Страница 49 из 68 3.5 Упражнения 1. (*1) Следующий цикл for перепишите с помощью оператора while:
for (i=0; i<max_length; i++) if (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
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() - сравнение строк. Какими должны быть типы параметров и результатов функций? Сравните их со стандартными версиями, имеющимися в <string.h> и в вашем руководстве. 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) так, чтобы она читала целую строку в буфер, а затем выдавала лексемы, читая по символу из буфера. 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) Исследуйте различные программы и выясните, какие способы выделения текста пробелами и какие комментарии используются.
|