Бьерн Страуструп. Язык программирования С++ Второе дополненное издание



Pdf көрінісі
бет80/256
Дата11.07.2022
өлшемі2,87 Mb.
#37591
1   ...   76   77   78   79   80   81   82   83   ...   256
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 


Достарыңызбен бөлісу:
1   ...   76   77   78   79   80   81   82   83   ...   256




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет