2012-11-15 7 views
5

Ich schreibe einen Code, um die Ziffern einer beliebigen positiven Ganzzahl in der Sprache C anzuzeigen. Zum Beispiel würde Integer 345 als drei vier fünf angezeigt werden.Drucken einer ganzen Zahl in Englisch

Der Code, den ich schrieb funktioniert gut für Ganzzahlen mit allen Ziffern größer als 0. Aber bestimmte Ganzzahlen wie 10, 304, 0 usw. werden nicht korrekt angezeigt. Die Verwendung von Rekursion und Array ist nicht erlaubt, um herauszufordern. Nur Schleifen und wenn Konstrukte erlaubt sind. Irgendwelche Vorschläge?

#include<stdio.h> 
int main(void) 
{ 
    int num, num_copy, accum = 1; 

    printf("Enter an integer "); 
    scanf("%i",&num); 

    num_copy = num; 

    while (num > 0){ 

    while (num > 9){ 
     num = num/10; 
     accum *= 10; 
     } 
     switch (num){ 

     case (1): 
       printf("one "); 
       break; 
     case (2): 
       printf("two "); 
       break; 
     case (3): 
       printf("three "); 
       break; 
     case (4): 
       printf("four "); 
       break; 
     case (5): 
       printf("five "); 
       break; 
     case (6): 
       printf("six "); 
       break; 
     case (7): 
       printf("seven "); 
       break; 
     case (8): 
       printf("eight "); 
       break; 
     case (9): 
       printf("nine "); 
       break; 
     } 
     num_copy = num_copy - (num*accum); 
     num = num_copy; 
     accum = 1; 
    } 

    return 0; 
} 
+1

Sie nicht behandeln '0' –

+0

Warum Klammer um Fall-Etiketten? Warum nicht um andere Konstanten? 'accum * = (10);' oder 'return (0);' – pmg

+0

Versuchen Sie, den Code zeilenweise zu durchlaufen. Sie werden mehrere Probleme bemerken, wenn Sie das tun. –

Antwort

2

Ohh! Das klingt nach Spaß! Keine Arrays und keine Rekursion, oder?

So, da wir die Zahl nicht Rekursion müssen wir bauen rückwärts verwenden können:

#include<stdio.h> 
int main(void) 
{ 
    int num, backwards = 0, digit, backupzeros = 0; 

    printf("Enter an integer "); 
    scanf("%i",&num);   // get the number 

    while(num > 0){ 
     digit = num % 10; // pry off the last digit 
     num /= 10;   // take off the digit 

     if((backwards == 0) && (digit == 0)) // If it's a number that ends in 0 
      backupzeros++;     // save it, we'll use that later 

     backwards = (backwards * 10) + digit; // glue it on backwards 
    } 

    // Now we have the number reversed. Next we need to print the digits 

    while (backwards > 0){ 
     digit = backwards % 10; 
     backwards /= 10; 

     switch (digit){ 

     case 1: 
       printf("one "); 
       break; 
     case 2: 
       printf("two "); 
       break; 
     case 3: 
       printf("three "); 
       break; 
     case 4: 
       printf("four "); 
       break; 
     case 5: 
       printf("five "); 
       break; 
     case 6: 
       printf("six "); 
       break; 
     case 7: 
       printf("seven "); 
       break; 
     case 8: 
       printf("eight "); 
       break; 
     case 9: 
       printf("nine "); 
       break; 
     default: 
       printf("zero "); 
       break; 
     } 
    } 

    while(backupzeros > 0) { 
     printf("zero "); 
     backupzeros--; 
    } 

    return 0; 
} 
+0

Ich hätte das ganze wohl nicht schreiben sollen, da es sich nach einer Hausaufgabe anhört ... aber ich könnte heute eine Pause gebrauchen. :) – Mike

+0

das ist kein Weg eine Hausaufgabe. Ich bin weit über dieses Alter hinaus. Ich bin Pilot einer Fluggesellschaft und lerne, wie man einen Computer programmiert. Danke für die Zeit, die du mir gewidmet hast. – user1825355

+0

@ user1825355 - Ich bin der Meinung, dass du nie zu alt bist, um wieder zur Schule zu gehen. (Ironischerweise bin ich ein Software-Ingenieur, aber ich werde zurückkommen, um eine Pilotenlizenz zu bekommen), und ich bin froh, Ihnen helfen zu können, wie Sie selbst mit den Einschränkungen von Rekursion und Arrays sehen können, ist es möglich, das Problem zu lösen Sie werden feststellen, dass die meisten Probleme viele verschiedene Lösungen haben. – Mike

0

"(..) Aber bestimmte ganze Zahlen wie 10, 304, 0",

Was alle diese Zahlen gemeinsam? "Null" ist die Antwort.

Sie müssen in Ihrem Schalter die Bedingung setzen, um die Null auch zu behandeln.

Sie können etwas tun:

#include<stdio.h> 
int main(void) 
{ 
    int num, num_copy, accum = 1; 

    printf("Enter an integer "); 
    scanf("%i",&num); 

    char str[15]; 
    sprintf(str, "%d", num); 


    for(num = 0; str[i] != '\O'; num++) 
    { 
     switch (num){ 

     case (1): 
       printf("one "); 
       break; 
     case (2): 
       printf("two "); 
       break; 
     case (3): 
       printf("three "); 
       break; 
     case (4): 
       printf("four "); 
       break; 
     case (5): 
       printf("five "); 
       break; 
     case (6): 
       printf("six "); 
       break; 
     case (7): 
       printf("seven "); 
       break; 
     case (8): 
       printf("eight "); 
       break; 
     case (9): 
       printf("nine "); 
       break; 
     case (0): 
      printf("zero "); 
       break; 
     } 
    } 

    return 0; 
} 

