Рейтинговые книги
Читем онлайн Освой самостоятельно С++ за 21 день. - Джесс Либерти

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 33 34 35 36 37 38 39 40 41 ... 170

5. Измените класс Employee так, чтобы можно было инициализировать данные-члены age, YearsOfService и Salary в процессе "создания" служащего.

6. Жучки: что неправильно в следующем объявлении?

class Square

{

public:

   int Side;

}

7. Жучки: что весьма полезное отсутствует в следующем объявлении класса?

class Cat

{

   int GetAge() const;

private:

   int itsAge;

};

8. Жучки: какие три ошибки обнаружит компилятор в этом коде?

class TV

{

public:

   void SetStation(int Station);

   int GetStation() const;

private:

   int itsStation;

};

main()

{

   TV myTV;

   myTV.itsStation = 9;

   TV.SetStation(10);

   TV myOtherTv(2);

}

День 7-й. Циклы

Структура любой программы состоит из комбинации множества ветвлений и циклов. На четвертом занятии вы научились организовывать ветвление программы с помощью оператора if. Сегодня вы узнаете:

• Что такое циклы и как они используются

• Каковы методы организации циклов

• Как избежать чрезмерной вложенности конструкций if/else

Организация циклов

Для решения ряда задач часто требуется многократное выполнение одних и тех же действий. На практике это реализуется с помощью рекурсивных (см. занятие 5) или итеративных алгоритмов. Суть итеративного процесса заключается в повторении последовательности операций нужное количество раз.

История оператора goto

В те годы, когда программирование находилось еще на начальной стадии развития, использовались только небольшие по размеру и достаточно примитивные программы. Нельзя было назвать приятным и сам процесс их разработки. В таких программах циклы состояли из метки, последовательности команд и оператора безусловного перехода.

В C++ меткой называют идентификатор, за которым следует двоеточие (:). Метка всегда устанавливается перед оператором, на который необходимо будет передать управление. Для перехода на нужную метку используется оператор goto, за которым следует имя метки. Пример использования оператора goto приведен в листинге 7.1.

Листинг 7.1. Организация цикла с помощью оператора goto

1:  // Листинг 7.1.

2:  // Организация цикла с помощью goto

3:

4:  #include <iostream.h>

5:

6: int main()

7: {

8:    int counter = 0; // инициализация счетчика

9: loop: counter++;  // начало цикла

10:   cout.<< "counter: " << counter << "n";

11:   if (counter < 5) // проверка значения

12:     goto loop; // возвращение к началу

13:

14:   cout << "Complete. Counter: " << counter << ".n";

15:   return 0;

16: }

Результат:

counter: 1

counter: 2

countor: 3

counter: 4

counter: 5

Complete. Counter: 5.

Анализ: В строке 8 переменная counter инициализируется нулевым значением. Метка loop: в строке 9 показывает начало цикла. На каждой итерации значение counter yвeличивaeтcя на единицу и выводится на экран. В строке 11 выполняется проверка значения переменной counter. Если оно меньше пяти, значит условие выполняется и управление передается оператору goto, в результате чего осуществляется переход на строку 9. Итеративный процесс выполняется до тех пор, пока значение переменной counter не достигнет пяти. После этого программа выходит за пределы цикла и на экран выводится окончательный результат.

Почему следует избегать оператора goto

Со временем нелестные высказывания в адрес оператора goto участились, впрочем, вполне заслуженно. С помощью оператора goto можно осуществлять переход в любую точку программы — вперед или назад. Такое беспорядочное использование этого оператора привело к появлению запутанных и абсолютно непригодных для восприятия программ, получивших жаргонное название "спагетти". Поэтому последние двадцать лет преподаватели программирования во всем мире твердили студентам одну и ту же фразу: "Никогда не используйте оператор goto".

На смену оператору goto пришли конструкции с несколько более сложной структурой, но и с более широкими возможностями: for, while и do...while. Несмотря на то что после полного искоренения оператора goto структура программ значительно прояснилась, негативные высказывания в его адрес следует признать преувеличенными. Как любой инструмент программирования, при правильном использовании оператор goto может оказаться достаточно полезным. В силу этого комитет ANS1 принял решение оставить этот оператор в языке. Правда, вместе с этим родилась шутка: "Дети! Использование этого оператора в домашних условиях небезопасно!"

