Выполнение программы по шагам без захода в функцию 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Выполнение программы по шагам без захода в функцию



Это простейший способ выполнения программы по элементарным фрагментам. Выбор команды Debug | Step Over или нажатие клавиши F10 вызывает выполнение отладчиком всего кода в операторе, указанном строкой выполнения, включая любые вызываемые на ней процедуры или функции, пока управление не вернется обратно к программисту. После этого строка выполнения указывает следующий выполняемый оператор.

Возьмем следующий пример программы.

 

Пример 1 – Простая программа, выполняемая по шагам.

 

#include <iostream>

using namespace std;

int sqr(int x)

{ //10

int q = x*x; //11

return q; //12

} //13

void main()

{ //0

const int N = 10; //1

int a[N] = {5, 2, 7, -9, 4, 8, -1, 0, 3, 6};//2

//найдем сумму квадратов //3

//положительных элементов массива //4

int s = 0; //5

for (int i = 0; i < N; i++) //6

if (a[i] > 0) s += sqr(a[i]); //7

cout << s << endl; //8

return; //9

}

 

Если нажать клавишу F10, то строка выполнения перемещается на фигурную скобку в начале программы (строка 0), поскольку это первое, что выполняется в программе. Второе нажатие клавиши F10 перемещает строку выполнения вниз до оператора объявления константы размерности массива N на следующей строке (строка 1). После этого нажатие F10 переводит указатель к строке с объявлением массива и его инициализации (строка 2). Далее, при нажатии F10, строки 3 и 4 будут пропущены, так как они состоят только из комментариев и указатель переместится к строке 5. В ней производится объявление переменной для хранения суммы квадратов элементов массива s и ее инициализация нулем.

После этого нажатие F10 вызывает начало выполнения цикла for. Первое нажатие инициализирует переменную i, и указатель переходит к строке 7. Далее нажатие F10 приводит к выполнению оператора if и указатель переходит на строку 8. Однако далее управление будет передано обратно на строку 6, так как цикл еще не завершен.

Обратите внимание, что в окне Locals выводятся значения счетчика i, максимального элемента m, размерности массива N и сам массив a.

Сравнение (строка 7) вызывается 10 раз, но не возможно понять выполняется ли при этом операция присвоение нового значения m. Выполнение по шагам не позволяет отладчику показывать детали любых вычислений для отдельной строки.

Выполнение по шагам вызывает выполнение всего оператора сразу, поэтому невозможно видеть изменения в ходе выполнения цикла.

Если необходимо видеть подробности, то в пример нужно внести следующее простое изменение:

 

Пример 2 – Модифицированная программа, для лучшего выполнения по шагам

 

#include <iostream>

using namespace std;

int sqr(int x)

{ //10

int q = x*x; //11

return q; //12

} //13

void main()

{ //0

const int N = 10; //1

int a[N] = {5, 2, 7, -9, 4, 8, -1, 0, 3, 6};//2

//найдем сумму квадратов //3

//положительных элементов массива //4

int s = 0; //5

for (int i = 0; i < N; i++) //6

if (a[i] > 0) //7.0

s += sqr(a[i]); //7.1

cout << s << endl; //8

return; //9

}

 

Если теперь нажимать клавишу F10, то указатель после строка 7.0 будет при выполнении условия переходить на строку 7.1, а при не выполнении на строку 8.

4.2 Выполнение программы по шагам с заходом в функцию (трассировка)

Чтобы выполнить трассировку кода, необходимо выбрать команду Debug | Trace Into или нажать клавишу F11.

Первое нажатие на F11 также передает управление на фигурную скобку основной программы (строка 0). Повторные нажатия F11 снова перемещают строку управления на теже операторы, что и F10, пока мы не доходим до строки 7.1. После этого нажатие клавиши F11 трассирует вызов функции sqr – строка выполнения перемещается на фигурную скобку в блоке функции (строка 10). Если продолжать нажимать F11, строка выполнения перемещается по функции, а затем, когда дойдет до оператора return (при этом указатель будет располагаться напротив закрывающей фигурной скобки), возвращается к оператору вызова.

Следует обратить внимание на то, что трассировке подвержены и функции стандартных библиотек. Так, например, при выводе на экран s при помощи стандартного потока cout будет произведена трассировка функции вывод. Во избежание данного поведения необходимо использовать пошаговое выполнение (Step Over) по клавише F10, либо нажимать Shift + F11 для выхода из трассируемой функции.

 


