Оператор switch

Задания раздела 5.3.2
5.9. Напишите программу, использующую серию операторов if для подсчета количества гласных букв в тексте, прочитанном из потока cin.
5.10. Программа подсчета гласных имеет одну проблему: она не учитывает заглавные буквы как гласные. Напишите программу, которая подсчитывает гласные буквы как в верхнем, так и в нижнем регистре. То есть значение счетчика aCnt должно увеличиваться при встрече как символа 'a', так и символа 'A' (аналогично для остальных гласных букв).
5.11. Измените рассматриваемую программу так, чтобы она подсчитывала также количество пробелов, символов табуляции и новой строки.
5.12. Измените рассматриваемую программу так, чтобы она подсчитывала количество встреченных двухсимвольных последовательностей ff, f1, 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=getvalue();
ivec[ix]=index;
break;
degault:
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;
}

Читать далее «Оператор switch»

Условный оператор if

Задания раздела 5.3.1
5.5. Напишите собственную версию программы преобразования числовой оценки в символ с использованием оператора if else.
5.6. Перепишите программу оценки так, чтобы использовать условный оператор вместо оператора if else.
5.7. Исправьте ошибки в каждом из следующих фрагментов кода:
(a) if (ival!=ival2)
ival1=ival2
else ival1=ival2=0;
(b) if (ival<minval)
minval=ival;
occurs=1;
(c) if (int ival=getvalue())
cout << "ival= " << ival << endl;
if (ival) cout << "ival=0\n";
(d) if (ival=0) ival=getvalue();
5.8. Что такое "потерянный оператор else"? Как в языке C++ определяется принадлежность ветви else?
Читать далее «Условный оператор if»

Операторная область видимости

Задания раздела 5.2
5.4. Объясните каждый из следующих примеров, а так же устраните все обнаруженные проблемы.
(a) while (string::iterator iter!=s.end()) { /* ... */  }
(b) while (bool status=find(word)) { /* ... */ }
if (!status) { /* ... */ }
Читать далее «Операторная область видимости»

Простые операторы

Задания раздела 5.1
5.1. Что такое пустой оператор? Когда его можно использовать?
5.2. Что такое блок? Когда его можно использовать?
5.3. Используя оператор запятой, перепишите цикл while из раздела 1.4.1 так, чтобы блок стал больше не нужен. Объясните, улучшило ли это удобочитаемость кода.
Читать далее «Простые операторы»

Явные преобразования типов

Задания раздела 4.11.3
4.36. С учетом того, что i имеет тип int, а d - double, напишите выражение i*=d так, чтобы осуществлялось целочисленное умножение, а не с плавающей запятой.
4.37. Перепишите каждое из следующих приведений старого стиля так, чтобы использовался именованный оператор приведения.
int i; double d; const string *ps; char *pc; void *pv;
(a) pv=(void*)ps;
(b) i=int(*pc);
(c) pv=&d;
(d) pc=(char*)pv;
4.38. Объясните следующее выражение:
double slope=static_cast<double> (j/i);
Читать далее «Явные преобразования типов»

Преобразование типов

Задания раздела 4.11.1
4.34. C учетом определений переменных данного раздела объясните, какие преобразования имеют место в следующих выражениях:
(a) if (fval)
(b) dval=fval+ival;
(c) dval+ival*cval;
Помните, что возможно придется учитывать порядок операторов
4.35. С учетом определений
char cval;
int ival;
unsigned int ui;
float fval;
double dval;
укажите неявные преобразования типов, если таковые вообще имеются.
(a) cval='a'+3;
(b) fval=ui-ival*1.0;
(c) dval=ui*fval;
(d) cval=ival+fval+dval;
Читать далее «Преобразование типов»

Оператор запятая

Задания раздела 4.10
4.31. Программа этого раздела использовала префиксные операторы инкремента и декремента. Объясните, почему были использованы префиксные, а не постфиксные версии? Что следует изменить для использования постфиксных версий? Перепишите программу с использованием постфиксных операторов.
4.32. Объясните следующий цикл:
constexpr int size=5;
int ia[size]={1,2,3,4,5};
for (int *ptr=ia, ix=0; ix !=size&&ptr!=ia+size; ++ix; ++ptr) { /* ... */}
4.33. Используя таблицу раздела 4.12 (приоритет операторов в предыдущей теме), объясните, что делает следующее выражение:
someValue ? ++x, ++y : --x, --y
Читать далее «Оператор запятая»

Таблица приоритетов операторов

Осторожно, графоний. С телефона не открывать! 300kb операторов и приоритетов.
Читать далее «Таблица приоритетов операторов»

Оператор sizeof

Задания раздела 4.9
4.28. Напишите программу для вывода размера каждого из встроенных типов.
4.29. Предскажите вывод следующего кода и объясните свое рассуждение. Напишите и выполните соответствующую программу. Совпадает ли вывод с ожиданиями? Если нет, то почему?
int x[10];
int *p=x;
cout << sizeof(x)/sizeof(*x)<<endl;
cout << sizeof(p)/sizeof(*p)<<endl;
4.30. Используя таблицу из раздела 4.12 расставьте скобки в следующих выражениях так, чтобы продемонстрировать порядок его обработки:
(a) sizeof x+y
(b) sizeof p->mem[i]
(c) sizeof a<b
(d) sizeof f()
Читать далее «Оператор sizeof»

Побитовые операторы

Задания раздела 4.8
4.25. Каково значение выражения ~'q' << 6 на машине с 32-битовыми целыми числами и 8-битовыми символами, с учетом, что символ 'q' имеет битовое представление 01110001?
4.26. Что будет, если в приведенном выше примере оценки учеников использовать для переменной quiz1 тип unsigned int?
4.27. Каков результат каждого из этих выражений?
unsigned long long ull=3, ul2=7;
(a) ull&ul2
(b) ull | ul2
(c) ull && ul2
(d) ull || ul2
Читать далее «Побитовые операторы»