Wątek przeniesiony 2014-03-26 14:33 z C/C++ przez ŁF.

Problem, zamiana liczby na napis

0

Witam,
Nie jestem i nigdy nie zamierzam być programistą, gdyż dla mnie to ciężki orzech do zgryzienia, ale z racji, że uczęszczam do technikum informatycznego jestem skazany na przedmiot taki jak Programowanie Strukturalne i Obiektowe. Z tego to właśnie przedmiotu dostałem następujące zadanie:
Wprowadź liczbę od 0 do 999 milionów i wypisz na ekran w formie słownej.
**Chcę zaznaczyć, iż nie proszę o gotowy program tylko o wskazówkę gdzie popełniam błąd, gdyż chce się czegoś nauczyć, celem bezproblemowego przebrnięcia przez ten przedmiot w przyszłości. **

Oto całość:

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

using namespace std;


int IS (string x, int n)
{
	int r=0;
	for(int i=0; i < n; i++)
          r = 10 * r + x[i] - 48;
    return r;
	
}

string t[5][20]={
    {"zero","jeden","dwa","trzy","cztery","piec","szesc","siedem","osiem","dziewiec","dziesiec","jedynascie","dwanascie","trzynascie","czternascie","pietnascie","szesnascie","siedemnascie","osiemnascie","dziewietnascie"},
    {"zero","dwadziescia","trzydziesci","czterdziesci","piecdziesiat","szescdziesiat","siedemdziesiat","osiemdziesiat","dziewiecdziesiat"},
    {"zero","sto","dwiescie","trzysta","czterysta","piecset","szescset","siedemset","osiemset","dziewiecset"},
    {"zero","tysiac","tysiace","tysiecy"},
    {"zero","milion","miliony","milionow"}
};

int main()
{
  string l;
  cin >> l;
  int n = l.length();
  int c = IS(l,n);

  if (n=1)
  {
  	cout << t[0][c] << endl;
  }
 else if (n=2)
  {
  	cout << t[1][c] << endl;
  }
  cout << c <<" "<< n <<endl;
}; 

Funkcja IS ma za zadanie zamienić string na int. Jeżeli przekroczę wartość 99 program przestaje działać a za powód podaje:

Proces exited with return value 3221225477
Press any key to continue . . .

Inny problem. Wpisując 20 otrzymuję napis 0, wpisując 21, dwadzieścia, co przewidywałem, gdyż jeszcze nie zajmowałem się kolejnymi liczbami, jednak, jeżeli piszę 22, to program wypisuje trzydzieści, itd. , aż wreszcie 28 to dziewięćdziesiąt. Kolejno od 29 do 99 nie wypisuje nic.

Proszę o pilną poradę, mam na to czas do piątku do 23:59, jednak chce to zrobić wcześniej, gdyż mam i zadania z innych przedmiotów do przerobienia.

0
if (n=1)
//
else if (n=2)

pewny jesteś że chciałeś tu zrobić przypisanie?

0

Powinno być

 #include <string>

Używając tablic wychodzisz poza jej zakresy, przepisz jeszcze raz tą część, oraz w instrukcji if kiedy do niej wchodzisz od razu do n przypisujesz 1, porównanie to jest == a nie =
W twoim przypadku np. dla liczby wprowadzonej 20 zwracasz dla niej int 20 i jak masz teraz n = 1 to wchodzisz w tą część i dla t[0][20] wychodzisz poza zakres tablicy.
Przy korzystaniu z cout wykorzystuje się << a nie samo <

Takie pierwsze spostrzeżenia.

0

Nie bardzo rozumiem co ma robić twoja funkcja IS, ale na pewno potrzebujesz zamiany liczby na string, to jest 123 na "123". pogóglaj jak to w C++ zrobić...

0

po co mu zamiana liczby na string?

on potrzebuje wyciągnąć cyfry na kolejnych pozycjach liczby, i na podstawie tych cyfr wybierać zdefiniowane stringi w tablicy czy tam mapie