Лабораторная работа № 9. Отладка программ в интегрированной среде Microsoft Visual C++ 2008

Цель и порядок работы

Цель работы – изучить инструментальные средства и возможности отладки программ в интегрированной среде Microsoft Visual C++ 2008 (Visual Studio 2008).

 

 

Порядок выполнения работы:

- ознакомиться с описанием лабораторной работы;

- получить задание у преподавателя, согласно своему варианту;

- написать программу и отладить ее на ЭВМ;

- оформить отчет.

Контрольные вопросы

1. Что такое отладка?

2. Для чего предназначена отладка?

3. Какие разновидности ошибок существуют?

4. Какие средства отладки предоставляет среда разработки MS Visual C++?

5. Что такое точка остановки (breakpoint)?

6. Какие дополнительные условия можно устанавливать в точке остановки?

7. Какие возможности существуют для слежения за значениями переменных во время отладки?

8. Как изменить значение переменной?

9. Какие горячие клавиши для работы с отдатчиком вы знаете?

Задание

1. Выполнить задание в соответствии с пунктом 1.

2. Выполнить задание в соответствии с пунктом 2.

3. Оформить отчёт.

Задание для выполнения работы

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

Например:

const int N = 10; //1

int a[N] = {5, 2, 7, -9, 4, 8, -1, 0, 3, 6};//2

 

Последовательность выполнения:

2: a = {5, 2, 7, 9, 4, 8, -1, 0, 3, 6}

5: i = 0

6: i = 0, s = 25

 

Часть первая

1) Набрать программу примера 1

2) Выполнить программу по шагам, фиксируя в отчете, в строке с каким номером находится строка выполнения при каждом нажатии на F10.

3) Внести в программу изменения в соответствии с примером 2.

4) Выполнить задание пункта 2.

5) Выполнить трассировку исходной программы примера 2, фиксируя в отчете, в строке с каким номером находится строка выполнения при каждом нажатии на F11.

 

Часть вторая

1. Набрать и откомпилировать следующую программу:

 

#include <iostream>

using namespace std;

int sum(int *x, const int N)

{

int s = 0;

for (int i = 0; i < N; i++)

s += x[i];

return s;

}

 

void main()

{

const int N = 10;

int a[N] = {1, 3, -5, 0, 4, 6, -1, 9, 3, 2};

 

//найдем максимальный элемент массива

int m = a[0];

for (int i = 1; i < N; i++)

if (m < a[i])

m = a[i];

cout << m << endl;

 

//найдем сумму элементов массива

int s;

s = sum(a, N);

cout << s << endl;

int z = s / m;

int k = 0;

for (int i = 0; i < N; i++)

if (a[i] > z)

k += a[i];

else

k -= a[i];

cout << k << endl;

int x, y;

cin >> x >> y;

s = 0;

while ((x!= 0) && (x!= 0))

{

x--;

y--;

s += x + y;

}

cout << s << endl;

return;

}

 

2. После каждой строки программы проставить номер. Например, //1, //2 и т.д.

3. Выполнить трассировку программы (без захода в функции стандартных библиотек), наблюдая за переменными в окне Locals.

4. Остановить отладку программы.

5. Установить точку остановки на операторе if (a[i] > z).

6. Выполнить программу до курсора на строке s = sum(a, N);

7. Продолжить выполнить программы до точки остановки. Далее продолжать пошаговое выполнение до строки cout << k << endl;.

8. Добавить в окно Watch 1 переменные x, y, s для наблюдения изменения их значений. Продолжать пошаговое выполнение.

9. Остановить отладку программы.

10. В операторе цикла while задать условную точку останова по числу проходов. Запустить программу для отладки.

11. Продолжать пошаговое выполнение до конца программы, наблюдая изменение значений x, y, s в окне Watch 1.

12. Записать полученные результаты.

13. Остановить отладку программы.

14. В операторе цикла while задать еще одну условную точку останова по логическому условию. Запустить программу для отладки

15. Продолжать пошаговое выполнение до конца программы, наблюдая изменение значений x, y, s в окне Watch 1.

16. Записать полученные результаты.

Содержание отчета

1) Титульный лист.

2) Наименование и цель работы.

3) Краткое теоретическое описание.

4) Задание на лабораторную работу.

5) Схема алгоритма.

6) Листинг программы.

7) Результаты выполнения программы.

 

 



Поделиться:


Последнее изменение этой страницы: 2016-12-11; просмотров: 433; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 13.58.112.1 (0.02 с.)