Практические задачи по операторам циклов: цикл while
1. Повторение, управляемое счетчиком. Чтобы лучше понять алгоритм работы цикла while, рассмотрим классическую задачу усреднения:
Проведен опрос класса из 10 студентов. Вам известны оценки по этому опросу (целые числа в диапазоне 0 - 100). Нужно определить среднюю оценку класса.
Конечно же, мы помним со школьного курса, что для определения среднего числа группы чисел, нужно найти общую сумму этих чисел и разделить ее на количество суммируемых чисел. Также мы поступим и с нашей задачей. Код программы смотрим ниже:
01.//Проведен опрос класса из 10 студентов. Вам известны оценки по этому опросу
02.//(целые числа в диапазоне от 0до 100). Надо определить среднюю оценку класса
03.
04.#include <iostream>
05.
06.using namespace std;
07.
08.int main()
09.{
10. //объявляем необходимые переменные
11. int total, counter, average, grade;
12.
13. //задаем начальные значения
14. total = 0, counter = 1;
15.
16. //начинаем цикл ввода и суммирования оценок
17. while (counter <= 10)
18. {
19. cout << "Vvedite ocenku: ";
20. cin >> grade;
21.
22. if (grade <= 100)
23. {
24. total += grade;
25. counter += 1;
26. }
27. else
28. cout << "Vvedite osenke v intervale 0 - 100\n";
29. }
30.
31. //считаем средний балл и выводим результат на экран
32. average = total / 10;
33. cout << "Srednyya osenka po klassu: " << average << endl;
34.
35. return 0;
36.}
Результат работы программы:
Разберем программу подробнее
Начинаем с объявления необходимых переменных: total - будет накапливать общую сумму баллов студентов; counter - является счетчиком итераций цикла while (в нашем случае число повторений цикла заранее известно, поэтому эту разновидность цикла еще называют повторением, управляемым счетчиком); average - будет содержать у нас наше искомое среднее значение; grade - в эту переменную будем записывать введенное пользователем значение балла.
На следующем шаге присваиваем начальные значения счетчику циклов и общей сумме баллов.
Затем организовываем цикл while, задав условие выполнения, в котором запрашиваем у студента его балл и сохраняем в переменную grade. Также в цикле предусматриваем проверку на правильность ввода данных студентами: в случае правильного ввода засчитываем балл и увеличиваем счетчик цикла на единицу, в обратном случае выводим пользователю подсказку, не засчитываем балл и не увеличиваем счетчик, т.е. в любом случае у нас будет 10 "правильных" баллов.
Далее подсчитываем средний балл и запоминаем в переменную average, выводим результат на экран.
Примечание:
1.total += grade;
2.counter += 1;
Здесь используется операция присваивания в сокращенном виде. Вначале в своих программах вы можете пользоваться полной записью присваивания, а потом уже переходить на сокращенную. Вот полная запись этих строк:
1.total = total + grade;
2.counter = counter + 1;
Последнюю строку можно еще записать и так:
1.counter++;
Повторение, управляемое меткой. Давайте теперь немного модифицируем предыдущую программу, чтобы рассмотреть цикл while, управляемый не счетчиком, а меткой. В отличии от счетчика, когда количество повторений заранее известно, количество итераций цикла, управляемого меткой, заранее неизвестно. Т.е. мы можем использовать баллы скольких угодно студентов, пока не будет окончен ввод.
01.//Проведен опрос класса из 10 студентов. Вам известны оценки по этому опросу
02.//(целые числа в диапазоне от 0до 100). Надо определить среднюю оценку класса
03.
04.#include <iostream>
05.
06.using namespace std;
07.
08.int main()
09.{
10. //объявляем необходимые переменные
11. float average;
12. int grade, counter, total;
13.
14. //задаем начальные значения
15. total = 0, counter = 0;
16.
17. //запрашиваем у студента его оценку и запоминаем
18. cout << "Vvedite ocenku, dlya vihoda vvedite -1\n";
19. cin >> grade;
20.
21. //начинаем цикл, если не было введено -1
22. while (grade != -1)
23. {
24. //накапливаем общее кол-во баллов
25. //и засчитываем ввод
26. total += grade;
27. counter++;
28.
29. cout << "Vvedite ocenku, dlya vihoda vvedite -1\n";
30. cin >> grade;
31. }
32.
33. //проверка на ввод
34. //если было введено хотя бы одно значение
35. if (counter != 0)
36. {
37. //рассчитываем средний балл
38. average = (float) total / counter;
39. cout << "Srednee znacheniye: " << average << endl;
40. }
41. else
42. //если не было введено ни одно значение
43. cout << "Ocenki ne vvedeni\n";
44.
45. return 0;
46.}
В данном варианте этого алгоритма, в котором цикл while управляется меткой (ввод продолжается, пока метка не будет равной -1), студенты могут вводить сколь угодно своих оценок, пока не будет введена метка окончания ввода "-1". Плюс в этой программе есть еще одно нововведение: теперь средний балл будет более точным, т.к. для его хранения мы объявили переменную average типа float (float - тип для хранения дробных чисел с точностью 6 - 7 знаков после запятой, в отличии от double, у которого 13 - 14 знаков).
(Еще раз небольшое отступление). Разберем новый для вас момент:
1.average = (float) total / counter;
В этой строке реализовано приведение типов. Что это такое и для чего служит? Мы объявили переменную average как float, но переменные total и counter у нас объявлены как int, а значит после операции деления, в случае, если получиться дробное число, дробная часть будет отброшена (потеряна). Для того, чтобы избежать потери нужно, чтобы делимое total было тоже типа float, а так как мы его не объявили изначально типа float, то приведем его сейчас к float.
3. Теперь рассмотрим пример использования цикла while с постусловием. Запрограммируем решение вот такой задачи:
Одна большая химическая компания платит своим продавцам на основе комиссионных. Продавец получает $200 в неделю плюс 9% от объема продаж за неделю. Например, продавец, который продал за неделю химикалий на $5000 получит $200 плюс 9% от $5000, то есть в итоге $650. Нужно разработать программу, которая будет вводить для каждого продавца его объем продаж за последнюю неделю, рассчитывать и выводить на экран его заработок. Данные должны вводиться поочередно для каждого продавца.
Приступим к программированию. Вот такая программа будет выполнять поставленную задачу:
01.//Работаем с циклом while (вариант с постусловием)
02.
03.#include <iostream>
04.
05.using namespace std;
06.
07.int main()
08.{
09. //объявляем необходимые переменные
10. float prodashi, zarabotok;
11.
12. //запрашиваем ввод и сохраняем значение
13. cout << "Vvedite ob'yom prodash: $";
14. cin >> prodashi;
15.
16. //начинаем цикл с постусловием
17. do
18. {
19. //считаем заработок и выводим его на экран
20. zarabotok = 200 + (prodashi * 9 / 100);
21. cout << "Zarobotok: $" << zarabotok << endl << endl;
22.
23. //запрашиваем ввод и сохраняем значение
24. cout << "Vvedite ob'yom prodash (dlya vihoda vvedite -1): $";
25. cin >> prodashi;
26. }
27. while (prodashi != -1);
28.
29. return 0;
30.}
Результат работы программы:
4. Цикл for. Решим вот такую вот задачу:
Программа последовательно запрашивает у пользователя десять чисел и находит максимальное из них. Выводит результат на экран.
01.//Программа последовательно запрашивает у пользователя десять чисел,
02.//находит максимальное и печатает результат
03.
04.#include <iostream>
05.
06.using namespace std;
07.
08.int main()
09.{
10. int counter;
11. float number, largest;
12.
13. //запрашиваем первое число, запоминаем его
14. cout << "Inter: ";
15. cin >> largest;
16.
17. //запрашиваем остальные девять чисел в цикле for
18. for (counter = 1; counter <= 9; counter++)
19. {
20. cout << "Inter: ";
21. cin >> number;
22.
23. //если вновь введенное число больше, то перезаписываем max
24. if (number > largest)
25. largest = number;
26. }
27.
28. cout << endl << "Max: " << largest << endl;
29.
30. return 0;
31.}
Результат работы программы: