Главная страница

Информатика уровень божество. 5 лаб. Основные программные средства языка программирования vc. по дисциплине


Скачать 377.35 Kb.
НазваниеОсновные программные средства языка программирования vc. по дисциплине
АнкорИнформатика уровень божество
Дата14.03.2022
Размер377.35 Kb.
Формат файлаdocx
Имя файла5 лаб.docx
ТипДокументы
#396497

МИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ, СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ

Ордена Трудового Красного Знамени федеральное государственное бюджетное образовательное учреждение высшего образования

«Московский технический университет связи и информатики»





Кафедра «Информатика»

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

«Разработка простейших проектов с использованием основных средств языка программирования VC++»

по теме

«Основные программные средства языка программирования VC++.»
по дисциплине

«Информатика»

Выполнил: студент гр. БИК2109 Креминский Д.Е.

Вариант №11

Проверил: ст.пр. Загвоздкина А.В.

Москва, 2021 г.
Задание

1) Общее и индивидуальное задание на разработку программного проекта.

Общее задание…

Индивидуальный вариант задания (Вариант 11):

С оздать решение (например, с именем lab5), состоящее из пяти программных проектов, для вычисления арифметического выражения:

при значениях исходных данных x=-4.62 и y=-0.32 с использованием различных способов обмена данными и местоположением функций в соответствии

с общим заданием.

2) Формализация и уточнение задания:

Для формализации и уточнения задания определим, что исходные данные x, y – вещественного типа double. Результаты вычислений – переменная d также должна быть вещественного типа double. Операция вычисления d будет записываться следующим оператором VC++:


d = (sqrt(abs(x)) + exp(-y)) /(5.8*(cos(pow(y,3))));


Вычисление d реализуем в функциях VC++ тремя различными способами в соответствии с общим заданием.

3) Разработка пяти программных проектов в одном решении и получение результатов их работы.

Выполнение работы

Создадим пять проектов в одном решении. Для этого, в отличие от предыдущих лабораторных работ, при создании первого проекта необходимо поставить галочку в переключателе Создать каталог для решения. Проектам и решению необходимо дать разные имена. Решению дадим имя lab5, а проекту – имя pr1 (рисунок 5.1).



Рисунок 5.1 – Создание нового проекта и решения.

Далее, создадим пустой проект и добавим в него файл с пустым исход-

ным кодом и с именем zad1.cpp.

Реализация 1-го проекта:

Алгоритм главной процедуры не зависит от способа обмена данными и

приведен на рисунке 5.2.




Рисунок 5.2 - Схема алгоритма главной процедуры main для всех проектов

  • Разработаем алгоритм процедуры с параметрами и возвращаемым значением.

Схема алгоритма этой процедуры func1 представлена на рисунке 5.3.




Рисунок 5.3 - Схема алгоритма процедуры func1 с параметрами и возвращаемым значением для первого проекта

  • Разработаем программные коды двух функций в соответствии

со схемами алгоритмов.

Программные коды разработанных функций запишем в файл с именем zad1.cpp в следующем порядке (рисунок 5.4):

  • сначала определение функции func1 с параметрами и возвращаемым

значением;

  • после него главную функцию main.

// «Разработка консольных проектов и решения VS

// линейной структуры с использованием функций VC++»

// 1 проект – функция func1 с входными параметрами и возвращаемым

// значением вначале, а после нее программный код главной функции main

#include

#include

using namespace std;

// Определение функции func1

double func1(double x, double y)

{

double d; // Локальный объект

d = (sqrt(abs(x)) + exp(-y)) / (5.8*(cos(pow(y,3))));

return d; // Возврат d в вызывающую функцию

}

int main()

{

setlocale(LC_ALL,"rus");

double x, y, d;

cout<<" Ввод x= ";

cin>>x;

cout<
return 0;

}
Рисунок 5.4 – Программный код первого проекта



  • Откомпилируем файл zad1.cpp, выполним построение решения lab5 и выполнение проекта pr1. Получим следующие результаты при заданных значениях исходных данных (рисунок 5.5).



Рисунок 5.5 – Результаты выполнения проекта pr1

  • Выполним проект с помощью отладчика по шагам и проведем следующие исследования:

  • в функции main заменим оператор вызова функции d=func1(x, y) на оператор d=func1(y, x), изменив порядок фактических параметров.

…Обоснование полученного результата…

int sum(int x, int y)

{

int d; // Локльный объект

d = x + y;

return d; // Возврат d в вызывающую функцию

}




int sum(int x, int y)

{

int d; // Локльный объект

d = x - y;

return d; // Возврат d в вызывающую функцию

}



int main()

{

int a = 5, b = 3;

int c = sum(a, b);

int g = dif(a, b);

int e = sum(b, a);

int f = dif(b, a);

return 0;

}

В общем случае результат вызова функции с несколькими параметрами зависит от порядка фактических параметров.

  • изменится ли значение переменной x в функции main, если внутри

функции func1 до оператора return d изменить значение x, напри-

мер, добавить оператор x++:

// Определение функции func1

double func1(double x, double y)

{

double d; // Локальный объект

d = (sqrt(abs(x)) + exp(-y)) / (5.8*(cos(pow(y,3))));

x++; // Изменение значения формального параметра x

return d; // Возврат d в вызывающую функцию

}

…Обоснование ответа…

Выполнив программу в режиме отладки по шагам, мы увидим, что значение x в функции main не изменилось. Почему?

Формальный параметр x в функции func1, передаваемый по значению, – это локальная переменная, которая живет лишь в этой функции. В теле функции x конечно, увеличится на 1. Но в функции main переменная x – это локальная переменная этой функции, передаваемая в функцию func1 как фактический параметр. Совпадение их имен случайно и ничего не значит: это разные переменные. Поэтому значение x в функции main не изменилось после вызова функции func1.

  • можно ли при вызове функции в списке фактических параметров указывать не имя переменной, а константу или выражение, например, для следующих операторов:

d = func1(x+2, y-0.5);

//

d = func1(-4.62, -0.32);

…Обоснование ответа…

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

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

// Определение функции func1

double func1(double a, double b)

{

double d; // Локальный объект

d = (sqrt(abs(x)) + exp(-y)) / (5.8*(cos(pow(y,3))));

return d; // Возврат d в вызывающую функцию

}

…Обоснование ответа…

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

Формальные параметры – это локальные переменные, Их имена произвольны и вовсе не обязаны совпадать с именами соответствующих фактических параметров – переменных.

Реализация 2-го проекта:

  • Создадим второй пустой проект с именем pr2 в уже существующем решении. Для этого выполним команду Файл/Добавить/Создать проект. В открывшемся окне Добавить новый проект зададим имя проекта pr2.

  • Запишем в файл с именем zad2.cpp программные коды разработанных в первом проекте функций (переименовав функцию func1 в func2) в следующем порядке:

  • сначала программный код главной функции main;

  • после него определение функции func2 с параметрами и возвращаемым значением.

Перед кодом главной функции запишем прототип функции func2.

  • Откомпилируем файл zad2.cpp и выполним перестроение решения lab5.

  • Чтобы выполнить второй проект, его надо назначить запускаемым проектом. Для этого необходимо выделить в окне Обозреватель решений имя проекта pr2 и нажать правую кнопку мыши, а затем выполнить команду Назначить запускаемым проектом (рисунок 5.6).



Рисунок 5.6 – Назначение запускаемым проетом

#include

#include

using namespace std;

// Определение функции func1

double func2(double x, double y)
int main()

{

setlocale(LC_ALL,"rus");

double x, y, d;

cout<<" Ввод x= ";

cin>>x;

cout<
return 0;

}

