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

Лабораторные работы

.pdf
Скачиваний:
55
Добавлен:
10.02.2019
Размер:
1.21 Mб
Скачать

Последняя строка программы

}

содержит закрывающуюся фигурную скобку. Она обозначает конец функции main () и конец основной части программы (в большинстве случаев – конец программы).

4. Сохранение, закрытие и открытие проектов

Проект сохраняется автоматически. Но можно сохранить проект, используя команды Save All, Save меню File.

Для открытия существующего проекта выберите последова-

тельно пункты Open | Project/Solution из меню File.

5. Рекомендации по использованию встроенного отладчика

Microsoft Visual C++ 2008

Отладка программ – процесс исправления ошибок в программе. Рассмотрим некоторые режимы отладки программ.

Чтобы запустить отладчик, необходимо нажать клавишу F10. В этом случае на экране появится желтая стрелка рядом с окном документа, указывающего на строку с открывающейся фигурной скобкой в main().

Если вы хотите начать трассировку не с начала, установите курсор на нужную строку.

Пошаговая трассировка. Этот режим позволяет следить за тем, как изменяются значения различных переменных. Нажимая клавишу F10, можно выполнять последовательно один оператор программы за другим. Значения переменных, выбранных компилятором, будут выводиться в окне закладки Autos. Если вы хотите пропустить пошаговое выполнение некоторого куска программы, нажмите клавиши

Shift+F11.

Просмотр переменных. Если требуется создать собственный набор просматриваемых переменных, внесите их в окно просмотра закладки Autos. Для этого щелкните правой кнопкой мыши на имени переменной в исходном коде. Из появившегося меню выберите Add Watch (Добавить). Имя переменной и ее текущее значение появится в окне просмотра. Если переменная пока недоступна, окно просмотра выдаст сообщение об ошибке вместо значения переменной.

11

Пошаговая трассировка функций. Следует заметить, что режим трассировки по F10 рассматривает каждую встроенную функцию как одно выражение. Если вам необходимо осуществить пошаговую трассировку каждого выражения функции, нажмите F11. Если вы хотите прервать пошаговую трассировку функции, воспользуйтесь клавиша-

ми Shift+F11.

Точки останова. Этот режим позволяет временно прерывать работу программы в указанных местах. Для того чтобы вставить точки останова в листинги, нужно установить курсор на ту строку, в которой программа при трассировке должна остановиться. Затем нажать правую кнопку мыши и выбрать из меню Breakpoint | Insert Breakpoint. Напротив этой строки кода появится красный кружок. Теперь, если вы, например, запустите программу на выполнение, программа остановится на этой строке. На этом временном срезе можно проверить значения переменных, произвести пошаговую трассировку кода и т.д.

Чтобы удалить точку останова, встаньте на красный кружок, нажмите правую кнопку мыши и выберите из появившегося меню Delete Breakpoint.

Задание 2.

Поэкспериментируйте с программой f1.c. Построчно исполните код программы f1.c, используя встроенный отладчик Microsoft Visual C++ 2008. Проследите за тем, как изменяются значения переменных a, b, summa.

Лабораторная работа № 2

ВЕТВЛЕНИЯ

1. Цель работы

Приобретение обучающимися практических умений и навыков в работе с базовыми конструкциями структурного программирования, в тестировании и отладке программ.

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

12

Общая форма записи условного оператора: if (условие)

{

блок операторов 1;

}

else

{

блок операторов 2;

}

Если на момент выполнения условие истинно, программа передает управление блоку операторов 1 и далее первому оператору за пределами конструкции if-else. При этом блок операторов 2 не выполняется. Если на момент выполнения условие ложно, выполняется блок операторов 2, а блок операторов 1 не выполняется. В табл. 1 указаны простейшие операции отношения.

Таблица 1

Операция

Запись на Си

 

 

Больше

>

 

 

Меньше

<

 

 

Больше либо равно

>=

 

 

Меньше либо равно

<=

 

 

Равно

= =

 

 

Не равно

!=

 

 

Вложенные операторы условия Операторы условия могут быть вложенными друг в друга в со-

ответствии с тем программным алгоритмом, который они реализуют. Допускается произвольная степень их вложенности. Например:

if (a<=b) // начало внешнего оператора условия

{

if (x!=0) printf (“x!=0 \n”);//начало вложенного оператора условия

else // начало ветви else, относящейся

// к вложенному оператору условия

13

{

x=1;

y=0;

} // конец ветви else, относящейся // к вложенному оператору условия

}

