2017-10-21 47 views
-1

Mon programme convertit un entier dans un nombre littéral. Il fonctionne avec précision avec des nombres supérieurs à (-9999) ou des nombres inférieurs à 9999 mais chaque fois que je tape 12314115151 en tant qu'utilisateur, le programme imprime un "négatif". Je pense que je l'ai fait une erreur dans mon code et besoin de votre aide ..Résultat inattendu avec intégrateur

Voici mon code:

#include <stdio.h> 
#include <conio.h> 

void positive(int input, int t); 
void negative(int input, int t); 

void main(){ 

int input,t; 

clrscr(); 

textcolor(YELLOW); 

cprintf("ENTER YOUR NUMBER: "); 

scanf("%i",&input); 

    if (input < -9999 || input > 9999){ 

     textcolor(RED); 

     cprintf("\nINVALID ENTRY, PROGRAM TERMINATED"); 


    }  


    else if(input == 0){ 

     cprintf("\nNUMBER IN WORD(S): "); 

     printf("Zero"); 

    } 

    else if(input < 0 || input >-10000){ 

     cprintf("\nNUMBER IN WORD(S): "); 

     negative(input,t); 
    } 
    else if(input > 0 || input <10000){ 

     cprintf("\nNUMBER IN WORD(S): "); 

     positive(input,t); 
    } 

getch(); 
} 

void positive(int input, int t){ 

     char* a[11]={"","One","Two","Three","Four","Five","Six","Seven","Eeight","Nine","Ten"}; 


     char* b[10]={"","Eleven","Twelve","Thirteen","Fourteen","Fifteen","Sixteen","Seventeen","Eighteen","Nineteen"}; 


     char* c[10]={"","","Twenty","Thirty","Fourty","Fifty","Sixty","Seventy","Eighty","Ninety"}; 

     textcolor(WHITE); 

     if(input > 0 || input < 11){ 

     t=input/1; 
     cprintf("Positive %s",a[t]); 
     } 

     if(input > 10 || input < 20){ 

     t=input%10; 

     cprintf("Positive %s",b[t]); 
     } 

     if (input > 19 || input < 100){ 
     t = input/10; 

     cprintf("Positive %s",c[t]); 

     t=input%10; 

     cprintf(" %s",a[t]); 
     } 

     if (input > 99 || input < 1000){ 
     t =input/100; 

     cprintf("Positive %s Hundred",a[t]); 

     t*=100; 
     input-=t; 

      if(input > -1 || input < 11){ 

      t=input/1; 
      cprintf(" and %s",a[t]); 
      } 

      if(input > 10 || input < 20){ 

      t=input%10; 

      cprintf(" and %s",b[t]); 
      } 

      if (input > 19 || input < 100) 
      { 
      t=input/10; 

      cprintf(" and %s",c[t]); 

      input=input%10; 

      cprintf(" %s",a[input]); 
      } 

     } 
      if(input >999 || input <10000){ 
      t=input/1000; 

      cprintf("Positive %s Thousand",a[t]); 

      t*=1000; 
      input-=t; 

       if(input > -1 || input < 11){ 

       t=input/1; 
       cprintf(" and %s",a[t]); 

       } 

       if(input > 10 || input < 20){ 
       t=input%10; 
       cprintf(" and %s",b[t]); 
       } 

       if (input > 19 || input < 100) 
       { 
       t=input/10; 
       cprintf(" and %s",c[t]); 
       input=input%10; 
       cprintf(" %s",a[input]); 
       } 
      if(input > 99 || input < 1000){ 
       t=input/100; 
        cprintf(" %s Hundred",a[t]); 

       t*=100; 
       input-=t; 

       if(input > -1 || input < 11){ 

        t=input/1; 
        cprintf(" and %s",a[t]); 
       } 

       if(input > 10 || input < 20){ 
        t=input%10; 
        cprintf(" and %s",b[t]); 
       } 

       if (input > 19 || input < 100) 
       { 
       t=input/10; 
        cprintf(" and %s",c[t]); 
        input=input%10; 
        cprintf(" %s",a[input]); 
        } 

      } 
      } 

    return; 
} 



