[C++]Zamiana liczb na tekst

Forum dotyczące ogólnie pojętego programowania - algorytmów, struktur danych, narzędzi programistycznych, itp - głównie w kontekście komputerów PC.
ODPOWIEDZ
Awatar użytkownika
zenzee
-
Posty: 75
Rejestracja: 25 lip 2008, 10:41
Lokalizacja: Samoa Zachodnie

[C++]Zamiana liczb na tekst

Post autor: zenzee » 20 wrz 2009, 21:06

Witam.
Oto kolejne moje dzieło. :mrgreen:
Tutaj postanowiłem zamiast wyświetlać liczby wprowadzone wyświetlić ich reprezentację
tekstową uwzględniając polskie litery.
Za komentarze w kodzie oczywiście z góry przepraszam. :grin:
No i jak może być ? :grin:
Dzieki wielkie.
Pozdrawiam.

Kod: Zaznacz cały

#include <iostream>
#include<string>
using namespace std;
//------------------------------------------------------------------------------
  string ostr(char* Tablica)
  {
  //------konwersja na polskie znaki-------------
   const int znaki[18]= {165,164,134,143,169,168,136,157,228,227,
    162,224,152,151,171,141,190,189};
  const char* const polskie = "ąĄćĆęĘłŁńŃóÓśŚźŹżŻ";
  int d = strlen(Tablica);
  int dx = (sizeof(znaki) / sizeof(int));
  string data;

  for(int s = 0;s<d;++s)
    {
    if(Tablica[s]> 0)data += Tablica[s];
    for(int a = 0;a < dx;++a)
      if(Tablica[s] == polskie[a])
         data+=znaki[a];
    }
  return data;
  }
  //------konwersja na polskie znaki-koniec-
  
  //dwie małe funkcja ,więc niech będa inline
  inline string wyswietl(char** dane,char* tab,int index)
  {
  string sa = ostr(dane[(tab[index]- '0')]);
  return sa;
  }
   
  inline string wyswietl(char** dane2,int Reszta)
  {
  //dla liczby 12
  //ostr(dane2[12-10])
  //przekaże do funkcji ostr tablice nascie[2],
  //czyli tekst "dwanaście"
  //zmienna sa2 = "dwanaście"
	string sa2 = ostr(dane2[Reszta - 10]);
    return sa2;

  }

//-------------------------------------------------------
   int main()
   {	   
   char* tysiace[10]={
   "",
   "tysiąc ","dwa tysiące ","trzy tysiące ","cztery tysiące ","pieć tysięcy ",
   "sześć tysięcy ","siedem tysięcy ","osiem tysięcy ","dziewięć tysięcy "
   };
   char* setki[10]={
   "",
   "sto ","dwieście ","trzysta ","czterysta ","pięćset ",
   "sześcset ","siedemset ","osiemset ","dziewięćset "
   };
   char* dziesiatki[10]={
   "",
   "dziesięć ","dwadzieścia ","trzydzieści ","czterdzieści ","piećdziesiąt ",
   "sześcdziesiąt ","siedemdziesiąt ","osiemdziesiąt ","dziewięćdziesiąt "
   };
   char* nascie[10]={
   "","jedenaście","dwanaście","trzynaście","czternaście","piętnaście",
   "szesnaście","siedemnaście","osiemnaście","dziewiętnaście"
   };
   char* jednostki[10]={
   "","jeden","dwa","trzy","cztery","pięć",
   "sześć","siedem","osiem","dziewięć"
   };
   cout<<"podaj liczbe-max 4 cyfry :";
   char liczba[5];
   char* wsk = &liczba[0];
   cin.getline(liczba,5);
   //W tablicy coś innego niż cyfra to "skróć" tablicę
   while(*wsk)
   {
     if(*wsk > '9' || *wsk < '0')
       *wsk = '\0';
	   ++wsk;
       }
   int len_ = strlen(liczba);//Ile cyfr w tablicy?
   int reszta = (atoi(liczba) % 100);//potrzebne dla
   //liczb 11-19
   switch(len_)
   {
   case 1:cout<<wyswietl(jednostki,liczba,0);//liczby 1-9
      if(liczba[0] == '0')cout<<"zero\n";break;//liczba 0
   case 2:
	  if(liczba[len_-2] == '1' && liczba[len_-1] != '0')
         cout<<wyswietl(nascie,reszta);//liczby 11-19
       else
        {
        cout<<wyswietl(dziesiatki,liczba,0);//liczby 10-90
        cout<<wyswietl(jednostki,liczba,1);//liczby 1-9
        }
        ;break;
   case 3:
//**dla liczby 138*****
//**przekazywana jest tablica setki i 
//**zawartosc tablicy liczba o indeksie 0,czyli '1'
	    cout<<wyswietl(setki,liczba,0);//liczby 100-900
//^^dla liczb 11-19 przekazywana jest tablica nascie
//^^i reszta z dzielenia(podstawa 100) z wprowadzonej liczby
//^^tylko wtedy gdy liczba[0] = '1' i liczba[1] nie równa
//^^się '0'
	    if(liczba[len_-2] == '1' && liczba[len_-1] != '0')
        cout<<wyswietl(nascie,reszta);
        else
         {
//**przekazywana jest tablica dziesiatki i 
//**zawartosc tablicy liczba o indeksie 1,czyli '3' 
		 cout<<wyswietl(dziesiatki,liczba,1);//liczby 10-90
//**przekazywana jest tablica jednostki i 
//**zawartosc tablicy liczba o indeksie 2,czyli '8'
		 cout<<wyswietl(jednostki,liczba,2);//liczby 1-9
         };break;
   case 4:cout<<wyswietl(tysiace,liczba,0);//liczby 1000-9000
        cout<<wyswietl(setki,liczba,1);//liczby 100-900
        if(liczba[len_-2] == '1' && liczba[len_-1] != '0')
          cout<<wyswietl(nascie,reszta);//liczby 11-19
         else
         {
         cout<<wyswietl(dziesiatki,liczba,2);//liczby 10-90
         cout<<wyswietl(jednostki,liczba,3);//liczby 1-9
         }
   }
   cin.get();
   return 0;
}
Edit:
Chyba za duże tablice zrobiłem -na 11 elementów ,a jest w każdej po 10 elementów .
Zbędne przecinki w dwóch tablicach -"nascie" i "jednostki".
Zmieniłem to. :wink:

ODPOWIEDZ