Практические задачи по операторам циклов: цикл 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.}

Результат работы программы: