3.5 Упражнения
1. (*1) Следующий цикл for перепишите с помощью оператора while:
for (i=0; iif (input_line[i] == '?') quest_count++;
Запишите цикл, используя в качестве его управляющей переменной указатель так, чтобы условие
имело вид *p=='?'.
2. (*1) Укажите порядок вычисления следующих выражений, задав полную скобочную структуру:
a = b + c * d << 2 & 8
a & 077 != 3
a == b || a == c && c < 5
c = x != 0
0 <= i < 7
f(1,2) + 3
a = - 1 + + b -- - 5
a = b == c ++
a = b = c = 0
a[4][2] *= * b ? c : * d * 2
a-b, c=d
Бьерн Страуструп.
Язык программирования С++
95
3. (*2)
Укажите 5 различных конструкций на С++, значение которых неопределено.
4. (*2)
Приведите 10 разных примеров непереносимых конструкций на С++.
5. (*1) Что произойдет при делении на нуль в вашей программе на С++? Что будет в случае
переполнения или потери значимости?
6. (*1) Укажите порядок вычисления следующих выражений, задав их полную скобочную структуру:
*p++
*--p
++a--
(int*)p->m
*p.m
*a[i]
7. (*2)
Напишите такие функции: strlen() - подсчет длины строки, strcpy() - копирование строк и strcmp()
- сравнение строк. Какими должны быть типы параметров и результатов функций? Сравните их со
стандартными версиями, имеющимися в и в вашем руководстве.
8. (*1) Выясните, как ваш транслятор отреагирует на такие ошибки:
void f(int a, int b)
{
if (a = 3) // ...
if (a&077 == 0) // ...
a := b+1;
}
Посмотрите, какова будет реакция на более простые ошибки.
9. (*2) Напишите функцию cat(), которая получает два параметра-строки и возвращает строку,
являющуюся их конкатенацией. Для результирующей строки используйте память, отведенную с
помощью new. Напишите функцию rev() для перевертывания строки, переданной ей в качестве
параметра. Это означает, что после вызова rev(p) последний символ p станет первым и т.д.
10. (*2) Что делает следующая функция?
void send(register* to, register* from, register count)
// Псевдоустройство. Все комментарии сознательно удалены
{
register
n=(count+7)/8;
switch (count%8) {
case 0: do { *to++ = *from++;
case 7: *to++ = *from++;
case 6: *to++ = *from++;
case 5: *to++ = *from++;
case 4: *to++ = *from++;
case 3: *to++ = *from++;
case 2: *to++ = *from++;
case 1: *to++ = *from++;
} while (--n>0);
}
}
Каков может быть смысл этой функции?
11. (*2) Напишите функцию atoi(), которая имеет параметр - строку цифр и возвращает
соответствующее ей целое. Например, atoi("123") равно 123. Измените функцию atoi() так, чтобы
она могла переводить в число последовательность цифр не только в десятичной, но и в
восьмеричной и шестнадцатеричной записи, принятой в С++. Добавьте возможность перевода
символьных констант С++. Напишите функцию itoa() для перевода целого значения в строковое
представление.
12. (*2) Перепишите функцию get_token() ($$3.12) так, чтобы она читала целую строку в буфер, а затем
Бьерн Страуструп.
Язык программирования С++
96
выдавала лексемы, читая по символу из буфера.
13. (*2) Введите в программу калькулятора из $$3.1 такие функции, как sqrt(), log() и sin(). Подсказка:
задайте предопределенные имена и вызывайте функции с помощью массива указателей на них. Не
забывайте проверять параметры, передаваемые этим функциям.
14. (*3) Введите в калькулятор возможность определять пользовательские функции. Подсказка:
определите функцию как последовательность операторов, будто бы заданную самим
пользователем. Эту последовательность можно хранить или как строку символов, или как список
лексем. Когда вызывается функция, надо выбирать и выполнять операции. Если пользовательские
функции могут иметь параметры, то придется придумать форму записи и для них.
15. (*1.5) Переделайте программу калькулятора, используя структуру symbol вместо статических
переменных name_string и number_value:
struct symbol {
token_value
tok;
union
{
double
number_value;
char*
name_string;
};
};
16. (*2.5) Напишите программу, которая удаляет все комментарии из программы на С++. Это значит,
надо читать символы из cin и удалять комментарии двух видов: // и /* */. Получившийся текст
запишите в cout. Не заботьтесь о красивом виде получившегося текста (это уже другая, более
сложная задача). Корректность программ неважна. Нужно учитывать возможность появления
символов //, /* и */ в комментариях, строках и символьных константах.
17. (*2) Исследуйте различные программы и выясните, какие способы выделения текста пробелами и
какие комментарии используются.
Бьерн Страуструп.
Язык программирования С++
97
Достарыңызбен бөлісу: |