Упражнение 5.9. Напишите программу, использующую серию операторов if
для подсчета количества гласных букв в тексте, прочитанном из потока cin
.
Упражнение 5.10. Программа подсчета гласных имеет одну проблему: она не учитывает заглавные буквы как гласные. Напишите программу, которая подсчитывает гласные буквы как в верхнем, так и в нижнем регистре. То есть значение счетчика aCnt
должно увеличиваться при встрече как символа 'a'
, так и символа 'A'
(аналогично для остальных гласных букв).
Упражнение 5.11. Измените рассматриваемую программу так, чтобы она подсчитывала также количество пробелов, символов табуляции и новой строки.
Упражнение 5.12. Измените рассматриваемую программу так, чтобы она подсчитывала количество встреченных двухсимвольных последовательностей: ff
, fl
и fi
.
Упражнение 5.13. Каждая из приведенных ниже программ содержит распространенную ошибку. Выявите и исправьте каждую из них.
Код для упражнения 5.13
(a) unsigned aCnt = 0, eCnt = 0, iouCnt = 0;
char ch = next_text();
switch (ch) {
case 'a': aCnt++;
case 'e': eCnt++;
default: iouCnt++;
}
(b) unsigned index = some_value();
switch (index) {
case 1:
int ix = get_value();
ivec[ix] = index;
break;
default:
ix = ivec.size()-1;
ivec[ix] = index;
(c) unsigned evenCnt = 0, oddCnt = 0;
int digit = get_num() % 10;
switch (digit) {
case 1, 3, 5, 7, 9:
oddcnt++;
break;
case 2, 4, 6, 8, 10:
evencnt++;
break;
}
(d) unsigned ival=512, jval=1024, kval=4096;
unsigned bufsize;
unsigned swt = get_bufCnt();
switch(swt) {
case ival:
bufsize = ival * sizeof (int);
break;
case jval:
bufsize = jval * sizeof(int);
break;
case kval:
bufsize = kval * sizeof(int);
break;
}
5.4. Итерационные операторы
while
и for
проверяют условие прежде, чем выполнить тело. Оператор do while
сначала выполняет тело, а затем проверяет свое условие.
while
while
многократно выполняет оператор, пока его условие остается истинным. Его синтаксическая форма имеет следующий вид:
while (
Пока
истинно (значение true
),
(который зачастую является блоком кода) выполняется. Условие не может быть пустым. Если при первой проверке условие ложно (значение false
), оператор не выполняется.
Условие может быть выражением или объявлением инициализированной переменной (см. раздел 5.2). Обычно либо само условие, либо тело цикла должно делать нечто изменяющее значение выражения. В противном случае цикл никогда не закончится.
while
, создаются и удаляются при каждой итерации.
while
Цикл while
обычно используется в случае, когда итерации необходимо выполнять неопределенное количество раз, например, при чтении ввода. Цикл while
полезен также при необходимости доступа к значению управляющей переменной после завершения цикла. Рассмотрим пример.
vector
int i;
//
while (cin >> i)
v.push_back(i); //
auto beg = v.begin();
while (beg != v.end() && *beg >= 0)
++beg;
if (beg == v.end())
//
Первый цикл читает данные со стандартного устройства ввода. Он может выполняться сколько угодно раз. Условие становится ложно, когда поток cin
читает недопустимые данные, происходит ошибка ввода или встречается конец файла. Второй цикл продолжается до тех пор, пока не будет найдено отрицательное значение. Когда цикл заканчивается, переменная beg
будет либо равна v.end()
, либо обозначит элемент вектора v
, значение которого меньше нуля. Значение переменной beg
можно использовать вне цикла while
для дальнейшей обработки.