Sie können sprintf() verwenden, um die ganze Zahl in ein char [] zu konvertieren. Dann brauchen Sie nur den char-Array

+0

Null erreicht nicht nur den Schalter. – user1825355

+0

Versuchen Sie, die Null-Bedingung zu setzen und mir sagen, was passiert – dreamcrash

+0

Schleife würde unbegrenzt laufen – user1825355

2

iterieren Wenn Sie eine rekursive Funktion schreiben, würde es helfen, die Schleifen zu vermeiden, die Sie in umgekehrter Reihenfolge drucken verwenden:

#include<stdio.h> 

void print_num(int num) 
{ 
if(num == 0) return; 
print_num(num/10); 

     switch (num%10){ 

     case (1): 
       printf("one "); 
       break; 
     case (2): 
       printf("two "); 
       break; 
     case (3): 
       printf("three "); 
       break; 
     case (4): 
       printf("four "); 
       break; 
     case (5): 
       printf("five "); 
       break; 
     case (6): 
       printf("six "); 
       break; 
     case (7): 
       printf("seven "); 
       break; 
     case (8): 
       printf("eight "); 
       break; 
     case (9): 
       printf("nine "); 
       break; 
     case (0): 
       printf("zero "); 
       break; 
     } 
} 


int main(void) 
{ 
    int num, num_copy, accum = 1; 

    printf("Enter an integer "); 
    scanf("%i",&num); 
    print_num(num); 

    return 0; 
} 

Nicht-rekursive Lösung, die verwendet ein Array, um die Zahlen zu speichern:

void print_num(int num) 
{ 
int i=0,j; 
int arr[256]; 

while(num) 
{ 
arr[i++]=num%10; 
num/=10; 
} 

for(j=i-1; j>=0;j--) 
{ 
     switch (arr[j]){ 

     case (1): 
       printf("one "); 
       break; 
     case (2): 
       printf("two "); 
       break; 
     case (3): 
       printf("three "); 
       break; 
     case (4): 
       printf("four "); 
       break; 
     case (5): 
       printf("five "); 
       break; 
     case (6): 
       printf("six "); 
       break; 
     case (7): 
       printf("seven "); 
       break; 
     case (8): 
       printf("eight "); 
       break; 
     case (9): 
       printf("nine "); 
       break; 
     case (0): 
       printf("zero "); 
       break; 
     } 
} 
+0

Ihre Lösung ist perfekt. Ich habe vergessen zu erwähnen, dass dieses Problem ohne Rekursion gelöst werden sollte. Nur Schleifen und wenn Konstrukte erlaubt waren. Noch mehr Ideen? – user1825355

+0

Ich verstehe. Sie können die Zahlen einfach in einem Array speichern und dann ausdrucken? –

+0

Entschuldigung noch einmal, keine Arrays auch! – user1825355

1

Dies ist eine Univ-Übung, vor vielen vielen Jahren !!!

Zahlen von 1 bis 999

#define MAX_BUF 100 

int main(){ 

    int num, i=0, j, digit; 
    char *buf[MAX_BUF]; 

    printf("Integer: "); 
    scanf("%d",&num); 

    while(num){ 
     digit = num %10; 
     num = num /10; 

     switch(digit){ 
      case 0: buf[i++] = "zero"; break; 
      case 1: buf[i++] = "one"; break; 
      case 2: buf[i++] = "two"; break; 
      case 3: buf[i++] = "three"; break; 
      case 4: buf[i++] = "four"; break; 
      case 5: buf[i++] = "five"; break; 
      case 6: buf[i++] = "six"; break; 
      case 7: buf[i++] = "seven"; break; 
      case 8: buf[i++] = "eight"; break; 
      case 9: buf[i++] = "nine"; break; 
     } 
    } 

    for(j = i-1; j >= 0; j--){ 
     printf("%s-", buf[j]); 
    } 

    return 0; 
} 
+0

@ b3h3mOth Es tut mir leid, Sie zu enttäuschen, aber keine Arrays, keine Rekursion erlaubt. nur Schleifen und wenn Konstrukte! – user1825355

+0

Ich verstehe, Böhm-Jacopini docet :) – b3h3m0th

0

Ungeprüfte ...

char *digitNames[10] = { 
    "zero", 
    "one", 
    ... // Too lazy to fill in the rest.. 
    "nine" 
} 

void displayNumber(uint32_t number) { 
    int totalDigits = 0; 
    int scale = 10; 
    uint32_t divisor = 1000000000; 
    uint32_t digit; 

    do { 
     scale--; 
     digit = number/divisor; 
     number -= digit * divisor; 
     divisor /= 10; 
     if(scale == 0) { 
      fputs(stdout, digitNames[digit]); 
     } else if((digit != 0) || (totalDigits != 0)) 
      printf("%s ", digitNames[digit]); 
      totalDigits++; 
     } 
    } while(scale != 0); 
} 
Verwandte Themen