C++ : tablica dwuwymiarowa.

0

Witam, mam za zadanie stworzyć tablice dwuwymiarową, której wielkość można zmieniać w trakcie wykonywania programu. W dodatku mam znaleźć minimum i maksimum w zbiorze oraz ją posortować.

Najpierw zrobiłem tablicę statyczną:

#include <iostream>

using namespace std;
const int N=3;
const int M=3;

void mini( int tab[N][M] , int N , int M);
void maxi( int tab[N][M] , int N, int M);
void wczytaj (int tab [N][M], int N, int M);
void wypisz ( int tab[N][M], int N, int M);

int main()
{

int i,j;

int tab[N][M];

wczytaj(tab, N,M);
wypisz(tab,N,M);
mini(tab,N,M);
maxi(tab,N,M);

//system("PAUSE");

}

void wczytaj ( int tab[N][M], int N, int M){
for ( int i=0; i<N ; i++) {
for (int j=0 ; j<M ; j++){
cout<<i+1<<"wiersz, kolumna"<<j+1<<endl;
cin>>tab[i][j];
}
cout<<endl;
}

}

void wypisz ( int tab[N][M] , int N, int M){
for ( int i=0; i<N ; i++){
for (int j=0 ; j<M ; j++){
cout<<tab[i][j]<<" ";
}
cout<<endl;
}
}

void mini( int tab[N][M] , int N, int M) {
int i=0;
int j=0;

int min=tab[i][j];
for ( int i=0; i<N ; i++)
for (int j=0 ; j<M ; j++){
if ( min>tab[i][j]) min=tab[i][j];
}

cout<<"wartosc minimalna to: "<<min<<endl;

}

void maxi( int tab[N][M] , int N, int M) {
int i,j;
int max = tab[i][j];
for ( int i=0; i<N ; i++)
for (int j=0 ; j<M ; j++){
if ( max<tab[i][j]) max=tab[i][j];
}

cout<<"Wartosc maksymalna to "<< max<<endl;

}

Jednakże moim głównym problemem jest stworzenie i co gorsze umiejętne obchodzenie się z tablicą dwuwymiarową. Znalazłem coś takiego jeśli chodzi o tablice dwuwymiarowe.

int i,j;
cout<<"Ile ma byc wierszy?";
cin>>w;
tabi=new int *[w];
cout<<"Ile ma byc kolumn?";
cin>>k;
int x;
for(int i = 0; i < w; i++) {
tabi[i] = new int[w];
for ( int j=0; x < k ; j++){

tabi[i][x]=1;
cout<< tabi[i][x] <<" ";
}
cout<<endl;
} 

Jednk nie umiem tego "wgrać" w funkcję.. jak wywołują funkcję to błędy przy kompilacji się pojawiają..

0

w jaką funkcję chcesz to wgrać ? w tym kodzie jest dużo niejasności, aby kompilator mógł to skompilować trzeba mu wytłumaczyć czym jest zmienna w, czym jest tabi.

Jeśli pojawiają Ci się błędy kompilacji, to przede wszystkim musisz napisać o jakie błędy chodzi... Oczekujesz pomocy, a nawet nie napiszesz co się konkretnie dzieje.. to nie jest filologia, to aspekty inżynieryjne, tu liczą się konkrety..

0

Głównie chodzi mi o to aby w funkcji np." wczytaj ",podawać wielkość tablicy ( liczbę wierszy, kolumn), w kolejnej funkcji "wypisz" ją wypisać i tak dalej dla znalezienia wartości minimalnej jak i maksymalnej.. Tylko, że jako jestem początkującym w programowaniu nie do końca wiem jak to zrobić..

0
const int N = 3;
int arr[N]
for (int i = 0; i < N; i++)

Petla będzie szła o 1 krok za daleko, tablica ma deklarowane 3 elementy, czyli od 0 do 2. Pętla leci od 0 do 3, czyli wykracza poza zadeklarowaną ilość elementów.

A dla sprawdzenia maksymalnej wartości wystarczy coś takiego jak wypisz, tylko żeby zamiast wypisywania wykonywała takie coś:

int max = 0; // tu musisz zmienić, bo liczba maksymalna może być mniejsza od 0.
if(tab[i][j]>max) max = tab[i][j];

// No rzeczywiście dałem ciała, dawno nic nie robiłem w C++ i myślałem, że ten modulator czy jak mu tam jest wykonywany po spełnieniu warunku a nie wykonaniu pętli.

0

nie ma czegoś takiego jak "zmiana wielkość tablicy podczas działania programu". Można ustawić jej wielkość podczas działania programu, ale nie da się jej zmienić (trzeba zadeklarować nową).

int **wczytaj (int wiersze,int kolumny)
{
    int** tablica = new int*[wiersze];
    for (int i = 0 ; i < wiersze; i++)
    {
        tablica[wiersze] = new int[kolumny];
    }
    return tablica;
}

w main tworzysz nową tablicę na zasadzie takiej

int **tablica = wczytaj(5,5);

zamiast 5,5 możesz wstawić dowolne liczby całkowite. Normalnie możesz odwoływać się do tego za pomocą [] [] (czyli tablica[0][4] = 8)

min i max możesz zrobić za pomocą
http://www.cplusplus.com/reference/algorithm/min_element/
http://www.cplusplus.com/reference/algorithm/max_element/

PAMIĘTAJ że musisz zwolnić pamięć za pomocą delete[] to co zadeklarowane zostało w funkcji wczytaj

i formatuj lepiej kod. Tego czytać się nie da.

0

Dzięki za odpowiedź. A min i max to chyba da rade też wyznaczyć korzystając z tych funkcji, które napisałem w 1 moim poście ?

0

No to mam coś takiego.

#include <iostream>
 
 using namespace std;

int **wczytaj (int wiersze,int kolumny);
void wczytaj1( int tablica, int wiersze, int kolmuny);
	
int **wczytaj (int wiersze,int kolumny)
{
	
    int** tablica = new int*[wiersze];
    for (int i = 0 ; i < wiersze; i++)
    {
        tablica[wiersze] = new int[kolumny];
    }
        return tablica;
}


