1. Технология за ефективно програмиране на алгоритми. Структури
от данни - STL
План:
Увод
Стандарти и пренасочване на вход и изход
Формати за задачи за състезания
Структури от данни - STL
Домашно - зад. 1 и 2
Увод
Стандарти на С и С++, компилатори
Dev-C++, Code::Blocks
за Windows, gcc за Linux, BSD и др. UNIX-ови ОС
Конзолни приложения, вход и изход
Стандартен вход и изход в С++
cin >> <име на
променлива>;
int k;
cin >> k;
cout << <име на
променлива>;
int ik = -10;
unsigned int uk = 10;
long lk = -1000000;
unsigned long ulk = 1000000; // 16 битов цял тип данни
double dk = 2.52;
cout << ik << " " <<uk << " " << lk << " "
<< ulk<< " " << dk << "\n";
Пренасочване на входа и изхода
Файл с програма на C или C++ със стандартни вход и изход:
prog.exe
Текстов файл с входните данни за програмата:
test1.inp
Изпълнение (стартиране) на програмата:
prog <test1.inp >test1.out
Текстов файл, произведен от програмата при това изпълнение:
test1.out
Формати за задачи за състезания
Пример 1: Сума на две числа
Дадени са две цели числа в интервала [-100, 100]. Напишете
програма,
която пресмята сумата на числaтa.
#include <iostream>
using namespace std;
int main()
{
int i, j;
cin >> i >> j;
cout << (i+j);
return 0;
}
Име на файл с текст на програмата: add.cpp
Име на изпълним файл (Windows): add.exe
Изпълнение на програмата:
C:\my_dir\>add
< inp.txt > out.txt
Файл за вход: inp.txt
12
5 |
Създаден от ОС файл: out.txt
17
|
Вход и изход за много примери
- Четене на зададен брой примери (числа)
int n;
cin >> n;
for (int i = 0; i < n; i++) { cin >> ... }
- Четене до края на файла за числа или думи (низове)
while (cin >> x) { ...}
while (cin >> x && x > 0) { ... }
- Четене до края на файла на редове (низове)
string st;
while(getline(cin, st)) { ... }
*
Даден е броят на примерите.
Пример 2: Сума на две числа
Дадени са две цели числа в интервала [-100, 100]. Напишете
програма,
която пресмята сумата на числaтa.
Вход
От стандартния вход се въвеждат много примери. Първото число е броят
на примерите, на всеки следващ ред са дадени по две числа за
събиране.
Изход
За всеки пример от входа на стандартния изход на отделен ред се
извежда едно число - сумата на числата от съответния пример от
входа.
Пример:
Вход
3
-10 2
20 3
30 4
Изход
-8
23
34
Решение:
// Николай Киров F12345
#include
<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
for (int k = 0; k < n; k++)
{
int i, j;
cin >> i >> j;
cout << (i+j) << endl;
}
return 0;
}
Решението като файл: f123456_0a.cpp
* Не е даден броят на
примерите.
Пример 3: Сума на две числа
Дадени са две числа в интервала [-100, 100]. Напишете програма, която пресмята сумата
на числaтa.
Вход
От стандартния вход се въвеждат много примери, на всеки ред са
дадени по две числа за събиране.
Изход
За всеки пример от входа на стандартния изход се извежда на отделен
ред едно число - сумата на числата от съответния пример от входа.
Пример:
Вход
-10 2
20 3
30 4
Изход
-8
23
34
Решение:
// Николай Киров F12345
#include
<iostream>
using namespace std;
int main()
{
int i, j;
while(cin
>>
i
>>
j) cout <<
(i+j) << endl;
return 0;
}
Тестване на програмата:
- стандартни случаи;
- гранични случаи;
- минимални и максимални размерности на входа;
- специални случаи;
- НЕ се разглеждат случаи, които са извън зададените ограничения
- НЕ се прави проверка за коректност на входа
* Големи числа.
Пример 4: Сума на две числа
Дадени са две цели числа в интервала [-10100, 10100].
Напишете програма,
която пресмята сумата на числaтa.
Вход
От стандартния вход се въвеждат много примери, на всеки ред са
дадени по две числа за събиране.
Изход
За всеки пример от входа на стандартния изход се извежда на отделен
ред едно число - сумата на числата от съответния пример от входа
Пример:
Вход
-100000000000000000000000000
1
200000000000000000000000000000000000000
-200000000000000000000000000000000000000
Изход
-999999999999999999999999999
0
Решение:
// Николай Киров F12345
#include
<iostream>
#include <string>
using namespace std;
string sum(string s1, string s2)
{
......
}
int main()
{
string i, j;
while(cin
>>
i
>>
j) cout << sum(i, j) << endl;
return 0;
}
* Персонализация за входа - участие на число
от факултетния номер на студента.
Пример 5: Сума на две числа
Дадени са две числа в интервала [-100, 100]. Напишете програма, която намира сумата на
двете числа и факултетния номер на студента.
Вход
От стандартния вход се въвеждат много примери, на всеки ред са
дадени по две числа за събиране.
Изход
За всеки пример от входа на стандартния изход на отделен ред се
извежда едно число - търсената сума от съответния пример от входа.
Пример:
Вход
-10 2
20 3
30 4
Изход
...
* Използване на генератор на случайни числа.
Пример 6: Сума на две числа
В редица от 100 случайни числа от интервала [-100, 100] да се намери
сумата на най-малкото и най-голямото число в редицата.
Вход
От стандартния вход се въвеждат много числа (примери), всяко число
задава начална стойност на случайната редица.
Изход
За всеки пример от входа на стандартния изход на отделен ред се
извежда едно число - търсената сума от съответния пример от входа.
Пример:
Вход
2
20
33
Изход
5
-1
3
Решение:
// Николай Киров F12345
#include
<iostream>
#include <cstdlib>
using namespace
std;
int main()
{
int i;
while(cin >> i)
{
srand(i);
int mi = 101, ma = -101;
for (int j=0; j<100;
j++)
{
int x =
rand()%201 - 100;
if (x
> ma) ma = x;
if (x
< mi) mi = x;
}
cout << (ma + mi)
<< endl;
}
return 0;
}
* Комбинация от генератор за случайна
числа и персоналицазия.
* Големи данни (Big Data): голям вход или дълги числа.
Структури от данни - STL
H.M. Deitel, P.J. Deitel, C++
How to Program, International 4th ed. , Prentice Hall, 2003. (2017)
Стандартна библиотека със шаблони: slides (PPT)
-- Въведение в STL - контейнери, итератори, алгоритми.
-- Контейнери-редици - vector,
list, deque: examples
(cpp)
-- Асоциативни контейнери - set,
multiset,
map, multimap: examples (cpp)
-- Адаптери на контейнери - стек, опашка и опашка с приоритет: examples
(cpp)
-- Алгоритми: examples (cpp)
-- Функционални класове.
Задача
- решение - данни
Cay Horstmann, Computing Concepts with
C++ Essentials, Third Edition, John Wiley & Sons, 2003.
Chapter 16: An
Introduction to Data Structures [bg]
Examples: list; stack and queue; set and multiset; map and multimap