Zamiana cyfr na słowa język C

0

Witam. Mam problem z programem który ma na celu zamianę liczb na słowa. Napisałem kawałek kodu i nie wiem co się dzieje w 23 linijce, że później program nie może wypisać żadnej nazwy cyfry. Proszę o pomoc w zrozumieniu problemu.

int main()
{
    static char *tab[100]={"zer","jed", "dwa", "trz", "czt", "pie","sze","sie","osi","dzi"};
    char *tab2[100];
    int i=0;       
    int liczba;
    int koncowka;
    
    printf("Podaj liczbe do zamiany na postac  slowna: ");
    scanf("%d",&liczba);
    fflush(stdin);
    
    do
    {
    koncowka=liczba %10;
    liczba=liczba /10;
    //slownie=tab[koncowka]+slownie
    tab2[i]=*tab[koncowka];
    i++; 
    printf("\nSlownie: %s",tab[koncowka]); 
    printf("\t %s: ",tab2);
    } 
    while(liczba>0);
        
    for(;i>0; i--)
    printf("\nSlownie: %i",*tab2[i]);
   
   system("PAUSE");
    return 0;    
} 
0

Poco tak komplikować?

int main()
  {
   static char *tab[]={"zer","jed", "dwa", "trz", "czt", "pie","sze","sie","osi","dzi","minus"};
   char buf[12]; // -2 000 000 000 + \0
   int liczba,i,d;
 
   printf("Podaj liczbe do zamiany na postac  slowna: ");
   if(scanf("%d",&liczba)==1)
     {
      printf("Slownie:");
      sprintf(buf,"%d",liczba);
      for(i=0;buf[i];++i)
        {
         d=buf[i]-'0';
         if((0>d)||(d>9)) d=10;
         printf("%s ",tab[d]);
        }
      printf("\n");
     }
   fflush(stdin);
   getchar();
   return 0;    
  }
0

Ciekawa alternatywa rozwiązania problemu :) Ale ja chcę napisać program używając mojego sposobu, używając dzielenia mod i div.

0
#include <cstdio>

int main()
  {
   static const char *tab[100]={"zer","jed", "dwa", "trz", "czt", "pie","sze","sie","osi","dzi"};
   const char *tab2[10];
   unsigned i=0,koncowka,liczba; // aby nie bawić się w ujemne

   printf("Podaj liczbe do zamiany na postac  slowna: ");
   scanf("%u",&liczba);
   do
     {
      koncowka=liczba%10;
      liczba/=10;
      tab2[i++]=tab[koncowka];
     }
   while(liczba>0);
   printf("Slownie:");
   while(i) printf(" %s",tab2[--i]);
   printf("\n");

   fflush(stdin);
   getchar();
   return 0;    
  }
0

Dzięki wielkie za pomoc. Ja już zacząłem kombinować z funkcją strcpy... a rozwiązanie było tak blisko :-)

0

To ja dodam jeszcze, że składanie jedności, dziesiątek i setek z przedrostków i przyrostków uważam za chybiony pomysł. Dużo prostsze, czytelniejsze i być może bardziej wydajne będzie stworzenie tablic z pełnymi słowami:

const char * const jednosci[10] = {"zero ", "jeden ", "dwa ", "trzy ", "cztery ", "piec ", "szesc ", "siedem ", "osiem ", "dziewiec "};

const char * const nastki[10] = {"dziesiec ", "jedenascie ", "dwanascie ", "trzynascie ", "czternascie ", "pietnascie ", "szesnascie ", "siedemnascie ", "osiemnascie ", "dziewietnascie "};

const char * const dziesiatki[10] = {"", "", "dwadziescia ", "trzydziesci ", "czterdziesci ", "piecdziesiat ", "szescdziesiat ", "siedemdziesiat ", "osiemdziesiat ", "dziewiecdziesiat "};

const char * const setki[10] = {"", "sto ", "dwiescie ", "trzysta ", "czterysta ", "piecset ", "szescset ", "siedemset ", "osiemset ", "dziewiecset "};


string slownie(unsigned liczba)
{
    int j = liczba % 10;
    liczba /= 10;
    int d = liczba % 10;
    liczba /= 10;
    int s = liczba % 10;

    string ret;

    ret += setki[s];
    if (d == 1) {
        ret += nastki[j];
    } else {
        ret += dziesiatki[d];
        ret += nastki[j];
    }

    return ret;
}

Gotowy program w C:
http://4programmers.net/Pastebin/1668
Konwertuje liczby od 0 do 10^27-1.

0

if((0>d)||(d>9)) d=10;
ło dzizas. 30 sekund mi zajęło czytanie tego, nie można tak?

if (d<0 || d>9) d=10;
0
bumcykyfysz napisał(a):
fflush(stdin);

Użyj innego sposobu na wyczyszczenie bufora.

0
_13th_Dragon napisał(a)

A jaki proponujesz i czemu c i ten nie pasuje?

fflush() można używać jedynie na strumieniu wyjścia. Użycie na strumieniu wejścia to niezdefiniowane zachowanie.
Z dokumentacji biblioteki standardowej C:

int fflush(FILE* stream);
Flushes stream stream and returns zero on success or EOF on error. Effect undefined for input stream. fflush(NULL) flushes all output streams.

A można np. tak:

int ch;
while ((ch = getchar()) != '\n' && ch != EOF);

1 użytkowników online, w tym zalogowanych: 0, gości: 1