Czy można wstawić biały znak,spację do tablicy typu int?

0

Czy można?

3

Tak, będzie wstawiona jako wartość tego znaku. Ale po co?

0

No właśnie chcę wstawić biały znak do int nie jako wartość liczbową tylko jako biały znak.

3

Nie możesz, bo to tablica int. Zresztą konwersja w obie strony jest bezstratna, więc o co chodzi?

0

Potrzebuję tablicy która może przechowywać znak biały a kiedy j ą wyświetle to będzie widoczny odstęp.

4

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.

2

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>.

0

A można usunąć konkretny element z tablicy ?

2

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.

0

A jeśli jest to tablica dynamiczna?

1

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.

0

Jeśli mam taką tablicę dwuwymiarową:

333444
4433
333344

I chcę zrobić

333444
4433
33334
3

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)

0

Muszę użyć malloc i free

3

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.

2

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…

4

@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.

0

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];
   }
 }
1

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';
}
0

Co robi ten kod?

0
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
0

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?

1

Sugerowałbym przepisywać element po elemencie. Im mniej bezpośredniej zabawy na pamięci, tym mniejsza szansa na błąd.

0

Czyli przepisać do nowej tablicy do określonego elementu a starą usunąć?

1

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.

0

I tak za każdym razem trzeba usuwać starą tablicę?

1

Tak. Skoro nie chcesz skorzystać ze zautomatyzowanych kontenerów, takich jak std::list, to nie masz automatyzacji i wszystko robisz ręcznie.

0

Tylko, że jeśli chcę skopiować wszystkie elementy bez jednego to muszę jakoś go wyróżnić.

1

Tak, ale to jest prawdą niezależnie od metody zmieniania tablicy, której używasz. Musisz jakoś rozpoznać niepotrzebne elementy.

0
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ę ?

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