S t r o n a
| 1 WETI Politechnika Gdańska
Laboratorium 4. Tablice
Przed zajęciami laboratoryjnymi zapoznaj się z następującymi pozycjami literatury:
1.
Wykład z przedmiotu „Podstawy programowania”
2.
J. Grębosz „Symfonia C++” tom 1., Oficyna Kallimach, Kraków, 1999
Rozdział 7, str. 192-216.
Przygotowując się do laboratorium przeanalizuj podane poniżej przykłady, odpowiedz na pytania,
rozwiąż testy i napisz odpowiednie programy. Po zajęciach zrób zadania podane w punkcie "Zadania do
samodzielnego rozwiązania po laboratorium".
Przykłady i pytania
Przeanalizuj programy, odpowiedz na pytania i wykonaj polecenia.
Przykład L4_F0_P1
Przeanalizuj program, który wypełnia tablicę jednowymiarową liczbami całkowitymi, wczytanymi ze
standardowego wejścia i wyświetla je na ekranie.
// L4_F0_P1.cpp
#include
<iostream>
using
namespace
std;
const
int
MAX_N = 12;
// maksymalny rozmiar tablicy
int
main()
{
int
tab[MAX_N];
// --- wczytanie aktualnej liczby elementów tablicy
// --- uwaga: podaj n adekwatne do maksymalnego rozmiaru tablicy
int
n;
cout <<
"Podaj liczb
ę
elementów tablicy: "
;
cin >> n;
cout << endl;
// --- (A) wczytanie elementów tablicy ze standardowego wej
ś
cia
for
(
int
i = 0; i < n; i++ ) {
cout <<
"Podaj element "
<< i <<
" tablicy:"
;
cin >> tab[i];
}
cout << endl <<
"Wczytana tablica:"
<<endl;
// --- (B) wypisanie całej tablicy
for
(
int
i = 0; i < n; i++ )
cout << i <<
" element tablicy: "
<< tab[i] << endl;
system(
"PAUSE"
);
return
0;
}
Pytania
a)
Dlaczego instrukcja wykonywana w drugiej pętli for nie jest umieszczona w nawiasach { }?
b)
Jak należy zmodyfikować program, aby wyświetlić elementy tablicy w odwrotnej kolejności?
c)
Jak należy zmodyfikować program, aby wyświetlić co drugi element tablicy?
S t r o n a
| 2 WETI Politechnika Gdańska
d)
Zastanów się nad działaniem programu, gdy w punkcie c) zastosujemy następującą pętlę:
for
(
int
i = 0; i != n; i = i + 2 )
Przeanalizuj działanie osobno dla parzystego i nieparzystego n. Czy wiesz już dlaczego w takich
przypadkach lepiej stosować nierówność zamiast warunku
i!=n
?
Wskazówki i odpowiedzi
a)
Jeśli w pętli umieszczamy tylko jedną instrukcję, nie trzeba stosować nawiasów klamrowych.
b)
Zmodyfikowana część (B)
for
(
int
i =
n-1
; i >=
0
; i-- )
cout << i <<
" element tablicy: "
<< tab[i] << endl;
albo
for
(
int
i =
0
; i <
n
; i++ )
cout << i <<
" element tablicy: "
<< tab[n-1-i] << endl;
c)
Zmodyfikowana część (B) (ewentualnie można zainicjować
i = 1)
for
(
int
i = 0; i < n; i = i + 2 )
cout << i <<
" element tablicy: "
<< tab[i] << endl;
d)
Dla parzystego n > 0, elementy tablicy zostaną wyświetlone poprawnie. Dla nieparzystego n > 0
warunek kontynuacji pętli
i!=n
,
zawsze będzie spełniony; otrzymamy pętlę „nieskończoną”.
Przykład L4_F0_P2
Przeanalizuj program, który wyświetla na ekranie następującą tablicę:
1 2 5 4 3
-6 7 -8 9 -10
11 -12 13 1 0
// L4_F0_P2.cpp
#include
<iostream>
#include
<iomanip>
using
namespace
std;
const
int
MAX_N = 3;
const
int
MAX_M = 5;
int
main()
{
int
A[MAX_N][MAX_M]={{1, 2, 5, 4, 3}, {-6, 7, -8, 9, -10}, {11, -12, 13, 1, 0}};
int
n = MAX_N;
int
m = MAX_M;
// --- (A) wypisanie tablicy na standardowe wyj
ś
cie
for
(
int
i = 0; i < n; i++ ) {
for
(
int
j = 0; j < m; j++ )
cout << setw(3) << A[i][j];
// i – indeks wiersza, j – indeks kolumny
cout << endl;
}
system(
"PAUSE"
);
return
0;
}
S t r o n a
| 3 WETI Politechnika Gdańska
Pytania
a)
Jak należy zmienić program, aby wyświetlał tablicę kolumnami, tzn.:
1 -6 11
2 7 -12
...
3 -10 0
b)
Jak należy zmienić program, aby wyświetlać tylko co drugą kolumnę?
Wskazówki i odpowiedzi
a)
Zmodyfikowana część (A)
for
(
int
j = 0; j < m; j++ ) {
// zamiana kolejno
ś
ci iteracji
for
(
int
i = 0; i < n; i++ )
// bez zmiany znaczenia i oraz j
cout << setw(3) << A[i][j];
// i – indeks wiersza, j – indeks kolumny
cout << endl;
}
b)
Zmodyfikowana część (A) (ewentualnie można w drugiej pętli zainicjować
j = 1)
for
(
int
i = 0; i < n; i++ ) {
for
(
int
j = 0; j < m; j+=2 )
cout << setw(3) << A[i][j];
cout << endl;
}
Przykład L4_F0_P3
Przeanalizuj program, który:
a)
generuje wektor n losowych liczb całkowitych z przedziału [a,b],
b)
oblicza wartość średnią elementów w wektorze,
c)
wyznacza liczbę elementów większych od wartości średniej.
// L4_F0_P3.cpp
#include
<iostream>
#include
<iomanip>
#include
<time.h>
using
namespace
std;
const
int
MAX_N = 100;
// maksymalny rozmiar tablicy A
int
main()
{
int
A[MAX_N];
int
a;
int
b;
int
n;
// --- wczytanie konców przedziału [a,b]
cout <<
"Podaj lewy koniec przedzialu [a,b]:"
;
cin >> a;
cout <<
"Podaj prawy koniec przedzialu [a,b]:"
;
cin >> b;
// --- wczytanie liczby elementów tablicy
cout <<
"Podaj liczbe elementow tablicy:"
;
cin >> n;
S t r o n a
| 4 WETI Politechnika Gdańska
// --- wypelnienie tablicy A elementami losowymi z przedziału [a,b]
int
c = b-a+1;
// tyle liczb całkowitych mie
ś
ci sie w przedziale [a,b]
srand(time(
NULL
));
// inicjalizacja generatora liczb pseudolosowych
// --- (A) generowanie elementów tablicy
for
(
int
i = 0; i < n; i++ )
A[i] = rand()
%
c + a;
// --- (B) wypisanie elementów tablicy na standardowe wyj
ś
cie
cout <<
"Elementy tablicy: "
;
for
(
int
i = 0; i < n; i++ )
cout << setw(3) << A[i];
// --- (C) wyznaczenie warto
ś
ci
ś
redniej
double
suma = 0;
for
(
int
i = 0; i < n; i++ )
suma += A[i];
double
srednia = suma / n;
cout << endl <<
"Wartosc srednia: "
<< srednia << endl;
// --- (D)
zliczanie elementow wiekszych od sredniej
int
licznik = 0;
for
(
int
i = 0; i < n; i++ )
if
(A[i] > srednia) licznik++;
cout << endl <<
"Liczba elementow wiekszych od sredniej: "
<< licznik << endl;
system(
"PAUSE"
);
return
0;
}
Pytania
Jak należy zmienić program, aby wyznaczał liczbę elementów większych od wartości średniej, które są:
a)
parzyste,
b)
niepodzielne przez trzy,
c)
parzyste i niepodzielne przez trzy.
Odpowiedzi
a)
Zmodyfikowana część (D)
for
(
int
i = 0; i < n; i++ )
if
(A[i] > srednia && A[i]%2==0 ) licznik++;
b)
Zmodyfikowana część (D)
for
(
int
i = 0; i < n; i++ )
if
(A[i] > srednia && A[i]%3!=0 ) licznik++;
c)
Zmodyfikowana część (D)
for
(
int
i = 0; i < n; i++ )
if
(A[i] > srednia && A[i]%2==0 && A[i]%3!=0 ) licznik++;
S t r o n a
| 5 WETI Politechnika Gdańska
Testy
1.
Wskaż poprawne deklaracje tablicy.
a)
int
tab[10];
b)
int
tab;
c)
tab{10};
d)
array
tab[10]
;
2.
Jaki jest indeks ostatniego elementu w tablicy 27-elementowej?
a)
27
b)
26
c)
28
d)
0
3.
Wskaż poprawne deklaracje tablicy dwuwymiarowej.
a)
array
tab[20][20];
b)
int
tab[20][20];
c)
int
tab[20, 20];
d)
double
tab[20];
4.
Co zostanie wypisane na standardowym wyjściu po wykonaniu poniższych instrukcji?
int
A[4] = {2, 4, 6, 8};
cout << A[0] <<
" "
<< A[3];
a)
2 4
b)
8
c)
2 6
d)
2 8
5.
Co zostanie wypisane na standardowym wyjściu po wykonaniu poniższych instrukcji?
int
A[5] = {7, 3, 4, 1, 9};
int
j = 3;
cout << A[j-1];
a)
7
b)
3
c)
4
d)
9
6.
Co zostanie wypisane na standardowym wyjściu po wykonaniu poniższego instrukcji?
int
A[5] = {7, 3, 4, 1, 9};
int
j = 3;
cout << A[j++];
a)
7
b)
3
c)
4
d)
1
Odpowiedzi
Test 1: a)
Test 2: b)
Test 3: b)
Test 4: d)
Test 5: c)
Test 6: d)
S t r o n a
| 6 WETI Politechnika Gdańska
Zadania przygotowujące do laboratorium
Zapoznaj się z treścią zadania, przemyśl rozwiązanie a następnie napisz, uruchom i przetestuj programy.
Zadanie L4_F0_Z1
Przeanalizuj program, który na podstawie tablicy dwuwymiarowej A tworzy wektor B, którego kolejne
elementy odpowiadają elementom tablicy A „przeglądanej wierszami” (patrz przykład). Elementy tablicy
A zdefiniowane są następująco:
A[i][j] = 5i + j
Przykład:
0 1 2 3
A: 5 6 7 8
10 11 12 13
B: 0 1 2 3 5 6 7 8 10 11 12 13
a)
Zmodyfikuj program, aby przekształcanie odbywało się „po kolumnach”, to znaczy tak, żeby dla
danej powyżej tablicy A otrzymać B
= [0 5 10 1 6 11 2 7 12 3 8 13]
b)
Napisz program realizujący operację odwrotną, tzn. przekształcający wektor o długości m*n
w tablicę o rozmiarach n
×
m.
// L4_F0_Z1.cpp
#include
<iostream>
#include
<iomanip>
using
namespace
std;
const
int
MAX_N = 10;
// maksymalne rozmiary tablicy A
const
int
MAX_M = 15;
const
int
MAX_K = MAX_N * MAX_M;
// maksymalny rozmiar wektora B
int
main()
{
int
A[MAX_N][MAX_M];
int
B[MAX_K];
int
n, m;
// --- wczytanie aktualnych rozmiarów tablicy A
cout <<
"Podaj liczb
ę
wierszy tablicy A: "
;
cin >> n;
cout <<
"Podaj liczb
ę
kolumn tablicy A: "
;
cin >> m;
// --- (A) generowanie tablicy A
for
(
int
i = 0; i < n; i++ )
for
(
int
j = 0; j < m; j++ )
A[i][j] = 5 * i + j;
// --- (B) wy
ś
wietlenie tablicy A
cout <<
"Tablica A: "
<< endl;
for
(
int
i = 0; i < n; i++ ){
for
(
int
j = 0; j < m; j++ )
cout << setw(4) << A[i][j];
cout << endl;
}
}
S t r o n a
| 7 WETI Politechnika Gdańska
// --- (C) przekształcenie tablicy A w wektor B
for
(
int
i = 0; i < n; i++ )
for
(
int
j = 0; j < m; j++ )
B[i * m + j] = A[i][j];
// --- (D) wy
ś
wietlenie wektora B
cout <<
"Wektor B: "
<< endl;
for
(
int
i =
0
; i <
n * m
; i++ )
cout << setw(4) << B[i];
cout << endl;
system(
"PAUSE"
);
return
0;
}
Wskazówki i odpowiedzi
a)
Przekształcanie „po kolumnach”.
// --- (C) przekształcenie tablicy A w wektor B
for
(
int
j = 0; j < m; j++)
for
(
int
i = 0; i < n; i++ )
B[j * n + i] = A[i][j];
b)
Przekształcenie tablicy 1D w tablicę 2D.
// L4_F0_Z1b.cpp
#include
<iostream>
#include
<iomanip>
using
namespace
std;
const
int
MAX_N = 10;
// maksymalne rozmiary tablicy A
const
int
MAX_M = 15;
const
int
MAX_K = MAX_N * MAX_M;
// maksymalny rozmiar wektora B
int
main()
{
int
B[MAX_K]
int
A[MAX_N][MAX_M];
int
n, m;
int
k;
cout <<
"Podaj liczbe elementow wektora B: "
;
cin >> k;
cout <<
"Podaj liczbe wierszy tablicy A: "
;
cin >> n;
if (k%n != 0){
cout <<
"Niepoprawne dane"
;
system(
"PAUSE"
);
exit(0);
}
m = k / n;
// --- (A) generowanie wektora B
for
(
int
i = 0; i < k; i++ )
B[i] = i;
// --- (B) wy
ś
wietlenie wektora B
cout <<
"Wektor B: "
<< endl;
for
(
int
i = 0; i < k; i++ )
cout << setw(4) << B[i];
cout << endl;
S t r o n a
| 8 WETI Politechnika Gdańska
// --- (C) przekształcenie wektora B w tablic
ę
A
for
(
int
i = 0; i < n; i++ )
for
(
int
j = 0; j < m; j++ )
A[i][j] = B[i * m + j];
// --- (D) - wy
ś
wietlenie tablicy A
cout <<
"Tablica A: "
<< endl;
for
(
int
i = 0; i < n; i++ ){
for
(
int
j = 0; j < m; j++ )
cout << setw(4) << A[i][j];
cout << endl;
}
system(
"PAUSE"
);
return
0;
}
Zadanie L4_F0_Z2
Przeanalizuj program wypisujący elementy tablicy kwadratowej, leżące nad, na oraz pod główną
przekątną (główna przekątna to przekątna zawierająca elementy, których indeks kolumny i wiersza są
takie same). Zwróć uwagę na modyfikator
setw(3*(i+1))
, dzięki któremu wartość elementu
wyświetlana jest w polu o szerokości odpowiadającej położeniu elementu w tablicy.
a)
Zmodyfikuj fragment programu odpowiedzialny za generowanie tablicy tak, aby każdy element
miał wartość równą sumie swoich indeksów.
b)
Zmodyfikuj program tak, aby przetwarzał elementy nad i pod „drugą” przekątną.
c)
Zmodyfikuj program tak, aby sprawdzał, czy tablica jest górno (dolno) trójkątna, a więc taka,
której wszystkie elementy leżące nad (pod) główną przekątną mają wartość 0.
// L4_F0_Z2.cpp
#include
<iostream>
#include
<iomanip>
using
namespace
std;
const
int
MAX_N = 10;
// maksymalny rozmiar kwadratowej tablicy A
int
main()
{
int
A[MAX_N][MAX_N];
int
n;
// aktualny rozmiar tablicy A
cout <<
"Podaj rozmiar tablicy A: "
;
cin >> n;
// --- (A) generowanie tablicy A
int
k = 0;
for
(
int
i = 0; i < n; i++ )
for
(
int
j = 0; j < n; j++ )
A[i][j] = k++;
// --- (B) wypisanie całej tablicy
for
(
int
i = 0; i < n; i++ ) {
for
(
int
j = 0; j < n; j++ )
cout << setw(3) << A[i][j];
cout << endl;
}
cout << endl;
S t r o n a
| 9 WETI Politechnika Gdańska
// --- (C) wypisanie elementów nad główn
ą
przek
ą
tn
ą
for
(
int
i =
0
; i <
n-1
; i++ ) {
cout << setw(3*(i+1)) <<
" "
;
for
(
int
j =
i+1
; j <
n
; j++ )
cout << setw(3) << A[i][j];
cout << endl;
}
// --- (D) wypisanie elementów na głównej przek
ą
tnej
for
(
int
i =
0
; i <
n
; i++ )
cout << setw(3*(i+1)) << A[i][i] << endl;
// --- (E) wypisanie elementów pod główn
ą
przek
ą
tn
ą
for
(
int
i =
1
; i <
n
; i++ ) {
for
(
int
j =
0
; j <
i
; j++ )
cout << setw(3) << A[i][j];
cout << endl;
}
system(
"PAUSE"
);
return
0;
}
Wskazówki i odpowiedzi
a)
Generowanie tablicy A, której elementy mają wartości równe sumie swoich indeksów.
// --- (A) generowanie tablicy
for
(
int
i = 0; i < n; i++ )
for
(
int
j = 0; j < n; j++ )
A[i][j] = i + j;
b)
Przetwarzanie tablicy względem „drugiej” przekątnej
// L4_F0_Z2b.cpp
#include
<iostream>
#include
<iomanip>
using
namespace
std;
const
int
MAX_N = 10;
// maksymalny rozmiar kwadratowej tablicy A
int
main()
{
int
A[MAX_N][MAX_N];
int
n;
// aktualny rozmiar tablicy A
cout <<
"Podaj rozmiar tablicy A: "
;
cin >> n;
// --- (A) generowanie tablicy
int
k = 0;
for
(
int
i = 0; i < n; i++ )
...
// patrz L4_F0_Z2
// --- (B) wypisanie całej tablicy
for
(
int
i = 0; i < n; i++ ) {
...
// patrz L4_F0_Z2
// --- (C) wypisanie elementów nad „drug
ą
” przek
ą
tn
ą
for
(
int
i =
0
; i <
n-1
; i++ ) {
for
(
int
j =
0
; j <
n-i-1
; j++ )
cout << setw(3) << A[i][j];
cout << endl;
}
S t r o n a
| 10 WETI Politechnika Gdańska
// --- (D) wypisanie elementów na „drugiej” przek
ą
tnej
for
(
int
i =
0
; i <
n
; i++ )
cout << setw(3*(n-i)) << A[i][n-i-1] << endl;
// --- (E) wypisanie elementów pod „drug
ą
” przek
ą
tn
ą
for
(
int
i =
1
; i <
n
; i++ ) {
cout << setw(3*(n-i)) << " ";
for
(
int
j =
n-i
; j <
n
; j++ )
cout << setw(3) << A[i][j];
cout << endl;
}
system(
"PAUSE"
);
return
0;
}
c)
Sprawdzanie, czy tablica jest górno (dolno) trójkątna.
// L4_F0_Z2c.cpp
#include
<iostream>
#include
<iomanip>
using
namespace
std;
const
int
MAX_N = 10;
// maksymalny rozmiar kwadratowej tablicy A
int
main()
{
int
A[MAX_N][MAX_N];
int
n;
cout <<
"Podaj rozmiar tablicy A: "
;
cin >> n;
// --- (A) generowanie tablicy
for
(
int
i = 0; i < n; i++ )
for
(
int
j = 0; j < n; j++ )
A[i][j]=0;
// --- (B) wypisanie całej tablicy
for
(
int
i = 0; i < n; i++ ) {
...
// patrz L4_F0_Z2
// --- (C) umo
ż
liwienie zmiany warto
ś
ci elementu nad główn
ą
przek
ą
tn
ą
char odp;
cout <<
"Czy chcesz zmienic wartosc elementu nad glowna przekatna? (t/n)"
;
cin >> odp;
if
(odp == 't'){
cout <<
" Element A[0][1] = "
;
cin >> A[0][1];
}
// --- (D) sprawdzenie elementów nad główn
ą
przek
ą
tn
ą
bool
tylko_zerowe =
true
;
int
i =
0
;
while
(i <
n-1
&& tylko_zerowe){
int
j =
i+1
;
while
(j <
n
&& tylko_zerowe){
if
(A[i][j] != 0) tylko_zerowe =
false
;
j++;
}
i++;
}
if
(tylko_zerowe) cout <<
"Macierz jest dolnotrojkatna"
<< endl;
else
cout <<
"Macierz nie jest dolnotrojkatna"
<< endl;
S t r o n a
| 11 WETI Politechnika Gdańska
// --- (E) umo
ż
liwienie zmiany warto
ś
ci elementu pod główn
ą
przek
ą
tn
ą
char odp;
cout <<
"Czy chcesz zmienic wartosc elementu pod glowna przekatna? (t/n)"
;
cin >> odp;
if
(odp == 't'){
cout <<
" Element A[1][0] = "
;
cin >> A[1][0];
}
// --- (F) sprawdzenie elementów pod główn
ą
przek
ą
tn
ą
i =
1
;
tylko_zerowe =
true
;
while
(i <
n
&& tylko_zerowe){
int
j =
0
;
while
(j <
i
&& tylko_zerowe){
if
(A[i][j] != 0) tylko_zerowe =
false
;
j++;
}
i++;
}
if
(tylko_zerowe) cout<<
"Macierz jest gornotrojkatna"
<< endl;
else
cout <<
"Macierz nie jest gornotrojkatna"
<< endl;
system(
"PAUSE"
);
return
0;
}
Zadanie L4_F0_Z3
Przeanalizuj program sprawdzający, czy dla danego k w k-tym wierszu tablicy dwuwymiarowej istnieje
element większy od danego p. Wynik zapisywany jest w zmiennej boolowskiej i wyświetlany na
standardowym wyjściu.
// L4_F0_Z3.cpp
#include
<iostream>
#include
<iomanip>
using
namespace
std;
// --- maksymalne rozmiary tablicy A
const
int
MAX_N = 5;
const
int
MAX_M = 10;
int
main()
{
double
A[MAX_N][MAX_M];
int
n, m;
cout <<
"Podaj liczbe wierszy tablicy: "
;
cin >> n;
cout <<
"Podaj liczbe kolumn tablicy: "
;
cin >> m;
// --- (A) generowanie tablicy
for
(
int
i = 0; i < n; i++)
for
(
int
j = 0; j < m; j++)
A[i][j] = 3./5 * (i+j);
// --- (B) wypisanie tablicy
for
(
int
i = 0; i < n; i++){
for
(
int
j = 0; j < m; j++)
cout << setw(6) << A[i][j];
cout << endl;
}
S t r o n a
| 12 WETI Politechnika Gdańska
// --- (C) przeszukiwanie k-tego wiersza tablicy
int
k;
double
p;
cout <<
"Podaj wartosc progowa: "
;
cin >> p;
cout <<
"Podaj indeks przeszukiwanego wiersza: "
;
cin >> k;
int
j = 0;
bool
znaleziono =
false
;
while
(!znaleziono && (j <
m
))
znaleziono = (A[k][j++] > p);
// sprawdzenie czy element ma zadan
ą
własno
ść
if
(znaleziono) {
cout <<
"W wierszu "
<< k <<
" istnieje element o wartosci wiekszej niz "
<< p << endl;
cout <<
"Jego indeks to "
<< j-1 << endl;
}
else
cout <<
"W wierszu "
<< k <<
" zaden element nie jest wiekszy od "
<< p << endl;
system(
"PAUSE"
);
return 0;
}
Zadanie L4_F0_Z4
Dana jest n-elementowa jednowymiarowa tablica liczb rzeczywistych. Przeanalizuj program odwracający
kolejność elementów w tablicy. Rozważ osobno przypadki dla parzystego oraz nieparzystego n.
a)
Zastanów się nad działaniem programu, jeżeli warunek drugiej pętli for zmienimy na i < n.
b)
Napisz program, który wykonuje analogiczną operację dla kwadratowej tablicy dwuwymiarowej
A. Operację taką nazywamy transponowaniem tablicy A. Aby transponować tablicę należy
zamienić ze sobą elementy symetryczne względem głównej przekątnej, czyli element A[i][j]
z elementem A[j][i]. Innymi słowy, każdy element A[i][j] pod główną przekątną zamieniamy
z jego odpowiednikiem A[j][i] nad przekątną. Analizując poniższy program zastanów jak będzie
działał, gdy w części (C) zakresy wartości zmiennych i oraz j będą takie, jak w części (B).
Przykład:
0 1 2 0 5 10
A przed
:
5 6 7 A po :
1 6 11
10 11 12 2 7 12
//L4_F0_Z4.cpp
#include
<iostream>
#include
<iomanip>
using
namespace
std;
const
int
MAX_N = 20;
int
main()
{
double
A[MAX_N];
int
n;
cout <<
"Podaj liczbe elementow tablicy: "
;
cin >> n;
// --- (A) generowanie tablicy A
for
(
int
i = 0; i < n; i++)
A[i] = i;
S t r o n a
| 13 WETI Politechnika Gdańska
// --- (B) odwrócenie kolejno
ś
ci elementów w tablicy A
int
temp;
for
(
int
i =
0
; i <
n/2
; i++) {
temp = A[i];
A[i] = A[n-1-i];
A[n-1-i] = temp;
}
// --- (C) wy
ś
wietlenie „odwróconej” tablicy A
cout << endl <<
"
Tablica z odwrotna kolejnoscia elementow: "
;
for
(
int
i = 0; i < n; i++)
cout << setw(4) << A[i];
cout << endl;
system(
"PAUSE"
);
return
0;
}
Wskazówki i odpowiedzi
a)
Odpowiedź: kolejność elementów w tablicy A nie ulegnie zmianie.
b)
Transponowanie tablicy A.
//L4_F0_Z4b.cpp - transponowanie
#include
<iostream>
#include
<iomanip>
using
namespace
std;
const
int
MAX_N = 18;
int
main()
{
double
A[MAX_N][MAX_N];
int
n;
int
m;
cout <<
"Podaj liczbe wierszy tablicy: "
;
cin >> n;
cout <<
"Podaj liczbe kolumn tablicy: "
;
cin >> m;
// --- (A) generowanie tablicy A
for
(
int
i = 0; i < n; i++ )
for
(
int
j = 0; j < m; j++ )
A[i][j] = m*i+j;
// --- (B) wypisanie tablicy A
...
// --- (C) transponowanie tablicy A
double
temp;
for
(
int
i =
1
; i <
n
; i++ )
for
(
int
j =
0
; j <
i
; j++ ){
temp = A[i][j];
A[i][j] = A[j][i];
A[j][i] = temp;
}
// --- (D) wypisanie transponowanej tablicy A
cout <<
"Transponowana tablica A: "
<< endl;
for
(
int
j = 0; j < m; j++ ){
for
(
int
i = 0; i < n; i++ )
cout << setw(3) << A[j][i];
cout << endl;
}
system(
"PAUSE"
);
return
0;
}
S t r o n a
| 14 WETI Politechnika Gdańska
Zadanie L4_F0_Z5
Przeanalizuj program, który dla tablicy trójwymiarowej A o rozmiarach n
×
m
×
k, wypełnionej liczbami
wybranymi losowo z przedziału [1, 20], wypisuje wartości wszystkich elementów „warstwami”
względem jednego z wymiarów. Dokonując jak najmniejszej ilości zmian zmodyfikuj program tak, aby
wypisywał całą tablicę, ale warstwami względem pozostałych dwóch wymiarów.
//L4_F0_Z5.cpp
#include
<iostream>
#include
<iomanip>
#include
<time.h>
using
namespace
std;
//
---
maksymalne rozmiary tablicy 3D
const
int
MAX_N = 10;
const
int
MAX_M = 15;
const
int
MAX_K = 20;
int
main()
{
int
A[MAX_N][MAX_M][MAX_K];
int
n;
int
m;
int
k;
// --- wczytanie rozmiarów tablicy 3D
cout <<
"Podaj rozmiar 1: "
;
cin >> n;
cout <<
"Podaj rozmiar 2: "
;
cin >> m;
cout <<
"Podaj rozmiar 3: "
;
cin >> k;
srand(time(
NULL
));
//inicjalizacja generatora liczb pseudolosowych
// --- (A) generowanie tablicy A - elementy pseudolosowe z przedziału [1,20]
for
(
int
i = 0; i < n; i++ )
for
(
int
j = 0; j < m; j++ )
for
(
int
p = 0; p < k; p++ )
A[i][j][p]= rand()
%
20 + 1;
// --- (B) wy
ś
wietlenie tablicy A
cout <<
"Wypisanie tablicy A: warstwy wzgl
ę
dem wymiaru pierwszego"
<< endl;
for
(
int
i = 0; i < n; i++ ) {
cout <<
"i = "
<< i << endl;
for
(
int
j = 0; j < m; j++ ){
for
(
int
p = 0; p < k; p++ )
cout << setw(3) << A[i][j][p];
cout << endl;
}
cout << endl;
}
system(
"PAUSE"
);
return
0;
}
S t r o n a
| 15 WETI Politechnika Gdańska
a)
wypisanie tablicy warstwami względem drugiego wymiaru
// --- (B) wy
ś
wietlenie tablicy A
cout <<
"Wypisanie tablicy A: warstwy wzgl
ę
dem wymiaru pierwszego "
<< endl;
for
(
int
j = 0; j < m; j++ ){
cout <<
"j = "
<< j << endl;
for
(
int
i = 0; i < n; i++ ) {
for
(
int
p = 0; p < k; p++ )
cout << setw(3) << A[i][j][p];
cout << endl;
}
cout << endl;
}
b)
wypisanie tablicy warstwami względem trzeciego wymiaru
// --- (B) wy
ś
wietlenie tablicy A
cout <<
"Wypisanie tablicy A: warstwy wzgl
ę
dem wymiaru pierwszego "
<< endl;
for
(
int
p = 0; p < k; p++ )
cout <<
"p = "
<< p << endl;
for
(
int
i = 0; i < n; i++ ) {
for
(
int
j = 0; j < m; j++ ){
cout << setw(3) << A[i][j][p];
cout << endl;
}
cout << endl;
}
S t r o n a
| 16 WETI Politechnika Gdańska
Zadania do samodzielnego rozwiązania po laboratorium
Zadanie L4_F3_Z1
Z tablicy dwuwymiarowej o rozmiarach n
×
m, wypełnionej liczbami losowymi z przedziału [1, 10], usuń
wiersz o zadanym indeksie z jednoczesną kompresją tablicy (przesunięciem do góry wszystkich wierszy
leżących poniżej).
Zadanie L4_F3_Z2
Do tablicy dwuwymiarowej A o rozmiarach n
×
m, wypełnionej liczbami losowymi z przedziału [10, 20]
dodaj kolumnę jedynek przed kolumną o indeksie k. Kolumny o wyższych indeksach przesuń w prawo
z jednoczesnym usunięciem kolumny ostatniej. Pamiętaj o właściwej kolejności poszczególnych operacji.
Przykład:
k = 1
1 2 5 4 1 1 2 5
Tablica A przed:
3 7 8 2 Tablica A po: 3 1 7 8
4 5 7 2 4 1 5 7
Zadanie L4_F3_Z3
Dla tablicy dwuwymiarowej A o rozmiarach n
×
m, wypełnionej liczbami losowymi z przedziału [a, b]
oblicz iloczyn elementów A[i][j], dla których suma indeksów i oraz j jest parzysta oraz osobno dla tych,
których suma indeksów jest nieparzysta. Czy można obliczyć obie sumy „przechodząc” przez tablicę
jednokrotnie?
Zadanie L4_F3_Z4
Napisz program sprawdzający, czy w wektorze liczb całkowitych istnieje para kolejnych elementów
podzielnych przez k. Wynik zapisz do zmiennej typu logicznego i wykorzystaj ją później do wypisania
odpowiedniego komunikatu na standardowym wyjściu. Program powinien również wypisać indeksy
elementów takiej pary.
Przykład:
k = 3
2 7 8 6 9 5 6 3 9
TAK, istnieje para kolejnych elementów podzielnych przez 3. Są to elementy o indeksach 3 i 4.
Zadanie L4_F3_Z5
Napisz program sprawdzający czy w tablicy dwuwymiarowej o rozmiarach n
×
m, gdzie n, m > 2, istnieje
podtablica o rozmiarach 3
×
3 i sumie elementów mniejszej od k.
S t r o n a
| 17 WETI Politechnika Gdańska
Zadanie L4_F3_Z6
Napisz program sprawdzający czy w tablicy dwuwymiarowej o rozmiarach
n
×
m, gdzie n, m > 2,
elementy w każdym z wierszy są uporządkowane niemalejąco (zauważ, że wiersz jest uporządkowany,
jeżeli nie zawiera pary elementów „burzących” uporządkowanie). Jeżeli są jakieś nieuporządkowane
wiersze, to zapisz ich indeksy w wektorze B. Wyświetl liczbę takich wierszy, wektor B albo komunikat, że
wszystkie wiersze są uporządkowane.
Zadanie L4_F3_Z7
Napisz program wypisujący na standardowym wyjściu tabelkę relacji R, określoną na zbiorze {1, 2, ... , n}
w następujący sposób R = { (x, y) | x dzieli y }. Tabela powinna być zapisana w tablicy dwuwymiarowej
a dopiero potem wypisana na standardowe wyjście.
Przykład:
Dla relacji R = {(1,1), (1,2), (1,3), (2,2), (3,3)} , tabelka będzie miała następującą postać:
1
2
3
1
1
1
1
2
0
1
0
3
0
0
1
Wartość 1 oznacza, że elementy x i y są w relacji R, natomiast 0, że nie są.
Nadobowiązkowe zadania do samodzielnego rozwiązania
Zadanie L4_F4_Z1
Napisz program, który dla danej tablicy dwuwymiarowej porządkuje jej wiersze niemalejąco według
wartości sumy elementów w wierszu.
Zadanie L4_F4_Z2
Napisz program, który dla wektora A złożonego z 13 liczb całkowitych dodatnich konstruuje tablicę
dwuwymiarową B, w której wiersze stanowią reprezentację binarną kolejnych liczb z tablicy A. Jaki
rozmiar będzie miała tablica B?
Zadanie L4_F4_Z3
Napisz program sprawdzający ile jest różnych wartości w wektorze nieujemnych liczb całkowitych
o wartościach z przedziału [0, 255].
Zadanie L4_F4_Z4
Splot dyskretny wektorów jest operacją często wykorzystywaną w cyfrowym przetwarzaniu sygnałów.
Napisz program, który dla dwóch wektorów A i B, każdy o n elementach rzeczywistych, oblicza splot
dyskretny dwóch wektorów, wynikiem którego jest wektor S o długości 2n-1 i elementach wyznaczonych
zgodnie ze wzorem:
=
− ,
dla każdego ∈ 0, 2 − 2 ,
przy czym, jeżeli k > n – 1, to A[k] = 0 i B[k] = 0.
S t r o n a
| 18 WETI Politechnika Gdańska
Przykład:
n = 5
dla j = 0
0 = 0 0
A[0]
A[1]
A[2]
A[3]
A[4]
B[4]
B[3]
B[2]
B[1]
B[0]
dla j = 1
1 = 0 1 + 1 0
A[0]
A[1]
A[2]
A[3]
A[4]
B[4]
B[3]
B[2]
B[1]
B[0]
dla j = 4
4 = 0 4 + 1 3 + 2 2
+ 3 1 + 4 0
A[0]
A[1]
A[2]
A[3]
A[4]
B[4]
B[3]
B[2]
B[1]
B[0]
dla j = 6
6 = 2 4 + 3 3 + 4 2
A[0]
A[1]
A[2]
A[3]
A[4]
B[4]
B[3]
B[2]
B[1]
B[0]
dla j = 8
8 = 4 4
A[0]
A[1]
A[2]
A[3]
A[4]
B[4]
B[3]
B[2]
B[1]
B[0]
Zadanie L4_F4_Z5
Napisz program obliczający iloczyn dwóch tablic liczb całkowitych. W wyniku mnożenia tablicy
o rozmiarach
× $, przez tablicę o rozmiarach $ × %, otrzymywana jest tablica & o rozmiarach × %
oraz elementach
&
obliczonych zgodnie ze wzorem:
&
=
' ∙ '
)
* +
=
1 ∙ 1
+
2 ∙ 2
+ ⋯ +
$ ∙ $
Zadanie L4_F4_Z6
Napisz program porządkujący niemalejąco, ciąg całkowitych liczb pseudolosowych z przedziału [0, M]
zapisanych w wektorze A. Zastosuj metodę przez zliczanie, która umieszcza w wektorze pomocniczym B
dane o liczbie wystąpień kolejnych elementów wektora A, a następnie zapisuje w wektorze wynikowym
C, kolejno na B[0] pozycjach liczbę 0, na B[1] pozycjach liczbę 1, itd.
Przykład:
M = 5
A:
2 1 3 1 0 5 3 0 2 3
Wektor pomocniczy B zawiera liczbę wystąpień kolejnych liczb: 0, 1, … , M w wektorze A, czyli:
B:
2 2 2 3 0 1
Konstruujemy tablicę wynikową C, umieszczając w niej na pierwszych B[0] = 2 pozycjach liczbę 0, na
kolejnych B[1] = 2 liczbę 1, itd. Tablica C ma postać:
C
: 0 0 1 1 2 2 3 3 3 5