Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КРАТКИЙ ОБЗОР С.doc
Скачиваний:
1
Добавлен:
26.10.2018
Размер:
2.11 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) Исследуйте различные программы и выясните, какие способы       выделения текста пробелами и какие комментарии используются.