Вторая важная особенность заключается в том, что мы используем заголовочный файл conio.h
. Этот файл содержит директивы #define, которые заменяют обычные функции ввода-вывода [такие, как getchar( )] на версии "пультового ввода-вывода", являющиеся не буферизованными. И в результате, если вы нажимаете, скажем, клавишу [а], немедленно звучит нота, и вам нe нужно нажимать клавишу [ввод]. Между прочим, эти функции не только не выполняют эхо-печать, но и не начинают автоматически новую строку. Поэтому мы вставили оператор printf( ) для эхо-печати вводимой переменной tempo и использовали символы \n и \r для перемещения курсора на новую строку и возврата его к левой сторонe экрана. Если вы хотите, чтобы символы, которые соответствуют нажимаемым клавишам, отображались одновременно на экране, вставьтев программу.
Хотя ввод не буферизован, клавиатура имеет свой собственный буфер. Это позволяет вам, если вы хотите, заранее набирать все требуемые символы. А ноты будут звучать в собственном устойчивом темпе. Вот, пример, начало мелодии "Радость мира"
Предоставляем вам возможность закончить эту мелодию.
ПРИЛОЖЕНИЕ И. РАСШИРЕНИЕ ЯЗЫКА СИ
Версия 7 ОС UNIX предоставляет два важных расширения языка Си. Первое заключается в том, что можно использовать саму структуру (а нe только адрес или элемент структуры) в качестве аргумента функции. Второе расширение позволяет использовать новую форму данных, называемую "перечислимый тип данных". Теперь рассмотрим эти расширения.
Структуры в качестве аргументов функции
В не расширенном языке Си можно передавать функции
Функция stats( )
будет иметь примерно такой заголовок:После вызова функции указатель name
будет ссылаться на структуру montana и функция будет использовать montana в своих манипуляциях.В расширенном языке Си мы можем применять имя самой структуры в качестве аргумента, и это приведет к созданию
Теперь функция stats( )
должна иметь несколько иной заголовок:На этот раз после вызова функции создается новая структурная переменная типа player
. Новая переменная получает название name, и каждый элемент name имеет такое же значение, как и соответствующий элемент структуры montana.Это расширение позволяет функции иметь свою "личную" копию структуры точно так же, как она обычно имеет свои копии стандартных переменных. Преимущество здесь то же, что и раньше: структуры не изменяются необъяснимо из-за непредвиденного побочного воздействия функции.
но на самом деле интерпретируют его как
В этом случае передается адрес, и функция работает с самой исходной структурной переменной, а не с ее копией.
Перечислимые типы
Ключевое слово enum
позволяет создавать новый тип и определять значения, которые он может иметь. Приведем пример:Первый оператор объявляет новый тип: spectrum
. Он перечисляет также возможные значения переменных типа spectrum: red, orange и т. д. Они являются константами типа spectrum так же, как 4 является константой типа int, a 'g' - константой типа char.Второй оператор объявляет color
переменной типа spectrum. Вы можете присвоить переменной color любую константу типа spectrum; например:На первый взгляд типы enum
могут показаться похожими на определенные пользователем порядковые типы языка Паскаль. Действительно, сходство есть, но есть и существенные различия, поэтому, если вы знаете Паскаль, то нс придете к такому заключению.Рассмотрим характер этих новых констант и операций, которые можно выполнять с использованием переменных типа
enum константы
Как компьютер запоминает что-нибудь подобное red
? Он может рассматривать это как символьную строку, но у нее нет кавычек. И действительно, red и другие enum константы запоминаются как целые числа. Например, попробуйте выполнитьи с учетом вышеуказанных описании вы получите такой результат: