Бьерн Страуструп - Язык программирования С++. Главы 2-4
Страница 49. Упражнения


 

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


 
« Предыдущая статья   Следующая статья »