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

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...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!