Zwiekszanie wielkości tablicy dynamicznej

0

Mam program który powienien wczytywać 5 ciągów znaków, potem zwiększać tablicę o 5 i wczytać 5 nastepnych ciągów, ale tego nie robi. Co jest źle?
PS Wiem że zmienne w klasach nie powinny być tak deklarowane.

#include <iostream>
#include <string>
using namespace std;
class Array
{
	int operation;	//zmienna do forów
	int value=5;	//wielkosc tablicy
	int counter=0;	//numer komorki
	string *namesArray=new string[value];
	public:
	
	Array()
	{
	}

	void print()
	{
		cout<<"Dane:"<<endl;
		for(operation=0;operation<value;operation++)
		{
			cout<<namesArray[operation]<<endl;
		}
	}
	void names(string data)
	{
		if(counter==value)
		{
			string *namesBigger;
			namesBigger=new string[value*2];
			for(operation=0;operation<value;operation++)
			{
				namesBigger[operation]=namesArray[operation];
			}
			namesArray=namesBigger;	
			
		}		
		namesArray[counter]=data;
		counter++;
			
	}
};


int main()
{
	Array add;
	string name;
	for(int operation=0;operation<10;operation++)
	{
		cout<<"Podaj dane"<<endl;
		cin>>name;
		add.names(name);
		add.print();
	}
}
3

1.int operation; //zmienna do forów - nie możesz w takim razie jej zrobić po prostu lokalnej? Dodatkowo zamiast operation nazwij ją po prostu i (od iteratora).

2.int value=5; //wielkosc tablicy - jak brzmi sam komentarz, pole to reprezentuje wielkość tablicy (size/capacity), a nie wartość tablicy (value), zatem zmień nazwę na adekwatną.

3.string *namesArray - nazwa zmiennej z reguły nie powinna zawierać jej typu. Samo names wystarczy.

4.void names(string data) - funkcje coś robią, zatem w ich nazwie powinien znaleźć się czasownik. Twoja metoda na przykład dodaje imię do listy, zatem powinna nazywać się addName i przyjmować parametr string name, a nie jakieś data.

potem zwiększać tablicę o 5

Dlaczego więc w Twoim kodzie rozmiar tablicy podwajasz, a nie zwiększasz o pięć?
Tak, akurat w tym konkretnym wypadku nastąpi powiększenie o 5 za pierwszym razem, lecz nie zgadza się to do końca z Twoim opisem.

ale tego nie robi. Co jest źle?

Wiemy, że tego nie robi, bo inaczej przecież byś na forum nie przyszedł.
Opisz to, co się dzieje zamiast oczekiwanego zachowania, a nie samo no nie działa mi.

PS Wiem że zmienne w klasach nie powinny być tak deklarowane.

Pierwsze primo: pola.
Drugie primo: skoro wiesz, popraw kod i wróć z poprawkami ;-) Wtedy będziemy się zastanawiać co jest nie tak.
To brzmi jak:

Dlaczego moje ciasto źle smakuje?
PS wiem, że nie powinno się piec ciasta w 500 stopniach celsjusza.
0

Zwróć uwagę na Twoją zmienną value.

Przez pierwsze 4 dodania jest OK, bo value ma wartość 5, co się zgadza bo i tyle ma miejsc tablica.
W 5 wywołaniu wykonuje nam się if (tak jak oczekiwano), który:

  1. Tworzy tablicę o podwojonym rozmiarze (czyli 10 miejsc)
  2. Przepisuje zmienne od 0 to 4 ( i < value, gdzie value = 5)
  3. Nowo powstałą tablicę przypisujemy do zmiennej namesArray

A potem:

  1. Dodajemy nowe imię do tablicy
  2. Do counter dodajemy 1.

Wartość w value nie jest zmieniana kiedy tablica jest powiększana, co oczywiście jest błędem.
Mimo że nowe wartości dodają się do tablicy, to jednak nie są wyświetlane bo w operacji print sprawdzasz zmienną w pętli bazując na value które cały czas ma wartość 5.
Musisz więc dodać w if'ie w names():

value += 5;

Oczywiście po wprowadzeniu poprawki gdzie tablica będzie powiększana o 5 miejsc.

0

@atmal zapomniałeś o jednym ważnym kroku - zwalnianiu starej tablicy....

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