Witam,
Mam zadanie, żeby napisać funkcję opisującą słownie jakąś liczbę (przesłaną jej jako argument). Rezultatem tej funkcji ma być string z tym opisem.
OK. Na razie udało mi się napisać funkcję do tego momentu, gdzie poprawnie opisuje ona ilość tysięcy i setek. I teraz pojawił się problem - przy opisywaniu dziesiątek (skomplikowane wyrażenie) dostaję taki błąd:
//"terminate called after throwing an instance of 'std::length_error'
what(): basic_string::S_create
Aborted (core dumped)"//
Widzę, że chodzi o coś z długością stringu... Ale o co? Przecież klasa sama rezerwuje sobie miejsce na znaki...
A oto mój program:
#include <iostream>
#include <string>
using namespace std;
string Slownie(int liczba);
int main()
{
string slownie = Slownie(5225);
cout << slownie;
}
string Slownie(int liczba)
{
string opis;
string jednostki[] = {"zero", "jeden", "dwa", "trzy", "cztery", "piec", "szesc", "siedem", "osiem", "dziewiec"
"jedenascie", "trzynascie", "czternascie" "pietnascie", "szesnascie", "siedemnascie", "osiemnascie", "dziewietnascie"};
string dziesiatki[] = {"dziesiec", "dziescia", "dziesci", "dziesci", "dziesiat", "dziesiat", "dziesiat", "dziesiat", "dziesiat"};
string setki[] = {"zero", "sto", "dwiescie","trzysta", "czterysta", "piecset", "szescset", "siedemset", "osiemset", "dziewiecset"};
string tysiace[] = {"zero", "tysiac", "tysiace", "tysiace", "tysiace", "tysiecy", "tysiecy", "tysiecy", "tysiecy", "tysiecy"};
if(liczba < 0) {opis += "minus "; liczba = (-liczba);} // Dla liczb ujemnych
if(liczba >= 1000) // Dla tysięcy
{
opis += jednostki[static_cast<int>(liczba / 1000)];
opis += ' ';
opis += tysiace[static_cast<int>(liczba / 1000)];
opis += ' ';
}
if((liczba - static_cast<int>(liczba / 1000)) >= 100) // Dla setek
{
opis += setki[static_cast<int>((liczba - (static_cast<int>(liczba / 1000) * 1000)) / 100)];
opis += ' ';
}
if(liczba - static_cast<int>((liczba / 1000) + liczba / 100) >= 20) // Dla dziesiatek
{
string liczba_dziesiatki = dziesiatki[static_cast<int>((liczba - ((static_cast<int>(liczba / 1000) * 1000) + (static_cast<int>(liczba / 100)) * 100)) / 100)]; // Tu mamy błąd
opis += jednostki[static_cast<int>((liczba - ((static_cast<int>(liczba / 1000) * 1000) + (static_cast<int>(liczba / 100)) * 100)) / 100)];
opis += liczba_dziesiatki;
opis += ' ';
}
return opis;
}
Wiem, że mógłbym ten program wyposażyć w zmienne i nieco skrócić wyrażenia w operatorach [], ale myślę, że tak łatwiej będzie znaleźć błąd. Liczę na waszą pomoc.