else // начало ветви else, относящейся // к внешнему оператору условия

{

a=b;

printf (“%d” ,a);

} // конец ветви else, относящейся // к внешнему оператору условия

Сокращенные варианты записи При программировании обыденной является ситуация, когда

требуется некоторое действие в ответ на сложившиеся условия. Например, если получены неверные исходные данные от пользователя, то выдать сообщение об ошибке и выйти из программы. В таких случаях используется сокращенная запись оператора условия с отсутствующим блоком else. Общая форма записи:

if (условие)

{

блок операторов;

}

Здесь в случае истинности условия управление передается блоку операторов в фигурных скобках. В случае ложности условия этот блок пропускается.

Составные логические выражения В программировании распространены двойные условия, кото-

рые в математике записываются в виде f<b<c. В программе такие условия должны быть переформулированы с использованием простых операций сравнения и логических операций «И», «ИЛИ», «НЕ». Обозначение логических операций приведено в табл. 2.

14

 

 

Таблица 2

 

 

 

Логическая операция

Знак С

Наименование знака

 

 

 

И

&&

Двойной амперсанд

 

 

 

ИЛИ

||

Двойная вертикаль-

 

 

ная черта

 

 

 

НЕ

~ (!)

Не

 

 

 

Например:

if ((a>b) && (a>c)) // если а больше b и а больше с printf ("a=%f",a); // вывести значение переменной а else // иначе

{

if ((b>a) && (b>c)) // если b больше а и b больше с prinrtf("b=%f",b); // вывести значение переменной b else

prinrtf("c=%f",c);

//

иначе вывести значение

}

//

переменной с

Оператор switch используется в том случае, если в программе присутствует большое дерево ветвлений и все ветвления зависят от значения какой-либо одной переменной.

Общий формат записи: switch (n)

{

case 1:

оператор 1; break;

case 2:

оператор 2; break;

case 3:

оператор 3; break;

…………….

}

где n – целочисленная или символьная переменная;

15

1, 2, 3 – целочисленная или символьная константа; Оператор 1 – тело первого case;

Оператор 2 – тело второго case; Оператор 3 – тело третьего case;

вreak – (прервать) оператор завершает выполнение ветвления switch, если значение переменной в операторе switch совпадает с одним из значений констант, указанных внутри ветвления. Если значение переменной в операторе switch не совпадет ни с одним из значений констант, то управление будет передано в конец switch без выполнения каких-либо действий. В случае отсутствия оператора break управление будет передано операторам, относящимся к другим веткам switch.

Условная операция Существует распространенная в программировании операция:

переменной необходимо присвоить одно значение в случае выполнения некоторого условия и другое значение в случае невыполнения этого условия. С помощью конструкции if … else это будет выглядеть следующим образом:

if (alfa<beta) min=alfa;

else

min=beta;

Подобные действия на практике настолько распространены, что была специально разработана условная операция, выполняющая эти действия. Эта операция записывается с помощью двух знаков и использует три операнда.

С помощью условной операции можно записать предыдущий фрагмент следующим образом: min = (alfa<beta) ? alfa : beta;

Правая часть оператора (alfa<beta) ? alfa : beta представляет собой условное выражение. Знак ? и двоеточие : обозначают условную операцию. Условие стоит перед знаком вопроса (alfa<beta) и является условием проверки. Это условие вместе с операндами alfa и beta составляют тройку операндов условной операции.

Если значение проверяемого условия истинно, то условное выражение становится равным значению alfа, в противном случае beta.

16

Скобки в данном случае использованы, чтобы визуально упростить читаемость этого оператора.

Пример выполнения лабораторной работы: требуется разработать программу, которая вычисляет значение функции

.

Анализ задачи показывает, что программу можно строить как последовательность подзадач. Следовательно, на первом шаге декомпозиции с использованием метода пошаговой детализации получаем следующую структурную схему программы, представленную на рис. 1, а.

Подзадачу Вычисление значения функции можно оформить в виде функции. Эта же программа может быть реализована и без использования функций.

Выполнять детализацию алгоритма основной программы не будем из-за его очевидной простоты. Выполним детализацию алгоритма функции. Исходные данные такой функции – значения переменных a, b. Функция не должна менять их значения, поэтому значения переменных можно передать как параметры-значения или параметрыконстанты.