{

double d; // Локальный объект

d = (sqrt(abs(x)) + exp(-y)) / (5.8*(cos(pow(y,3))));

return d; // Возврат d в вызывающую функцию

}

  • Выполним проект pr2. Получим следующие результаты при заданных значениях исходных данных (рисунок 5.7).



Рисунок 5.7 - Результаты выполнения проекта pr2

Реализация 3-го проекта:

  • Создадим третий проект с именем pr3 в уже имеющемся решении.

  • Разработаем алгоритм процедуры с параметрами и без возвращаемого значения. Схема алгоритма этой процедуры func3 представлена на рисунке 5.8.



Рисунок 5.8 – Схема алгоритма процедуры func3 с параметрами и без возвращаемого значения для третьего проекта

  • Разработаем программные коды двух функций в соответствии со схемами алгоритмов.

Программные коды разработанных функций запишем в файл с именем zad3.cpp в следующем порядке (рисунок 5.9):

  • объявление (прототип) функции func3;

  • определение функции main;

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


// «Разработка консольных проектов и решения VS

// линейной структуры с использованием функций VC++»

// 3-й проект – без возвращаемого значения, со ссылкой на выходной параметр

#include

#include

using namespace std;

// Объявление (прототип) функции func3

void func3(double, double, double&);

int main()

{

setlocale(LC_ALL,"rus");

double x,y,d;

cout<<" Ввод x= ";

cin>>x;

cout<
return 0;

}

// Определение функции func3

void func3(double x, double y, double& d)

{

d = (sqrt(abs(x)) + exp(-y)) / (5.8*(cos(pow(y,3))));

}
Рисунок 5.9 – Программный код третьего проекта.

  • Откомпилируем файл zad3.cpp, выполним перестроение решения lab5 и выполнение проекта pr3, назначив его запускаемым проектом. Получим следующие результаты при заданных значениях исходных данных (рисунок 5.10).



Рисунок 5.105 – Результаты выполнения проекта pr3

  • Выполним проект с помощью отладчика по шагам, так же, как и

в первом проекте, поставив точку останова после ввода исходных

данных x и y на операторе вызова функции.

  • Проследим за изменением значений всех переменных в окнах Ло-

кальные и Видимые.

  • Ответим на следующие вопросы:

  • можно ли при вызове функции в списке фактических параметров записывать выражения? Например,


func3(x+2, y-0.5, d+1); // Вызов функции func3


…Обоснование ответа…

Функция func3 имеет следующий прототип:

void func3(double, double, double&);

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

  • изменится ли результат выполнения проекта, если при определении функции func3 удалить знак & (операция взятия адреса) перед формальным параметром d:

void func3(double x, double y, double d)

…Обоснование ответа…

Конечно, изменится. В этом случае d будет передаваться в функцию func3 не по ссылке, а по значению. Вычисленное в func3 значение локальной переменной d не попадает в main, и она выведет неопределенное значение, так как переменная d в main не инициализирована.

Однако до этого не дойдет, так как при построении решения будет выдана ошибка из-за несоответствия определения функции ее прототипу.

Реализация 4-го проекта:

  • Создадим четвертый проект с именем pr4 в уже имеющемся решении.

  • Разработаем алгоритм процедуры без параметров и без возвращаемого значения.

Схема алгоритма этой процедуры func4 представлена на рисунке 5.11.



Рисунок 5.11 – Схема алгоритма процедуры func4 без параметров и без возвращаемого значения для четвертого проекта

  • Разработаем программные коды двух функций в соответствии со схемами алгоритмов.

Программные коды разработанных функций запишем в файл с именем

zad4.cpp в следующем порядке (рисунок 5.12):

  • объявление (прототип) функции func4;

  • определение глобальных переменных;

  • определение функции main;

  • определение функции func4 без параметров и без возвращаемого значения.

// «Разработка консольных проектов и решения VS линейной структуры с использованием функций VC++»

// 4 проект – без параметров и без возвращаемого значения

