Czy można?
Tak, będzie wstawiona jako wartość tego znaku. Ale po co?
No właśnie chcę wstawić biały znak do int nie jako wartość liczbową tylko jako biały znak.
Nie możesz, bo to tablica int. Zresztą konwersja w obie strony jest bezstratna, więc o co chodzi?
Potrzebuję tablicy która może przechowywać znak biały a kiedy j ą wyświetle to będzie widoczny odstęp.
Czyli standardowo problem XY.
Owszem, możesz zaenkodować specjalne wartości w tablicy, ale poprawne rozwiązanie to:
Oprogramuj poprawnie wyświetlanie danych zamiast bawić się w takie hacki.
A z cyklu „rozwiązanie poprawne, ale zupełnie nie takie, o które autorowi chodziło”: nie, ale możesz użyć std::variant<int, char>
.
A można usunąć konkretny element z tablicy ?
Nie, tablica jest kontenerem statycznym w takim sensie, że raz zadeklarowana ma z góry zadaną wielkość. Jeśli chcesz usuwać elementy, to rozwiązaniem jest na przykład std::list
.
A jeśli jest to tablica dynamiczna?
To deklarujesz mniejszą tablicę i przepisujesz do niej z tej starej tablicy tylko te elementy, które mają być dalej używane, ale to mało efektywne.
Od tego jest std::list
.
Jest jeszcze tablica dynamiczna std::vector
, która umie takie rzeczy.
Jeśli mam taką tablicę dwuwymiarową:
333444
4433
333344
I chcę zrobić
333444
4433
33334
to albo jak czlowiek uzyj std::vector i zapomnij o tablicach albo tworzysz nowa tablice, przepisujesz stara do nowej po za elementami ktore chcesz usunac i usuwasz stara (zwalniasz pamiec)
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';
}
Co robi ten kod?
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
Mam już tablicę i program znajduje zero i podstawia ale nie wiem jak dokonać tego przesunięcia i jak wykorzystać tutaj funkcja realloc.
Czyli będę musiał przekopiować funkcją realloc do nowej mniejszej którą zrobię funkcją malloc?
Sugerowałbym przepisywać element po elemencie. Im mniej bezpośredniej zabawy na pamięci, tym mniejsza szansa na błąd.
Czyli przepisać do nowej tablicy do określonego elementu a starą usunąć?
Tak jest najłatwiej i najtrudniej wtedy o błąd. Nie jest to najszybsze rozwiązanie, ale za to najpewniejsze, więc to je będę poleca z braku dodatkowych przesłanek.
I tak za każdym razem trzeba usuwać starą tablicę?
Tak. Skoro nie chcesz skorzystać ze zautomatyzowanych kontenerów, takich jak std::list
, to nie masz automatyzacji i wszystko robisz ręcznie.
Tylko, że jeśli chcę skopiować wszystkie elementy bez jednego to muszę jakoś go wyróżnić.
Tak, ale to jest prawdą niezależnie od metody zmieniania tablicy, której używasz. Musisz jakoś rozpoznać niepotrzebne elementy.
int copy_array(int** tab,int t[],int n)
{
tab=(int**)malloc(n*sizeof(int*));
for(int i=0; i<n; i++)
{
if(tab[i]!=jakiś wyróżniony element)
arr[i] = tab[i]=(int*)malloc(t[i]*sizeof(int));
}
return arr;
}
Czy mniewięcej dobrze to kopiuję ?