trzeba pobawić potęgą 10, użyłbym działań / i % do tego

0

przykładowo liczba mod % 100 daję resztę z dzielenia przez 100 if(reszta > 19) { dzielimy przez 10 mamy dziesiątki; reszta mod 10 mamy jedności; } else { odwołaj się​ do wartości [reszta] } podziel przez 100 a potem % 10 aby wyznaczyć setki, po wykonaniu tego skróć liczbę o 3 ostatnie cyfry, np zamieniając na string usuń 3 elementy -> zrób teraz te same obliczenia co wyżej dla tysięcy potem dla milionów, koniec zadania

0

konwersja:

  string l;
  cin >> l;
  int c = atoi(l.c_str());

lub od razu:

int c;
  cin >> c;
0
_13th_Dragon napisał(a):

konwersja:

  string l;
  cin >> l;
  int c = atoi(l.c_str());

lub od razu:

int c;
  cin >> c;

Przy drugiej opcji może i łatwiej operować na intach, ale ciężej o długość ciągu znaków.

@Edit
Jak dzielić liczbę na części, najlepiej numerowane, czyli, mam dajmy na to 123321, chcę to podzielić na części o numerach 1(123) i 2(321). Jak takiego cudu dokonać?

@Edit2
Mam takie coś, liczy to do 999, znaczy wypisuje do 999. Teraz chcę to zapętlić zależnie od długości stringa, ale ni diabła, ni cholery, nie wiem jak, pomimo tego, że jakoś już to dzielę. Jednak wynik jest taki, że z 29999 wypisze mi 29, a jeżeli dam np. 288233, to cały program się wiesza.
Oto i kod.

Usunięto z powodu nowszej wersji

@Edit3
Stworzyłem wersję, która niby wypisuje od 0 do 999 mln, ale, kiedy przy większej liczbie dochodzi do setek, zaczynają się dziać niestworzone cuda. Oto ta wersja.

#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

string t[4][20]={
    {"zero","jeden","dwa","trzy","cztery","piec","szesc","siedem","osiem","dziewiec","dziesiec","jedynascie","dwanascie","trzynascie","czternascie","pietnascie","szesnascie","siedemnascie","osiemnascie","dziewietnascie"},
    {"zero","dwadziescia","trzydziesci","czterdziesci","piecdziesiat","szescdziesiat","siedemdziesiat","osiemdziesiat","dziewiecdziesiat"},
    {"zero","sto","dwiescie","trzysta","czterysta","piecset","szescset","siedemset","osiemset","dziewiecset"},
    {"zero","Tys","Mln"}
};

int main()
{
  string l;
  cin >> l;
  int n = l.length();
  int c = strtol(l.c_str(), NULL, 10);
  int a = 0;
	int g = n % 3; 
	
  
  if (n<=3)
  {
  
  

  if (c<=19)
  	cout << t[0][c];
 else if (n==2 && c>=20)
  {
  	a=(c-(10*(c/10)));
  	c=(c/10)-1;
  	if (a==0)
  		cout << t[1][c];
  	else 
  		cout << t[1][c] << " " << t[0][a];
  		
  	
  }
  else if (n==3)
  {	
  	a=(c-(100*(c/100)));
  	c=(c/100);
	if (a==0)
		cout << t[2][c];
	else if (a<=19)
		cout << t[2][c] << " " << t[0][a];
	else if (a>=20 && a<=99)
	{
		int b=(a-(10*(a/10)));
  		a=(a/10)-1;
  		if (b==0)
  			cout << t[2][c] << " " << t[1][a];
  		else 
  			cout << t[2][c] << " " << t[1][a] << " " << t[0][b];
	}
}

}
else if (n>3 && n<6 && g!=0)
{
	c = strtol((l.substr(0,g)).c_str(), NULL, 10);
	if (c<=19)
  	cout << t[0][c];
 	else if (g==2 && c>=20)
  {
  	a=(c-(10*(c/10)));
  	c=(c/10)-1;
  	if (a==0)
  		cout << t[1][c] << " " << t[3][1]<<" ";
  	else 
  		cout << t[1][c] << " " << t[0][a] << " " << t[3][1]<<" ";
  		
  	
  }
  c = strtol((l.substr(g,3)).c_str(), NULL, 10);
  a=(c-(100*(c/100)));
  	c=(c/100);
	if (a==0)
		cout << t[2][c];
	else if (a<=19)
		cout << t[2][c] << " " << t[0][a];
	else if (a>=20 && a<=99)
	{
		int b=(a-(10*(a/10)));
  		a=(a/10)-1;
  		if (b==0)
  			cout << t[2][c] << " " << t[1][a];
  		else 
  			cout << t[2][c] << " " << t[1][a] << " " << t[0][b];
	}
}
else if (n>3 && n<=6 && g==0)
{
	c = strtol((l.substr(0,3)).c_str(), NULL, 10);
	a=(c-(100*(c/100)));
  	c=(c/100);
	if (a==0)
		cout << t[2][c];
	else if (a<=19)
		cout << t[2][c] << " " << t[0][a];
	else if (a>=20 && a<=99)
	{
		int b=(a-(10*(a/10)));
  		a=(a/10)-1;
  		if (b==0)
  			cout << t[2][c] << " " << t[1][a]<<" "<< t[3][1]<<" ";
  		else 
  			cout << t[2][c] << " " << t[1][a] << " " << t[0][b]<<" "<< t[3][1]<<" ";
	}
	c = strtol((l.substr(3,3)).c_str(), NULL, 10);
  a=(c-(100*(c/100)));
  	c=(c/100);
	if (a==0)
		cout << t[2][c];
	else if (a<=19)
		cout << t[2][c] << " " << t[0][a];
	else if (a>=20 && a<=99)
	{
		int b=(a-(10*(a/10)));
  		a=(a/10)-1;
  		if (b==0)
  			cout << t[2][c] << " " << t[1][a];
  		else 
  			cout << t[2][c] << " " << t[1][a] << " " << t[0][b];
	}
}
else if (n>6 && n<9 && g!=0)
{
c = strtol((l.substr(0,g)).c_str(), NULL, 10);
	if (c<=19)
  	cout << t[0][c];
 	else if (g==2 && c>=20)
  {
  	a=(c-(10*(c/10)));
  	c=(c/10)-1;
  	if (a==0)
  		cout << t[1][c] << " " << t[3][2]<<" ";
  	else 
  		cout << t[1][c] << " " << t[0][a] << " " << t[3][2]<<" ";
  		
  	
  }
  c = strtol((l.substr(g,3)).c_str(), NULL, 10);
  a=(c-(100*(c/100)));
  	c=(c/100);
	if (a==0)
		cout << t[2][c];
	else if (a<=19)
		cout << t[2][c] << " " << t[0][a];
	else if (a>=20 && a<=99)
	{
		int b=(a-(10*(a/10)));
  		a=(a/10)-1;
  		if (b==0)
  			cout << t[2][c] << " " << t[1][a]<<" "<< t[3][1]<<" ";
  		else 
  			cout << t[2][c] << " " << t[1][a] << " " << t[0][b]<<" "<< t[3][1]<<" ";
	}
	c = strtol((l.substr(g+3,3)).c_str(), NULL, 10);
  a=(c-(100*(c/100)));
  	c=(c/100);
	if (a==0)
		cout << t[2][c];
	else if (a<=19)
		cout << t[2][c] << " " << t[0][a];
	else if (a>=20 && a<=99)
	{
		int b=(a-(10*(a/10)));
  		a=(a/10)-1;
  		if (b==0)
  			cout << t[2][c] << " " << t[1][a];
  		else 
  			cout << t[2][c] << " " << t[1][a] << " " << t[0][b];
	}
  
}
else if (n>6 && n<=9 && g==0)
c = strtol((l.substr(0,3)).c_str(), NULL, 10);
	a=(c-(100*(c/100)));
  	c=(c/100);
	if (a==0)
		cout << t[2][c];
	else if (a<=19)
		cout << t[2][c] << " " << t[0][a];
	else if (a>=20 && a<=99)
	{
		int b=(a-(10*(a/10)));
  		a=(a/10)-1;
  		if (b==0)
  			cout << t[2][c] << " " << t[1][a]<<" "<< t[3][2]<<" ";
  		else 
  			cout << t[2][c] << " " << t[1][a] << " " << t[0][b]<<" "<< t[3][2]<<" ";
	}
	c = strtol((l.substr(3,3)).c_str(), NULL, 10);
  a=(c-(100*(c/100)));
  	c=(c/100);
	if (a==0)
		cout << t[2][c];
	else if (a<=19)
		cout << t[2][c] << " " << t[0][a];
	else if (a>=20 && a<=99)
	{
		int b=(a-(10*(a/10)));
  		a=(a/10)-1;
  		if (b==0)
  			cout << t[2][c] << " " << t[1][a]<<" "<< t[3][1]<<" ";
  		else 
  			cout << t[2][c] << " " << t[1][a] << " " << t[0][b]<<" "<< t[3][1]<<" ";
	}
	c = strtol((l.substr(6,3)).c_str(), NULL, 10);
  a=(c-(100*(c/100)));
  	c=(c/100);
	if (a==0)
		cout << t[2][c];
	else if (a<=19)
		cout << t[2][c] << " " << t[0][a];
	else if (a>=20 && a<=99)
	{
		int b=(a-(10*(a/10)));
  		a=(a/10)-1;
  		if (b==0)
  			cout << t[2][c] << " " << t[1][a];
  		else 
  			cout << t[2][c] << " " << t[1][a] << " " << t[0][b];
	}
	else 
		cout << "Program mial byc maksymalnie do 999 Mln" << endl;


};
0

inne podejście

takie. o którym wspominałem wcześniej

dobry trening http://ideone.com/89Eutz

0

To jest koszmar !!
Do 999 999 999:

string WordlyPL(unsigned val)
  {
   static const char *Range[4][3]=
     {
        {"","",""},
        {"tysiąc ","tysiące ","tysięcy "},
        {"milion ","miliony ","milionów "},
        {"miliard ","miliardy ","miliardów "}
     };
   static const char *Digits[4][10]=
     {
        {"","jeden ","dwa ","trzy ","cztery ","pięć ","sześć ","siedem ","osiem ","dziewięć "},
        {"dziesięć ","jedenaście ","dwanaście ","trzynaście ","czternaście ","piętnaście ","szesnaście ","siedemnaście ","osiemnaście ","dziewiętnaście "},
        {"","","dwadzieścia ","trzydzieści ","czterdzieści ","pięćdziesiąt ","sześćdziesiąt ","siedemdziesiąt ","osiemdziesiąt ","dziewięćdziesiąt "},
        {"","sto ","dwieście ","trzysta ","czterysta ","pięćset ","sześćset ","siedemset ","osiemset ","dziewięćset "}
     };
   string result;
   if(!val) result="Zero ";
   else
     {
      for(unsigned i=0;val>0;++i,val/=1000)
        {
         unsigned n=val%1000,n1=val%10,n2=(val/10)%10,n3=(val/100)%10;
         string add(Digits[3][n3]);
         if(n2==1) add+=Digits[1][n1]; else add+=string(Digits[2][n2])+Digits[0][n1];
         if(n>0)
           {
            if(n2==1) add+=Range[i][2];
            else if((2<=n1)&&(n1<=4)) add+=Range[i][1];
            else if(n1!=1) add+=Range[i][2];
            else if((!n2)&&(!n3)) add+=Range[i][0];
            else add+=Range[i][2];
           }
         result=add+result;
        }
     }
   return result;
  }

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