Dev-C++ за Windows, gcc за Linux, BSD и др. UNIX-ови ОС
Конзолни приложения, вход и изход
Стандартен вход и изход за езика
C++
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
Дадени са две цели числа в интервала [-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 |
Създаден от ОС файл: out.txt
17 |
cin >> n;
sum = 0;
for (i=0; i<n; i++)
for (j=0; j<n; j++) sum++;
Колко бързо ще работи
горната програма,
т.е. какви са критериите по които се определя бързината й?
Това, което
можем да направим експериментално е да проверим за колко
време ще се
изпълни
и ще завърши работата си. За да изследваме по-общо нейното
поведение е
възможно да я изпълним за други стойности на n.
Резултатите от последното са обобщени в следната таблица: |
|
Сравняване на двете
функции f (n)= 2n2 и
g(n)= 200n,
които показват времето за изпълнение на два дадени
алгоритъма А1
и A2, в зависимост от n. Асимптотично алгоритъмът A2 е по-бърз и неговата сложност е линейна, докато тази на A1 е квадратична. |
|
Нека е дадена задача, в която размерът на входните данни е определен от дадено цяло число n. Почти всички задачи, които ще разглеждаме, притежават това свойство. Ще поясним последното като разгледаме няколко примера:
Пример 1.
Да се сортира масив с n елемента.
Размерът на входните данни се определя от
броя
n
на
елементите на масива .
Пример 2.
Да се намери най-големият общ делител на a
и b.
В този пример размерът на входните данни се
определя
от броя на двоичните цифри (битовете) на по-голямото от числата
a
и b.
Пример 3.
Да се намери покриващо дърво на граф.
В този случай характеризираме размера на
входа
с две числа: брой на върховете и брой на ребрата.
Когато се интересуваме от сложността на алгоритъм най-често се интересуваме как ще работи при достатъчно голям размер n на входните данни. При формалното оценяване на сложността на алгоритмите изследваме поведението им при "достатъчно голямо" n, т.е. клонящо към безкрайност.
1. O(F) определя множеството от всички функции f, които нарастват не по-бързо от F, т.е. съществува константа c > 0 такава, че f (n) <= cF(n), за всички достатъчно големи стойности на n.
Нарастване на най-често използваните функции:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Определяне на сложност на алгоритъм:
- елементарна операция - не зависи от
размера
на обработваните данни - O(1) ;
- последователност от оператори - определя
се
от асимтотично най-бавния - f + g ~
max(O(
f
),
O(g));
- композиция на оператори - произведение от
сложностите - f g ~ O(
f g);
- условни оператори - определя се от
асимтотично
най-бавния между условието и различните случаи;
- цикли, вложени цикли - O(n),
O(np) .
// 1
for (i = 0; i < n; i++)
for (j = 0; j < n; j++,
sum++);
// 2
for (i = 0; i < n; i++)
for (j = 0; j < n; j++) if
(a[i] == b[j])
return;
// 3
for (i = 0; i < n; i++)
for (j = 0; j < n; j++) if
(a[i] != b[j])
return;
// 4
for (i = 0; i < n; i++)
for (j = 0; j < n; j++) if
(a[i] == a[j])
return;
// 5
for (i = 0; i < n; i++)
for (j = 0; j < i; j++)
sum++;
// 6
for (i = 0; i < n; i++)
for (j = 0; j < n*n; j++)
sum++;
// 7
for (i = 0; i < n; i++)
for (j = 0; j < i*i; j++)
sum++;
// 8
for (i = 0; i < n; i++)
for (j = 0; j < i*i; j++)
for (k = 0; k < j*j;
k++)
sum++;
Петър и Павел написали програма за генериране на номера на кредитни карти, но не били сигурни дали работи вярно. Напишете програма, която проверява дали резултатът от програмата на Петър и Павел е валиден номер на кредитна карта VISA или MasterCard.
Номерата на кредитните карти са 16-цифрени, разделени на групи от по 4 цифри, като всяка група е разделена от съседните й с тире. Проверката за валидност на картата се извършва по следния алгоритъм:
Вход
От стандартния вход се прочита цяло число k – броя номера на кредитни карти, които трябва да бъдат проверени. От всеки от следващите редове се прочита по един номер на карта.
Изход
За всеки един от номерата програмата трябва да изведе на отделен ред на стандартния изход VISA, ако това е валиден номер на VISA карта, MasterCard – ако е валиден номер на Master Card, YES – ако е валиден номер, който не е нито VISA, нито Master Card и NO – ако не е валиден номер на карта.
Пример
Вход |
Изход |
3 4204-5876-9012-5234 5173-1249-4804-2492 8699-3855-7635-7380 |
VISA MasterCard NO |