Упражнения

  1. (*1) Перепишите следующий оператор for в виде эквивалентного оператора while:
2. for (i=0; im3. *p.m4. *a[i]
  1. (*2) Напишите функции: strlen(), которая возвращает длину строки, strcpy(), которая копирует одну строку в другую, и strcmp(), которая сравнивает две строки. Разберитесь, какие должны быть типы параметров и типы возвращаемых значений, а потом сравните их со стандартными версиями, которые описаны в и в вашем руководстве.
  2. (*1) Посмотрите, как ваш компилятор реагирует на ошибки:
9. a:= b+1;10. if (a = 3) //...11. if (a&077 == 0) //...

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

  1. (*2) Напишите функцию cat(), получающую два строковых параметра и возвращающую строку, которая является конкатенацией параметров. Используйте new, чтобы найти память для результата. Напишите функцию rev(), которая получает строку и переставляет в ней символы в обратном порядке. То есть, после вызова rev(p) последний символ p становится первым.
  2. (*2) Что делает следующая программа?
14. void send(register* to, register* from, register count)15. // Полезные комментарии несомненно уничтожены.16. {17. register n=(count+7)/8;18. switch (count%8) {19. case 0: do { *to++ = *from++;20. case 7: do { *to++ = *from++;21. case 6: do { *to++ = *from++;22. case 5: do { *to++ = *from++;23. case 4: do { *to++ = *from++;24. case 3: do { *to++ = *from++;25. case 2: do { *to++ = *from++;26. case 1: do { *to++ = *from++;27. while (--n>0);28. }29. }

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

  1. (*2) Напишите функцию atoi(), которая получает строку, содержащую цифры, и возвращает соответствующее int. Например, atoi("123") - это 123. Модифицируйте atoi() так, чтобы помимо обычной десятичной она обрабатывала еще восьмеричную и шестнадцатиричную записи C++. Модифицируйте atoi() так, чтобы обрабатывать запись символьной константы. Напишите функцию itoa(), которая строит представление целого параметра в виде строки.
  2. (*2) Перепишите get_token() (#3.1.2), чтобы она за один раз читала строку в буфер, а затем составляла лексемы, читая символы из буфера.
  3. (*2) Добавьте в настольный калькулятор из #3.1 такие функции, как sqrt(), log() и sin(). Подсказка: предопределите имена и вызывайте функции с помощью вектора указателей на функции. Не забывайте проверять параметры в вызове функции.
  4. (*3) Дайте пользователю возможность определять функции в настольном калькуляторе. Подсказка: определяйте функции как последовательность действий, прямо так, как их набрал пользователь. Такую последовательность можно хранить или как символьную строку, или как список лексем. После этого, когда функция вызывается, читайте и выполняйте эти действия. Если вы хотите, чтобы пользовательская функция получала параметры, вы должны придумать форму записи этого.
  5. (*1.5) Преобразуйте настольный калькулятор так, чтобы вместо статических переменных name_string и number_value использовалась структура символа symbol:
35. struct symbol {36. token_value tok;37. union {38. double number_value;39. char* name_string;40. };41. };
  1. (*2.5) Напишите программу, которая выбрасывает комментарии из C++ программы. То есть, читает из cin, удаляет // и /* */ комментарии и пишет результат в cout. Не заботьтесь о приятном виде выходного текста (это могло бы быть другим, более сложным упражнением). Не беспокойтесь о правильности программ. Остерегайтесь // и /* и */ внутри комментариев, строк и символьных констант.
  2. (*2) Посмотрите какие-нибудь программы, чтобы понять принцип различных стилей комментирования и выравнивания, которые используются на практике.

*1 Нам неизвестен русскоязычный термин, эквивалентный английскому indentation. Иногда это называется отступами. (прим. перев.)

*2 игра слов: "for" - "forever" (навсегда). (прим. перев.)

* 3В языке немного лучше этого с этими исключениями тоже надо бы справляться. (прим. автора)

* 4знака этой операции. (прим. перев.)

* 5Следовало бы переводить как "инкремент" и "декремент", однако мы следовали терминологии, принятой в переводной литературе по C, поскольку эти операции унаследованы от C. (прим. перев.)


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: