funkcja zamieniającą liczbę int na liczbę napisaną słownie błąd dla ujemnych int

0

uczę się języka c++ napisałem i tak wymyśliłem ta funkcje wypisującą na ekran słownie podaną liczbę z przedziału -9999 do 9999
funkcja przesyła dziwne wartości lub i się zawiesza przy minusowych liczbach
najlepsze że napisałem najpierw cześć dla minusowych liczb później dla przekopiowałem i przebiłem na dodatnie i dla dodatnich działa a dla ujemnych nie:)
wiec nie wiem zbytnio co jest pięć
pewnie da się to napisać prościej ale chce się dowiedzieć dlaczego mój sposób nie działa

 #include<iostream>
#include<string>
#include<sstream>


using namespace std;

string zam_na_slownie(int licz);


int main()
{
    cout<<"witaj Podaj Liczbe :";
    int licz;
    cin>>licz;
    cout <<"\n\n o to przekowertowana liczba na tekst :\n"<<zam_na_slownie(licz);

}

//***************************************************************************************
string zam_na_slownie(int licz)
{
    string jednosci[] = {"","jeden ","dwa ","trzy ","cztery ","pienc ","szejsc ","siedem ","osiem ","dziewiec "};
    string jedynastki[] = {"","jedenascie ","dwanascie ","trzynascie ","czterynascie ","pientnascie ","szejsnascie ","siedemnascie ","osiemnascie ","dziewietnascie"};
    string dziesiadki[] = {"","dziesienc" ,"dwadziescia ","trzydziesci ","czterydziesci ","piencdziesiand ","szejscdziesiand ","siedemdziesiand ","osiemdziesiand ","dziewiecdziesiand "};
    string setki[] = {"","sto ","dwiescie ","trzysta ","czterysta ","piencset ","szejscset ","siedemset ","osiemset ","dziewiecset "};
    string tysiance[] = {"","tysianc ","dwa tysiance ","trzy tysiance ","cztery tysiance ","pienc tysiency ","szejsc tysiency ","siedem tysiency ","osiem tysiency ","dziewiec tysiency "};
    string pom,cyf;

    ostringstream na_str;

    na_str<<licz;
    cyf=na_str.str();


    if(0>licz)
    {
        licz=!licz;
        switch( (int)cyf.size())
        {
        case 5:
            pom+="minus "+tysiance[(int)licz/1000]+setki[(licz/100)%10];

            if ((licz/10)%10 == 1 && licz%10 != 0)
            {
                pom+=jedynastki[licz%10];
            }
            else
            {
              pom+=dziesiadki[(licz/10)%10]+jednosci[licz%10];
            }
            break;

        case 4:
            pom+="minus "+setki[(licz/100)%10];
            if ((licz/10)%10 == 1&&licz%10 != 0)
            {
                pom+=jedynastki[licz%10];
            }
            else
            {
              pom+=dziesiadki[(licz/10)%10]+jednosci[licz%10];
            }
            break;
        case 3:

                pom+="minus ";
            if ((licz/10)%10 == 1&&licz%10 != 0)
            {
                pom+=jedynastki[licz%10];
            }
            else
            {
              pom+=dziesiadki[(licz/10)%10]+jednosci[licz%10];
            }
            break;

        case 2:

            pom += "minus "+jednosci[licz%10];
            break;





        }
    }
    else
    {

        switch( (int)cyf.size())
        {
        case 4:
            pom+=tysiance[licz/1000]+setki[(licz/100)%10];

            if ((licz/10)%10 == 1 && licz%10 != 0)
            {
                pom+=jedynastki[licz%10];
            }
            else
            {
              pom+=dziesiadki[(licz/10)%10]+jednosci[licz%10];
            }
            break;

        case 3:
            pom+= setki[(licz/100)%10];
            if ((licz/10)%10 == 1&&licz%10 != 0)
            {
                pom+=jedynastki[licz%10];
            }
            else
            {
              pom+=dziesiadki[(licz/10)%10]+jednosci[licz%10];
            }
        case 2:


            if ((licz/10)%10 == 1&&licz%10 != 0)
            {
                pom+=jedynastki[licz%10];
            }
            else
            {
              pom+=dziesiadki[(licz/10)%10]+jednosci[licz%10];
            }
            break;

        case 1:
            pom+=jednosci[licz];
            break;


    }

}
    return pom;
}
3

nie wnikałem w szczegóły, ale ja bym liczby ujemne załatwił tak:

string zam_na_slownie(int licz) {
    if (licz<0) {
         return string("minus ")+zam_na_slownie(-licz);
    }
    ....
}

Albo jeszcze lepiej skorzystał ze strumieni:

