Реализация цикла на базе if и goto
Обновление генератора псевдослучайных чисел
Если запустить программу «Угадай число!», то можно заметить, что компьютер всегда загадывает одно и то же число. Во избежание этого следует каждый раз обновлять начальное значение генератора псевдослучайных чисел командой
srand(time(0));
Функция time() расположена в библиотеке time.h.
Одна из фундаментальных и наиболее важных конструкций в программировании – это циклы; они позволяют повторить некоторые действия заданное число раз. Мы детально изучим циклы в соответствующей главе, а сейчас рассмотрим, как реализовать циклическую конструкцию на базе операторов if и goto. После этого вы сможете почувствовать основную идею цикла, а также лучше понять работу операторов if и goto.
Наша задача будет заключаться в том, чтобы вывести на экран числа от 1 до N, где число N пользователь вводит с клавиатуры. Вначале обсудим алгоритм решения данной задачи, который может быть представлен в виде следующих шагов:
|
|
- Если N больше, чем 0, то вывести число 1;
- Если N больше, чем 1, то вывести число 2;
- Если N больше, чем 2, то вывести число 3;
- Если N больше, чем 3, то вывести число 4;
- Если N больше, чем 4, то вывести число 5;
- …
Обратите внимание на то, что все шаги в описанном алгоритме очень похожи и отличаются только числами в них. Введем следующие обозначения:
- Условие(1) – Если N больше, чем 0;
- Действие(1) – Вывести число 1;
- Условие(2) – Если N больше, чем 1;
- Действие(2) – Вывести число 2;
- Условие(3) – Если N больше, чем 2;
- Действие(3) – Вывести число 3;
- …
Легко видеть, что все условия и действия можно записать в общем виде:
Шаг(i) – Если N больше, чем i-1, то вывести число i;
Тогда весь алгоритм можно записать так:
- Ввести N;
- i присвоить 1;
- Если истинно Условие(i), то выполнить Шаг(i) и перейти на шаг 2;
Теперь посмотрите, как это алгоритм будет выглядеть на языке Си:
//Ввести число N
int N;
cout << "Введите число N:\n";
cin >> N;
//Задать начальное значение
int i=1;
//Метка очередного шага
NEXT_STEP:
//Нужно ли продолжать
if (i<=N) {
//Выводим число
cout << i << " ";
//Увеличиваем на 1
i++;
//Переходим на очедедной шаг
goto NEXT_STEP;
}
Задача 1. Сумма углов треугольника равна 180 градусам. Напишите программу, которая принимает с клавиатуры три числа и проверяет, может ли треугольник иметь такие углы. Используйте оператор?:.
#include "stdafx.h"
#include <iostream>
using namespace std;
int main() {
//Объявляем переменные для углов
float angle1, angle2, angle3;
//Вводим величины углов с клавиатуры
cout << "Введите угол 1:\n";
cin >> angle1;
cout << "Введите угол 2:\n");
cin >> angle2;
cout << "Введите угол 3:\n");
cin >> angle3;
|
|
//Вычисляем сумму углов
float sum = angle1 + angle2 + angle3;
//Проверяем, равна сумма 180 или нет
sum==180? cout << "Может": cout << "Нет";
system("pause");
return 0;
}
Задача 2. Автомобилистов, превысивших скорость, наказывают по следующей схеме: за превышение не более чем на 10 км/ч выносится предупреждение; за превышение не более чем на 20 км/ч водитель штрафуется на 100 рублей; не более чем на 40 км/ч – 300 рублей; не более чем на 60 км/ч – 1500 рублей; за превышение скорости более чем на 60 км/ч водитель карается лишением прав. На некотором участке дороги разрешённая скорость составляет 60 км/ч. Напишите программу, которая принимает с клавиатуры скорость водителя и сообщает, движется ли он с разрешённой скоростью, или же его следует наказать согласно описанной схеме. Используйте лесенку if-else-if.
#include "stdafx.h"
#include <iostream>
using namespace std;
int main() {
float velocity;
cout << "Введите скорость:\n";
cin >> velocity;
if (velocity<=0) {
cout << "Ошибка ввода\n";
} else if (velocity<=60) {
cout << "Разрешенная скорость\n";
} else if (velocity<=70) {
cout << "Предупреждение\n";
} else if (velocity<=80) {
cout << "Штраф 100 рублей\n";
} else if (velocity<=100) {
cout << "Штраф 300 рублей\n";
} else if (velocity<=120) {
cout << "Штраф 1500 рублей\n";
} else {
cout << "Лишение прав\n";
}
system("pause");
return 0;
}
Задача 3. Напишите программу, которая принимает с клавиатуры номер дня недели и выводит его название. Используйте switch.
#include "stdafx.h"
#include <iostream>
using namespace std;
int main() {
int day;
cout << "Введите номер дня:\n";
cin >> day;
switch (day) {
case 1: cout << "Понедельник"; break;
case 2: cout << "Вторник"; break;
case 3: cout << "Среда"; break;
case 4: cout << "Четверг"; break;
case 5: cout << "Пятница"; break;
case 6: cout << "Суббота"; break;
case 7: cout << "Воскресенье"; break;
default: cout << "Такого дня нет"; break;
}
system("pause");
return 0;
}
Задача 4. Напишите программу, которая принимает с клавиатуры целое число N и выводит на экран все делящиеся на 7 числа из диапазона от 1 до N, используя циклическую конструкцию на базе операторов if и goto.
#include "stdafx.h"
#include <iostream>
using namespace std;
int main() {
int n;
cout << "Введите число:\n";
cin >> n;
int i=1;
start:
if (i<=n) {
if (i%7==0) {
cout << i << endl;
}
i++;
goto start;
}
system("pause");
return 0;
}
Задача 5. Напишите программу, которая по выбору пользователя отображает на экране квадрат, треугольник или крестик из звездочек.
#include "stdafx.h"
#include <iostream>
using namespace std;
int main() {
cout << "Какую фигуру нарисовать?\n";
cout << "1 - квадрат\n";
cout << "2 - крестик\n";
cout << "3 - треугольник\n";
int choice;
cin >> choice;
switch (choice) {
case 1:
cout << "***\n* *\n***\n"; break;
case 2:
cout << " * \n***\n * \n"; break;
case 3:
cout << " * \n * * \n*****\n"; break;
default:
cout << "Неправильный выбор\n";
}
system("pause");
return 0;
}
КОНТРОЛЬНЫЕ ВОПРОСЫ
1. Объясните своими словами, зачем нужны условные операторы. Приведите примеры их использования.
2. Опишите синтаксис условного оператора if и приведите пример его использования. Изобразите его блок-схему и псевдокод.
3. Какие операции сравнения и логические операции вам известны? Объясните их действие и приведите примеры.
4. Как можно реализовать консольное меню при помощи логических операций и функций ввода/вывода?
5. Объясните работу оператора?:.
6. Что такое вложенные операторы if-else? Приведите пример и изобразите блок-схему с псевдокодом.
7. Что такое лесенка if-else-if? Приведите пример и изобразите для него блок-схему с псевдокодом.
8. Опишите синтаксис условного оператора switch.
9. Объясните работу оператора goto.
10. Как реализовать цикл на базе операторов goto и if? Изобразите его блок-схему и псевдокод.