Вы находитесь на странице: 1из 21

Министерство образования и науки Российской Федерации

Федеральное государственное бюджетное образовательное учреждение


высшего образования
Восточно-Сибирский государственный университет технологий и
управления
(ФГБОУ ВСГУТУ)

Электротехнический факультет
Кафедра «Системы Информатики»

Дисциплина
«Основы программирования»

Отчет по лабораторной работе №2


На тему:
Ветвление и условные операторы
Вариант 4

Выполнил: студент гр. Б660


Писарева П.В.
Проверил: преподаватель
Дышенов Б.А.

г.Улан-Удэ
2020г.
1 Постановка задачи
1. Разработать программу, вычисляющую формулу. Переменные a и b
пользователь вводит с клавиатуры. Вычисления выполняются с
использованием промежуточных переменных. Значение вычисляется при
различных типах данных: сначала float, затем double. Учесть в программе
невозможность делить на 0.
( a−b ) 2−(a 2−2 ab)
x=
a+ b5

2. Написать программу для решения задачи с использованием


потокового ввода-вывода:
Даны три действительных числа x, y, z. Составить программу, выводящую те
из них, которые не принадлежат промежутку [-4, 4].

3. Написать программу для решения задачи с использованием switch:


Даны стоимость товара и категория скидки. Вычислить стоимость с учетом
скидки скидку: категория 1 – 30%; категория 2 – 20 %; категория 3 – 10 %;
категория 4 – 5 %; категория 5 – 3 %; категория 6 – 1%. Заданная сумма
меньше или равна 0, или категория скидки некорректна – вывести сообщение
об этом.

4. Разработать программу, определяющую принадлежит ли точка


заданной фигуре.
Решение задачи 1

1 Формальная постановка задачи

Входные данные:

a1, b1 – действительные числа, представляющие переменные, которые

пользователь вводит с клавиатуры. Эти числа заданы типом float.

a2, b2 – действительные числа, представляющие переменные, которые

пользователь вводит с клавиатуры. Эти числа заданы типом double.

Выходные данные:

ch1, zn1 – действительные числа, представляющие числитель и


знаменатель соответственно в типе float;

ch2, zn2 – действительные числа, представляющие числитель и


знаменатель соответственно в типе double;

x1 – действительное число, представляющее результат вычисления в типе

float.

x2 – действительное число, представляющее результат вычисления в типе

double.

Метод получения вычисляемых значений:

Числитель:

ch1 = pow((a1 – b1), 2) - pow(a1, 2) - 2 * a1 * b1;

По формуле вычисляется значение числителя (аналогично для ch2).

Знаменатель:

zn1 = pow((a1 + b1), 5);

По формуле вычисляется значение знаменателя (аналогично для zn2).

Результат вычисления:
x1 = ch1 / zn1;

Значение числителя делится на значение знаменателя (аналогично для x2).

2 Проектирование
3 Реализация

Текст программы содержит символы кириллицы, поэтому в начало


программы включается файл Windows.h, а в теле функции прописываются
следующие команды:

#include <Windows.h>
SetConsoleCP(1251);
SetConsoleOutputCP(1251);

Текст программы начинается с заголовка главной функции main():

int main()

Далее открывается тело функции и в нее включается описание


переменных.

Кодовая часть программы начинается с приглашения – вывода строки-


константы:

printf("Введите a и b (через пробел): ");

за которым считываются данные, вводимые пользователем:

scanf_s("%f %f", &a1, &b1);

Далее вычисляются отдельно числитель и знаменатель:

ch = pow((a - b), 2) - pow(a, 2) - 2 * a * b;


zn = pow((a + b), 5);

Переменным в другом типе данных присваиваются те же значения:

a2 = a1;
b2 = b1;

Условие задачи требует учесть невозможность деления на 0, поэтому


вводится конструкция с проверкой. Если знаменатель равен нулю, то
выводится сообщение об ошибке.

if ((zn1 == 0) || (zn2 == 0)) printf("Нет решений (деление на


0)");
В остальных случаях вычисляется значение формулы и выводятся оба
результата:

else {
x1 = ch1 / zn1;
x2 = ch2 / zn2;
printf("Результат вычислений с типом float: %.10f \n",
x1);
printf("Результат вычислений с типом double: %.10f \n",
x2);
}

Текст программы:

#include <stdio.h>
#include <Windows.h>
#include <math.h>

int main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
/* Объявление переменных */
float x1, a1, b1, ch1, zn1;
double x2, a2, b2, ch2, zn2;

/* Ввод переменных пользователем */


