Lab 4 Tablice id 258003 Nieznany

background image

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?

background image

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;

}

background image

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;

background image

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++;

background image

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)

background image

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;

}

}

background image

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;

background image

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;

background image

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;

}

background image

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;

background image

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;

}

background image

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;

background image

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;

}

background image

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;

}

background image

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;

}

background image

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.

background image

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.

background image

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


Wyszukiwarka

Podobne podstrony:
CCNA4 lab 3 3 2 pl id 109125 Nieznany
chemia tablice id 112030 Nieznany
Lab nr 3 id 258529 Nieznany
CCNA4 lab 4 3 7 pl id 109128 Nieznany
lab 04 id 257526 Nieznany
bd lab 04 id 81967 Nieznany (2)
arkusz zr Chemia tablice id 625 Nieznany (2)
CCNA4 lab 5 2 2 pl id 109130 Nieznany
lab fizycz id 258412 Nieznany
PMK lab potoczny id 363423 Nieznany
Lab 3 WDAC id 257910 Nieznany
BP20122013 lab 1n id 92525 Nieznany
CCNA4 lab 1 1 6 pl id 109122 Nieznany
3 endoprotezy lab IMIR id 3308 Nieznany
Lab 13 id 257441 Nieznany
Lab 1 ASM51 id 749292 Nieznany
lab 11 id 257664 Nieznany
lab zagadnienia 2 id 258726 Nieznany

więcej podobnych podstron