Laboratorijas darbs 6.1. Masīvi (C++)

  1. Atvērt failu lab6.1.cpp, nokompilēt un darbināt.

#include <iostream>

using namespace std;

const int arr_size = 5;

 

int main ()

{

    int arr[arr_size];

    for (int i=0; i<arr_size; i++) cout << arr[i] << endl;

    return 0;

}

Izdrukājas kaut kādi 5 (neinicializēta masīva skaitļi).

Ievērot programmas augšdaļā esošo rindu

const int arr_size = 5;

kas deklarē konstanti arr_size.

  1. Nomainīt masīva deklarācijas rindu ar

int arr[arr_size]={11,22,33,44,55,66};

t.i., pievienot inicializāciju un nokompilēt (lab6.1a.cpp).

Tiek izdota kompilācijas kļūda, jo inicializācijas virknē masīva elementu par daudz.

lab6.1a.cpp: In function `int main()':

lab6.1a.cpp:7: excess elements in aggregate initializer

3.      Nodzēst inicializācijas virknē beidzamo elementu (66), kompilēt un darbināt programmu, iegūstot rezultātu 11 22 33 44 55

4.      Zem masīva arr deklarēšanas rindiņas pievienot rindiņas (lab6.1b.cpp):

int arr2[arr_size];

arr2 = arr;

5.      Kompilēt programmu, iegūstot kompilācijas kļūdu:

lab6.1b.cpp: In function `int main()':

lab6.1b.cpp:9: ISO C++ forbids assignment of arrays

6.      Nomainīt masīva arr2 deklarāciju no int arr2[arr_size]; uz

int *arr2;

Masīvs arr2 tagad ir dinamiskais masīvs, arr2 vērtības piešķiršana tam nozīmē norādi uz to pašu atmiņas apgabalu uz ko norāda arr.

7.      Aiz rindiņas arr2 = arr; ievietot rindiņu:

arr2[2] = 999;

(lab6.1c.cpp)

8.      Kompilēt un darbināt programmu.

Var redzēt, ka mums programmā ir viens masīvs, uz kuru norāda 2 mainīgie arr un arr2: elements #2 tika izmainīts caur mainīgo arr2, bet izdrukāts caur arr.

9.      Aiz masīva izdrukas rindiņas ievietot:

    arr2 = new int[arr_size];

    for (int i=0; i<arr_size; i++) arr2[i] = arr[i]*arr[i];

    for (int i=0; i<arr_size; i++) cout << arr2[i] << endl;

    delete[] arr2;

(lab6.1d.cpp)

Šīs rindas (1) izveido jaunu masīvu (ar new) – arr2 vairs nenorāda uz to pašu masīvu, uz kuru arr; (2) jaunais masīvs tiek aizpildīts ar iepriekšējā masīva vērtību kvadrātiem; (3) jaunais masīvs tiek izdrukāts; (4) jaunais masīvs tiek likvidēts.

10.  Nomainīt konstantes arr_size vērtību uz 6.

11.  Nomainīt masīva arr deklarācijas rindiņu uz:

int arr[arr_size-1]={11,22,33,44,55};

(lab6.1e.cpp)

Ar šo izmaiņu: (1) masīvs arr nemaina garumu, taču no viņa tiek mēģināti izdrukāt vairāk elementi nekā viņā ir; (2) masīvs arr2 ir garumā 6 un tā pēdējais elements tiek aizpildīts ar masīva arr neeksistējoša elementa kvadrātu.

12.  Kompilēt un darbināt programmu, uz ekrāna iegūstot 12 skaitļus.

Šis piemērs parāda, ka C++ nekontrolē masīva robežu pārkāpšanu.

 

 

Laboratorijas darbs 6.2. Simbolu virknes

1.      Atvērt failu lab6.2.cpp, nokompilēt un darbināt.

#include <iostream>

using namespace std;

 

int main ()

{

    char s[20]="Hello, World!";

    cout << s << endl;

    return 0;

}

Programma izveido un izdrukā simbolu virkni “Hello, World!”.

0

1

2

3

4

5

6

7

8

9

10

11

12

13

H

e

l

l

o

,

 

W

o

r

l

d

!

\0

 

  1. Pirms izdrukas rindiņas pievienot rindu:

s[5] = '\0';

(lab6.2a.cpp)

Šādā veidā pozīcijā #5 (pa virsu komatam) tiek uzrakstīts simbolu virknes beigu simbols.

3.      Nokompilēt un darbināt programmu, uz ekrāna izdrukājas “Hello”.

Dotā simbolu virkne sākās līdz ar masīva sākumu un beidzās pie tuvākā simbolu virknes beigu simbola