printf("Введите a и b (через пробел): ");
scanf_s("%f %f", &a1, &b1);
a2 = a1;
b2 = b1;

/* Вычисление числителя и знаменателя */


ch1 = pow((a1 - b1), 2) - pow(a1, 2) - 2 * a1 * b1;
zn1 = pow((a1 + b1), 5);
ch2 = pow((a2 - b2), 2) - pow(a2, 2) - 2 * a2 * b2;
zn2 = pow((a2 + b2), 5);

/* Проверка условия делимости и вывод результата */


if ((zn1 == 0) || (zn2 == 0)) printf("Нет решений (деление
на 0)");
else {
x1 = ch1 / zn1;
x2 = ch2 / zn2;
printf("Результат вычислений с типом float: %.10f \n",
x1);
printf("Результат вычислений с типом double: %.10f \n",
x2);
}
return 0;
}

4 Тестирование

При работе программы на экран было выведено следующее:

Введите a и b (через пробел): 5.124 5.236678


Результат вычислений с типом float: -0.0006693454
Результат вычислений с типом double: -0.0006693453

Решение задачи 2

1 Формальная постановка задачи

Входные данные:

x, y, z – действительные числа, представляющие переменные, которые

пользователь вводит с клавиатуры.


Выходные данные:

Сообщение, содержащее информацию о том, какие из чисел не


принадлежат промежутку.

Метод получения информации:

if ((x < -4) || (x > 4)) cout << " " << x;
if ((y < -4) || (y > 4)) cout << " " << y;
if ((z < -4) || (z > 4)) cout << " " << z;

Поочередно проверяется, не меньше ли каждое число нижней границы


промежутка и не больше ли верхней границы промежутка.
2 Проектирование
3 Реализация

Текст программы содержит символы кириллицы, поэтому в начало


программы включается файл Windows.h, а в теле функции прописываются
следующие команды:

#include <Windows.h>
SetConsoleCP(1251);
SetConsoleOutputCP(1251);

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


программы также включаются файл iostream и строка, позволяющая
использовать их в Visual Studio:

#include <iostream>
using namespace std;

Текст программы начинается с заголовка главной функции main():

int main()

Далее открывается тело функции и в нее включается описание


переменных.

Кодовая часть программы начинается с приглашения – вывода строки-


константы:

cout << "Введите x, y и z (через пробел): ";

за которым считываются данные, вводимые пользователем:

cin >> x >> y >> z;

Далее происходит проверка на принадлежность каждого числа промежутку


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

if ((x < -4) || (x > 4)) cout << " " << x;
if ((y < -4) || (y > 4)) cout << " " << y;
if ((z < -4) || (z > 4)) cout << " " << z;
Текст программы:

#include <iostream>
#include <Windows.h>
using namespace std;

int main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);

/* Объявление переменных */
float x, y, z;

/* Ввод чисел */
cout << "Введите x, y и z (через пробел): ";
cin >> x >> y >> z;

/* Проверка принадлежности промежутку и вывод */


cout << "Числа, не принадлежащие промежутку:";
if ((x < -4) || (x > 4)) cout << " " << x;
if ((y < -4) || (y > 4)) cout << " " << y;
if ((z < -4) || (z > 4)) cout << " " << z;
return 0;
}
4 Тестирование

При работе программы на экран было выведено следующее:

Введите x, y и z (через пробел): 2 3.9259 -5


Числа, не принадлежащие промежутку: -5
Решение задачи 3

1 Формальная постановка задачи

Входные данные:

cat – целое число, представляющее категорию скидки.

val – действительное число, представляющее стоимость товара.

Выходные данные:

a – действительное число, представляющее стоимость товара с учетом

скидки.

Метод получения вычисляемого значения:

Реализуется конструкция с оператором switch с управляющим выражением


cat, в результате работы которой выбирается нужная категория скидки, и в
соответствии с ней изначальная стоимость товара умножается на нужный
процент.
2 Проектирование
3 Реализация

Текст программы содержит символы кириллицы, поэтому в начало


программы включается файл Windows.h, а в теле функции прописываются
следующие команды:

#include <Windows.h>
SetConsoleCP(1251);
SetConsoleOutputCP(1251);

Текст программы начинается с заголовка главной функции main():

int main()

Далее открывается тело функции и в нее включается описание


переменных.

Кодовая часть программы начинается с приглашения – вывода строки-


константы:

printf("Введите стоимость товара и категорию скидки: ");

за которым считываются данные, вводимые пользователем:

scanf_s("%f %d", &val, &cat);

