Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Давыдов В.Г. - Программирование и основы алгоритмизации - 2003

.pdf
Скачиваний:
839
Добавлен:
13.08.2013
Размер:
9.55 Mб
Скачать

Это можно сделать, набрав путь вручную, или воспользовавшись расположенной справа кнопкой 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