Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
c++book1.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
2 Мб
Скачать
☆

3.5 Упражнения

1. (*1) Перепишите следующий оператор for в виде

эквивалентного оператора while:

for (i=0; i<max_length; i++)

if (input_line[i] == '?') quest_count++;

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) Найдите пять различных конструкций С++, значение которых неопределено.

4. (*2) Найдите десять различных примеров непереносимой С++ программы.

5. (*1) Что происходит в вашей системе, если вы делите на ноль? Что происходит при переполнении и потере значимости?

6. (*1) Полностью расставьте скобки в следующих выраже­ниях:

*p++

*--p

++a--

(int*)p->m

*p.m

*a[i]

7. (*2) Напишите функции: strlen(), которая возвращает длину строки, strcpy(), которая копирует одну строку в дру­гую, и strcmp(), которая сравнивает две строки. Разберитесь, какие должны быть типы параметров и типы возвращаемых значе­ний, а потом сравните их со стандартными версиями, которые описаны в <string.h> и в вашем руководстве.

8. (*1) Посмотрите, как ваш компилятор реагирует на ошибки:

a := b+1;

if (a = 3) // ...

if (a&077 == 0) // ...

Придумайте ошибки попроще, и посмотрите, как компилятор на них реагирует.

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: do (* *to++ = *from++;

case 6: do (* *to++ = *from++;

case 5: do (* *to++ = *from++;

case 4: do (* *to++ = *from++;

case 3: do (* *to++ = *from++;

case 2: do (* *to++ = *from++;

case 1: do (* *to++ = *from++;

while (--n>0);

*)

*)

Зачем кто-то мог написать нечто похожее?

11. (*2) Напишите функцию atoi(), которая получает стро­ку, содержащую цифры, и возвращает соответствующее int. Нап­ример, atoi("123") - это 123. Модифицируйте atoi() так, чтобы помимо обычной десятичной она обрабатывала еще восьмеричную и шестнадцатиричную записи С++. Модифицируйте atoi() так, чтобы обрабатывать запись символьной константы. Напишите функцию itoa(), которая строит представление целого параметра в виде строки.

12. (*2) Перепишите get_token() (#3.1.2), чтобы она за один раз читала строку в буфер, а затем составляла лексемы, читая символы из буфера.

13. (*2) Добавьте в настольный калькулятор из #3.1 такие функции, как sqrt(), log() и sin(). Подсказка: предопределите имена и вызывайте функции с помощью вектора указателей на функции. Не забывайте проверять параметры в вызове функции.

14. (*3) Дайте пользователю возможность определять функ­ции в настольном калькуляторе. Подсказка: определяйте функции как последовательность действий, прямо так, как их набрал пользователь. Такую последовательность можно хранить или как символьную строку, или как список лексем. После этого, когда функция вызывается, читайте и выполняйте эти действия. Если вы хотите, чтобы пользовательская функция получала параметры, вы должны придумать форму записи этого.

15. (*1.5) Преобразуйте настольный калькулятор так, что­бы вместо статических переменных name_string и number_value использовалась структура символа symbol:

struct symbol (*

token_value tok;

union (*

double number_value;

char* name_string;

*);

*);

16. (*2.5) Напишите программу, которая выбрасывает ком­ментарии из С++ программы. То есть, читает из cin, удаляет // и /* */ комментарии и пишет результат в cout. Не заботьтесь о приятном виде выходного текста (это могло бы быть другим, бо­лее сложным упражнением). Не беспокойтесь о правильности программ. Остерегайтесь // и /* и */ внутри комментариев, строк и символьных констант.

17. (*2) Посмотрите какие-нибудь программы, чтобы понять принцип различных стилей комментирования и выравнивания, ко­торые используются на практике.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]