- •Задания:
- •Протокол выполнения заданий в шаблоне консольного приложения реализовать следующий код (см. Задания)
- •Оценить результаты работы программы
- •С помощью механизмов отладки проверить значения переменных I, j, f на строках кода отмеченных в комментариях.
- •Объяснить значения переменных в указанных строках
С помощью механизмов отладки проверить значения переменных I, j, f на строках кода отмеченных в комментариях.
Включаю отладку и отмечаю строчки, на которых буду проверять значения переменных.
Добавляю наблюдаемые переменные (см. скриншоты ниже).
На первой остановке значения следующие (остановки см. на скриншотах ниже – красные строчки):
что совпадает с моими проверками во 2 пункте (f = 0, так как переменная ещё не была задана).
Значение переменной i здесь равна 58.
С помощью инструментов отладки двигаюсь дальше (клавиша в dev-c++ --> «следующий шаг»):
Вторая остановка:
Значение переменной i здесь равна 60.
Третья остановка:
Значение переменной i здесь равна 32, а f = 33.3499985
Четвертая остановка:
Значение переменной i здесь равна 33, а f = 34.3499985
Пятая остановка:
Значение переменной f здесь равна 23.125
Шестая остановка:
Значение переменной i здесь равна 23, а f = 24.125
Седьмая остановка:
Значение переменной f здесь равна 25.125
Все точки остановки отладки свидетельствуют о том, что я сделал правильные выводы во 2 пункте.
Объяснить значения переменных в указанных строках
По остановкам:
1) Значение переменной i здесь равна 58. Сначала значение переменной при выводе выводится то, что задано ещё до функции (52), а потом приобретает значение 54. Это происходит благодаря инкриментам, прописанным в функциях (i++ и ++i). Сложение, совмещённое с присваиванием в программе дальше, доводит значение до 58.
2) Значение переменной i здесь равна 60. 13(нач. значение) – 1 (дискримент) = 12. Далее, умножение, совмещённое с присваиванием в программе, доводит значение до 60(12*5=60).
3) Видим, что переменная f прибрела значение, которое мы ей задали программно (33). После запятой появляются дополнительные цифры, и это возникает как следствие машинного представления дробей – сумма двоичных степеней (так как тип у нас float). Значение переменной i здесь равна 32 (приобретает это значение программно между 8 и 10 строчками кода).
4) Переменная f увеличивается на 1, что происходит благодаря инкрименту в прошлой функции. В прошлой же функции переменная i приобрела целочисленную часть f до инкримента(33), что и показала отладка.
5) Видим, что переменная f прибрела значение, которое мы ей задали программно (23). После запятой появляются дополнительные цифры, и это возникает как следствие машинного представления дробей – сумма двоичных степеней (так как тип у нас float).
6) Значение переменной i здесь равна 23 (приобретает это значение программно у переменной f, взяв целочисленную часть у неё), а f увеличивается на 1 целое значение, что происходит благодаря инкрименту в прошлой функции.
7) f увеличивается на 1 целое значение, что происходит благодаря инкрименту в прошлой функции.
Дополните код следующими строками: int* ptr_i = &i; int* ptr_j = &j
Дополнил
код необходимыми строками (выделил в
красный цвет):
Выясните следующее:
5.1. На какую величину отличаются значения указателей (значения адреса)?
5.2. Как вывести на экран значение адреса?
5.3. Как по указателю ptr_i вывести значение переменной i на экран?
5.4. Можно ли по указателю ptr_i получить значение переменной j? И как это можно сделать?
5.1) Видно, что значение указателей отличаются на величину “fe34”. Это связано с различием в типах переменных на которые переходят указатели(int и float).
5.2) С помощью кода или посмотреть на показания отладки (1 и 2 скриншот соответственно):
5.3) С помощью незначительных изменений в коде вывода (добавить звёздочку перед указателем):
5.4) С помощью следующего кода:
Вывод
1. В шаблоне консольного приложения реализовал предложенный нам код через DEV-C++.
2. Оценил результаты работы программы, пояснив изменения переменных и причины их изменения построчно.
3. С помощью механизмов отладки проверил значения переменных i, j, f на строках кода, отмеченных в комментариях. Проверка прошла успешно, отладка вывела истинные значения.
4. Объяснил значения переменных в указанных строках по остановкам:
1) Значение переменной i здесь равна 58. Сначала значение переменной при выводе выводится то, что задано ещё до функции (52), а потом приобретает значение 54. Это происходит благодаря инкриментам, прописанным в функциях (i++ и ++i). Сложение, совмещённое с присваиванием в программе дальше, доводит значение до 58.
2) Значение переменной i здесь равна 60. 13(нач. значение) – 1 (дискримент) = 12. Далее, умножение, совмещённое с присваиванием в программе, доводит значение до 60(12*5=60).
3) Видим, что переменная f прибрела значение, которое мы ей задали программно (33). После запятой появляются дополнительные цифры, и это возникает как следствие машинного представления дробей – сумма двоичных степеней (так как тип у нас float). Значение переменной i здесь равна 32 (приобретает это значение программно между 8 и 10 строчками кода).
4) Переменная f увеличивается на 1, что происходит благодаря инкрименту в прошлой функции. В прошлой же функции переменная i приобрела целочисленную часть f до инкримента(33), что и показала отладка.
5) Видим, что переменная f прибрела значение, которое мы ей задали программно (23). После запятой появляются дополнительные цифры, и это возникает как следствие машинного представления дробей – сумма двоичных степеней (так как тип у нас float).
6) Значение переменной i здесь равна 23 (приобретает это значение программно у переменной f, взяв целочисленную часть у неё), а f увеличивается на 1 целое значение, что происходит благодаря инкрименту в прошлой функции.
7) f увеличивается на 1 целое значение, что происходит благодаря инкрименту в прошлой функции.
5. Дополнил код следующими строками: int* ptr_i = &i; int* ptr_j = &j;
Выяснил:
5.1. На какую величину отличаются значения предложенных указателей – на величину “fe34”.
5.2. Как вывести на экран значение адреса (см. код, в пункте 5.2).
5.3. Как по указателю ptr_i вывести значение переменной i на экран (см. код, в пункте 5.3).
5.4. Что можно по указателю ptr_i получить значение переменной j (см. код, в пункте 5.4).
