1. Синтактични грешки. Програмистът е направил “граматическа
грешка” според езика С++. Например:
int main(
{ // error:
missing ‘)’
readIn: // error: illegal character ‘:’
sort();
compact();
print();
return 0 // error: missihg
‘;’
}
2. Грешки за типове. Данните в С++ се свързват с типове.
Стойността 10, например, е цяла. Думата “hello”, заградена от двойни кавички е
символен низ. Ако на дадена функция очакваща аргумент от цял тип се подаде
аргумент тип низ, компилаторът ще сигнализира за грешка при
типовете.
Всяко съобщение за грешка съдържа номер на ред и кратко
описание на причината, поради която се счита, че вие сте сгрешили. Препоръчва се
грешките да се коригират в последователността, в която се появяват. Често
единична грешка може да предизвика лавинообразен ефект и компилаторът да съобщи
за повече грешки, отколкото фактически съществуват. След като коригирате текста
на програмата си, можете да я компилирате отново.
За операционната
система MS-DOS, обаче, разширението “.c” не е допустимо - MS-DOS не прави
разлика между малки и големи букви.
Реализацията на С++ под управлението
на MS-DOS поддържа следните разширения на файлове:
cxx (x е + завъртян на
90 градуса).
cpp (p съответствува на “плюс”-а).
Втората част от работата
на компилатора е да преведе формално коректния програмен текст. Този превод,
наречен генерация на код, фактически генерира обектов или асемблерен текст,
разбираем за компютъра на който програмата ще бъде
изпълнявана.
Резултатът от успешна компилация е изпълним файл. По
подразбиране, при системата на автора този файл се нарича a.out. Той може да
бъде изпълнен както следва:
$ a.out
Изходът на програмата изглежда
така:
readIn()
sort()
compact()
print()
Командната опция
“-о име” позволява на програмиста да даде име на програмния файл, различно от
a.out. Например, командният ред
$ CC prog1 prog1.C
ще създаде
изпълним файл prog1. За да се изпълни тази програма трябва да се
напише:
$ prog1
Освен езиковия компилатор реализацията на С++
предлага и набор от стандартни библиотеки. Библиотеките са съвкупност от
предварително дефинирани функции. В С++, например, входът и изходът се поддържат
от стандартна С++ библиотека. Програмистите могат да използуват библиотечните
функции в програмите си по същия начин, по който използуват функциите, които са
написали.
Най-голямото предимство на програмните библиотеки е това, че
позволяват на добри програмисти да окомплектоват своите знания за използуване от
множество други програмисти. Малко от нас, например, знаят как работи
електричеството, но повечето знаят как да включат осветлението. Добрата
библиотека може да бъде използувана така лесно, както и ключа за осветление. В
следващата част се прави един кратък преглед на входно-изходната
библиотека.
1.3. Първоначален поглед върху
вход-изхода.
Входът и изходът не са част от езика С++, но се
поддържат от библиотека, написана на С++ и позната като iostream (вх/изх.
поток). Приложение А разглежда подробно тази библиотека(ў). В този дял е дадена
достатъчна информация за начинаещия читател.
Входът, постъпващ от
потребителският терминал, наречен стандартен вход, е свързан с предварително
дефинирания във вх/изх. поток вход cin (произнася се “see-in”). Изходът, насочен
към потребителския терминал, се нарича стандартен изход и се свързва с
предварително дефинирания във вх/изх. поток изход cout (произнася се
“see-out”).
Операторът за изход (“<<”) се използува за изпращане на
стойност към стандартния изход. Например:
cout << "The sum of 7 + 3
= ";
cout << 7 + 3;
cout << "n";
Последователността от
символи n представя символа нов ред. При писане той предизвиква насочване на
печата на следващия ред. Последователност от входно-изходни оператори може да
бъде обединена в един оператор. Например,
cout << "The sum of 7 + 3
= " << 7 + 3 << "n";
Всеки следващ изходен оператор може да
бъде добавен на свой ред към cout. За четимост обеднените изходни оператори
могат да се разположат на няколко реда. На следващите три реда е записан един
изходен оператор.
Читателят, разполагащ с реализация на С++, която не се
основава на версия 2.0, има по-ранната версия на библиотеката, наречена stream.
Примерите в тази книга използуват подмножество, общо за двете
версии.
cout << "The sum of ";
<< v1 << " +
";
<< v2 << " = " << v1 + v2 <<
"n";
Съответно операторът за вход (“ >> “) се използува за четене
на стойност от стандартния вход. Например, следната програма реализира прост
алгоритъм за четене на две стойности, определяне на по-голямата от тях и
отпечатването й.
#include <stram.h>
void read2 ( int1&,
int2& );
int max( int, int );
void writeMax( int );
main()
{
int val1, val2;
read2( val1, val2 );
int maxVal = max(
val1, val2 );
writeMax( maxVal );
return 0;
}
void
read2(int& v1, int& v2); {
cout << "nPlease enter two
numeric values: ";
cin >> v1 >> v2;
}
int max( int
v1, int v2); {
if ( v1 > v2 )
return v1;
else
return
v2;
}
viod writeMax( int val ) {
cout << val << " is
the largest value.n";
}
По тази програма могат да бъдат направени
няколко забележки. Описани са три имена на функции преди да бъде дефинирана
функцията main(). Първоначалният списък се нарича предварителна декларация,
съобщаваща на програмата, че тези функции съществуват и описанията им могат да
бъдат намерени някъде в текста на програмата, представена от този файл или в
отделен файл. Всяка функция трябва да бъде декларирана преди да може да бъде
викана. Предварителната декларация е един от начините да се направи това. val1 и
val2 се наричат променливи. Операторът
int val1, val2;
дефинира
тези променливи за програмата. И променливите трябва да бъдат обявени преди да
могат да бъдат използувани. Подробен преглед на променливите е направен в глава
1.
v1 и v2, наричани формални параметри, изграждат списъка от аргументи
на функциите read2() и max(). val е единствения формален параметър на
writeMax(). Същността на дефиницията им е разгледана в дял 4.6, където се
обсъжда как се описват параметрите на функции.
Читателят сигурно е
забелязал, че main() e описана малко по- различно този път. Не е описан явно
типа на връщания резултат. Това е разрешено в С++: функция, за която не е
зададен тип за връщане, връща тип цяло число по подразбиране. Когато програмата
бъде компилирана и изпълнена се получава следния изход (потребителят е въвел
стойностите 17 и 124):
Please enter two numeric values: 17 124
124 is
the largest value.
Двете стойности, 17 и 124, са разделени с интервал.
Интервалите, табулациите и новите редове са празно пространство (white space) за
С++. Операторът
cin >> v1 >> v2;
правилно чете двете
стойности, защото операторът за изход (“>>”) пропуска цялото празно
пространство, което е въведено.
Предварителната дефиниция на cin и cout
се съдържа в stream.h. Ако програмистът забрави да включи този файл, всички
обръщения към cin и cout ще бъдат отбелязани от компилатора като грешки.
Включването на предварителните декларации показва първичната употреба на
заглавния файл. ( Част 5.5 разглежда заглавните файлове в
подробности).
Съществува и един трети вх/изх. поток, cerr (произнася се
“see-err”), наречен стандартна грешка, който също се свързва с потребителския
терминал. cerr се използува за да уведомява потребителя относно някои особени
състояния на програмата по време на изпълнение. Например, следната част от
програма предпазва програмиста от деление на нула:
if (v2 == 0 ) {
cerr << "nerror: attempt to divide by zero";
return;
}
v3 = v1/v2;
#include
void read() { cout pact() { cout n"; }
void write() { cout n() {
read();
sort();
compact();
write();
return 0;
}
При мен С ми извежда грешка още в първия ред, демек при #include