wstawianie i usuwanie wiersza w tablicy dynamicznej

0

Cześć potrzebuje pomocy w zadaniu

Utwórz dynamiczną tablicę dwuwymiarową i wypełnij ją liczbami rzeczywistymi. Napisz w
tym celu funkcję utworz_tab, która utworzy tablicę i zwróci wskaźnik do niej. Następnie
napisz funkcję wypisz, która wypisuje tablicę na ekranie. Następnie napisz funkcję
wstaw_wiersz, która wstawia do tablicy dodatkowy wiersz na zadanej pozycji. Na koniec
napisz funkcję usun_wiersz, która usuwa z tablicy wiersz o podanym indeksie. Funkcje muszą
być tak napisane aby nie można było dodać ani usunąć wiersza poza zakresem tablicy, przy
czym dopuszczalne jest dodawanie i usuwanie wierszy na początku i na końcu tablicy.
Przykładowe deklaracje wymienionych funkcji:
float** utworz_tab(unsigned int n, unsigned int m);
void wypisz(float tab, unsigned int n, unsigned int m);
float
wstaw_wiersz(float *tab, unsigned int &n, unsigned int m, float wiersz, unsigned int
pozycja);
float
usun_wiersz(float **tab, unsigned int &n, unsigned int m, unsigned int pozycja);
Zwróć uwagę, że parametr n określający liczbę wierszy w tablicy przekazywany jest przez
referencję, ponieważ podczas usuwania/dodawania wierszy zmienia się jego wartość.
Do testowania programu trzeba użyć poniższy kod sprawdzający (należy skopiować go do
bloku main() w swoim programie):

const unsigned int w=2, k=3;
float dane[w][k]={{2.5,3,5} , {3,-2.5,1}};
unsigned int w1=w, k1=k;
float **tab=utworz_tab(w, k);
for (unsigned int i=0; i<w1; i++)
for (unsigned int j=0; j<k1; j++)
tab[i][j]=dane[i][j];
cout<<"Tablica:"<<endl;
wypisz(tab, w1, k1);
float *wiersz=new float[k1];
for (unsigned int j=0; j<k1; j++)
wiersz[j]=0;
unsigned int poz=1;
cout<<"Proba wstawienia wyzerowanego wiersza na pozycji "<<poz<<endl;
tab=wstaw_wiersz(tab, w1, k1, wiersz, poz);
wypisz(tab, w1, k1);
poz=0;
cout<<"Proba wstawienia wyzerowanego wiersza na pozycji "<<poz<<endl;
tab=wstaw_wiersz(tab, w1, k1, wiersz, poz);
wypisz(tab, w1, k1);
poz=w1;
cout<<"Proba wstawienia wyzerowanego wiersza na pozycji "<<poz<<endl;
tab=wstaw_wiersz(tab, w1, k1, wiersz, poz);
wypisz(tab, w1, k1);
poz=20;
cout<<"Proba wstawienia wyzerowanego wiersza na pozycji "<<poz<<endl;
tab=wstaw_wiersz(tab, w1, k1, wiersz, poz);
wypisz(tab, w1, k1);
poz=0;
cout<<"Proba usuniecia wiersza na pozycji "<<poz<<endl;
tab=usun_wiersz(tab, w1, k1, poz);
wypisz(tab, w1, k1);
poz=w1-1;
cout<<"Proba usuniecia wiersza na pozycji "<<poz<<endl;
tab=usun_wiersz(tab, w1, k1, poz);
wypisz(tab, w1, k1);
poz=1;
cout<<"Proba usuniecia wiersza na pozycji "<<poz<<endl;
tab=usun_wiersz(tab, w1, k1, poz);
wypisz(tab, w1, k1);
poz=20;
cout<<"Proba usuniecia wiersza na pozycji "<<poz<<endl;
tab=usun_wiersz(tab, w1, k1, poz);
wypisz(tab, w1, k1);
2

Cześć, zawsze chętnie pomagamy! Z czym masz problem w tym zadaniu?

0

float** utworz_tab(unsigned int n, unsigned int m)
{
        float **tab = new float *[n];
        for( int i = 0; i < n; i++ )
            tab [i] = new float [m];
            
           
            
    return  tab;
}

