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 > 0, elementy tablicy zostaną wyświetlone poprawnie. Dla nieparzystego > 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)

 

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)

 

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)

 

b)

 

c)

 

d)

 

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)

 

b)

 

c)

 

d)

 

 

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ć 

= [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 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  [ab

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: 

= 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 nm > 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  nm > 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 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 = { (xy) | x dzieli }. 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ć: 

 

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

 

= 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 = 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 ma postać: 

C

:      0  0  1  1  2  2  3  3  3  5