Website Summary Files Commits Branches @commit @diff @stats
path: root / Sem. 06 / README.md
blob: 5da8c188c6e173524214c73ebec062859ea6135a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139

# Масиви (с фиксирана дължина)

**Масивът** е наредена последователност от елементи от един тип. Отделен елемент на масива се достъпва посредством името на масива, последвано от поредния номер (индекс) на елемента в квадратни скоби



## Инициализация на масиви

   ```c++
    int arr[6]; // Създава масив от 6 елемента, всеки от които е цяло число.
    int arr2[] = {0, 1, 2, 3, 4, 5}; // Създава масив от 6 елемента.
    int arr3[6] = {1,2,3}; //Останалите елементи се запълват с defaut-на стойност. 
    int arr[]; //грешка
    int arr[4] = {1, 2, 3, 4, 5} // грешка
```

  Задължително големината на масива трябва да е константа, чиято стойност е ясна преди да се компилира програмата

   ```c++
	int n;
	cin >> n;
	int arr[n]; //грешка!
```

   ```c++
	const int SIZE = 4;
	int arr[SIZE]; //ok!
```

## Достъп на елемент
	В масивите имаме константен достъп до всеки един елемент.
Достъпът става посредством индекси. Индексацията започва от 0. (защо?)

   ```c++
   int arr[] = {1, 2, 400, 4, 5}
    arr[3] = 44; //Присвоява на елементът на индекс 3 стойността 44.
					       // [1, 2, 400, 44, 5]
    cout << arr[2]; //Отпечатва на стандартния изход елементът на индекс 2 (400)
   
```
arr не е самият масив, а указател към първия елемент.
   ```c++
   int arr[] = {1, 2, 400, 4, 5}
	cout << arr; //ще се отпечата АДРЕСА на масива, но не и самия масив.
```

Достъпът до елемент става, чрез смятането адреса му:

Адресът на arr[i] е: arr + i * sizeof(type of array)

i е брой "отмествания" надясно.





## Подаване на масиви във функции
   ```c++
    #include <iostream>
    using namespace std;
    void print(const int arr[], int len)
    {
	    for(int i = 0; i < len; i++)
	    {
	        cout << arr[i] << " ";
	    }
	}
	void increment(int[] arr, unsigned size)
	{
		for(unsigned i = 0; i < size; i++)
			arr[i]++;
	}
	int main()
	{
	    const int SIZE = 4;
	    int arr[SIZE] {1,2,3,4};
    
        increment(arr, SIZE);
	    print(arr,SIZE);
    
	    return 0;
    }
```
 Масивите се подават във функциите по адрес! 
 Т.е промените, които се правят върху масива във функцията, ще се отразят върху подадения като параметър масив!
## Примери

 - Отпечатване на масив
 - Линейно търсене в масив
 -  Решето на Ератостен
 - Двоично търсене
 - Обръщане на масив

<h3>Задачи</h3>

**Задача 1:** Да се напише функция, която приема масив и връща дали е палиндром.

*Вход: [1 2 3 2 1], Изход: true*

**Задача 2** Да се напише функция, която приема масив и връща най-малкото общо кратно на числата в масива.

*Вход: [9 18 6 12], Изход: 36*


**Задача 3** Да се напише функция, която приема масив и връща най-големият общ делител на числата в масива.

*Вход: [9 18 6 12], Изход: 3*

**Задача 4 :** Да се напише функция, която приема масив и връща дали е конкатенация на два масива, които са палиндроми.

*Вход: [1 2 3 2 1 4 5 5 4], Изход: true*

*Вход: [1 2 3 4 5], Изход: false*

*Вход: [1 2 3 2 1], Изход: true*


**Задача 5 :** Въвежда се число N (N <= 1000) и N цели числа (елементи на масив).
Да се отпечатат броя на инверсиите в масива.

Инверсия ще наричаме двойка индекси (i,j), където i < j  и arr[i] > arr[j]

*Вход: 6 5 4 3 2 10  Изход: 15* //в масива [5 4 3 2 1 0]  има 15 инверсии.

*Вход: 5 10 11 12 13 14 15, Изход: 0*


**Задача 6:** 
От даден масив от  сортирани последнователни числа са премахнати някои числа.
Напишете фунцкия, която приема такъв масив и връща най-малкото премахнато число.

Решението ви трябва да работи с **логартмична сложност** ( а не с лиейно минаване през масива). 

*Вход: [5 6 7 9 10 12 13], Изход: 8* //премахнатите числа са 8 и 11.

*Вход: [10 12 13 14 16], Изход: 11* //премахнатите числа са 11 и 16.

Модифицирайте функцията, за да отпечатване и най-голямото премахнато число