Лекция С++

public
yeskendir.sultanov Apr 06, 2024 Never 102
Clone
C++ main.cpp 470 lines (387 loc) | 15.04 KB
1
#include <bits/stdc++.h>
2
#define ll long long
3
#define h first
4
#define m second.first
5
#define s second.second
6
#define Time pair<int,pair<int,int>>
7
8
using namespace std;
9
10
int main() {
11
// pair<int, pair<int, int>> x;
12
Time ta, tb;
13
cin >> ta.h >> ta.m >> ta.s;
14
cin >> tb.h >> tb.m >> tb.s;
15
if (ta > tb) {
16
cout << "YES";
17
} else {
18
cout << "NO";
19
}
20
return 0;
21
}
22
23
24
/*
25
1. Библиотеки
26
2. Переменные
27
3. int - 32 bits, 0 - sign, 31 bits => [0; 2^31-1] => ~ [-2*10^9; 2*10^9]
28
4. Оператор присваивания
29
int x = 17;
30
int y = x + 3;
31
int z = 0;
32
z = x + y;
33
x + y = z; --- нельзя
34
35
int a = 7, b = 3;
36
a += b; => a = a + b; // a = 10
37
a -= b; => a = a - b; // a = 7
38
a *= b; => a = a * b; // a = 21
39
a /= b; => a = a / b; // a = 7
40
a %= b; => a = a % b; // a = 1
41
42
Increments => Post a++, Pre ++a;
43
44
for (int i = 0; i < n; ++i) или for (int i = 0; i < n; i++) --- разницы нет
45
46
Decrements => Post a--, Pre --a;
47
48
int a, b, c;
49
a = b = c = -1;
50
5. Ариметические операторы
51
+, -, *, /, %
52
Деление => целочисленное и вещественное
53
целочисленное происходит между целыми числами
54
int a = 9, b = 2;
55
cout << a / b; => 4
56
57
вешественное просходит когда один из операндов вещественное число
58
int a = 9;
59
cout << a / 2.0; => 4.5
60
int b = 2;
61
cout << double(a) / b; => 4.5
62
cout << (a + 0.0) / b;
63
cout << 1.0 * a / b;
64
cout << double(a / b) ? --- неправильно посчитается
65
6. Типы данных
66
Числовые
67
целые
68
- int - 32 bits = 4B -> [-2^31+1; 2^31-1] => ~ [-2*10^9; 2*10^9]
69
- long long - 64 bits = 8B -> [-2^63+1; 2^63-1] => ~ [-8*10^18; +8*10^18]
70
2^10 ~ 10^3
71
(2^10)^6 ~ (10^3)^6 => 2^60 ~ 10^18
72
8 * 2^60 ~ 8 * 10^18
73
Например, создадим массив на 10^6 элементов с типом long long, сколько памяти будет занимать массив?
74
10^6 * 8B = 8 MB
75
76
10^3 ~ 1K
77
10^6 ~ 1M
78
10^9 ~ 1G
79
10^12 ~ 1T
80
- short - 16 bits = 2B -> [-2^15+1; +2^15-1] => ~ [-32000; 32000];
81
- unsigned - беззнаковый
82
- unsigned short x; -> [0; +2^16-1] => ~ [0; 64000]
83
- unsigned int x; -> [0; +2^32-1] => ~ [0; 4*10^9] [-2147483648; 2147483647]
84
- unsigned long long x; -> [0; +2^64-1] => ~ [0; 1.6 * 10^19]
85
- Подводные при работы
86
- При смещивании беззнаковых с знаковыми
87
unsigned int x = -1;
88
cout << x;
89
На экран выйдет 4294967295
90
- Переполнение
91
int a = 100000, b = 100000;
92
cout << a * b;
93
На экран выйдет 1410065408, неправильный результат
94
Так как int * int = int, поэтому один из операндов
95
должен быть с типом long long, если результат не
96
вмещается в int.
97
98
int a = 2147483647;
99
cout << a + 1;
100
Результат будет -2147483648.
101
вещественные -- числа с плавающей точкой
102
- float - 32 bits => 3.14 (6 знаков)
103
- double - 64 bits => (12-13 знаков)
104
- long double - 128 bits => (18-19 знаков)
105
- unsigned float
106
- unsigned double
107
- unsigned long double
108
109
Для вывода с определенной точностью
110
#include <iomanip>
111
112
113
cout << fixed << setprecision(9) << x;
114
double x = 5.14;
115
На экран выйдет: 5.140000000
116
Символьные
117
char x;
118
x = 'a';
119
120
ASCII -> любой символ храниться как число
121
'a' - 97
122
'b' - 98
123
'c' - 99
124
...
125
'z' - 122
126
127
'A' - 65
128
'B' - 66
129
'C' - 67
130
...
131
'Z' - 90
132
133
'0' - 48
134
'1' - 49
135
'2' - 50
136
...
137
'9' - 57
138
139
Все символы при сравнении сравниваются по ASCII коду.
140
Например, 'A' < 'a' => true => 65 < 97
141
char x = 'a';
142
x++; // x = x + 1; => x = 'b'
143
144
char x;
145
cin >> x;
146
if ('A' <= x && x <= 'Z') {
147
x += 32;
148
} else if ('a' <= x && x <= 'z') {
149
x -= 32;
150
}
151
cout << x;
152
153
if ('0' <= x && x <= 9) { // 48 <= x && x <= 57
154
cout << "YES";
155
} else {
156
cout << "NO";
157
}
158
159
Как узнать ASCII код символа?
160
char x;
161
cin >> x;
162
cout << int(x);
163
164
Как превратить в символ по ASCII коду?
165
int n; // n <= 127
166
cin >> n;
167
cout << char(n);
168
Булевые
169
1 bit => 0 или 1 ---> но архитектура компьютера по байтам ->
170
1 bool => 1B = 8 bits
171
0 == false
172
не ноль = 1 = true
173
174
bool flag = false;
175
flag = true;
176
177
if (flag == true) // if (flag)
178
if (flag == false) // if (!flag)
179
Составные --- структура данных
180
Массив
181
int a[30]; // одинаковый тип у всех элементов
182
183
Пример:
184
int n;
185
cin >> n;
186
int a[n]; // индексы будут [0; n - 1]
187
for (int i = 0; i < n; ++i) {
188
cin >> a[i];
189
}
190
for (int i = n - 1; i >= 0; --i) {
191
cout << a[i] << " ";
192
}
193
Двумерный массив - массивов массивов по другому таблица = матрица
194
int a[3][4];
195
a[0] = {0, 0, 0, 0};
196
a[1] = {0, 0, 0, 0};
197
a[2] = {0, 0, 0, 0};
198
199
Пример:
200
Дана матрица размера n*n, '
201
надо найти сумму элементов
202
в главной диагонали и вывести также все элементы.
203
204
0 1 2
205
0 1 2 3
206
1 4 5 6
207
2 7 8 9
208
209
int n;
210
cin >> n;
211
int a[n][n], sum = 0;
212
for (int i = 0; i < n; ++i) {
213
for (int j = 0; j < n; ++j) {
214
cin >> a[i][j];
215
if (i == j) {
216
sum += a[i][j];
217
}
218
}
219
}
220
221
cout << sum << endl;
222
for (int i = 0; i < n; ++i) {
223
for (int j = 0; j < n; ++j) {
224
cout << a[i][j] << " ";
225
}
226
cout << endl;
227
}
228
229
Многомерный массив -
230
Например: 3D -> int a[3][4][5]; -> массив таблиц
231
4D -> int a[3][3][4][4] -> таблица таблиц
232
233
Строка
234
Массивы
235
char a[10];
236
237
Чем отличается строка от массива символов?
238
- Динамичный размер - строка --- массив - статичный размер
239
- Готовые встроенные функция - строка --- нет готовых встроенных функции
240
241
string s; // пустая, то есть s = "";
242
cin >> s; // Hello World => слово прочитается, то есть до пробела => s = "Hello"
243
244
getline(cin, s); // Hello World => считывает полностью линию, s = "Hello World"
245
246
Пример:
247
Astana is capital of Kazakhstan. Almaty is beautiful city.
248
Fizmat is great school.
249
Apple is great company.
250
251
string s;
252
int wordCnt = 0;
253
while (cin >> s) { // возвращает true, если смог прочитать слово
254
wordCnt++;
255
}
256
cout << wordCnt;
257
258
259
string s;
260
int lineCnt = 0;
261
while (getline(cin, s)) { // возвращает true, если смог прочитать слово
262
lineCnt++;
263
}
264
cout << lineCnt;
265
266
267
string s;
268
cin >> s;
269
cout << s;
270
271
string s;
272
cin >> s;
273
for (int i = 0; i < s.size(); ++i) {
274
cout << s[i];
275
}
276
277
string s = "Hello World";
278
// s.size() => размер, 11
279
// s.empty() => true or false, пустой или нет
280
// s.substr(6, 5) -> дает подстроку длиной 5 символов начиная с индекса 6, "World"
281
282
string s = "Hello";
283
for (char x: s) {
284
cout << x;
285
}
286
// x = 'H' => x = 'e' => x = 'l' => x = 'l' => x = 'o'
287
288
string s = "Hello";
289
for (auto x: s) {
290
cout << x;
291
}
292
// x = 'H' => x = 'e' => x = 'l' => x = 'l' => x = 'o'
293
294
Сравнение строк - лексикографически
295
296
string a = "12", b = "2"; // "AB" "B"
297
if (a > b) {
298
cout << "YES";
299
} else {
300
cout << "NO";
301
}
302
303
"12", "11"
304
305
pair -- пара
306
pair<int, int> x;
307
x.first = 5;
308
x.second = 7;
309
310
pair<int, int> y;
311
y.first = 3;
312
y.second = 8;
313
314
swap(x, y);
315
316
x = y;
317
318
// -----------
319
int a, b;
320
a = 5;
321
b = 7;
322
323
int c, d;
324
c = 3;
325
d = 8;
326
327
a = c;
328
b = d;
329
330
swap(a, c);
331
swap(b, d);
332
333
Время --- h, m, s --- (8:15:27)
334
pair<int, pair<int, int>> t;
335
t.first = 8;
336
t.second.first = 15;
337
t.second.second = 27;
338
339
pair<int, pair<int, int>> td;
340
t.first = 3;
341
t.second.first = 55;
342
t.second.second = 17;
343
344
if (t > td) {
345
swap(t, td);
346
}
347
348
Пример кода:
349
350
#include <bits/stdc++.h>
351
#define ll long long
352
#define h first
353
#define m second.first
354
#define s second.second
355
#define Time pair<int,pair<int,int>>
356
357
using namespace std;
358
359
int main() {
360
// pair<int, pair<int, int>> x;
361
Time ta, tb;
362
cin >> ta.h >> ta.m >> ta.s;
363
cin >> tb.h >> tb.m >> tb.s;
364
if (ta > tb) {
365
cout << "YES";
366
} else {
367
cout << "NO";
368
}
369
return 0;
370
}
371
372
Структура данных
373
374
struct Point {
375
int x, y;
376
};
377
378
struct Triangle {
379
Point A, B, C;
380
381
double getArea() {
382
double ab = sqrt((A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y));
383
double ac = sqrt((A.x - C.x) * (A.x - C.x) + (A.y - C.y) * (A.y - C.y));
384
double bc = sqrt((B.x - C.x) * (B.x - C.x) + (B.y - C.y) * (B.y - C.y));
385
double p = (ab + ac + bc) / 2.0;
386
return sqrt(p * (p - ab) * (p - bb) * (p - ac));
387
}
388
};
389
390
int main() {
391
int n;
392
cin >> n;
393
Triangle t[n];
394
int k = 0;
395
for (int i = 0; i < n; ++i) {
396
cin >> t[i].A.x >> t[i].A.y;
397
cin >> t[i].B.x >> t[i].B.y;
398
cin >> t[i].C.x >> t[i].C.y;
399
400
if (t[k].getArea() < t[i].getArea()) {
401
k = i;
402
}
403
}
404
405
cout << k;
406
}
407
408
Векторы --- vector<int> a; --- структура данных похожий массив, с динамичный размером
409
410
vector<int> a; // пустой
411
int n;
412
cin >> n;
413
vector<int> a(n, -1); // создали сразу с размером n, заполненный значениями -1
414
415
vector<int> a;
416
int n;
417
cin >> n;
418
for (int i = 0; i < n; ++i) {
419
int x;
420
cin >> x;
421
a.push_back(x);
422
}
423
a.pop_back(); // удаляет последний элемент
424
425
a.insert(5, 6);
426
a.insert(3, {1, 2, 3});
427
428
7. Условный оператор
429
if (x > 0) {
430
cout << "Positive";
431
} else if (x < 0) {
432
cout << "Negative";
433
} else {
434
cout << "Zero";
435
}
436
437
Операторы сравнения
438
<, >, ==, !=, <=, >=
439
440
Логические операторы
441
&& - and --- объединяет два условия в один, возвращает true, если оба условии true.
442
|| - or --- объединяет два условия в один, возвращает true, если хотя бы один из условии true.
443
! - перевочивает значение условии в обратное
444
445
8. Циклы
446
for, while, do-while
447
448
int x;
449
cin >> x; // 123
450
int digitSum = 0;
451
while (x > 0) {
452
digitSum += x % 10; // 123 % 10 = 3, sum += 3=> sum=3, sum+=12%10 => sum=5, sum+=1%10=6
453
x /= 10; // x=123/10=12 => x=12/10=1, x=1/10=0
454
}
455
cout << digitSum;
456
457
458
int n;
459
cin >> n;
460
int sum = 0;
461
for (int i = 0; i < n; i++) {
462
int x;
463
cin >> x;
464
sum += x;
465
}
466
467
do {
468
469
} while (condition);
470
*/