Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С++ Страуструп.doc
Скачиваний:
4
Добавлен:
18.04.2019
Размер:
2.72 Mб
Скачать

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) Исследуйте различные программы и выясните, какие способы

выделения текста пробелами и какие комментарии используются.

* ГЛАВА 4

Итерация присуща человеку,

а рекурсия - богу.

- Л. Дойч

Все нетривиальные программы состоят из нескольких раздельно

транслируемых единиц, по традиции называемых файлами. В этой главе

описано, как раздельно транслируемые функции могут вызывать друг друга,

каким образом они могут иметь общие данные, и как добиться

непротиворечивости типов, используемых в разных файлах программы.

Подробно обсуждаются функции, в том числе:

передача параметров, перегрузка имени функции,

стандартные значения параметров, указатели на функции и, естественно,

описания и определения функций. В конце главы обсуждаются

макровозможности языка.

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