16+
ComputerPrice
НА ГЛАВНУЮ СТАТЬИ НОВОСТИ О НАС




Яндекс цитирования


Версия для печати

Модуль поиска не установлен.

Программирование на С++ - это не сложно! Часть 3

08.09.2008

Алексей Антипов (KyberAlex) KyberAlex@mail.ru

Основные понятия языка С++. Раздел 4. Структура программы С++

Итак, мы уже умеем определять переменные и производить над ними простые вычисления. Но в реальности мы не можем просто нагромоздить кучу переменных и формул и считать это программой. Программа должна иметь определенную структуру, подчиняющуюся правилам С++. Прежде всего надо отметить, что программа на С++ может быть двух типов: консольная и с графическим интерфейсом (GDI). GDI-программы = это обычные программы Windows, они работают в графическом режиме, т.е. в окне такой программы мы видим текст и графику одновременно. Консольные программы остались в наследство со времен MSDOS. В окне консольной программы может быть только текст, причем количество символов по горизонтали и вертикали фиксировано, и, как правило, составляет 80х25, 80х43, 80х50 и некоторые другие значения. Если вы хотите посмотреть, как выглядит консольная программа, откройте "блокнот" или другой текстовый редактор и наберите в нем следующие строки:

dir
pause,

сохраните полученный текст под именем console.bat, а затем откройте полученный файл проводником Windows или из вашего файл-менеджера. Если у вас установлен Windows95/98, то вы можете вместо этого просто вызвать "сеанс MSDOS" из меню "пуск".

Как же выглядит структура программы на С++? В общем виде она представляет собой совокупность переменных и функций, размещаемых в заголовочных файлах и программных файлах. Для GDI-программы в самом общем виде она выглядит так:

#include <windows.h>
... определения переменных и функций ...
int APIENTRY WinMain( HINSTANCE hInst, HINSTANCE hPrevInst,
LPSTR szCmdLine, int nCmdShow )
{
... текст программы ...
return ... возвращаемое значение ...
}

Для консольной программы структура немного другая:

#include <iostream.h>
... определения переменных и функций ...
void main()
{
... текст программы ...
}

GDI-программы мы подробно рассмотрим во второй части нашего курса, здесь же мы займемся консольными программами, т.к. они проще и больше подходят для освоения С++.

Функции можно назвать строительными блоками для программы на С++. Как правило, функция представляет собой законченный фрагмент программы, выполняющий некоторую задачу. Любая программа на С++ всегда должна иметь функцию main или WinMain, с которой и начинается выполнение программы. Эта функция, в свою очередь, может вызывать другие функции и т.д. Функции размещаются в программных файлах (расширение .cpp). Как обязательный минимум, в программе должен быть срр-файл, содержащий функцию main (или WinMain). Обратите внимание, что как и в именах переменных, в именах функций строчные и прописные буквы различны! Поэтому имена Main или winmain не будут интерпретированы как имена начальной функции программы, что приведет к ошибке. Подробнее мы рассмотрим функции в следующем разделе, здесь же они будут употребляться в общем виде, без подробного раскрытия своей структуры.

В принципе, все функции программы могут быть определены в одном срр-файле, но для реальных больших программ это создаст огромные трудности при написании и отладке, т.к. в полученном нагромождении разобраться будет очень сложно. Поэтому функции обычно группируют по смыслу в несколько срр-файлов. Для связи срр-файлов в единое целое используют заголовочные файлы (расширение .h). В заголовочных файлах указываются те функции и переменные данного срр-файла, которые предназначены для использования в других срр-файлах. Рассмотрим пример: имеются следующие файлы: myprog.cpp, содержащий функцию main, и файл myfunc.cpp, содержащий несколько функций и переменных:

файл myprog.cpp
#include <iostream.h>
void main()
{
...программа, использующая функции и переменные из myfunc.cpp
}
файл myfunc.cpp
int perem1;
float perem2;
int func1( int z )
{
...
}
int func2( double a )
{
...
}

Пусть мы хотим использовать переменную perem2 и функцию func1 из myfunc.cpp в myprog.cpp. Для этого создадим заголовочный файл myfunc.h следующего вида:

файл myfunc.h
    #ifndef _MYFUNC_H_
    #define _MYFUNC_H_
extern int perem2;
    int func1( int z );
#endif

Чтобы подключить полученный заголовочный файл к нашим программным файлам, необходимо вставить в начало обоих срр- файлов директиву #include "myfunc.h".

Директива #include "имяфайла.h" предназначена специально для подключения заголовочных файлов к программным. К одному программному файлу можно подключить столько заголовочных, сколько надо, использовав соответствующее количество директив #include. Этой же директивой подключаются и стандартные файлы С++. Так, например, практически все консольные программы должны подключать файл iostream.h, а GDI-программам необходим файл windows.h. Обратите внимание, что имена стандартных С++ файлов в директиве #include заключаются не в кавычки, а в угловые скобки, например, так: #include <iostream.h>

Рассматривая структуру файла myfunc.h можно видеть, что для переменной в заголовочный файл выносится ее описание с до-бавлением перед ним директивы extern, а для функции выносится ее заголовок.

Общепринято начинать заголовочный файл директивами

    #ifndef _имяфайла_H_
    #define _имяфайла_H_
и заканчивать директивой #endif. Это делается с целью избежать множественного определения одних и тех же функций и переменных на тот случай, если заголовочный файл используется в нескольких программных файлах. Например, файл a.h включается в файлы a.cpp и b.cpp. Если вышеприведенных директив не будет, то компилятор С++ сначала определит переменные и функции из a.h при обработке а.срр, затем начнется обработка b.cpp, при этом опять произойдет обращение к a.h (т.к. b.cpp использует a.h), и опять будут определены те же самые переменные и функции, что неизбежно приведет к ошибке. Эти директивы фиксируют, что заголовочный файл с таким-то именем уже обработан и еще раз определять из него переменные и функции не надо. Директива #ifndef блокирует компиляцию нижележащего фрагмента программы до директивы #endif, если ее аргумент определен. При первом обращении к заголовочному файлу аргумент _имяфайла_Н_ еще не определен и поэтому заголовочный файл нормально компилируется, в т.ч. и директива #define _имяфайла_Н_ , которая и определит аргумент _имяфайла_Н_ для последующих вызовов заголовочного файла.

Программирование на С++ - это не сложно! Часть 1
Программирование на С++ - это не сложно! Часть 2
Программирование на С++ - это не сложно! Часть 4



статьи
статьи
 / 
новости
новости
 / 
контакты
контакты