#include

#include

using namespace std;

void func4(void ); // Объявление (прототип) функции func4

double x, y, d; // Глобальные переменные

int main()

{

setlocale(LC_ALL,"rus");

cout<<" Ввод x= ";

cin>>x;

cout<
return 0;

}

// Определение функции func4

void func4()

{

d = (sqrt(abs(x)) + exp(-y)) / (5.8*(cos(pow(y,3))));

}

Рисунок 5.12 – Программный код четвертого проекта

  • Откомпилируем файл zad4.cpp, выполним перестроение решения lab5 и выполнение проекта pr4, назначив его запускаемым проектом. Получим следующие результаты при заданных значениях исходных данных (рисунок 5.13).



Рисунок 5.13 – Результаты выполнения проекта pr4

  • Выполним проект с помощью отладчика по шагам, так же, как и в первом проекте, поставив точку останова после ввода исходных данных x и y на операторе вызова функции.

  • Проследим за изменением значений всех переменных в окнах Локальные и Видимые.

  • В тело главной функции main добавим определение переменных x, y, d до оператора ввода исходных данных:







  • Перестроим решение и выполним проект. Проанализируем полученные результаты и ответим на вопрос: почему и как изменились результаты выполнения проекта?

Обоснование ответа
#include

#include

using namespace std;

void func4(void ); // Объявление (прототип) функции func4

double x, y, d; // Глобальные переменные

int main()

{

setlocale(LC_ALL,"rus");

double x, y, d;

cout<<" Ввод x= ";

cin>>x;

cout<
return 0;

}

// Определение функции func4

void func4()

{

d = (sqrt(abs(x)) + exp(-y)) / (5.8*(cos(pow(y,3))));

}
В этом случае в функции появляются 3 локальные переменные x, y, d, которые “перекрывают” область видимости одноименных глобальных переменных. Операторы cin введут значения этих локальных переменных. Но func4 видит глобальные переменные, которые остались неинициализированными. Она вычислит значение глобальной переменной d, но результат непредсказуем. В свою очередь функция main выведет неопределённое значение локальной переменной d.

Компилятор выдаст предупреждение об использовании неинициализированной переменной d в функции main. Если мы его проигнорируем и попытаемся выполнить программу, то выдастся сообщение об аналогичной ошибке времени выполнения.

Реализация 5-го проекта:

Создадим в уже имеющемся решении пятый проект с именем pr5, состоящий из двух файлов. В первый файл с именем zad5_m.срр (Рисунок 5.14) поместим текст функции main из второго проекта. Во второй файл с именем zad5_f.срр (Рисунок 5.15) поместим текст функции func2 из того же проекта. После раздельной компиляции файлов выполним их совместную компоновку (перестроение решения) и выполнение проекта.

#include

#include

using namespace std;

// Определение функции func1

double func5(double x, double y);
int main()

{

setlocale(LC_ALL,"rus");

double x, y, d;

cout<<" Ввод x= ";

cin>>x;

cout<
return 0;

}

Рисунок 5.14 – Код первого файла с именем zad5_m.срр




#include

#include

using namespace std;

// Определение функции func1

double func5(double x, double y)
{

double d; // Локальный объект

d = (sqrt(abs(x)) + exp(-y)) / (5.8*(cos(pow(y,3))));

return d; // Возврат d в вызывающую функцию

}

Рисунок 5.15 – Код второго файла с именем zad5_f.срр

Результаты выполнения при заданных значениях исходных данных приведены на рисунке 5.16.



Рисунок 5.16 - Результаты выполнения проекта pr5
Доказательство правильности результатов.

Результат выполнения всех пяти проектов одинаков и равен 0.608352. Выполним расчет арифметического выражения с использованием программы Microsoft Excel и получим совпадающий результат, что доказывает его правильность (Рисунок 5.17).



Рисунок 5.17 – Доказательство правильности результатов


написать администратору сайта