Neste site voce vai encontrar tutoriais de software livre e tambem alguns para Windows, sistema de controles de frequência e usuários desenvolvidos em PHP e MySQL, diversão, muita coisa sobre pescarias com albuns de fotos e também as viagens que pude registrar até agora.
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#include "funcoes.h"
#include "natuser.h"
#define BRANCO 32
#define TAMBUF 1250
/*----------------------------------------------------------------------*
* *
* Modulo ....................... PB19040A *
* Autor ........................ Lercio Teotonio Gontijo *
* Data ......................... 14 de julho de 1994 *
* Funcao ....................... Valores monetarios por extenso *
* *
* Descricao sumaria: *
* *
* Esta subrotina sera chamada no NATURAL AIX com a passagem de *
* 3 parametros. O primeiro parametro sera o valor a ser conver- *
* tido por extenso e podera ter no maximo 14 bytes devendo ser *
* composto somente por numeros ("8234868743" por exemplo). O *
* segundo parametro sera o tamanho do primeiro parametro ("10" *
* por exemplo). O ultimo parametro sera a area reservada de 255 *
* bytes para receber o valor por extenso. *
* *
* Se ocorrer algum erro na passagem dos parametros a subrotina *
* ira devolver um "*" (asterisco) no terceiro parametro junta- *
* mente com um return code diferente de 0. *
* *
*----------------------------------------------------------------------*/
long PB19040A (WORD nparm, BYTE **parmptr, FINFO *parmdec)
{
char extenso[255], *pointer, string[20];
int tam;
extenso[0] = '*';
extenso[1] = 0;
memmove((char *) parmptr[2], (char *) &extenso, 2);
memmove((char *) &string, (char *) parmptr[1], 2); /* OBTEM O TAMANHO */
string[2] = '\0'; /* COM DOIS BYTES */
tam = atoi(string); /* MOVE PARA UMA VARIAVEL INTEIRA */
if (tam > 14) return 1; /* TAMANHO LIMITADO EM 14 BYTES */
memmove((char *) &string, (char *) parmptr[0], tam);
string[tam]= '\0'; /* OBTEM O VALOR COM O TAMANHO */
pointer = Extenso(string,0);
if (pointer[0] == 32) pointer++;
strcpy(extenso,pointer);
memmove((char *) parmptr[2], (char *) &extenso, strlen(extenso));
return 0;
}
Include do funcoes.h
#define BRANCO 32
#define TAMBUF 1250
extern char tab1[15][15];
extern char tab2[37][15];
extern int indice, redondo, decimais, centenas, flag1, jareais;
extern void clear(unsigned char linhas);
extern char *strrev(char *string);
extern void MontaTipo(char tipo);
extern char *Dezenas(char *string);
extern char *Centenas(char *string);
extern void MontaTabela();
extern char *ComeBrancos(char *string);
extern int ConsisteData(char *Data, char tipo);
extern int ImpressaoOnline(FILE *out,char *tamanho,char *saltos,char *cor,char *texto);
Funcao de Reais por Extenso
#include <stdio.h>
#define BRANCO 32
#define TAMBUF 1250
char tab1[15][15];
char tab2[37][15];
int indice, redondo, decimais, centenas, flag1, jareais;
char *Dezenas(char *string);
void clear(unsigned char linhas)
{
char i;
for(i=0;i<linhas;i++,printf("%79s\n"," "));
}
char *strrev(char *string)
{
char buffer[TAMBUF];
int i, j, length;
for(length=0;string[length]!=0;length++)
if ( length > TAMBUF-1)
{
clear(25);
printf("Programa cancelado no uso da funcao \"strrev\"\n");
printf("Limite de %s excedido.\n\n",TAMBUF);
exit(0);
}
for(j=0,i=length;i>0;i--,j++)
buffer[j] = string[i-1];
buffer[length] = 0;
strcpy(string,buffer);
return(string);
}
void MontaTipo(char tipo)
{
char Tipos[4][15], i;
strcpy(Tipos[0]," CENTIMETRO");
strcpy(Tipos[1]," CENTIMETROS");
strcpy(Tipos[2]," METRO");
strcpy(Tipos[3]," METROS");
if (tipo)
for(i=0;i<4;i++)
strcpy(tab1[i],strrev((char *)Tipos[i]));
}
char *Centenas(char *string) {
char *pointer, extenso[80];
if (strlen(string) == 0)
return(string);
extenso[0] = centenas = 0;
pointer = string;
pointer += strlen(string) - 1;
if (pointer[0]-48 < 1)
return("");
centenas = 1;
if (atoi(pointer) == 1) {
if (redondo)
strcat(extenso,"OTNEC ");
else {
if (!jareais || indice > 2)
strcpy(extenso,tab1[indice+1]);
strcat(extenso,"MEC ");
}
return(extenso);
}
if (!redondo && (!jareais || indice > 2))
strcpy(extenso,tab1[indice+1]);
strcat(extenso,tab2[pointer[0]-48+26]);
return(extenso);
}
void MontaTabela() {
strcpy(tab2[0],"MU ");
strcpy(tab2[1],"SIOD ");
strcpy(tab2[2],"SERT ");
strcpy(tab2[3],"ORTAUQ ");
strcpy(tab2[4],"OCNIC ");
strcpy(tab2[5],"SIES ");
strcpy(tab2[6],"ETES ");
strcpy(tab2[7],"OTIO ");
strcpy(tab2[8],"EVON ");
strcpy(tab2[9],"ZED ");
strcpy(tab2[10],"EZNO ");
strcpy(tab2[11],"EZOD ");
strcpy(tab2[12],"EZERT ");
strcpy(tab2[13],"EZROTAUQ ");
strcpy(tab2[14],"EZNIUQ ");
strcpy(tab2[15],"SIESSEZED ");
strcpy(tab2[16],"ETESSEZED ");
strcpy(tab2[17],"OTIOZED ");
strcpy(tab2[18],"EVONEZED ");
strcpy(tab2[19],"ETNIV ");
strcpy(tab2[20],"ATNIRT ");
strcpy(tab2[21],"ATNERAUQ ");
strcpy(tab2[22],"ATNEUQNIC ");
strcpy(tab2[23],"ATNESSES ");
strcpy(tab2[24],"ATNETES ");
strcpy(tab2[25],"ATNETIO ");
strcpy(tab2[26],"ATNEVON ");
strcpy(tab2[27],"OTNEC ");
strcpy(tab2[28],"SOTNEZUD ");
strcpy(tab2[29],"SOTNEZERT ");
strcpy(tab2[30],"SOTNECORTAUQ ");
strcpy(tab2[31],"SOTNEHNIUQ ");
strcpy(tab2[32],"SOTNECSIES ");
strcpy(tab2[33],"SOTNECETES ");
strcpy(tab2[34],"SOTNECOTIO ");
strcpy(tab2[35],"SOTNECEVON ");
strcpy(tab1[0], "OVATNEC ");
strcpy(tab1[1], "SOVATNEC ");
strcpy(tab1[2], "LAER ");
strcpy(tab1[3], "SIAER ");
strcpy(tab1[4], "LIM ");
strcpy(tab1[5], "LIM ");
strcpy(tab1[6], "OAHLIM ");
strcpy(tab1[7], "SEOHLIM ");
strcpy(tab1[8], "OAHLIB ");
strcpy(tab1[9], "SEOHLIB ");
strcpy(tab1[10],"OAHLIRT ");
strcpy(tab1[11],"SEOHLIRT ");
strcpy(tab1[12],"OAHLIRTAUQ ");
strcpy(tab1[12],"SEOHLIRTAUQ ");
strcpy(tab1[14],"*********** "); /* FINAL FLAG */
}
char *ComeBrancos(char *string)
{
long i, j;
char *pointer;
pointer = string;
while(!*pointer) pointer++;
for(i=0;*pointer;pointer++)
if (*pointer != ' ' || (*pointer+1 != ' ' && *pointer+1 != 0))
string[i++] = *pointer;
string[i-1]=0;
return(string);
}
ConsisteData(char *Data, char tipo)
{
int dia, mes, ano;
char str[4];
str[2] = str[3] = '\0';
switch(tipo)
{
case 'G' : /* Data gregoriana */
str[0] = Data[0]; str[1] = Data[1]; dia = atoi(str);
str[0] = Data[2]; str[1] = Data[3]; mes = atoi(str);
str[0] = Data[4]; str[1] = Data[5]; ano = atoi(str);
if ((mes < 1) || (mes > 12)) return 0;
if ((dia < 1) || (dia > 31)) return 0;
if ((mes == 2) && (ano % 4 == 0) && (dia > 29)) return 0;
if ((mes == 2) && (ano % 4 != 0) && (dia > 28)) return 0;
if ((mes == 4 || mes == 6 || mes == 9 || mes == 11)
&& (dia > 30)) return 0;
break;
case 'J' : /* Data juliana */
str[0] = Data[0]; str[1] = Data[1]; str[2] = '\0'; ano = atoi(str);
str[0] = Data[2]; str[1] = Data[3]; str[2] = Data[4];
dia = atoi(str);
if (ano % 4 == 0)
{
if ((dia < 1) || (dia > 366))
return 0;
}
else
if ((dia < 1) || (dia > 365))
return 0;
break;
default : return 0;
}
return 1;
}
/*----------------------------------------------------------------------*
* *
* Modulo ........................... Extenso *
* Autor ............................ Lercio Teotonio Gontijo *
* Data ............................. 13 de julho de 1994 *
* Local ............................ PRODABEL - GAD *
* Funcao ........................... Valores em reais por extenso *
* *
* Descricao Sumaria: *
* *
* Foram desenvolvidas 4 funcoes para conversao de valores em *
* reais por extenso relacionadas na ordem que sao usadas: *
* *
* 1 - char *Extenso(char *string,char tipo) *
* 2 - char *Dezenas(char *string) *
* 3 - char *Centenas(char *string) *
* *
* 1 - char *Extenso(char *string) *
* Recebe um string (valor alfanumerico) contendo o numero *
* a ser convertido por extenso. Precede a casa dos centa- *
* vos com um "0" se o numero tiver mais de 2 algarismos. *
* Há duas tabelas,a primeira, tipo de unidade, possui 15 *
* palavras: *
* CENTAVO - CENTAVOS REAL - REAIS *
* MIL - MIL MILHAO - MILHOES *
* BILHAO - BILHOES TRILHAO - TRILOES *
* QUATRILHAO - QUATRILHOES ******* (flag fim) *
* MAIOR NUMERO: 99.999.999.999.999,99 *
* *
* A segunda tabela, valores por extenso, possui 36: *
* UM - DOIS ate VINTE (inclusive), TRINTA - QUARENTA - *
* CINQUENTA - SESSENTA - SETENTA - OITENTA - NOVENTA - *
* CENTO - DUZENTOS - TREZENTOS - QUATROCENTOS - *
* QUINHENTOS - SEISCENTOS - SETECENTOS - OITOCENTOS e *
* por fim NOVECENTOS. *
* *
* A rotina processa a conversao do numero de 3 em 3 *
* algarismos da direita para a esquerda gerando, primeiro *
* CENTAVOS e por ultimo TRILHOES, existe tratamento *
* para o caso especial "CEM" e para os "E". Ao final da *
* conversao o extenso gerado sera invertido e retornado *
* a rotina chamadora. *
* *
* Exemplo de chamada a funcao: *
* *
* #include <stdio.h> *
* char *Extenso(char *,char *) / * prototipacao * / *
* int main(void) *
* { *
* char *pointer; / * declara um ponteiro de memoria * / *
* pointer = Extenso("456746936786","1"); *
* printf("Numero por extenso: %s\n",pointer); *
* return 0; *
* } *
* *
* 2 - char *Dezenas(char *string) *
* *
* Recebe a parte remanescente do string (o pedaco que *
* ainda falta ser convertido), pega as duas posicoes *
* mais a direita, se o resultado der menos que dois *
* algarismos o numero sera precedido de zeros ate com- *
* pletar duas possices (dois algarismos) e sera entao *
* convertido para extenso. *
* A ROTINA DEVOLVE O STRING CONVERTIDO. *
* *
* 3 - char *Centenas(char *string) *
* *
* Recebe a parte remanescente do string (o pedaco que *
* ainda falta ser convertido), pega a ultima posicao e *
* converte por extenso. *
* A ROTINA DEVOLVE O STRING CONVERTIDO. *
* *
*----------------------------------------------------------------------*/
char *Extenso(char *string,char *tipo)
{
char *pointer, extenso[304];
unsigned long valor;
extenso[0] = 0;
indice = 0;
jareais = 0;
pointer = string;
while(*pointer == '0') pointer++; /* IGNORA OS ZEROS INICIAIS */
strcpy(string,pointer);
valor = atol(string);
MontaTipo(tipo);
/*
* Se numero a ser convertido por extenso tiver dois ou
mais algarismos, os dois algarismos mais a direita
serao precedidos por um "0" (zero), permitindo desta
forma que a conversao utilize a tabela padrao. Assim:
CASO 1: O numero recebido "83",
o numero convertido "083",
CASO 2: O numero recebido "1234",
o numero convertido "12034".
Isto nao afetara a conversao porque a rotina de Dezenas()
convertera os dois algarismos a direita (83 caso 1 e 34
caso 2) e a rotina Centenas() convertera o proximo algaris-
mo que sera sempre "0" e nao produzira nenhum resultado.
*/
if (strlen(string) > 2) { /* SE VALOR MAIOR QUE CENTAVOS */
pointer = string + strlen(string) - 2; /* LOCALIZA CENTAVOS DO VALOR */
strcpy(extenso,"0"); /* COLOCA ZERO NO EXTENSO */
strcat(extenso,pointer); /* ACRESCENTA CENTAVOS NO EXTENSO */
pointer[0] = 0; /* ENCERRA STRING NA UNIDADE */
strcat(string,extenso); /* ACRESCENTA EXTENSO NO STRING */
extenso[0] = 0; /* DEVOLVE VASIO PARA EXTENSO */
}
/*------------------------------------------------------------------*\
* PROCESSAMENTO DO STRING (NUMERO) A SER CONVERTIDO *
\*------------------------------------------------------------------*/
while(strlen(string) > 0) {
pointer = Dezenas(string); /* CONVERTE DEZENAS */
string[strlen(string)-2] = 0; /* ELIMINA DOIS BYTES A DIREITA */
if (strlen(extenso) > strlen(tab1[2]) && /* COLOCA OU NAO COLOCA "E" */
extenso[strlen(extenso)-2] != 'E' &&
strcmp(&extenso[strlen(extenso)-strlen(tab1[2])],strrev(tab1[2])) &&
strcmp(&extenso[strlen(extenso)-strlen(tab1[3])],strrev(tab1[3])))
strcat(extenso,"E ");
strcat(extenso,pointer); /* GUARDA EXTENSO CONVERTIDO */
pointer = Centenas(string); /* CONVERTE CENTENAS */
string[strlen(string)-1] = 0; /* ELIMINA UM BYTES A DIREITA */
if (string[strlen(string)-1] > MENOSVIRANUM &&
strlen(extenso) > strlen(tab1[2]) && /* COLOCA OU NAO COLOCA "E" */
extenso[strlen(extenso)-2] != 'E' &&
strcmp(&extenso[strlen(extenso)-strlen(tab1[2])],strrev(tab1[2])) &&
strcmp(&extenso[strlen(extenso)-strlen(tab1[3])],strrev(tab1[3])))
strcat(extenso,"E ");
indice += 2; /* INCREMENTA INDICE TABELA 1 */
if (strlen(pointer) > 0 && decimais > 0 && !flag1)
if (extenso[strlen(extenso)-2] != 'E')
strcat(extenso,"E "); /* COLOCA OU NAO COLOCA "E" */
strcat(extenso,pointer); /* GUARDA EXTENSO CONVERTIDO */
if (strlen(pointer) > 0 && centenas > 0 && strlen(string) > 0)
strcat(extenso,"E "); /* COLOCA OU NAO COLOCA "E" */
if (strlen(string) &&
strlen(extenso) > strlen(tab1[2]) && /* COLOCA OU NAO COLOCA "E" */
extenso[strlen(extenso)-2] != 'E' &&
strcmp(&extenso[strlen(extenso)-strlen(tab1[2])],strrev(tab1[2])) &&
strcmp(&extenso[strlen(extenso)-strlen(tab1[3])],strrev(tab1[3])))
strcat(extenso,"E ");
if (strlen(string) && !jareais) { /* COLOCA A PALAVRA REAIS ??? */
if (strlen(string) == 1 && string[0] == '1')
strcat(extenso,strrev(tab1[2]));
else strcat(extenso,strrev(tab1[3]));
jareais = 1;
}
if (tab1[indice][0] == '*') /* STRING DE VALOR ALTO */
break;
}
pointer = strrev(extenso);
return(pointer);
}
char *Dezenas(char *string)
{
int num;
char *pointer, extenso[204];
extenso[0] = decimais = flag1 = redondo = 0;
if (strlen(string) < 1)
return(string);
pointer = string;
if (strlen(string) > 2) {
pointer += strlen(string) - 2;
num = atoi(pointer);
sprintf(pointer,"%02d",num);
} else {
num = atoi(string);
sprintf(pointer,"%02d",num);
}
if (num > 1) {
if (!jareais || indice > 2)
strcpy(extenso,strrev(tab1[indice+1]));
redondo = 2;
}
else if (num == 1) {
if (strlen(string) < 3 && (!jareais || indice > 2))
strcpy(extenso,strrev(tab1[indice]));
else if (indice > 2 && (!jareais || indice > 2))
strcpy(extenso,strrev(tab1[indice+1]));
else if (indice < 2 && (!jareais || indice > 2))
strcpy(extenso,strrev(tab1[indice]));
else if (!jareais || indice > 2)
strcpy(extenso,strrev(tab1[indice+1]));
redondo = flag1 = 1;
}
if (num < 21 && num > 0)
strcat(extenso,strrev(tab2[num-1]));
else {
if (pointer[1]-MENOSVIRANUM > 0)
strcat(extenso,strrev(tab2[pointer[1]-MENOSVIRANUM-1]));
if (pointer[0]-MENOSVIRANUM > 1) {
if (pointer[1]-MENOSVIRANUM > 0)
strcat(extenso,"E ");
strcat(extenso,strrev(tab2[MAIS2ACHAVINTE+pointer[0]-MENOSVIRANUM]));
}
}
if (num)
decimais = 1;
return(extenso);
}