void negative(int input, int t){ 

    char* a[11]={"","One","Two","Three","Four","Five","Six","Seven","Eeight","Nine","Ten"}; 


    char* b[10]={"","Eleven","Twelve","Thirteen","Fourteen","Fifteen","Sixteen","Seventeen","Eighteen","Nineteen"}; 


    char* c[10]={"","","Twenty","Thirty","Fourty","Fifty","Sixty","Seventy","Eighty","Ninety"}; 

    textcolor(WHITE); 

    input*=-1; 

    if(input > 0 || input < 11){ 

    t=input/1; 
    cprintf("Negative|| %s",a[t]); 
    } 

    if(input > 10 || input < 20){ 

    t=input%10; 

    cprintf("Negative %s",b[t]); 
    } 

    if (input > 19 || input < 100){ 

    t = input/10; 

    cprintf("Negative %s",c[t]); 

    t=input%10; 

    cprintf(" %s",a[t]); 
    } 

    if (input > 99 || input < 1000){ 

    t =input/100; 

    cprintf("Negative %s Hundred",a[t]); 

    t*=100; 
    input-=t; 

    if(input > -1 || input < 11){ 
     t=input/1; 
     cprintf(" and %s",a[t]); 
    } 

    if(input > 10 || input < 20){ 
     t=input%10; 
     cprintf(" and %s",b[t]); 
    } 

    if (input > 19 || input < 100) 
    { 
     t=input/10; 
     cprintf(" and %s",c[t]); 
     input=input%10; 
     cprintf(" %s",a[input]); 
    } 

    } 

    if(input >999 || input <10000){ 
    t=input/1000; 
    cprintf("Negative %s Thousand",a[t]); 
    t*=1000; 
    input-=t; 

     if(input > -1 || input < 11){ 

     t=input/1; 
     cprintf(" and %s",a[t]); 
     } 

     if(input > 10 || input < 20){ 
     t=input%10; 
     cprintf(" and %s",b[t]); 
     } 

     if (input > 19 || input < 100) 
     { 
     t=input/10; 
     cprintf(" and %s",c[t]); 
     input=input%10; 
     cprintf(" %s",a[input]); 
     } 
    if(input > 99 || input < 1000){ 
     t=input/100; 

     cprintf(" %s Hundred",a[t]); 

     t*=100; 
     input-=t; 

     if(input > -1 || input < 11){ 

      t=input/1; 
      cprintf(" and %s",a[t]); 
     } 

     if(input > 10 || input < 20){ 
      t=input%10; 
      cprintf(" and %s",b[t]); 
     } 

     if (input > 19 || input < 100) 
     { 
     t=input/10; 
      cprintf(" and %s",c[t]); 
      input=input%10; 
      cprintf(" %s",a[input]); 
      } 

    } 
    } 

    return; 
} 

Toutes les idées?

+3

'12314115151' est pas une valeur valide de 32 bits 'int'. –

+0

C'est une répétition massive (ou proche de la répétition) dans le code positif et négatif. Vous devriez concevoir une méthode pour éviter cette répétition, probablement en imprimant la chaîne "Négatif" et en appelant la fonction "positive" avec la valeur absolue du nombre. Cela réduit votre code magnifiquement. D'autres changements algorithmiques sont nécessaires pour le faire fonctionner avec de plus grands nombres, mais une fois que vous avez 0..999 couverts, le reste est une question de répétition avec des multiplicateurs différents, etc. Par exemple, dix et dix mille sont liés, comme est dix mille dix (ou dix mille dix si vous êtes américain). –

Répondre

1
else if(input == 0){ 

     cprintf("\nNUMBER IN WORD(S): "); 

     printf("Zero"); 

    } 

    else if(input < 0 || input >-10000){ // There should be && instead of ||. 

     cprintf("\nNUMBER IN WORD(S): "); 

     negative(input,t); 
    } 
    else if(input > 0 || input <10000){ //There too. 

     cprintf("\nNUMBER IN WORD(S): "); 

     positive(input,t); 
    } 

Comme vous le voyez, j'ai commenté les parties de votre code que vous devez modifier. Maintenant, vous cherchez un nombre qui est PLUS GRAND QUE -10000 - votre numéro IS plus grand. num < 0 ne veut rien dire parce que c'est OPTIONNELLE condition maintenant. Et comme mentionné vers le bas,

12314115151 est pas une valeur int 32 bits valide

0

si vous changez votre condition ci-dessous vous obtiendrez le résultat souhaité:

else if(input < 0){ 

     cprintf("\nNUMBER IN WORD(S): "); 

     negative(input,t); 
    } 
    else if(input > 0){ 

     cprintf("\nNUMBER IN WORD(S): "); 

     positive(input,t); 
    }