На рис. 1, б, 1, в приведена схема алгоритма проектируемой программы с использованием подпрограммы типа функция. На рис. 3 приведена схема алгоритма программы без использования функции.

Из-за очевидной простоты алгоритма основной программы проведем модульное тестирование по критерию комбинаторного покрытия условий только одного компонента программы – вычисление значения функции m (см. рис. 1, в). На рис. 2 представлен граф передачи управления, соответствующий схеме алгоритма функции (см. рис. 1, в).

Из построенного графа видно, что для функции по критерию комбинаторного покрытия условий необходимо покрыть тестами во-

семь комбинаций:

 

1)

а>1, b=0;

5) а = 2, b> 1;

2)

а>1,b≠0;

6) а = 2, b≤1;

3)

а≤ 1,b=0;

7) а≠2, b> 1;

4)

а≤ 1,b≠0;

8) а ≠2, b≤1.

17

Основная

начало

m (a, b)

программа

 

 

 

 

 

да

 

Ввод a, b

a>1 и b=0

Вычисление значения функции

 

Вывод

нет

 

 

 

x=a/2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

m(a ,b)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

а

 

 

 

 

 

 

да

 

 

 

 

 

 

 

 

 

 

 

 

a=2 или

 

 

 

 

конец

 

b>1

 

 

 

 

б

 

 

 

 

 

 

 

 

 

 

 

 

 

x=a+1

 

 

 

 

 

 

 

 

 

 

 

 

 

нет

 

 

 

 

 

 

 

 

 

 

 

 

в

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

return x

 

в

Рис. 1. Алгоритм программы примера с использованием функции

Эти комбинации можно проверить тестами:

а= 2, b = 0 — проверяет комбинацию (1);

а= 2, b=1 — проверяет комбинации (2), (6); a=2, b=3 — проверяет комбинацию (5);

а= 1, b = 0 — проверяет комбинацию (3);

а= 1, b = 1 — проверяет комбинации (4), (8); a=1, b=3 — проверяет комбинацию (7).

Текст программы на языке С с использованием функции:

//func.c

#include <stdio.h> #include <locale.h>

float m (float a, float b, float x)

{

if (a>1 && b==0) x/=2; if (a==2 || b>1)x++;

return x;

}

int main(void)

{

float a,b,x; setlocale(LC_CTYPE, "russian"); printf ("введите a,b\n");

scanf ("%f%f", &a,&b);

18

printf ("\nm(x)=%f",m(a,b)); return (0);

}

1

 

 

 

 

 

 

начало

2

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ввод a,b

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

a>1 и b=0

 

 

 

 

 

 

да

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

a>1 и b=0

a≤1 или b≠0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

 

 

нет

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

x=a/2

5

a=2 или b>1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

да

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

a=2 или

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

a≠2 и b≤1

 

 

 

 

 

b>1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6

 

 

 

 

 

 

x=a+1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

нет

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

7

 

 

 

 

 

вывод х

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

8

 

 

 

 

 

конец

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 2. Граф передачи управ-

3

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ления для схемы

алгоритма

Рис. 3. Блок-схема алгоритма

 

 

 

 

 

 

функции (в)

программы примера

 

Текст программы на языке С без использования функции:

#include <stdio.h> #include <conio.h>

#include <locale.h> int main (void)

{

float a,b,x; setlocale(LC_CTYPE, "russian"); printf ("введите a,b\n"); scanf ("%f %f ",&a,&b);

if ((a>1) && (b==0)) x/=2; if ((a==2) || (b>1)) x++; printf ("\nx=%f",x); return (0);

}

19

2. Порядок выполнения

Задание 1: 1. Разработайте структурную схему и выполните детализацию алгоритмов модулей к задаче индивидуального задания:

а) с использованием функции; б) без использования функции.

2.Напишите программы на языке С для разработанных алгоритмов решения задачи.

3.Выполните отладку и компиляцию программ, получите исполняемые файлы.

4.Выполните тестирование программ.

3.Варианты заданий

Номер

 

Номер

 

вари-

Функция

вари-

Функция

анта

анта

 

 

 

 

 

 

 

1

 

9

 

 

y=

 

 

 

 

 

 

2

 

10

 

 

 

 

 

3

 

11

 

 

 

 

 

4

 

12

 

 

 

 

 

5

 

13

 

 

 

 

 

6

 

14

 

 

 

 

 

7

 

15

 

 

 

 

 

8

 

16

 

 

 

 

 

20