Czy można?
Jeśli mam taką tablicę dwuwymiarową:
333444
4433
333344
I chcę zrobić
333444
4433
33334
Muszę użyć malloc i free
Czy można wstawić biały znak,spację do tablicy typu int?
Najprościej, całkowicie na chłopski rozum: Nie można, ponieważ jest to tablica licz całkowitych, a czy spacja jest liczbą całkowitą? I naturalnie nie chodzi mi tutaj o kod ASCII. ;-)
Pokaż w ogóle treść zadania.
W C++? Jaka idea za tym stoi?
No ale skoro _musisz_¹ — przebiegasz tablicę raz, w poszukiwaniu wyrażeń, które nie zostaną usunięte. Jak już wiesz, ile ich będzie, to malloc
-iem tworzysz nową tablicę, o potrzebnym rozmiarze, przepisujesz co chcesz i free
zwalniasz starą pamięć.
¹ Jeśli robisz to na potrzeby jakiegoś kursu na studiach czy gdzieś, to spróbuj o tym zapomnieć jak tylko go zaliczysz…
@Render125: to cały czas jest problem XY, albo to zrozumiesz i zadasz zrozumiałe pytanie, albo będziesz tylko marzył o odpowiedzi, którą ci potrzebna.
tab=(int**)malloc(n*sizeof(int*)); ///alokacja pamieci dla wierszy
for(int i=0; i<n; i++)
{
tab[i]=(int*)malloc(t[i]*sizeof(int)); ///alokacja pamieci dla kolumn
}
/// Przypisanie wartoœci
cout<<endl;
cout<<"WYPELNIJ KAZDA Z TABLIC(Pamietaj ze mozesz tylko raz wpisac zero): ";
for(int i=0; i<n; i++)
{
tab[i]=(int*)malloc(t[i]*sizeof(int));
for ( int j = 0; j < t[i]; ++j)
{
cout<<"Element nr "<<j<<" :";
cin>>tab[i][j];
}
}
Gdyby nie test z kodu to nadal nie wiadomo by było na czym polega problem, a tak łącząc to z innym postami to można się domyśleć (ledwo):
for (int i = 0; i < n; i++) {
for (int j = 0; j < t[i]; ++j) {
if (tab[i][j]) {
cout << setw(6) << tab[i][j];
} else {
cout << std::string(6, ' ');
}
}
cout << '\n';
}
grzesiek51114 napisał(a):
Pokaż w ogóle treść zadania.
Ogólnie to mam stworzyć tablicę dwuymiarową i dokonać kilku modyfikacji
211122222
11220212
22222111
111123
222222
1
11111
Po wciśnięciu U wszystkie elementy bezpośrednio poniżej 0 przenoszą się o polę w górę.
211122222
11222212
22222111
111123
2222 2
1
11111
Następnie wyrównujemy planszę do lewej, to znaczy "łatamy" luki w wierszu poprzez przesunięcie elementów po lukach w lewo.
211122222
11222212
22222111
111123
22222
1
11111
Patrzymy, jaka liczba weszła na miejsce 0: w naszym przykładzie jest to 2. Usuwamy z tablicy wszystkie pola, do których da się dotrzeć ruchami tylko w prawo i lewo albo tylko w górę i w dół bez przechodzenia przez pole o innej wartości (w naszym przykładzie przez pola o wartości innej niż 2). Przywracamy 0 na pole, w którym znajdowało się wcześniej
2111 2222
11 0 12
2222 111
1111 3
2222
1
11111
Na koniec robimy wyrównianie w lewo.
21112222
11012
2222111
11113
2222
1
11111