0

1

2

3

4

5

6

7

8

9

10

11

12

13

H

e

l

l

o

\0

 

W

o

r

l

d

!

\0

 

4.      Izdrukas rindiņu nomainīt par cout << s[7] << endl;

(lab6.2b.cpp)

0

1

2

3

4

5

6

7

8

9

10

11

12

13

H

e

l

l

o

\0

 

W

o

r

l

d

!

\0

5.      Nokompilēt un darbināt programmu, izdrukājas ‘W’

6.      Izdrukas rindiņu nomainīt par cout << &s[7] << endl;

(lab6.2c.cpp)

7.      Nokompilēt un darbināt programmu, izdrukājas ‘World!’

0

1

2

3

4

5

6

7

8

9

10

11

12

13

H

e

l

l

o

\0

 

W

o

r

l

d

!

\0

Par simbolu virknes sākumu var kalpot jebkura masīva vieta – tam nav obligāti jābūt masīva sākumam. & - adreses ņemšanas operators. Pēc līdzības ar šo piemēru var izspriest, ka šajā kontekstā s un &s[0] darbojas identiski.

8.      Izdrukas rindiņu nomainīt par cout << &s[2] << endl;

(lab6.2d.cpp)

9.      Nokompilēt un darbināt programmu, izdrukājas ‘llo’

0

1

2

3

4

5

6

7

8

9

10

11

12

13

H

e

l

l

o

\0

 

W

o

r

l

d

!

\0

 

 

 

Laboratorijas darbs 6.3. Vingrinājumi par masīviem un simbolu virknēm

Vingrinājums 1. (lab6.3a.cpp)

Dota simbolu virkne s. Noskaidrot, vai kāds simbols šajā simbolu virknē atkārtojas pēc kārtas.

Piemēram, simbolu virknē „Hallo, World!” pēc kārtas atkārtojas simbols ‘l’. (Atbildei jābūt – jā vai nē)

 

Vingrinājums 2. (lab6.3b.cpp)

Dota simbolu virkne s. Noskaidrot, vai kāds simbols šajā simbolu virknē atkārtojas.

Piemēram, simbolu virknē „Hallo, World!” atkārtojas simboli ‘l’ un ‘o’. (Atbildei jābūt – jā vai nē)

 

Vingrinājums 3. (lab6.3c.cpp)

Dots int masīvs arr[n].

Noskaidrot, vai kāds skaitlis šajā masīvā atkārtojas.

Piemēram, masīvā, {1,2,1,5,3} atkārtojas skaitlis 1. (Atbildei jābūt – jā vai nē)

 

 

Laboratorijas darbs 6.4. Saraksti (Python)

1.      Atvērt failu lab6.1.py, darbināt.

arr = [11,22,33,44,55]

for a in arr:

    print(a)

Izdrukājas skaitļi 11,22,33,44,55.

  1. Pārveidot programmu (lab6.1a.py):

arr = [11,22,33,44,55]

for i in range(0,len(arr)):

    print(arr[i])

Tas ir cits veids, kā izdrukāt to pašu (elementi tiek numurēti attiecīgi 0..4).

  1. Papildināt programmu ar rindiņu (lab6.1b.py):

print(arr[5])

Tiek izdota kļūda, jo sarakstā nav elementa ar numuru 5.

Traceback                    

    <module>

      lab6.1b.py  4 IndexError: list index out of range          

  1. Indeksu kļūdas pārbaudei var ieviest papildus kodu (lab6.1bb.py):

try:

    arr = [11,22,33,44,55]

    for i in range(0,len(arr)):

        print(arr[i])

    print(arr[5])

except IndexError as err:

    print(err)

Šī programma izdrukā:

11

22

33

44

55

list index out of range

5.      Izveidot jaunu programmu, kas automātiski ģenerē un izdrukā saraksta saturu, izmantojot for ciklu ģenerēšanai (lab6.1c.cpp):

ARR_SIZE = 5

arr = [11*(a+1) for a in range(0,ARR_SIZE)]

for i in range(0,len(arr)):

    print(arr[i])

Izdrukājas skaitļi 11,22,33,44,55 (kā sākumā).

6.      Papildinām programmu ar rindiņām (lab6.1d.cpp):

arr2 = arr

arr[0] = 999

for i in range(0,len(arr2)):

    print(arr2[i])

Izdrukājas skaitļi 11,22,33,44,55,999,22,33,44,55.

Pēc iegūtā rezultāta redzams, ka abi mainīgie arr un arr2 apzīmē vienu un to pašu sarakstu (arr[0]=999 uzstādīja vērtību 999, bet print(arr2[i]) izdrukāja)