Ir ao conteúdo
  • Cadastre-se

Números por extenso.


Lucas109
Ir à solução Resolvido por MassakiMsk,

Posts recomendados

Estou tentando fazer um programa em C que imprime o numero por extenso de ate 6 casas, mas n esta dando certo :(

pela logica, se funciona para um, funciona para todos mas n é isso q esta acontecendo...

ainda ha coisas para se arrumar, mas primeiro quero resolver essas saidas bizarras (imagem).

eu printei a saida desse programa ai, alguns numeros dao certo, mas outros nao,  alguem saberia me dizer o porque ?

 

obg.

# include <stdio.h>
short int inv=0, cont=0;  //armazena o numero invertido
// conta a qntidade de casas do numero digitado.

void Separador()
    {

    char Uni[9][7]= {"Um", "Dois", "Tres", "Quatro","Cinco", "Seis", "Sete", "Oito", "Nove"};
    char Dec[9][13]= {"Dez", "Vinte", "Trinta", "Quarenta", "Cinquenta", "Sessenta", "Setenta", "Oitenta", "Noventa"} ;
    char Cem[9][13]= {"Cento", "Dozentos", "Trezentos", "Quatrocentos", "Quinhentos", "Seiscentos", "Setecentos", "Oitocentos", "Novecentos"};
    for(cont; cont>0; cont--)              //repete a escrita por extenso enquanto tiver algarismos nao precessados
        {
        if(inv%10==0)inv=inv/10;              // impede que um algarismo zero caia no default
        else
            {
            switch(cont)
                {
                case 1:
                    printf("%s",Uni[inv%10-1] );
                    break;
                case 2:
                    printf("%s",Dec[inv%10-1]);     //encaminha o algarismo da vez para uma das matrizes com base na sua posição
                    printf(" e ") ;
                    inv=inv/10;
                    break;
                case 3:
                    printf("%s",Cem[inv%10-1]);
                    printf(" e ");
                    inv=inv/10;
                    break;
                default:
                    cont=cont-3;
                    Separador();                   // caso o numero tenha mais de tres algarismos, a rotina é repetida para processar os numeros de 4 casas ou mais(ate 6).
                    printf(" Mil ");
                    inv=inv/10;                    //atualiza o numero
                    cont=4;                        // reseta para que as casas antes do mil sejam processadas.
                }
            }

        }

    }

int main ()
    {
    short int num;
    while(1)
        {
        cont=0;
        inv=0;
        printf("\nNumero:\n");
        scanf("%d", &num);        // quando é digitado zero, termina o programa
        if(num==0)break;
        while(num!=0)
            {
            inv+=num%10;
            num=num/10;
            inv*=10;                //inverte o numero digitado
            cont++;
            }
        inv=inv/10;

        Separador();
        }

    return 0;
    }

 

Extenso.PNG

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Solução

O problema é que você está tentando economizar espaço com o short int.

 

Olhe a imagem mostrando o valor de inv.

Apenas tire o short e deixe int normal. o short inte só vai até 32K e alguma coisa.

numero.png

No caso desse teste 2004, o inv teria valor 40020, e depois de dividido por 10 ficaria 4002, mas esse 40020 já estourou o limite do short int, então ele foi os 8K estourados para o lado negativo.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

6 horas atrás, Lucas109 disse:

que bobeira eu dei. Eu tenho essa mania de sair pondo short aonde da. Nunca ia me lembrar de verificar isso,  muito obrg

você não precisa usar short em uma ou duas variáveis, você apenas vai notar diferença em rendimento. você estará economizando o quê? 2 bytes? >_< Outra coisa é que você tenha um array de 1 milhão inteiros e ainda assim olha que isso não é muito comparado com a ram que tem instalada nos computadores modernos. Reservar um ou 2 megabytes em uma RAM de 4 gigas nem doi, mas ficar fazendo casts, usando especificadores de formato raros etc sim que vai te doer... e muito >_<. Agora se google lhe encarregar de fazer uma base de dados para todas as pessoas do planeta, usar ints em lugar de short se traduziria em um gasto de 50% a mais na compra de memórias ram, discos duros etc. hahaha você poderia levar literalmente a quebra a essa empresa. :muro:
 

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...