Skocz do zawartości

Zamiana liczby na słowo w c++


Idź do rozwiązania Problem ogarnięty przez jaresxeni,

Recommended Posts

Witam, mam problem z programem napisanym w języku c++. 
W programie mamy podaj jakąś liczbe z zakresu 1-999 a on ma nam ją zapisać słownie.

Napisałem cały program, który działa prawie bez błednie, tzn wypisuje wszystkie liczby ale gubi się przy jednej mianowicie 111, wiem dlaczego ale nie mam pomysłu jak to naprawić. Poniżej podaje cały kod prograu. Z góry dziękuje za pomoc.
 

#include <iostream>
#include <math.h>
#include <string>

using namespace std;

string jednosci[10]={"","jeden ","dwa ","trzy ","cztery ","piec ","szesc ","siedem ","osiem ","dziewiec "};
string nastki[11]={"","dziesiec ","jedenascie ","dwanascie ","trzynascie ","czternascie ","pietnascie ","szesnascie ","siedemnascie ",
                   "osiemnascie ","dziewietnascie "};
string dziesiatki[10]={"","dziesiec ","dwadziescia ","trzydziesci ","czterdziesci ","piecdziesiat ","szescdziesiat ","siedemndziesiat ",
                      "osiemdziesiat ","dziewiecdziesiat "};
string setki[10]={"","sto ","dwiescie ","trzysta ","czterysta ","piecset ","szescset ","siedemset ","osiemset ","dziewiecset "};


int main()
{
    int j=0,liczba,koncowka,k=1;
    string i,slownie="";

//------- Petla pozwalajaca wpisac kolejne cyfry ---------------

    while(k>0)
    {
        if(k>1)
        {
            cout<<"chcesz podac jeszcze raz ? (TAK/NIE)\n";
            cin>>i;
            cout<<endl;

        if(i=="TAK"||i=="tak"||i=="Tak")
        {
           k=1;
           j=0;
           slownie="";
        }
        else
            return 0;
        }

//-------- Pogram zamieniajacy na slowa --------------

        cout<<"podaj liczbe z zakresu 1-999 \n";
        cin >> liczba;
        if (liczba<1||liczba>999)
        {
            cout<<"liczba nie jest z zakresu 1-999";
            return 0;
        }

        do
        {
            koncowka = liczba % 10;
            liczba = liczba / 10;

            if (j==2)
            {
                slownie=setki[koncowka]+slownie;


            }

            if (j==1)
            {
                slownie=dziesiatki[koncowka]+slownie;

            }

            if (j==0 && (liczba%10!=1))
            {
                 slownie=jednosci[koncowka]+slownie;

            }

            if (j==0 && (liczba%10==1))
            {
                slownie=nastki[koncowka+1]+slownie;
                liczba=liczba/10;


            }
             j=j+1;
        }
        while(liczba>0);
        k++;

    cout << slownie <<endl<<"----------------- \n"<<endl;
    }
    return 0;
}

Link to post
Share on other sites
działa prawie bez błednie, tzn wypisuje wszystkie liczby ale gubi się przy jednej mianowicie 111

 

No niestety nie tylko przy jednej. Moje testy:

podaj liczbe z zakresu 1-999
111
dziesiec jedenascie
-----------------

chcesz podac jeszcze raz ? (TAK/NIE)
tak

podaj liczbe z zakresu 1-999
110
dziesiec dziesiec
-----------------

chcesz podac jeszcze raz ? (TAK/NIE)
tak

podaj liczbe z zakresu 1-999
700
siedemset
-----------------

chcesz podac jeszcze raz ? (TAK/NIE)
tak

podaj liczbe z zakresu 1-999
219
dwadziescia dziewietnascie
-----------------

chcesz podac jeszcze raz ? (TAK/NIE)

Zamiast "sto" bierzesz "dziesięć", zamiast "dwieście" bierzesz "dwadzieścia".

I dzieje się tak z tego co widzę dla wszystkich liczb gdzie jest n-set x-naście (czyli gdy jest n setek i naście jedności).

Problemy sprawia linijka 77 

if (j==0 && (liczba%10==1))
{
    slownie=nastki[koncowka+1]+slownie;
    liczba=liczba/10;


}

Jednak usunięcie tej linijki powoduje niepoprawne wyświetlanie nastek. Tak więc musisz wykombinować tak, żeby to dzielenie nie psuło wypisywania setek (np. po wypisaniu nastek 'cofasz' to dzielenie mnożąc *10).

Edytowane przez Luki91
  • Popieram 1
Link to post
Share on other sites
  • Rozwiązanie

O ładnie ;/ nie wiem jak to sprawdzałem że nie za uważyłem tego. No i teraz się okazało że jest pełno błędów a ja sobie niemogłęm z jednym poradzić 

 

 

Dziękuje za pomoc @Luki91 twoje sugestie bardzo mi pomogły, dodanie nowej zmiennej i edycja jednego warunku przyniosły pozytywny skutek jeszcze tylko sprawdze czy aby na pewno działą dla wszystkich liczb :D 


Tak wyglada poprawny kod tego programu (program sprawdiłem ale nie daje 100% pewności bo znowu mogłem coś przeoczyć) może komuś sie przyda jeszcze :) Jeszcze raz dziękuje @Luki91 za szybką pomoc.

#include <iostream>
#include <math.h>
#include <string>

using namespace std;

string jednosci[10]={"","jeden ","dwa ","trzy ","cztery ","piec ","szesc ","siedem ","osiem ","dziewiec "};
string nastki[11]={"","dziesiec ","jedenascie ","dwanascie ","trzynascie ","czternascie ","pietnascie ","szesnascie ","siedemnascie ",
                   "osiemnascie ","dziewietnascie "};
string dziesiatki[10]={"","dziesiec ","dwadziescia ","trzydziesci ","czterdziesci ","piecdziesiat ","szescdziesiat ","siedemndziesiat ",
                      "osiemdziesiat ","dziewiecdziesiat "};
string setki[10]={"","sto ","dwiescie ","trzysta ","czterysta ","piecset ","szescset ","siedemset ","osiemset ","dziewiecset "};


int main()
{
    int j=0,liczba,koncowka,k=1,c=0;
    string i,slownie="";

//------- Petla pozwalajaca wpisac kolejne cyfry ---------------

    while(k>0)
    {
        if(k>1)
        {
            cout<<"chcesz podac jeszcze raz ? (TAK/NIE)\n";
            cin>>i;
            cout<<endl;

        if(i=="TAK"||i=="tak"||i=="Tak")
        {
           k=1;
           j=0;
           slownie="";
        }
        else
            return 0;
        }
//-------- Pogram zamieniajacy na slowa --------------

        cout<<"podaj liczbe z zakresu 1-999 \n";
        cin >> liczba;
        if (liczba<1||liczba>999)
        {
            cout<<"liczba nie jest z zakresu 1-999";
            return 0;
        }

        do
        {
            koncowka = liczba % 10;
            liczba = liczba / 10;

            if (j==3||(j==2&&c!=1))
            {
                slownie=setki[koncowka]+slownie;


            }

            if (j==1)
            {
                slownie=dziesiatki[koncowka]+slownie;

            }

            if (j==0 && (liczba%10!=1))
            {
                 slownie=jednosci[koncowka]+slownie;

            }

            if (j==0 && (liczba%10==1))
            {
                slownie=nastki[koncowka+1]+slownie;
                liczba=liczba*10;
                c=1;


            }
             j=j+1;
        }
        while(liczba>0);
        k++;
        c=0;

    cout << slownie <<endl<<"----------------- \n"<<endl;
    }
    return 0;
}

Edytowane przez jaresxeni
Link to post
Share on other sites
Gość
This topic is now closed to further replies.
  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...