Давыдов В.Г. - Программирование и основы алгоритмизации - 2003
.pdfЭто можно сделать, набрав путь вручную, или воспользовавшись расположенной справа кнопкой Browse... (просмотр). Разумеется, что соответствующий подкаталог должен быть предварительно соз дан.
•Указать утилите Project имя файла проекта. Одновременно
свводом имени проекта в поле Project Name (имя проекта) это же имя автоматически добавляется в качестве подкаталога в поле Loca tion.
После выполнения указанных действий для создания проекта следует нажать кнопку [ОК], в результате чего на экране появится диалоговое окно мастера создания консольного приложения. В этом окне выбираем переключатель An empty project (пустой проект). При этом создаются только служебные файлы проекта. Для того чтобы наполнить созданный проект, необходимо добавить в него файл(ы), содержащий(ие) текст программы.
Это можно сделать двумя способами.
1.Добавить в проект уже существующий файл(ы), созданный(ые) ранее в текстовом редакторе и имеющий(ие) расширение *.с/?/?. Повторно обращаем внимание на то, что следует предвари тельно поместить существующий(ие) файл(ы) в каталог проекта (лучше все иметь в одном месте).
2. Создать новый файл и вставить его в проект.
Добавление в проект существующего файла. Для этого необ ходимо выбрать в меню Project пункты Add to Project (добавить в проект) и Files.... В результате этих действий на экран будет выве дено диалоговое окно Insert Files into Project (добавление файлов в проект). Здесь следует выбрать те файлы, имеющие расширение
.срр, которые хотите включить в проект. Это можно сделать, либо дважды щелкнув кнопкой мыши на имени файла, либо выделив нужные файлы и нажав кнопку [OKJ.
Создание нового файла и включение его в проект. Для созда ния нового файла необходимо из меню File выполнить команду New... и в появившемся диалоговом окне New выбрать вкладку Files, где представлены все типы файлов, которые можно создавать. Флажок Add to Project (добавить в проект) должен быть установ лен, чтобы создаваемый файл автоматически был добавлен в проект. В списке Files выберите тип создаваемого файла — C/C++ Header File или C++ Source File, а в поле File name: - имя файла. Осталось нажать кнопку [ОК]. В результате Visual C++ создаст файл и откро ет пустое поле редактирования текста.
После набора и сохранения всех текстов можно переходить к следующему этапу - отладке программного проекта.
410
Открытие для работы существующего проекта. Для суще ствующего проекта необходимо из меню File выполнить команду Open Workspace ... и в появившемся диалоговом окне Open Work space войти в каталог проекта и "кликнуть" по файлу с расширением
.dsw. В результате проект загружается в IDE для последующей рабо ты.
П.2.2. IDE Borland C++ 3.1. Создание программного проекта
Создание нового проекта П08'Прило:>§сения, Для того чтобы создать новое приложение (программу), необходимо создать новый проект. Для нового проекта следует предварительно создать каталог. С помощью встроенного в IDE текстового редактора в каталоге про екта следует создать файлы проекта с исходным текстом с расшире ниями *.срр, *.h или *.hpp.
После создания исходных файлов надо создать файл проекта. Для этого надо выбрать в меню Project команду Open Project..., в появившемся окне Open Project File ввести имя файла проекта и нажать кнопку [ОК].
Для включения в проект файлов с расширениями *.с/?р (в ча стном случае в проекте такой файл может быть единственным) сле дует на рабочем столе активизировать окно Project, выбрать в меню
Project команду Add Item..., в появившемся окне Add to Project List "кликнуть" по каждому из файлов с расширением *.ср/7 и на жать кнопку [Done]. В результате этого будет создан требуемый программный проект.
После создания программного проекта необходимо проверить и, при необходимости, скорректировать информацию о местополо жении каталогов стандартных включаемых файлов. С этой целью достаточно в меню Options выполнить команду Directories, в поя вившемся окне Directories указать расположение каталогов стан дартных включаемых файлов и нажать кнопку [ОК]. После этого программный проект готов к работе.
Открытие |
для работы существующего |
проекта |
DOS- |
прилоэн:ения. Для |
существующего проекта необходимо из |
меню |
Project выполнить команду Open Project..., в появившемся окне Open Project File в каталоге проекта выбрать имя файла проекта и нажать кнопку [ОК]. В результате проект загружается в IDE для по следующей работы.
411
Приложение П.З. Рекомендации по структуре
однофайловой программы с одной функцией и пример оформления исходного текста
приведенный ниже пример оформления исходного текста про стейшего однофайлового программного проекта с единственной функцией попутно преследует и другую цель — он демонстрирует какой должна быть структура программы:
Файл |
TASK01.CPP |
|
|
|
|
|
|
Проект |
|
|
однофайловый |
с |
единственной |
||
|
|
|
функцией |
(главной) |
|
||
Назначение |
|
пример |
простой |
программы |
г |
||
|
|
|
вычисляющей |
с := а + b |
|
||
Состав |
проекта |
|
файл |
проекта |
|
TASK01.PRJ/ |
функция); |
|
|
|
файл |
TASK01.СРР |
(главная |
||
|
|
|
файл |
TASK01.DAT |
(файл |
данных); |
|
|
|
|
файл |
TASK01.OUT |
(файл |
результатов) |
|
ЭВМ |
|
|
IBM |
80386 |
|
|
|
Среда |
программирования: |
ВС31 (C++) |
|
|
|
||
Операционная |
система |
DR DOS 6.0 |
|
|
|
||
Дата |
создания |
|
08.11.2000 |
|
|
|
|
Дата |
корректировки |
|
|
|
|
|
Иванов И. И,, каф. |
АВТ, ФТК, гр. |
1081/4 |
Санкт-Петербургским |
государственный |
политехнический |
V университет |
|
|
// Для работы с функциями ввода-вывода: STanDard Input Output ^include <stdio.h>
±nt main( |
void. ) |
// |
Возвращает 0 при успехе |
|
|||
{ |
a, Ь, |
// Аргументы |
функции |
|
|||
±nt |
|
||||||
|
с, |
// |
Значение |
функции |
fscant |
||
FILE |
ret code; |
// |
// |
Возвращаемое значение для |
|||
*£_±Пг |
Указатель на структуру со |
чтения |
|||||
|
*f_out; |
|
// |
сведениями |
о файле для |
||
|
|
// |
Указатель на |
структуру со |
записи |
||
|
|
|
// |
сведениями |
о файле для |
//Открываем файл для чтения
±£( ( f_ln |
= fopen( "task01.dat", "г" ) ) |
== NULL ) |
||
{ |
"\n |
Ошибка 10. |
Файл taskOl.dat |
для чтения не" |
printf( |
||||
|
" |
открыт \п" |
) ; |
|
412
retvLm 10;
}
//Читаем значения аргументов функции
retcode = fscanf( |
f_±n, |
" |
%i |
%i", &a, &b ) ; |
|
||||
±£( |
retcode |
!= |
2 ) |
|
|
|
|
|
|
{ |
printf( |
"\n |
Ошибка 20. |
Произошла |
ошибка |
чтения из" |
|||
|
|||||||||
|
jtretujm |
" файла |
taskOl.dat |
\п" ) |
; |
|
|||
} |
20; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// |
Закрываем |
файл для |
чтения |
|
|
|
|||
±f( |
fclose( |
f_in |
) |
== EOF ) |
|
|
|
||
{ |
printf( |
"\n |
Ошибка |
30. |
Файл task01.dat |
не " |
|||
|
|||||||||
|
return |
"закрыт |
\п" |
) ; |
|
|
|
|
|
|
30; |
|
|
|
|
|
|
|
}
//Открываем файл для записи
з.£( ( f_out |
= fopen( "task01.out"r |
"w" ) |
) == NULL ) |
||
{ |
|
Ошибка 40. |
Файл |
taskOl.out |
для записи " |
printf( |
"\n |
||||
return |
"не |
открыт \п" |
) ; |
|
|
40; |
|
|
|
|
}
//Печатаем заголовок и аргументы функции
fprintf( |
f_out, |
|
И. |
И. г каф. |
АВТ, |
ФТК, |
гр. |
1081/4 |
|
|
||||||||
"\п |
|
Иванов |
|
|
||||||||||||||
"\п С.-Петербургский |
|
государственный |
политехнический |
унверситет " |
||||||||||||||
"\п |
|
|
|
(семестр |
1, |
программный проект |
1) |
|
|
\п" |
||||||||
"\п |
|
|
|
|
Аргументы |
с |
: = а |
+ b |
b=%i |
\л", а, b |
\п" |
|||||||
"\п |
|
|
|
|
функции: |
a=%i |
) ; |
|||||||||||
// |
Закрываем |
|
файл |
для |
|
записи |
|
|
|
|
|
|
|
|
||||
±f( |
fclose( |
|
f_out |
|
) -= EOF ) |
|
|
|
|
|
|
|
|
|||||
{ |
printf( |
|
"\n |
Ошибка |
50. |
|
Файл |
taskOl.out |
не закрыт |
\n" |
) ; |
|||||||
|
|
|
||||||||||||||||
|
return |
50; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// |
Вычисляем |
|
значение |
функции |
- |
в |
этом месте |
обычно |
делается |
|||||||||
// |
довольно |
много работы: |
проверяется |
область |
допустимых |
|||||||||||||
// |
|
значений |
прочитанных |
данных |
(аргументов |
функции) |
и |
|
||||||||||
// |
|
выполняется |
решение |
задачи |
|
|
|
|
|
|
|
|||||||
с = а + Ь; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||
// |
Открываем |
файл |
для |
|
дозаписи |
", "a" |
|
== NULL ) |
|
|
||||||||
±f( |
( |
f_out |
|
= fopen( |
"taskOl. |
out |
) ) |
|
|
|||||||||
{ |
printf( |
|
"\n |
Ошибка |
60. |
|
Файл |
taskOl.out |
для |
дозаписи |
" |
|||||||
|
|
|
||||||||||||||||
|
return |
|
"не открыт \п" ) ; |
|
|
|
|
|
|
|
|
|||||||
|
60; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// |
Печатаем |
значение |
функции |
|
|
|
|
|
|
|
|
|||||||
fprintf |
( f_outr |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
413
"\n |
Значение функции: с=%1'\ с ) ; |
//Закрываем файл для записи
±f( fclose( f_out ) == EOF )
{
printf( "\n Ошибка 10. Файл taskOl.out не закрыт \n" ) ; r&tuxm 10;
}
return 0;
Рекомендуем использовать этот пример как "образец для под ражания". Обращаем внимание на следующие особенности.
1. В программе используется файловый ввод-вывод. Это наи более рациональный способ ввода-вывода.
2.Программа имеет следующую структуру:
•открытие файла данных для чтения, чтение из него данных и за крытие файла (обратите внимание, что файл данных закрывается сразу же после завершения из него чтения, а не в конце работы программы - так выгоднее);
•открытие файла результатов для записи, вывод в него заголовка и прочитанных данных и закрытие файла (обратите внимание, что
файл результатов закрывается сразу же после завершения |
вывода |
в него значений прочитанных данных, а не в конце |
работы |
программы - так также выгоднее); |
|
•проверка области допустимых значений прочитанных данных (это обязательно нужно делать) и содержательное решение зада чи, которое в большинстве случаев является довольно сложным — поэтому-то на это время держать файл результатов открытым невыгодно;
•открытие файла результатов для дозаписи, вывод в него результа тов решения задачи и закрытие файла.
3.Для обработки ошибок в программе используются значения, возвращаемые функциями библиотеки Си. Это нужно делать всегда.
4.Чтобы сделать программу наглядной, легко читаемой в про грамме используется рациональная ступенчатая запись и коммента
рии. Никогда не пренебрегайте подобными элементами оформления и внимательно изучите пример с этой точки зрения.
Приложение П.4. Методика отладки программы
Известное высказывание о том, что после обнаружения по следней ошибки в программе остается еще хотя бы одна, стало ак сиомой. Поэтому отладке программы уделялось и уделяется боль-
414
шое внимание. Как же вести отладку программы?
Все обнаруживаемые в программе ошибки можно разделить на три большие категории.
1. Синтаксические ошибки, которые автоматически выявляют ся на этапе компиляции. Уяснить смысл синтаксических ошибок и устранить их достаточно легко, так как здесь в качестве достаточно хорошего помощника выступает компилятор. В зависимости от язы ка программирования, компилятор лучше или хуже выявляет такие ошибки. В ряде случаев синтаксическая ошибка в программе влечет за собой неадекватную реакцию компилятора. Например, отсутствие скобки часто приводит к тому, что компилятор обнаруживает ошиб ку через десятки строк кода. В последнем случае можно рекомендо вать одновременный набор открывающей и закрывающей скобок (например, { }) с последующим вводом текста между ними.
2. Логические (часто их также называют алгоритмическими) ошибки. Их бывает наиболее трудно обнаружить и исправить. Часть
из них выявляется на этапе отладки, часть на этапе |
сопровождения, |
|
а некоторые приводят к тяжелым последствиям. |
|
|
3. Информационные |
ошибки. В частности, к |
Появлению ин |
формационных ошибок может привести отсутствие обработки оши бок ввода-вывода, попытки деления на ноль, переполнение разряд ной сетки компьютера и т.п. Для исключения и/или обработки ин формационных ошибок в ряде случаев приходится значительную часть исходного кода программы отводить для всевозможных про верок.
П.4.1. Компиляция и компоновка программного проекта. Устранение синтаксических ошибок
На этапе отладки необходимо устранить все синтаксические и большую часть логических ошибок в программном проекте, допу щенных на предыдущих этапах создания приложения. Для этого не обходимо скомпилировать каждый созданный файл. Это можно сде лать несколькими способами.
•Скомпилировать каждый файл с расширением .срр. Для этой цели в IDE MS Visual Studio C++ 6.0 можно использовать команду
Build I Compile имя_файла или комбинацию клавиш <CtrH-F7>, а в IDE Borland C++ 3.1 - команду Compile | Compile имя_файла или комбинацию клавиш <Alt+F9>. Компиляцию отдельного файла удобно использовать в больших проектах, чтобы сосредоточиться на конкретном файле. При этом следует иметь в виду, что ссылки меж ду файлами не проверяются.
•Скомпилировать и скомпоновать все файлы проекта ("со брать" или "построить" исполняемый файл), воспользовавшись для
415
этого в IDE MS Visual Studio C++ 6.0 командами Build | Build имя_файла эквивалентно <F7> или Build | Rebuild All. Единствен ным отличием этих команд является то, что команда Rebuild All не проверяет даты создания файлов проекта и компилирует все файлы, а не только те, которые были модифицированы после компиляции. Аналогичным образом, в IDE Borland C++ 3.1 можно использовать команды Compile | Маке имя_файла эквивалентно <F9> или Com pile I Build All. В результате создается исполняемый файл с расши рением .ехе,
• Можно сразу запустить приложение, выполнив в IDE MS Visual Studio C++ 6.0 команду Build | Execute имя_файла или по комбинации клавиш <Ctrl+F5>, а в IDE Borland C++ 3.1 -команду Run I Run имя_файла или по комбинации клавиш <Ctrl+F9>. Если в программный проект были внесены какие либо изменения, то в IDE MS Visual Studio C++ 6.0 на экране будет высвечено диалоговое окно с запросом на построение исполняемого файла. Для построе ния указанного файла следует нажать кнопку [Да]. В IDE Borland C++ 3.1 подобный запрос не выполняется.
Если программный проект содержит синтаксические ошибки, то в IDE MS Visual Studio C++ 6.0 при выполнении любой из пред ставленных команд информация об ошибках автоматически отобра жается во вкладке Build окна Output, по умолчанию расположенно го в нижней части окна IDE. Если окно Output было удалено с экра на, то его можно вывести снова на экран с помощью команды View | Output или по комбинации клавиш <Alt+2>. Каждое сообщение об ошибке или предупреждении начинается с имени файла, где они об наружены, за которым следует номер строки, где это произошло, а далее идут двоеточие и слово "error" (ошибка) или "warning" (пре дупреждение) и соответствующий номер. В конце приводится крат кое описание ошибки или предупреждения. Если дважды щелкнуть левой кнопкой мыши на строке с сообщением или предупреждени ем, то ошибочная строка будет отмечена стрелкой в левой части в соответствующем окне редактирования. Лучше всего добиться, что бы в окончательном варианте не было ни того, ни другого, хотя с предупреждениями исполняемый файл создается и может быть за пущен.
Аналогичным образом, в IDE Borland C++ 3.1 при наличии синтаксических ошибок при выполнении любой из представленных выше команд информация об ошибках автоматически отображается в появившемся окне Message. Каждое сообщение об ошибке или предупреждении начинается со слова "error" (ошибка) или "warning" (предупреждение), за которым следуют имя файла и но мер ошибочной строки, а далее идут двоеточие и приводится крат кое описание ошибки или предупреждения. Если дважды щелкнуть
416
левой кнопкой мыши на строке с сообш^ением или предупреждени ем, то в соответствуюш[ем окне редактирования в ошибочную строку будет помещен курсор, а текст сообщения будет повторен в нижней части окна редактирования.
После устранения синтаксичесих ошибок следует запустить программу, выполнив команду Build | Execute имя__файла либо по комбинации клавиш <Ctrl+F5> (IDE MS Visual Studio C++ 6.0) или команду Run | Run имя_файла либо по комбинации клавиш <CtrI+F9> (IDE Borland C++ 3.1). При этом также можно получить сообщение об ошибке (или ошибках). Это тот самый случай, когда программный проект не содержит синтаксических ошибок, а при ложение не работает. Вызвано это так называемыми логическими (алгоритмическими) ошибками, для обнаружения которых можно использовать разные методы (например, закомментировать фраг менты программы).
Однако лучше всего воспользоваться имеющимся в IDE
встроенным отладчиком.
П.4.2. Отладка программного проекта. Устранение логических (алгоритмических) ошибок
Встроенный отладчик предоставляет следующие возможности.
•Пошаговое выполнение программы.
а Просмотр значений переменных в любом месте программы. Для пошагового выполнения программы отладчик предостав ляет несколько возможностей, основные из которых мы и рассмот
рим вначале для IDE MS Visual Studio C++ 6.0, a затем и для IDE Borland C++3 . 1 .
Встроенный отладчик IDE MS Visual Studio C++ 6,0. Для за пуска исполняемого файла в режиме отладки можно выполнить ко манду Build I Start Debug | Go (выполнить) или эквивалентно на жать клавишу <F5>. Однако если просто выполнить эту команду, не предпринимая никаких предварительных действий, работа програм мы не будет отличаться от запуска в обычном режиме, разве что при завершении во вкладке Debug в нижней части окна Output интегри рованной среды разработки появится информация о параметрах за вершения работы программы.
Чтобы перейти в режим пошагового выполнения, предвари тельно перед выполнением команда Go необходимо установить так называемые точки останова {breakpoints), которые можно рассмат ривать как стоп-сигналы для отладчика. Обычно они устанавлива ются в местах, которые вызывают сомнение в правильности выпол нения. При этом предполагается, что все операторы, предшествую-
417
ш^ие первой точке останова, выполняются правильно. Самый про стой способ установки точки останова заключается в следующем. Курсор устанавливается на строку, на которой нужно остановить работу программы, и нажимается клавиша <F9>. Повторное нажатие клавиши <F9> удаляет точку останова. Строка останова в окне ре дактирования отмечена темно-красным кружком в крайней левой позиции. Если, после задания точки останова, программу запустить по команде Build | Start Debug | Go, либо нажав клавишу <F5>, то все операторы программы, предшествующие точке останова, будут выполняться в обычном режиме и только перед строкой останова выполнение программы приостановится.
При этом внешний вид интегрированной среды разработки существенно изменится. Во-первых, изменипся состав основного меню. Во-вторых, строка, которая будет выполняться следующей, будет отмечена желтой (по умолчанию) стрелкой. И, наконец, поя вится два новых окна - Variables (переменные) и Watch (наблюде ние), которые позволяют просматривать и менять значения пере менных. Если одно из окон или оба окна на экране отсутствуют, то их можно поместить на экран, используя комбинации клавиш <Alt-4-3> для переменных и/или <Alt+4> для наблюдения.
Для пошагового выполнения в отладчике имеются следующие команды.
•Debug I Step Over (шаг через) или эквивалентно <F10> - выполняет текущий оператор или функцию и переходит к следую щей строке.
•Debug I Step Into (шаг внутрь) или эквивалентно <F11> - выполняет текущий оператор языка C++ или переходит к первому оператору функции.
а Debug | Step Out (шаг вне) или эквивалентно <Shift+Fll> - завершает выполнение текущей функции и переходит к строке, не посредственно следующей за ее вызовом.
• Debug I Run to Cursor (выполнить до курсора) или эквива лентно <Ctrl+F10> - выполняет программу до строки, где в текущий момент находится курсор.
В окне Variables (переменные) автоматически отображаются только локальные переменные текущего блока. После каждого шага выполнения программы значения этих переменных обновляются. В строке Context указывается, в какой функции (блоке) в данный мо мент находимся.
Переменные, которые нужно контролировать или изменять по желанию программиста, можно задать в окне Watch (наблюдение). Для этого в свободной строке столбца Name для контроля значения переменной достаточно набрать идентификатор переменной и на-
418
жать клавишу [Enter]. Для изменения значения переменной в про цессе отладки следует выбрать строку с именем этой переменной, с помощью клавиши [Tab] перейти в столбец Value, набрать там но вое значение и нажать клавишу [Enter]. При дальнейшей отладке, вместо прежнего значения, будет использовано модифицированное таким образом значение переменной.
Для просмотра значения переменной в реэюиме отладки, наря ду с использованием окон Variables и Watch, можно в окне редак тирования поставить курсор на имя интересующей нас переменной.
Если переменной было |
присвоено значение, то появится всплываю |
|
щее окно со значением |
этой переменной Эта |
возмолсностъ наибо |
лее удобна и мы рекомендуем ее использовать |
как моэюно чаще. |
Встроенный отладчик IDE Borland C++ 5.7. Для запуска ис полняемого файла в режиме отладки следует также предварительно задать точки останова (breakpoints). Предполагаем, что все опера торы, предшествующие первой точке останова, выполняются пра вильно. Самый простой способ установки точки останова заключа ется в следующем. Курсор устанавливается на строку, на которой нужно остановить работу программы, и вводится комбинация кла виш <Ctrl+F8>. Повторный ввод этой комбинации удаляет точку останова. Строка останова в окне редактирования отмечена красным цветом. Если, после задания точки останова, программу запустить по команде Run | Run, либо введя комбинацию клавиш <Ctrl+F9>, то все операторы программы, предшествующие точке останова, бу дут выполняться в обычном режиме и только перед строкой остано ва выполнение программы приостановится. При этом строка остано ва сохранит подсветку, но изменит цвет подсветки.
Для пошагового выполнения в отладчике имеются следующие команды.
аRun I Trace over (шаг поверх) или эквивалентно <F8> - вы полняет текущий оператор или функцию и переходит к следующей строке.
аRun I Trace into (шаг внутрь) или эквивалентно <F7> - вы полняет текущий оператор языка C++ или переходит к первому опе ратору вызываемой функции.
• Run I Go to cursor (выполнить до курсора) или эквивалент но <F4> - выполняет программу до строки, где в текущий момент находится курсор.
Переменные, которые нужно контролировать в точке останова можно посмотреть в окне Watch. Чтобы это окно появилось в IDE и отображало значение требуемого объекта, достаточно поместить курсор на идентификатор объекта, ввести комбинацию клавиш <Ctrl+F7> и в появмвшемся окне Add Watch нажать кнопку [ОК].
419