Tablice wielowymiarowe
Transkrypt
Tablice wielowymiarowe
Tablice wielowymiarowe
Elementami tablic mogą być w szczególności także inne tablice. Jeśli elementem tablicy jest inna
tablica jednowymiarowa, mamy do czynienia z tablicą dwuwymiarową. Taką tablicę możemy
zadeklarować następująco:
int t[3][2]; //t jest tablicą 3-elementową, której elementami są dwuelementowe tablice typu
int
Elementy naszej tablicy to:
t[0][0]
t[0][1]
t[1][0]
t[1][1]
t[2][0]
t[2][1]
Poszczególne elementy takiej tablicy są umieszczane kolejno w pamięci komputera tak, ze najszybciej
zmienia się najbardziej skrajny prawy indeks, zatem poniższa inicjalizacja:
int t[3][2]={1,2,3,4,5,6};
spowoduje następujące nadanie wartości elementom tablicy:
t[0][0]=1
t[1][0]=3
t[2][0]=5
t[0][1]=2
t[1][1]=4
t[2][1]=6
Lepiej jest jednak inicjalizować tablice następująco:
int t[3][2]={{1,2},{3,4},{5,6}};
biorąc wiersze w nawiasy klamrowe; ma to tę dodatkową zaletę, że oddaje prawdziwą naturę takiej
tablicy jako tablicy tablic.
Inicjując tablicę następująco
int tab[3][4] = { {1,2,3,4}, {5,6}, {1} };
otrzymamy (pozostałe elementy są automatycznie inicjowane zerami ):
1234
5600
1 0 0 0.
Często o takiej dwuwymiarowej tablicy myślimy jak o macierzy, która w naszym przypadku miałaby
3 wiersze i 2 kolumny.
Poniżej fragment programu nadaje poszczególnym elementom tablicy wartość będącą sumą numeru
jej wiersza i kolumny, a następnie wyświetla te wartości w postaci macierzy:
int t[3][2];
int i,j;
for (i=0; i<3; i++)
for (j=0; j<2; j++)
t[i][j]=i+j;
//wyświetlenie
for (i=0; i<3; i++)
{for (j=0; j<2; j++)
cout<<t[i][j]<<”
cout << endl;
}
”;
Załóżmy, że zadeklarowaliśmy tablicę dwuwymiarową o dim1 wierszach i dim2 kolumnach
const int dim1 = ...;
const int dim2 = ...;
int tab[dim1][dim2];
Elementy tablicy rozmieszczone są w pamięci wierszami. Zatem mając adres początku tablicy i dwa
indeksy: m i n, element tab[m][n]odpowiadający tym indeksom znajduje się w wierszu(m+1)szym o indeksie m, a więc, licząc od początku tablicy, musimy najpierw „przeskoczyć” m wierszy,
każdy o długości dim2, czyli m⋅dim2 elementów. Następnie musimy „przeskoczyć” n elementów
tego wiersza, w którym znajduje się szukany element (który ma indeks kolumnowy n, czyli jest w tym
wierszu (n + 1)-szym elementem). Zatem do obliczenia tego przesunięcia nie jest potrzebna
znajomość pierwszego wymiaru tablicy, czyli liczby wierszy dim1. Ogólnie, dla tablic
wielowymiarowych, do prawidłowego obliczenia przesunięcia elementu względem początku tablicy
potrzebna jest znajomość wszystkich wymiarów prócz pierwszego .
W funkcjach mających jako parametry tablice dwuwymiarowe musimy zawsze jawnie specyfikować
drugi wymiar tablicy.
ZADANIA
Napisz korzystając z funkcji program, który
1. wczytuje z klawiatury wymiary m,n (m,n<= 10) i elementy macierzy a następnie wypisuje ją
na ekranie w ten sposób, by każdy wiersz macierzy znajdował się w osobnej linii a elementy
w wierszu były wypisane na 5 miejscach.
#include <iostream>
#include <iomanip>
using namespace std;
const int nmax = 10;//rozmiar macierzy
void PobMacierz(int &n, int & m, float a[][nmax])
{
//pobieranie il. wierszy
do
{ cout << "Podaj il. wierszy\n n = ";
cin >> n;
}while((n < 1) || (n > nmax));
//pobieranie il. kolumn
do
{ cout << "Wstaw il. kolumn\n m = ";
cin >> m;
}while((m < 1)||(m > nmax));
//pobieranie el. macierzy
cout << "\nPodaj elementy macierzy A\n";
for(int i=0; i < n; i++)
for(int j=0; j < m; j++)
{
cout << "A["<< i+1 << ", " << j+1 << "] = ";
cin >> a[i][j];
}
}
//-----------------------------------void DrukMacierz(int n, int m, float a[][nmax])
{
//wyswietlanie el. macierzy
cout<<fixed<<setprecision(2);//el. wysw. z dokladn.do 2-ch miejsc po przecinku
for(int i=0; i < n; i++)
{//wyswietlamy el. i-tego wiersza
for(int j=0; j < n; j++)
cout << setw(5) << a[i][j];
cout << endl;//przechodzimy do nowego wiersza
}
}
//---------------------------------------
int main()
{
float a[nmax][nmax];//deklaracja macierzy nmax x nmax
int n, m; //n-il.wierszy, m-il. kolumn
PobMacierz(n,m,a);
DrukMacierz(n,m,a);
system("pause");
return 0;
}
2. wczytuje macierz (jej wymiary i elementy) a następnie oblicza sumę elementów macierzy.
3. wyznacza minimum w wierszach wczytanej z klawiatury tablicy dwuwymiarowej rozmiaru n
x n (gdzie n<=10 było podane z klawiatury)
4. wprowadza liczby do dwuwymiarowej tablicy liczb o wymiarach n wierszy na m kolumn oraz
oblicza: sumy elementów w wierszach i sumy elementów w kolumnach. Wyprowadza na
ekran obliczone sumy z numerem wiersza i kolumny.
5. wczytuje macierz kwadratową a następnie liczy jej ślad, tzn. sumę elementów na głównej
przekątnej.
6. wczytuje dwie macierze a potem, jeżeli jest to możliwe, dodaje je i wypisuje macierz będącą
ich sumą.
7. wczytuje z klawiatury stopień n macierzy kwadratowej (n<= 10) a potem jej elementy, a
następnie podaje numer tego wiersza macierzy w którym suma elementów w wierszu była
najmniejsza.
8. wczytuje z klawiatury stopień n macierzy kwadratowej (n<= 10), potem jej elementy, a
następnie podaje numer tej kolumny macierzy w której suma elementów w kolumnie była
największa.