jaresxeni 0 Napisano 12 Listopada 2013 Udostępnij Napisano 12 Listopada 2013 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
Luki91 157 Napisano 12 Listopada 2013 Udostępnij Napisano 12 Listopada 2013 (edytowane) 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 12 Listopada 2013 przez Luki91 1 Link to post Share on other sites
Rozwiązanie jaresxeni 0 Napisano 12 Listopada 2013 Autor Rozwiązanie Udostępnij Napisano 12 Listopada 2013 (edytowane) 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 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 12 Listopada 2013 przez jaresxeni Link to post Share on other sites
Recommended Posts