void wypisz(float **tab, unsigned int n, unsigned int m)
{
	
		for (int i  = 0; i < n; ++i)
		{
			for( int j = 0 ; j < m ; ++j)
				cout<<" \t"<<tab[i][j];	
			cout<<endl;
		}			
}

float** wstaw_wiersz(float **tab, unsigned int &w, unsigned int k, float *wiersz, unsigned int pozycja)
{
	
	for (int i  = 0; i < w; ++i)
		{
			for( int j = 0 ; j < k ; ++j)
			{
				if(i == pozycja)
				{
					tab[pozycja][j] = *wiersz;
					
								
				}
			}
				
 	}
		return tab;
	
	
}


@kq: cześć dzięki za odpowiedz :)
na razie wygląda to tak jak wyżej , nie bardzo wiem co wstawić w warunku bo teraz zeruje wszystkie wiersze .

2

nie bardzo wiem co wstawić w warunku bo teraz zeruje wszystkie wiersze

Przekazujesz wyzerowany wiersz, więc wszystko działa jak powinno.

for (unsigned int j=0; j<k1; j++)
  wiersz[j]=0;
  
unsigned int poz=1;
cout<<"Proba wstawienia wyzerowanego wiersza na pozycji "<<poz<<endl;
tab=wstaw_wiersz(tab, w1, k1, wiersz, poz);

wstaw_wiersz jest błędnie zaimplementowane. Pomijając już niepotrzebną jedną pętle, w każdą komórkę wstawiasz wartość z pierwszej komórki wiersza tab[pozycja][j] = *wiersz;. Implementacja tej funkcji mogłaby wyglądać w ten sposób

for( int j = 0 ; j < k ; ++j)
  tab[pozycja][j] = wiersz[j];

return tab;

Ale nadal będziesz mieć wstawiowe zera, bo jak pisałem, przekazałaś wiersz gdzie każda komórka ma taką wartość.

0

Przepraszam muszę sprostować ,bo źle wytłumaczyłam działanie tych funkcji
Funkcja wstaw_wiersz ma wstawiać wiersz na określoną pozycję , wypełniać ten wiersz wartościami zadeklarowanymi pod zmienną wiersz( w tym wypadku zerami ) i przesuwać pozostałe wiersze . Funkcja też musi sprawdzać czy podana pozycja nowego wiersza nie wychodzi poza zakres czyli wielkość macierzy .
Funkcja usun_wiersz ma mieć analogiczne działanie.

Prawidłowe działanie programu
Tablica:
2.5 3 5
3 -2.5 1
Proba wstawienia wyzerowanego wiersza na pozycji 1
2.5 3 5
0 0 0
3 -2.5 1
Proba wstawienia wyzerowanego wiersza na pozycji 0
0 0 0
2.5 3 5
0 0 0
3 -2.5 1
Proba wstawienia wyzerowanego wiersza na pozycji 4
0 0 0
2.5 3 5
0 0 0
3 -2.5 1
0 0 0
Proba wstawienia wyzerowanego wiersza na pozycji 20
0 0 0
2.5 3 5
0 0 0
3 -2.5 1
0 0 0
Proba usuniecia wiersza na pozycji 0
2.5 3 5
0 0 0
3 -2.5 1
0 0 0
Proba usuniecia wiersza na pozycji 3
2.5 3 5
0 0 0
3 -2.5 1
Proba usuniecia wiersza na pozycji 1
2.5 3 5
3 -2.5 1
Proba usuniecia wiersza na pozycji 20
2.5 3 5
3 -2.5 1

1

I co konkretnie jest tutaj nie jasne? W komentarzach już napisałem, że musisz w takim układzie zrobić realloc. C++ nie ma kanonicznego odpowiednika do realokacji dla pamięci stworzonej przez new, bo do tablic domyślnie powinnaś używać std::vector, tak więc jeśli chcesz to robić ręcznie będziesz musiała użyć realloc z C więc dla samej inicjalizacji doradzałbym przerzucenie się na malloc. Twój kod i tak nie ma z C++ za wiele wspólnego.

0

zdecydowanie chcę to zrobić ręcznie . W tego typu ćwiczeniach nie chodzi o funkcjonalność a o rozumienie jak działa dana funkcja .

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