Точки 2а, 2б и 2в
също вече представят проблеми, които знаем как да решим. Тъй като вече сме в
състояние да решим всички подпроблеми, които бяхме формулирали, то фактически
сме решили и по-големия проблем. Последователността от действия ще
бъде:
1. Четене от файла продажби.
2. Подреждане на
файла продажби - първо по издател, а после в групите на издателите.
3. Сгъстяване на повтарящите се заглавия.
4. Записване на резултатите в
нов файл.
Описаната последователност от действия може да бъде наречена
алгоритъм. Следващата стъпка е описване на алгоритъма в термините на някой
програмен език - в този случай на С++.
1.2. С++ програма
В
С++ всяко действие се представя чрез израз. Израз, ограничен с “;” представлява
оператор. Най-малката независима единица в езика е оператора. В естествените
езици аналогичната конструк ция е изречение. Следващите изрази, например, са
оператори на С++.
int value;
value = 7 + 1;
cout <<
value;
Първият оператор е един декларативен оператор. Той дефинира област
от паметта на компютъра, свързана с името value, където могат да се записват
цели числа. Вторият оператор е оператор за присвояване. Той помества в паметта
на компютъра, свързана с името value, резултата от събирането на 7 и 1. Третият
оператор е оператор за изход. Сout описва изход, насочен към потребителския
терминал. << е оператор за изход. Операторът записва в cout, т.е. на
потребителския терминал, стойността, съхранена в областта от компютърната памет,
свързана с името value.
Операторите логически се групират в единици,
наречени функции. Например, всички оператори, необходими за четене от файла
продажби, са организирани във функция, наречена readIn().
Съответно,
създаваме и функциите sort(), compact() и print().
В С++ всяка програма
трябва да съдържа функция, наречена main(), написана от програмиста, преди да
може да бъде изпълнена. Следва пример за дефиниране на main() за гореописания
алгоритъм.
int main() {
readIn();
sort();
compact();
print();
return 0;
}
Програмата на С++
започва да се изпълнява от първия оператор на main(). В този случай, програмата
започва с изпълнението на функцията readIn(). Изпълнението й продължава чрез
последователното изпълнение на операторите в main(). Тя приключва нормално с
изпълнението на последния оператор на main().
Всяка функция се състои от
четири части: тип на резултата, име на функцията, списък от аргументи и тяло.
Първите три елемента заедно образуват прототипа на функцията. Списъкът от
аргументи, затворен в скоби, съдържа списък от нула или повече аргументи,
отделени със запетая. Тялото на функцията е затворено в скоби от вида “{ }”. То
съдържа последователност от програмни оператори.
В този пример, в тялото
на main() се извикват за изпълнение функциите readIn(), sort(), compact() и
print(). Когато тези функции приключат работа, се изпълнява операторът return 0.
Това е един предварително дефиниран оператор на С++, предоставящ метод за
прекратяване на изпълнението на функция. Когато операторът е съпътствуван от
стойност, 0 например, тази стойност става стойност, която функцията връща. В
този случай, връщаната стойност 0 показва успешното приключване на изпълнението
на main().
Нека сега да подготвим програмата за изпълнение. Първо трябва
да предложим дефиниции за readIn(), sort(), compact() и print(). В този момент
следните фиктивни примери са достатъчно добри.
void readIn() { cout
<< "readIn()n"; }
void sort() { cout << "sort()n";
}
void compact() { cout << "compact()n"; }
void print() {
cout << "print()n"; }
void се използува за да укаже, че функцията
не връща стойност. Както е дефинирано, всяка функция просто ще съобщи за своето
съществуване чрез написване на съответния текст върху терминала на потребителя,
когато бъде извикана от main(). По-късно бихме могли да заменим фиктивния пример
със самото тяло, когато то бъде реализирано. Този метод на последователно
увеличаване на кода на програмата е полезен за контролиране на програмните
грешки, които неминуемо допускаме. Да се опитваме да направим работеща програма
отведнъж е просто много сложно и объркващо.
Всеки файл, съдържащ текст на
програма се състои от две части - име на файл и разширение. Разширението често
определя съдържанието на файла. Това разширение ще се променя при различните
реализации на С++. При операционната система UNIX, името на С++ файла може да
бъде завършено както със “.с”, така и със “.С”. Употребата на малка буква “.с”
показва съществуващата връзка между програмните езици С++ и С. (Всички файлове,
съдържащи програми на С трябва да завършват със “.с”). За да бъде различаван С++
програмен файл, използувайте разширение “.С”. (ў)
Въведете следната пълна
програма в един С++ кодов файл.
#include <stream.h>
void
read() { cout << "read()n"; }
void sort() { cout << "sort()n";
}
void compact() { cout << "compact()n"; }
void write() { cout
<< "write()n"; }
int main() {
read();
sort();
compact();
write();
return
0;
}
Stream.h е един от т.н. заглавни файлове. Той съдържа информация
за cout, която е необходима за написаната програма. #include е една
предпроцесорна директива. Тя указва добавянето на съдържанието на stream.h към
нашия текстов файл.
След като вече програмата е записана във файл може
да бъде компилирана. Това се прави така ($ е системния показалец):
$ СС
prog1.C
Името на командата, използувано за извикване на компилатора на
С++ ще бъде различно за различните реализации. СС е името на командата,
използувано от AT&T C++ Language System, Release 2.0. Направете справка в
своя наръчник или попитайте вашия системен администратор за името на С++
компилатора във вашата система.
Част от работата на вашия компютър е да
анализира текста на програмата за коректност. Компютърът не може да установи
дали логиката на вашата програма е правилна, но може да открие грешки във
формата на програмата. Най-общо програмните грешки, които компилаторът открива
са:
#include
void read() { cout pact() { cout n"; }
void write() { cout n() {
read();
sort();
compact();
write();
return 0;
}
При мен С ми извежда грешка още в първия ред, демек при #include