- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Язык Си - руководство для начинающих - M. УЭИТ
Шрифт:
Интервал:
Закладка:
Ниже показана такая функция целиком:
/* tone(freq, time) -- устанавливает звук заданной частоты и продолжительности */
#define TIMERMODE 182 /* код установки таймера в нужный режим */
#define FREQSCALE 119000L /* базовая частота в герцах */
#define TIMESCALE 1230L /* число отсчетов времени в 0,1 с */
#define T_MODEPORT 67 /* порт управляет режимом работы таймера */
#define FREQPORT 66 /* порт регулирует частоту звука*/
#define BEEPPORT 97 /* порт управляет громкоговорителем */
#define ON 97 /* сигнал включения громкоговорителя */
tone(freq, time)
int freq, time;
{
int hibyt, lobyt, port;
long i, count, divisor;
divisor = FREQSCALE/freq; /* масштабирование частоты в единицах таймера */
lobyt = divisor % 256; /* разбивает целое */
hibyt = divisor / 256; /* на два байта */
count = TIMESCALE * time; /* преобразует время в единицы таймера */
outp(T_MODEPORT, TIMERMODE); /* подготавливает таймер к вводу */
outp(FREQPORT, lobyt); /* устанавливает младший байт регистра таймера */
outp(FREQPORT, hibyt); /* устанавливает старший байт регистра таймера */
port = inp(BEEPPORT); /* запоминает состояние порта */
outp(BEEPPORT, ON) /* включает громкоговоритель */
for(i = 0, i < count; i++)
; /* отметка задержки */
outp(BEEPPORT, port); /* выключает Громкоговоритель, восстанавливает состояние */
Мы определяем TIMESCALE в директиве #define как целое тип long, потому что вычисление TIMESCALE * time будет выполняться для типа long, а не int. Иначе результат, если он больше 32767 будет усекаться перед занесением в count.
Использование функции tоnе( )
Наша функция tone( ) в значительной степени дублирует действие оператора SOUND языка Бейсик для компьютера IBM PC Здесь мы используем ее для создания довольно ограниченной ( 8 нот, одна октава) клавиатуры, в которой используются 8 клавишей, начиная с А, для воспроизведения нот. Ниже приведена соответствующая программа, а также некоторые пояснения к ней.
/* простая музыкальная клавиатура */
#include <conio.h> /* использует небуфсризованный ввод-вывод */
#include <ctype.h>
#define С 262 /* определяет частоты */
#define D 294
#define E 330
#define F 349
#define G 392
#define А 440
#define В 494
#define C2 524
main( )
{
int key, freq, tempo, time;
puts(" Введите, пожалуйста, основной темп: 10 = 1 с.");
scanf(" %d", &tempo);
printf(" %d n r", tempo); /* эхо-ввод */
puts(" Спасибо. Используйте клавиши а - k для воспроизведения нот.nr");
puts(" Клавиша переключения регистра удваивает продолжительность звучания.
Символ ! прекращает работу.");
while((key = getchar( )) != '!')
{ time = isupper(key)? 2 * tempo : tempo;
key = tolower(key);
switch (key) {
case 'a' : tone(C, time);
break;
case 's' : tone(D, time);
break;
case 'd' : tone(E, time);
break;
case 'f' : tone(E, time);
break;
case 'g' : tone(G, time);
break;
case 'h' : tone(A, time);
break;
case 'j' : tone(B, time);
break;
case 'k' : tone(C2, time);
break;
default : break; }
}
рuts("До свидания!nr");
} }
Главной особенностью созданной программы является оператор switch, который присваивает разные звуки восьми клавишам от А до К. Кроме того, программа удваивает продолжительность звучания ноты, если вы используете верхний регистр. Эта продолжительность (time) устанавливается перед оператором switch, затем верхний регистр переключается на нижний, чтобы сократить число необходимых меток.
Вторая важная особенность заключается в том, что мы используем заголовочный файл conio.h. Этот файл содержит директивы #define, которые заменяют обычные функции ввода-вывода [такие, как getchar( )] на версии "пультового ввода-вывода", являющиеся не буферизованными. И в результате, если вы нажимаете, скажем, клавишу [а], немедленно звучит нота, и вам нe нужно нажимать клавишу [ввод]. Между прочим, эти функции не только не выполняют эхо-печать, но и не начинают автоматически новую строку. Поэтому мы вставили оператор printf( ) для эхо-печати вводимой переменной tempo и использовали символы n и r для перемещения курсора на новую строку и возврата его к левой сторонe экрана. Если вы хотите, чтобы символы, которые соответствуют нажимаемым клавишам, отображались одновременно на экране, вставьте
putchar(key);
в программу.
Хотя ввод не буферизован, клавиатура имеет свой собственный буфер. Это позволяет вам, если вы хотите, заранее набирать все требуемые символы. А ноты будут звучать в собственном устойчивом темпе. Вот, пример, начало мелодии "Радость мира"
KjhGfdsA
Предоставляем вам возможность закончить эту мелодию.
ПРИЛОЖЕНИЕ И. РАСШИРЕНИЕ ЯЗЫКА СИ
Версия 7 ОС UNIX предоставляет два важных расширения языка Си. Первое заключается в том, что можно использовать саму структуру (а нe только адрес или элемент структуры) в качестве аргумента функции. Второе расширение позволяет использовать новую форму данных, называемую "перечислимый тип данных". Теперь рассмотрим эти расширения.
Структуры в качестве аргументов функции
В не расширенном языке Си можно передавать функции адрес структуры. Например, если montana является структурной переменной структурного типа player, мы можем обратиться к функции следующим образом:
stats(&montana);
Функция stats( ) будет иметь примерно такой заголовок:
stat(name) struct player * name;
После вызова функции указатель name будет ссылаться на структуру montana и функция будет использовать montana в своих манипуляциях.
В расширенном языке Си мы можем применять имя самой структуры в качестве аргумента, и это приведет к созданию копии исходной структуры в составе вызванной функции. Например, обращение к той или иной функции может выглядеть примерно так:
stats(montana);
Теперь функция stats( ) должна иметь несколько иной заголовок:
stats(name) struct player name;
На этот раз после вызова функции создается новая структурная переменная типа player. Новая переменная получает название name, и каждый элемент name имеет такое же значение, как и соответствующий элемент структуры montana.
Это расширение позволяет функции иметь свою "личную" копию структуры точно так же, как она обычно имеет свои копии стандартных переменных. Преимущество здесь то же, что и раньше: структуры не изменяются необъяснимо из-за непредвиденного побочного воздействия функции.
Будьте осторожны: Некоторые компиляторы допускают обращение вида
stats(montana);
но на самом деле интерпретируют его как
stats(&montana);
В этом случае передается адрес, и функция работает с самой исходной структурной переменной, а не с ее копией.
Перечислимые типы
Ключевое слово enum позволяет создавать новый тип и определять значения, которые он может иметь. Приведем пример:
enum spectrum (red, orange, yellow, green, blue, violet);
enum spectrum color;
Первый оператор объявляет новый тип: spectrum. Он перечисляет также возможные значения переменных типа spectrum: red, orange и т. д. Они являются константами типа spectrum так же, как 4 является константой типа int, a 'g' - константой типа char.
Второй оператор объявляет color переменной типа spectrum. Вы можете присвоить переменной color любую константу типа spectrum; например:
color = green;
На первый взгляд типы enum могут показаться похожими на определенные пользователем порядковые типы языка Паскаль. Действительно, сходство есть, но есть и существенные различия, поэтому, если вы знаете Паскаль, то нс придете к такому заключению.