По условию задачи требуется выполнить проверку корректности ввода


данных, поэтому далее вводится конструкция с проверкой. Если введенная
сумма меньше или равна нулю, то выводится соответствующее сообщение:

if (val <= 0) printf("Заданная сумма меньше или равна 0");

В остальных случаях выполняется конструкция switch с управляющим


выражением cat, в которой прописаны соответствующие скидки по
категориям, а в общем случае, когда введена некорректная категория скидки,
выводится сообщение об этом:

switch (cat) {
case 1: printf("Стоимость товара со скидкой составляет
%.2f", a = val * 0.7); break;
...
case 6: printf("Стоимость товара со скидкой составляет
%.2f", a = val * 0.99); break;
default: printf("Заданная категория скидки
некорректна");

Текст программы:

#include <stdio.h>
#include <Windows.h>
int main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);

/* Объявление переменных*/
int cat;
float val, a;

/* Ввод стоимости товара и категории скидки */


printf("Введите стоимость товара и категорию скидки: ");
scanf_s("%f %d", &val, &cat);

/* Выбор подходящей категории скидки и вывод результата */


if (val <= 0) printf("Заданная сумма меньше или равна 0");
else
switch (cat) {
case 1: printf("Стоимость товара со скидкой составляет
%.2f", a = val * 0.7); break;
case 2: printf("Стоимость товара со скидкой составляет
%.2f", a = val * 0.8); break;
case 3: printf("Стоимость товара со скидкой составляет
%.2f", a = val * 0.9); break;
case 4: printf("Стоимость товара со скидкой составляет
%.2f", a = val * 0.95); break;
case 5: printf("Стоимость товара со скидкой составляет
%.2f", a = val * 0.97); break;
case 6: printf("Стоимость товара со скидкой составляет
%.2f", a = val * 0.99); break;
default: printf("Заданная категория скидки
некорректна");
}
return 0;
}
4 Тестирование

При работе программы на экран было выведено следующее:

Введите стоимость товара и категорию скидки: 499.90 3


Стоимость товара со скидкой составляет 449.91
Решение задачи 4

1 Формальная постановка задачи

Входные данные:

x, y – действительные числа, представляющие координаты точки.

Выходные данные:

Сообщение с информацией о том, принадлежит ли точка с заданными


координатами фигуре.

Метод получения информации:

Реализуется конструкция с оператором if, проверяющая условия попадания


точки в заданную область.

2 Проектирование
3 Реализация

Текст программы содержит символы кириллицы, поэтому в начало


программы включается файл Windows.h, а в теле функции прописываются
следующие команды:

#include <Windows.h>
SetConsoleCP(1251);
SetConsoleOutputCP(1251);

Текст программы начинается с заголовка главной функции main():

int main()

Далее открывается тело функции и в нее включается описание


переменных.

Кодовая часть программы начинается с приглашения – вывода строки-


константы:

printf("Введите координаты точки: ");

за которым считываются данные, вводимые пользователем:

scanf_s("%f %f", &x, &y);

Далее выполняется проверка на принадлежность точки к заданной области.


Для удобства разбиваем фигуру на две половины: выше оси x и ниже оси x.
Чтобы точка входила в заданную область, должны выполняться условия:

1. Точка лежит выше прямых y=-x, y=x и y=0 и ниже прямой y=1,
т.е. y>-1 и y>x и y<1 и y>0.
2. Точка лежит ниже прямых y=-x, y=x и y=0 и выше прямой y=-1,
т.е. y<-x и y<x и y<0 и y>-1.

Точка лежит в области, если выполняется хотя бы одно условие: y>-1 и


y>x и y<1 и y>0 или y<-x и y<x и y<0 и y>-1, в таком случае выводится
сообщение об этом. Если ни одно условие не выполняется, также выводится
соответствующее сообщение.

Текст программы:

#include <stdio.h>
#include <Windows.h>
int main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);

/* Объявление переменных */
float x, y;

/* Ввод данных */
printf("Введите координаты точки: ");
scanf_s("%f %f", &x, &y);

/* Проверка принадлежности точки к области */


if (((y > -x) && (y > x) && (y < 1) && (y > 0)) || (y < -x)
&& (y < x) && (y < 0) && (y > -1)) printf("Точка принадлежит
заданной области");
else printf("Точка не принадлежит заданной области");
return 0;
}
4 Тестирование

При работе программы на экран было выведено следующее:

Введите координаты точки: 0.1 0.6


Точка принадлежит заданной области

Заключение

В ходе выполнения данной работы были изучены условные операторы и


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

Оценить