
Лаба 4 / Лабораторная_работа_№4_Токарев_0421
.docxМИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра Электротехнологической и преобразовательной техники
отчет
по лабораторной работе № 4
по дисциплине «Информационные технологии»
Тема: Инструкции языка С++
Студент гр. 0421 |
|
Токарев А.А. |
Преподаватель |
|
Чмиленко Ф.В. |
Санкт-Петербург
2021
Цель работы: исследование инструкций языка С++ для управления программным потоком.
Задания:
Инструкция условного перехода if
Оператор ?:
Инструкция выбора switch
Инструкции циклов while и do while
Инструкции цикла for
Инструкции безусловного перехода goto
Дополнительные задания:
Задание переменной прямо в условном операторе if или switch
Ход работы:
Задание 1.
Создадим программу с инструкцией if. Программа сравнивает два различных целых числа, введенных с клавиатуры и выводит большее из них на консоль:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int a, b, c;
system("chcp 1251");
system("cls");
cout << "Введите первое целое число: " << endl;
cin >> a;
cout << "Введите второе целое число, не равное первому: " << endl;
cin >> b;
if (a > b)
{
c = a;
}
if (a < b)
{
c = b;
}
cout << "Большее число из введенных: " << c << endl;
system("pause");
return 0;
}
Рисунок 1 – Результат работы программы, демонстрирующей применение инструкции if
Создадим программу с инструкцией if – else. Программа получает с клавиатуры два целых числа и выводит результат их сравнения на консоль. Программа содержит пример использования разной структуры вложенности инструкции if-else:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int a, b;
system("chcp 1251");
system("cls");
cout << "Введите первое целое число: " << endl;
cin >> a;
cout << "Введите второе целое число: " << endl;
cin >> b;
if (a > b)
{
cout << "Первое число больше второго" << endl;
}
else
{
if (a < b)
{
cout << "Второе число больше первого" << endl;
}
else
{
cout << "Числа равны" << endl;
}
}
system("pause");
return 0;
}
Рисунок 2 – Результат работы программы, демонстрирующей применение инструкции if-else
Задание 2.
Перепишем программу, демонстрирующую применение инструкции if-else и заменим эту инструкцию на тернарный оператор ?:. Программа получает с клавиатуры два целых числа и выводит результат их сравнения на консоль:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int a, b;
system("chcp 1251");
system("cls");
cout << "Введите первое целое число: " << endl;
cin >> a;
cout << "Введите второе целое число: " << endl;
cin >> b;
(a > b) ? cout << "Первое число больше второго" << endl : (a < b) ? cout << "Второе число больше первого" << endl
: cout << "Числа равны" << endl;
system("pause");
return 0;
}
Рисунок 3 – Результат работы программы, демонстрирующей применение тернарного оператора
Задание 3.
Разработаем программу, демонстрирующую примеры использования инструкции switch. Напишем простой калькулятор для двух введенных с консоли целых чисел, который выполняет простые арифметические действия (сумма, разность, умножение, деление, вычисление остатка от целочисленного деления). Чтобы учесть случай, когда происходит деление на ноль, а также, чтобы реализовать возможность в случае неверно введенного символа арифметического оператора ввести его заново, дополнительно воспользуемся инструкцией goto и двумя метками: M1 и M2:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int a, b, result;
char c;
system("chcp 1251");
system("cls");
M2 : cout << "Введите первое число: " << endl;
cin >> a;
cout << "Введите второе число: " << endl;
cin >> b;
cout << "Выберите арифметический оператор(+, -, *, /, %): " << endl;
cin >> c;
M1 : switch(c)
{
case '+':
result = a + b;
cout << a << " + " << b << " = " << result << endl;
break;
case '-':
result = a - b;
cout << a << " - " << b << " = " << result << endl;
break;
case '*':
result = a * b;
cout << a << " * " << b << " = " << result << endl;
break;
case '/':
if (b == 0){
cout << "На ноль делить нельзя!" << endl;
goto M2;
}
result = a / b;
cout << a << " / " << b << " = " << result << endl;
break;
case '%':
result = a % b;
cout << a << " % " << b << " = " << result << endl;
break;
default:
cout << "Ошибка!Введен неверный оператор!" << endl;
cout << "Выберите арифметический оператор(+, -, *, /, %): " << endl;
cin >> c;
goto M1;
}
system("pause");
return 0;
}
Рисунок 4 – Результат работы программы, демонстрирующей применение инструкции switch/case
Задание 4.
Разработаем программу, демонстрирующую работу инструкции while. Программа выводит сумму всех четных положительных чисел от 0 до введенного с клавиатуры числа включительно. При введение отрицательного числа выдает ошибку и закрывается. Для демонстрации итераций, выведем все положительные четные числа на промежутке от нуля до введенного числа в теле цикла. Для того, чтобы пропускать нечетные числа, воспользуемся инструкцией continue, а для того, чтобы выйти из цикла при вводе отрицательного числа, будем использовать инструкцию break:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
system("chcp 1251");
system("cls");
int a = 0;
int b;
int c = 0;
bool m;
cout << "Введите конечное положительное целое число: " << endl;
cin >> b;
while(a != b + 1)
{
if (b < 0)
{
m = false;
break;
}
else
{
m = true;
}
if (a % 2 == 1)
{
a++;
continue;
}
cout << a << endl;
c += a;
a++;
}
if (m == true)
{
cout << "Сумма всех четных целых положительных чисел от 0 до " << b << " равна " << c << endl;
}
else
{
cout << "Было введено отрицательное число!" << endl;
}
system("pause");
return 0;
}
Рисунок 5 – Результат работы программы, демонстрирующей применение инструкции while
Разработаем программу, демонстрирующую работы инструкции do while. Программа выводит сумму всех чисел на заданном с клавиатуры интервале:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
system("chcp 1251");
system("cls");
int a, b;
int result = 0;
cout << "Введите первое число интервала: " << endl;
cin >> a;
cout << "Введите второе число интервала, которое больше первого числа: " << endl;
cin >> b;
int c = a;
do
{
result += c;
cout << c << endl;
c++;
}
while(c <= b);
cout << "Сумма чисел на отрезке от " << a << " до " << b << " равна " << result << endl;
system("pause");
return 0;
}
Рисунок 6 – Результат работы программы, демонстрирующей применение инструкции do while
Задание 5.
Создадим программу, в которой продемонстрируем работу инструкции for. Программа выводит на экран сумму всех четных целых чисел в заданном с клавиатуры диапазоне:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
system("chcp 1251");
system("cls");
int a, b, i;
int result = 0;
cout << "Введите первое число интервала: " << endl;
cin >> a;
cout << "Введите второе число интервала (больше первого числа): " << endl;
cin >> b;
for (i = a; i <= b; i++)
{
if (i % 2 == 1 || i % 2 == -1)
{
continue;
}
result += i;
}
cout << "Сумма четных чисел от " << a << " до " << b << " равна " << result << endl;
system("pause");
return 0;
}
Рисунок 7 – Результат работы программы, демонстрирующей применение инструкции for с увеличением счетчика цикла
Перепишем программу так, чтобы вместо инструкции for использовалась инструкция while:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
system("chcp 1251");
system("cls");
int a, b, c;
int result = 0;
cout << "Введите первое число интервала: " << endl;
cin >> a;
cout << "Введите второе число интервала: " << endl;
cin >> b;
c = a;
while (c <= b)
{
if (c % 2 == 1 || c % 2 == -1)
{
c++;
continue;
}
result += c;
c++;
}
cout << "Сумма четных чисел на отрезке от " << a << " до " << b << " равна " << result << endl;
system("pause");
return 0;
}
Рисунок 8 – Результат работы программы, при замене инструкции for на инструкцию while
Реализуем ту же самую программу с инструкцией for, но в этот раз с уменьшением счетчика цикла:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
system("chcp 1251");
system("cls");
int a, b, i;
int result = 0;
cout << "Введите первое число интервала: " << endl;
cin >> a;
cout << "Введите второе число интервала: " << endl;
cin >> b;
for (i = b; i >= a; i--)
{
if (i % 2 == 1 || i % 2 == -1)
{
continue;
}
result += i;
}
cout << "Сумма четных чисел на отрезке от " << a << " до " << b << " равна " << result << endl;
system("pause");
}
Рисунок 9 – Результат работы программы, демонстрирующей применение инструкции for с уменьшением счетчика цикла
Задание 6.
Переделаем программу-калькулятор, разработанную в задании 3, так, чтобы вместо инструкции switch использовалась инструкция if-else. Помимо уже используемых инструкций goto, будем использовать еще одну, чтобы по нажатии клавиши “x” закрывать программу. Также реализуем возможность повторить ввод чисел и выбор оператора по нажатии клавиши “z”:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int a, b, result;
char c, f;
system("chcp 1251");
system("cls");
M1 : cout << "Введите первое целое число: " << endl;
cin >> a;
cout << "Введите второе целое число: " << endl;
cin >> b;
cout << "Выберите арифметический оператор(+, -, *, /, %): " << endl;
cin >> c;
M2 : if (c == '+')
{
result = a + b;
cout << a << " + " << b << " = " << result << endl;
}
if (c == '-')
{
result = a - b;
cout << a << " - " << b << " = " << result << endl;
}
if (c == '*')
{
result = a * b;
cout << a << " * " << b << " = " << result << endl;
}
if (c == '/')
{
if (b == 0){
cout << "На ноль делить нельзя!" << endl;
goto M1;
}
result = a / b;
cout << a << " / " << b << " = " << result << endl;
}
if (c == '%')
{
result = a % b;
cout << a << " % " << b << " = " << result << endl;
}
if (c != '+' && c != '-' && c != '*' && c != '/' && c != '%')
{
cout << "Ошибка!Введен неверный оператор!" << endl;
cout << "Выберите арифметический оператор(+, -, *, /, %): " << endl;
cin >> c;
goto M2;
}
M3 : cout << "Введите z, чтобы сделать еще вычисление, введите х, чтобы закрыть программу: " << endl;
cin >> f;
if (f == 'z')
{
goto M1;
}
if (f == 'x')
{
return 0;
}
if (f != 'x' && f != 'z')
{
goto M3;
}
}
Рисунок 10 – Результат работы программы, демонстрирующей применение инструкции goto
Напишем программу, в которой применение goto является «обоснованным». Программа будет считать факториал введенного с клавиатуры числа, но, в случае, если факториал будет больше 500000, будет выдаваться ошибка и программа будет завершена:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
system("chcp 1251");
system("cls");
int a, b, i;
int result = 1;
while(true)
{
cout << "Введите число: " << endl;
cin >> a;
for (i = 1; i <= a; i++)
{
result *= i;
if (result > 500000)
{
goto M1;
}
}
cout << "Факториал равен: " << result << endl;
result = 1;
}
M1: cout << "Факториал больше 500000!" << endl;
system("pause");
return 0;
}
Рисунок 11 – Результат работы программы, демонстрирующей «обоснованное» применение инструкции goto
Дополнительное задание.
Напишем программу, демонстрирующую возможность задавать объявление переменной прямо в условном операторе if. Программа получает целое число, вводимое с клавиатуры, и определяет, является ли последняя цифра числа четверкой:
#include <stdio.h>
#include <iostream>
using namespace std;
int main()
{
int N;
system("chcp 1251");
system("cls");
cout << "Введите целое число: ";
cin >> N;
if (int a = N % 10; a == 4)
{
cout << "Во введенном числе последней цифрой является 4" << endl;
}
else
{
cout << " Во введенном числе последней цифрой не является 4" << endl;
}
system("pause");
return 0;
}
Рисунок 12 – Результат работы программы, демонстрирующей возможность задавать объявление переменной прямо в условном операторе if
Выводы:
В данной лабораторной работе были изучены основные инструкции для управления программным потоком в языке программирования С++. Были изучены инструкции условного перехода if и if-else, тернарный оператор ?:, инструкция выбора switch, инструкции циклов while и do while, инструкции цикла for и инструкции безусловного перехода goto.
С помощью условного перехода if-else можно создавать программы с ветвлением программного потока на два направления. Это удобно в небольших программах с малым количеством ветвлений.
Также, для ветвления программного потока на два направления можно использовать тернарный оператор ?: . Его использование позволяет сократить текст программы, но при использовании сложных вложенных условных переходов затрудняет её чтение.
Если программный поток необходимо разветвить на несколько направлений, количество которых больше, чем два, можно использовать инструкцию выбора switch. Она будет удобна в такой программе, где число возможных исходов для switch четко определено.
Если число итераций цикла заранее неизвестно, то для работы с программным потоком хорошо подходит бесконечный цикл while, или его подвид - do while. Отличие в них заключается в том, что в do while тело цикла будет выполнено минимум 1 раз. Чтобы пропустить тело цикла в определенные итерации, используется инструкция continue, а чтобы выйти из цикла – инструкция break.
Если число итераций цикла известно заранее, то целесообразно цикл for. У него имеется встроенный счетчик итераций, цикл можно построить как с увеличением, так и с уменьшением этого счетчика.
Инструкция goto позволяет выполнить безусловный переход к определенной метке в программе. Применять его необходимо обдуманно, иначе можно легко запутаться в программном коде и его последовательности выполнения. Один из случаев, когда применение goto оправдано – выход из вложенных циклов.
Также в лабораторной работе был рассмотрен пример, демонстрирующий инициализацию переменных прямо в условных операторах. По сути, этот механизм позволяет уменьшить количество глобальных переменных, что улучшает чистоту кода и облегчает его тестирование.