Организация циклов с помощью оператора while

В циклах, организованных с помощью оператора while, выполнение последовательности операций продолжается до тех пор, пока условие продолжения цикла истинно. В примере программы в листинге 7.1 значение переменной counter увеличивалось до тех пор, пока не стало равным пяти. Листинг 7.2 демонстрирует тот же алгоритм, реализованный с помощью оператора while.

Листинг 7.2. Организация цикла с помощью оператора while

1: // Листинг 7.2.

2: // Организация цикла с помощью оператора while

3:

4: #include <iostream.h>

5:

6: int main()

7: {

8:    int counter = 0;  // присвоение начального значения

9:

10:   while(counter < 5) // проверка условия продолжения цикла

11:   {

12:     counter++;  // тело цикла

13:     cout << " counter: " << counter << ";n";

14:   }

15:

16:   cout << " Complete. Counter: " << counter << ".n";

17:   return 0;

18: }

Результат:

counter: 1

counter: 2

counter: 3

counter: 4

counter: 5

Complete. Counter: 5.

Анализ: Эта несложная программа показывает пример организации цикла с помощью оператора while. В начале каждой итерации проверяется условие, и, если оно выполняется, управление передается на первый оператор цикла. В нашем примере условию продолжения цикла удовлетворяют все значения переменной counter, меньшие пяти (строка 10). Если условие выполняется, запускается следующая итерация цикла. В строке 12 значение счетчика увеличивается на единицу, а в строке 13 выводится на экран. Как только значение счетчика достигает пяти, тело цикла (строки 11 — 14) пропускается и управление передается в строку 15.

Сложные конструкции с оператором while

Сложность логического выражения, являющегося условием в операторе while, не ограничена. Это позволяет использовать в конструкции while любые логические выражения C++. При построении выражений допускается использование логических операций: && (логическое И), 11 (логическое ИЛИ), а также ! (логическое отрицание). В листинге 7.3 показан пример использования более сложных условий в конструкциях с оператором while.

Листинг 7.3. Сложные условия в конструкциях while

1: // Листинг 7.3.

2: // Сложные условия в конструкциях while

3:

4: include <iostream.h>

5:

6: int main()

7: {

8:    unsigned short small;

9:    unsigned long large;

10:   const unsigned short MAXSMALL=65535;

11:

12:   cout << "Enter a small number: ";

13:   cin >> small;

14:   cout << "Enter a large number: ";

15:   cin >> large;

16:

17:   cout << "small: " << small << "...";

18:

19:   // на каждой итерации проверяются три условия

20:   while (small < large && large > 0 && small < MAXSMALL)

21:   {

22:     if (small % 5000 == 0) // после каждых 5000 строк выводится точка

23:       cout << ".";

24:

25:     small++;

26:

27:     large-=2;

28:   }

39:

30:   cout << "nSmall: " << small << " Large: " << large << endl;

31:   return 0;

32: }

Результат:

Enter а small number: 2

Enter а large number: 100000

small: 2 

Small: 33335 Large: 33334

Анализ: Программа представляет собой простую логическую игру. Вначале предлагается ввести два числа — small и large. После этого меньшее значение увеличивается на единицу, а большее уменьшается на два до тех пор, пока они не "встретятся". Цель игры: угадать число, на котором значения "встретятся".

В строках 12—15 осуществляется ввод значений. В строке 20 проверяется три условия продолжения цикла.

1. Значение переменной small не превышает значения large.

2. Значение переменной large неотрицательное и не равно нулю.

3. Значение переменной small не превышает значения константы MAXSMALL.

Далее, в строке 23, вычисляется остаток от деления числа small на 5000, причем значение переменной small не изменяется. Если small делится на 5000 без остатка, результатом выполнения этой операции будет 0. В этом случае для визуального представления процесса вычислений на экран выводится точка. Затем в строке 26 значение переменной small увеличивается на 1, а в строке 28 значение large уменьшается на 2.

1 ... 33 34 35 36 37 38 39 40 41 ... 170
На этой странице вы можете бесплатно читать книгу Освой самостоятельно С++ за 21 день. - Джесс Либерти бесплатно.

Оставить комментарий