Program oddzielający grupy 3-cyfrowe [Solved]


(Tomasz Gawron) #1

Witam, mam zadanie o nastepującej treści "Napisz funkcję, która zależy od jednego arumentu - liczby całkowitej. Zaś zwraca napis (ciąg cyfr) reprezentujący podaną liczbą z oddzieleniem grup 3-cyfrowych przy pomocy przecinka np:1234567 => 1,234,567. Funkcja zwracać powinna wskaźnik do tablicy char"

Oto co ja napisałem:

#include 

#include 


using namespace std;

string cyfry;


char *funkcja(int dlugosc)

{

	int i, j=0;

	int k=dlugosc+dlugosc/3;

	char *cyfry1;

	cyfry1=new char[k];

	for(i=(dlugosc-1); i>=0; i--)

	{

		if(j==0)

		goto dalej;

		if((j%3)==0)

		{

		cyfry1[k]=(char)44;

		k=k-1;

		}

		dalej:

		cyfry1[k]=cyfry[i];

		k=k-1;

		j=j+1;

	}

	return cyfry1;

	delete cyfry1;

}


int main()

{

	char *cyfry1;

	cout<<"Podaj ciąg cyfr: ";

	getline(cin, cyfry);

	int dlugosc=cyfry.length();

	cyfry1 = funkcja(dlugosc);

	cout<
	return 0;

}

Niestety nie wiem dlaczego po wywołaniu nie zwraca ona żadnej wartości. Gdy włożyłem do mojej funkcji "cout" po każdym zapisie znaku do nowej tablicy to wartości były poprawe, ale gdy już starałem się wydrukować wyniki po zakończeniu pętli for to ich "nie ma". Proszę o pomoc.


(MietekN) #2

Zamień blok:

{

      if(j==0) goto dalej;

      if((j%3)==0)

      {

        k--;

        cyfry1[k]=(char)44;

      }

      dalej:

      k--;

      cyfry1[k]=cyfry[i];

      j++;

}

Błąd polegał na tym że powinno być k-1 a nie k jako indeks cyfra1. Wystarczyło linie k=k-1 przenieść wyżej by osiągnąć ten rezultat. Zapis k-- to to samo tylko w prostszym zapisie.

Skasuj też linie

delete cyfry1;

bo w tym miejscu i tak nic nie robi.

Proponował bym też przerobić program by nie było w nim instrukcji goto , tego typu skoków należy unikać by kod był czytelniejszy.


([alex]) #3

To co podałeś jest straszne!

#include using namespace std;

(Tomasz Gawron) #4

Dziękuję za pomoc, po kilku zmianach wszystko działa.

Co do Twojej odpowiedzi alex mam dwa pytania:

1) "nie możesz użyć getline dla zmiennej wskaźnikowej, musi być tablica" - dlaczego?

Poza tym, co jeśli zamierzam wprowadzić więcej niż 100 liczb?? Nie uda mi się bo tablica jest za mała dlatego też nie może zrobić tak jak zaproponowałeś.

2) przy próbie kompilacji Twojego kodu mam błąd

"cyfry1.cpp: In function ‘char* funkcja(const char*)’:

cyfry1.cpp:6: error: ‘strlen’ was not declared in this scope"

ale to już jest mniej ważne - pytam tylko z ciekawości.


([alex]) #5
  1. Jeżeli masz wskaźnik:

char *tb;

to wskazuje ona na nieokreślony obszar w pamięci, getline będzie próbować w ten obszar wpisać to co wpisze użytkownik z klawiatury - gwarantowany Access Violation.

Jak potrzebujesz więcej to zwiększ ze 100 do 1000, jak potrzebujesz bez ograniczenia to albo użyj:

string s;

getline(cin,s);

lub sklejaj dynamicznie z fragmentów używając strlen() i cin.gcount() do określenia czy wczytał już cały wiersz.

  1. Dołącz większość kompilatorów ma to podpięte pod

  2. Naucz się myśleć i działać samodzielnie, problem z strlen wpisz w google "cplusplus strlen" pierwszy link będzie akurat na temat, w pierwszych 3-ch wierszach będziesz miał informacje o


(Tomasz Gawron) #6

To czyż nie tak miałem??

string cyfry;

getline(cin, cyfry);

Popraw mnie jeśli się mylę ale ja nie widzę różnicy w mojej deklaracji a w Twojej, stąd też moje pytanie dlaczego jest ona błędna.


([alex]) #7

miałeś:

char *cyfry;

a to nie jest to samo co:

string cyfry;


(Tomasz Gawron) #8

Przeczytaj dokladnie i mój kod :), szczególnie linijki 31 oraz 5. Jest wyraźnie "char *cyfry 1" oraz "string cyfry".


([alex]) #9

Racja, nie zauważyłem zmiennej globalnej.