int main(){
	int wiersze,kolumny;
	cout<<"Ile wierszy";
	cin>>wiersze;
	cout<<"Ile kolumn?";
	cin>>kolumny;
	
	

	int **tablica = wczytaj(5,5);
	
	wczytaj1(tablica(wiersze , kolumny);
	return 0;	

   delete []tablica;
       
}

void wczytaj1 ( int tablica[wiersze][kolumny], int wiersze, int kolumny){
  for ( int i=0; i<w ; i++) {
             for (int j=0 ; j<k ; j++){
                   cout<<i+1<<"wiersz, kolumna"<<j+1<<endl;
                   cin>>tablica[i][j];
                 }
                cout<<endl;
}

Jak teraz wpisywać do tego kolejne elementy?
Bo chce wpisywać wartości do tej tablicy.

0

przecież to się nie kompiluje...

http://4programmers.net/Forum/C_i_C++/162722-Zwolnienie_pamieci_z_dynamicznej_tablicy_dwuwymiarowej

tu masz jak zwalniać pamieć po takim utworzeniu tablicy.

Kod który Ci dałem, pokazuje Ci jak przechodzić po tej całej tablicy, więc zamiast np new robisz przypisanie wartości. Dodatkowo nie przeczytałeś uważnie tego co napisałem tylko zadowolony przekleiłeś kod nie próbując go zrozumieć

Zamiast zadawać milion pytań które prowadzą do gotowca to poszukaj w google. Jest od groma odpowiedzi na Twoje pytania. Nawet nie wiesz jak coś zrobić. Jeżeli nie wiesz to czytasz książkę lub czytasz odpowiedzi do Twoich pytań które masz. Bo to wszystko było już tysiące razy powtarzane.

0

# include <iostream>

using namespace std;
    

int **wczytaj (int wiersze, int kolumny);
void wypisz ( int tablica, int wiersze, int kolumny);


int main(){
    
   int wiersze,kolumny;
    cout<<"ile ma byc wierszy?"<<endl;
   cin>>wiersze;
cout<<"ile ma byc kolumn?"<<endl;
cin>>kolumny;
    
    int **tablica=wczytaj(wiersze,kolumny);
    wypisz(**tablica,wiersze,kolumny);
    
//sprzątamy po sobie 
for (int i = 0; i < wiersze; ++i) {
    delete tablica[i];
}
delete tablica;

system("PAUSE");
return 0;
}

//****************************************
int **wczytaj (int wiersze, int kolumny){

int** tablica = new int*[wiersze];
for (int i = 0; i < wiersze; i++) {
    tablica[wiersze] = new int[kolumny];
}
return tablica;
}

//**********************************
void wypisz ( int tablica, int wiersze, int kolumny){     
     for(int i=0; i<wiersze ;i++){
             cout<<endl;
        for(int j=0; j<kolumny; j++)     {   
          cout<<"tsblica"<< tablica;
          cout<<"   " ;
          }          
          }    
     
     }

Przynajmniej się coś kompiluję, tylko wyświetla mi adresy, a nie wartości. Nie wiem gdzie wpisywać te wartości, i jak się odnosić tą tablicą dwuwymiarową... Od razu zaznaczę, że nie oczekuję gotowca.. szukałem w internecie ale nie znalazłem jak się odnosić do takich tablic..
JU

0

obfuskacja pelna geba, no ale nic...

void wypisz(int** tablica, int w, int k);

wewnatrz wypisz:
cout << tablica[i][j];
0

No chyba nie za bardzo to pomogło bo program się wiesza.. A ja chcę zrobić tak żeby na początku podać ilość kolumn i wierszy, a potem gdy już mam rozmiar tej tablicy to chciałbym sam wpisywać do niej jakieś wartości.

0
#include <iostream>
using namespace std;
    

int **wczytaj (int wiersze, int kolumny);
void wypisz ( int** tablica, int wiersze, int kolumny);


int main(){
    
int wiersze,kolumny;

cout<<"ile ma byc wierszy?"<<endl;
cin>>wiersze;

cout<<"ile ma byc kolumn?"<<endl;
cin>>kolumny;
    
    int **tablica=wczytaj(wiersze,kolumny);
    wypisz(tablica,wiersze,kolumny);
    
             //sprzątamy po sobie 

for (int i = 0; i < wiersze; ++i) {
          delete tablica[i];
}
      delete tablica;

system("PAUSE");
return 0;
}

//****************************************
int **wczytaj (int wiersze, int kolumny){

int** tablica = new int*[wiersze];
for (int i = 0; i < wiersze; i++) {
    tablica[wiersze] = new int[kolumny];
}
return tablica;
}

//**********************************
void wypisz ( int** tablica, int wiersze, int kolumny){     
     for(int i=0; i<wiersze ;i++){
             cout<<endl;
        for(int j=0; j<kolumny; j++){   
          cout << tablica[i][j]; 
         cout<<"   " ;
          }          
    }    
     
 }
     
0
for (int i = 0; i < wiersze; i++) {
    tablica[wiersze] = new int[kolumny];
}

wiersze => i

jeszcze jedno:

delete tablica;

=>

delete[] tablica;
0

Chyba nie za bardzo rozumiem.. Zamiast tablica[wiersze] ma byc tablica[i] ? (wydaj sie bardziej logiczne..) A poza tym i tak wydaje mi się że nic z tego nie wyjdzie bo trzeba dodać jeszcze jakąś druga pętle (tylko na razie nie wiem jak..) po kolumnach żeby można było wpisywać odpowiednie wartości.. + oczywiście "cin". Jeśli się mylę to proszę mnie poprawić.
A co zwalniania pamięci to oczywiście mój błąd.

0

Czyli jak to ma być?

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