МУ_ЛР2_ОП (1079923), страница 2
Текст из файла (страница 2)
// Циклы do
int i = 0;
do
{
printf("Шаг цикла(do) - %d\n" , i);
i++; i++;
} while ( i < 4);
Оператор break , также как и в переключателе прерывает выполнение цикла любого типа. После его выполнения циклические повторения прекращаются и выполняется оператор, следующий за оператором цикла.
// Цикл for с условной остановкой на втором шаге
for (int i =1 ; i <= 5 ; i++ )
{
printf("Шаг цикла(break) - %d\n" , i);
if ( i == 2) break;
};
Оператор continue прерывает выполнение только текущего шага цикла. Далее цикл продолжается так, как задано по начальному условию. В примере, расположенном ниже часть 2 цикла не выполняется при значении индекса I равного 2-м.
// Цикл for с условным пропуском части операторов на втором шаге ( continue)
for (int i =1 ; i <= 5 ; i++ )
{
printf("Шаг цикла(break) - %d" , i);
if ( i == 2) { printf("Пропуск %d!!\n", i); continue; };
printf("Тело - часть 2!!\n");
};
Другие примеры использования операторов цикла.
Для цикла for ( суммирование массива):
Summ = 0; // начальное условие
for (int i = 0 ; i < MAX; i++ ) // начальное условие и проверка продолжения
{
Summ = Summ + iMas[i]; // тело цикла
… // Другие операторы тела цикла
};
Для цикла while, тоже вычисление суммы массива:
Summ = 0; // начальные условия
int i =0; // начальные условия
while (i < MAX ) // проверка продолжения
{
Summ = Summ + iMas[i]; // тело цикла
i++;
… // Другие операторы тела цикла
};
Для цикла do – while (сумма в массиве):
Summ = 0; // начальные условия
int i =0; // начальные условия
do {
Summ = Summ + iMas[i]; // тело цикла
i++;
… // Другие операторы тела цикла
} while (i < MAX ); // проверка продолжения
Большинство ошибок в циклической программе связано с неверным заданием условий проверки продолжения и завершения циклов, а также задании начальных условий цикла. В этом случае часто программа может выполняться сколь угодно долго и говорят, что программа зациклилась (заметьте, что данное слово уже вошло также в обиход обычной речи!).
9 Отладка программ.
В этом разделе повторяем возможности отладчика, так как демонстрация программы преподавателю должна быть выполнена в режиме отладчика. При разработке программ важную роль играет отладчик, который встроен в систему программирования. В режиме отладки можно проверить работоспособность программы и выполнить поиск ошибок самого разного характера. Отладчик позволяет проследить ход (по шагам) выполнения программы и одновременно получить текущие значения всех переменных и объектов программы, что позволяет установить моменты времени (и операторы), в которые происходит ошибка и предпринять меры ее устранения. В целом, отладчик позволяет выполнить следующие действия:
-
Запустить программу в режиме отладки без трассировки по шагам (F5);
-
Выполнить программу по шагам (F10);
-
Выполнить программу по шагам с обращениями к вложенным функциям(F11);
-
Установить точку останова (BreakPoint – F9);
-
Выполнить программу до первой точки останова (F5);
-
Просмотреть любые данные в режиме отладки в специальном окне (locals);
-
Просмотреть любые данные в режиме отладки при помощи мышки;
-
Изменить любые данные в режиме отладки в специальном окне (locals и Watch);
-
Установить просмотр переменных в специальном окне (Watch);
-
Просмотреть последовательность и вложенность вызова функций.
При выполнении всех лабораторных курса студенты должны активно использовать отладчик VS, знать его возможности и отвечать на контрольные вопросы, связанные с отладкой и тестированием программ.
Примечание. Подробное описание материала и понятий вы можете найти в литературе [1 - 6] или справочной системе MS VS. Кроме того, не пропускайте лекции по курсу. Не рекомендую безоговорочно верить материалам из сети Интернет (например, в Википедии), так как там в некоторых статьях есть ошибки!
10 Модули
При проектировании и разработке программ применяется метод модульного программирования. Суть его заключается в том, что сложная программа разбивается на отдельные части (модули – не надо путать с учебными модулями). Каждый модуль разрабатывается отдельно и возможно разными программистами. Такой способ называют также декомпозицией. Совокупность модулей составляет проект программы. Модули бывают разных типов:
-
Исходные модули, содержащие текст на языке программирования.
-
Объектные модули получаются в результате компиляции программы.
-
Исполнимые модули предназначены для выполнения программы.
Исходные модули могут быть разных типов. Основные исходные модули – это модули программ (*.c, *.cpp) и модули заголовочных файлов (*.h , *.hpp). Они включены в разные разделы дерева проекта программы.
Объектные модули формируются компилятором языка программирования (у нас С++) в том случае, если не было ошибок в программе. Объектные модули являются промежуточным звеном в создании программ, но не могут выполняться непосредственно. Подключаемые в программу библиотеки содержат объектные модули, поэтому не требуется их повторной компиляции. Объектные модули имеют расширение *.obj.
Исполнимые модули предназначены для непосредственного выполнения на компьютере или подключения в выполняемую программу. Основные исполнимые модули имеют расширение *.exe (или *.com), поэтому операционная система может контролировать их запуск. Модули динамических библиотек имеют расширение *.dll. Существуют и другие разновидности исполнимых модулей, зависящих от используемых технологий. Исполнимые модули формируются специальной программой системы программирования редактором связей (или компоновщиком). Редактирование связей заключается в проверке межмодульных связей по функциям и по данным и объединении их единый исполнимый модуль. Последовательный процесс обработки программы для получения исходного модуля представлен в методическом пособии в разделе 3[5].
Для объединения модулей функционально и по данным в С++ используются прототипы функций и описание внешних переменных. Покажем это на простом примере:
// Модуль 1
int i = 0; // Глобальная переменная
int Summ(int a, int b){}; // Описание функции в модуле 1
…
// Модуль 2
extern int i; // Описание внешних данных
int Summ(int , int ); // Прототип внешней функции
main(){
…
i = 5; // Использование внешних данных
S = Summ(2,2); // Вызов внешней функции
…
}
В модуле 2 используется переменная i, описанная как глобальная переменная в модуле 1. В модуле 2 используется функция Summ, описанная как в модуле 1. Для правильного объединения связей (работы редактора связей) используются описания внешних данных (extern) и задание прототипа функции Summ.
11 Понятие о блок-схемах
Для описания алгоритмов используются различные способы. Наиболее наглядным и простым является технология блок-схем. В лабораторных работах вам необходимо в совершенстве освоить эту технологию. В ЛР №2 фрагменты программ циклического вида и с ветвлением нужно оформит в виде блок-схемы. Блок-схемы позволяют не только логично и без ошибок построить программу, но и проверить ее работу в процессе отладки и проверки. Технология построения блок-схем подробно описана в методическом пособии к лабораторным работам по курсу[5] в разделе 8. Для графического построения блок-схем очень удобно использовать программный продукт MS Visio. Пример блок-схемы для вычисления суммы положительных элементов массива приведен ниже.
12 Библиотеки функций
В системах программирования предусматривается много библиотек для функций различного назначения (например, для работы со строками, выполнения ввода и вывода, работы с массивами и т.д.). Эти библиотеки подключаются с помощью заголовочных файлов или пространств описаний (имен - namespace). Кроме заголовочных файлов для использования библиотек подключаются специальные модули (иногда они подключаются автоматически), содержащие описания функций ( *.lib или *.dll). Пример подключения библиотек ввода/вывода и библиотек для работы с математическими и системными функциями:
#include <math.h>
#include <process.h>
#include <stdio.h>
Стандартных библиотек очень много. Нужно хорошо знать их назначение и их состав для использования в программах. Чем лучше знания о библиотеках, тем быстрее и безошибочно можно создать сложную программу. В современных системах программирования доступны (большом количестве) библиотеки классов, которые описывают новые дополнительные типы данных.
13 Примеры программ с ветвлением и циклами.
Вторая часть задания, помимо первой связанной с изучением теоретического раздела заключается в том, чтобы испытать в проекте СИ уже отлаженные программы и фрагменты программ. Возможно, что, осваивая теоретическую часть работы, вы уже на компьютере проверили выполнение фрагментов текста и применения различных операторов ветвления (из раздела 3), тогда вам будет проще продемонстрировать их работу преподавателю. В дополнение к примерам, расположенным выше нужно испытать и изучить примеры расположенные ниже. Эти действия нужно сделать в отладчике.
Для этого нужно создать пустой проект в MS VS (Test_LR2), как описано выше, скопировать через буфер обмена в него текст данных примеров, отладить его и выполнить.
14 Пример поиска максимального значения из трех переменных (А , B, C)
Задавая вручную различные значения переменных A, B, C нужно проверить работы алгоритма по всем веткам условий ( четыре варианта).
// условный переход
int A = 4 , B = 4 , C =1;
if ( A > B )
{
if ( A > C )
printf("Максимально (A) - %d\n" , A);
else
printf("Максимально (C) - %d\n" , C); }
else
{
if ( B > C )
printf("Максимально (B) - %d\n" , B);
else
printf("Максимально (C) - %d\n" , C);
};
15 Решение квадратное уравнение
Задавая вручную различные значения переменных a, b, c нужно проверить работы алгоритма по всем веткам условий ( два варианта ). Уравнение в общем виде имеет вид. Его решение вы можете посмотреть в любом справочнике по математике.
ax2+bx+c=0
Программа для вычисления корней уравнения (Напомню: корни могут быть действительными и комплексными).
float a,b,c;
float c,d,e,f,x1,x2;
scanf ("%5f%5f%5f",&a,&b,&c);
// Промежуточные вычисления
z=2.0f*a;
e=-b/z;
d=b*b-4*a*c; // детерминант
f=sqrt(fabs(d))/z;
// Проверка корней
if(d>=0)
{
x1=e+f;
x2=e-f;
printf("Корни уравнения действительные\n");
printf("\n x1= %4.1f",x1);
printf("\n x2= %4.1f\n",x2);
};
else
{
printf("Корни уравнения мнимые\n");
printf("\Вешественная часть n e= %4.1f",e);
printf("\nМнимая часть f= %4.1f\n",f); };
16 Использование условного оператора для организации цикла
Для организации цикла может быть использован и условный оператор. Как это делается , показано в следующем фрагменте текста для вычислений суммы арифметической прогрессии.
// Организация цикла с помощью if
int j = 1; // индекс для цикла
int Sum = 0; // Переменная для вычисления суммы