ostream &slownie(ostream &wyj, int licz) {
      if (licz<0) {
            return slownie(wyj << "minus ", -licz);
      }
 ...
}
2
biku napisał(a):
... "tysianc " ... 

Doprawdy?

0

Rozbuduję trochę listę szokujących błędów ortograficznych.o to przekowertowana liczba na tekst
(I nie chodzi mi o literówkę w słowie przekowertowana.)

0

dzięki :) sory za ortografie
miałem tego nie wrzucać na forum ale nie chciało mi się poprawiać

1

A może podejdź do tego z innej strony ? Widzę, że korzystasz z integerów.. zastanów się co by było, gdybyś poznał ich maksymalną wartość (a jeżeli się uczysz, to na pewno widziałeś tą tabelę), następnie podzielił ją na pół i odjął liczby ujemnej ? Wykorzystasz wtedy to, że osiągając maksymalną liczbę ujemną integer 'przeskakuje' do maksymalnej dodatniej i odejmuje dalej.

Chodzi mi oczywiście o to, żeby dostać tą samą liczbę, tylko że dodatnią - dla której Twój skrypt działa.

Zobrazuje Ci to prostym przykładem:

 
Zakres liczb: od -10 do 10 (czyli razem 20 liczb)
Nasza liczba: -6

20/pół= 10

-6 -10 = -16
Biorąc pod uwagę przeskakiwanie, to cała operacja będzie wyglądała tak:
-6
-7
-8
-9
-10
+10
+9
+8
+7
+6 = wynik

Nie wiem niestety czy będzie to bezpieczne, to tylko taka wolna myśl :)

Edit:// Fachowo nazywa się to 'przepełnieniem' i może być interpretowane w zależności od kompilatora. Niestety nie jest to bezpieczna operacja według autora książki 'C++ Dla każdego' - Siddharta Rao

1

Proszę oto poprawiony program a prawdopodobnie przyczyna nie dziania tamtego leżała w linijce z licz=!licz chodziło o zmianę znaku
niestety ten operator działa zero jednakowo tylko i przesyłał zamieniał na zero sprawdziłem cout :) zamieniłem tą linijke na *-1 a poza tym skróciłem program jak sugerowaliście

 #include<iostream>
#include<string>
#include<sstream>


using namespace std;

string zam_na_slownie(int licz);


int main()
{
    cout<<"witaj Podaj Liczbe :";
    int licz;
    cin>>licz;
    cout <<"\n\n o to liczba zamieniona  na tekst :\n"<<zam_na_slownie(licz);

}


string zam_na_slownie(int licz)
{
    string jednosci[] = {"","jeden ","dwa ","trzy ","cztery ","piec ","szesc ","siedem ","osiem ","dziewiec "};
    string jedenastki[] = {"","jedynascie ","dwanascie ","trzynascie ","czternascie ","pientnascie ","szesnascie ","siedenascie ","osiemnascie ","dziewietnascie"};
    string dziesiatki[] = {"","dziesiec" ,"dwadziescia ","trzydziesci ","czterydziesci ","piecdziesiat ","szedziesiat ","siedemdziesiant ","osiemdziesiat ","dziewiecdziesiat "};
    string setki[] = {"","sto ","dwiescie ","trzysta ","czterysta ","piecset ","szescset ","siedemset ","osiemset ","dziewiecset "};
    string tysiace[] = {"","tysiac ","dwa tysiace ","trzy tysiace ","cztery tysiace ","piec tysiecy ","szesc tysiecy ","siedem tysiecy ","osiem tysiecy ","dziewiec tysiecy "};
    string pom,cyf;

    ostringstream na_str;




    if(0>licz)
    {
        licz=licz*-1;
        pom+="minus ";
    }
    na_str<<licz;
    cyf=na_str.str();

        switch( (int)cyf.size())
        {
        case 4:
            pom+=tysiace[licz/1000]+setki[(licz/100)%10];

            if ((licz/10)%10 == 1 && licz%10 != 0)
            {
                pom+=jedenastki[licz%10];
            }
            else
            {
              pom+=dziesiatki[(licz/10)%10]+jednosci[licz%10];
            }
            break;

        case 3:
            pom+= setki[(licz/100)%10];
            if ((licz/10)%10 == 1&&licz%10 != 0)
            {
                pom+=jedenastki[licz%10];
            }
            else
            {
              pom+=dziesiatki[(licz/10)%10]+jednosci[licz%10];
            }
         break;
        case 2:


            if ((licz/10)%10 == 1&&licz%10 != 0)
            {
                pom+=jedenastki[licz%10];
            }
            else
            {
              pom+=dziesiatki[(licz/10)%10]+jednosci[licz%10];
            }
            break;

        case 1:
            pom+=jednosci[licz];
            break;


        }
    return pom;
    }



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