My-library.info
Все категории

M. УЭИТ - Язык Си - руководство для начинающих

На электронном книжном портале my-library.info можно читать бесплатно книги онлайн без регистрации, в том числе M. УЭИТ - Язык Си - руководство для начинающих. Жанр: Программирование издательство -, год 2004. В онлайн доступе вы получите полную версию книги с кратким содержанием для ознакомления, сможете читать аннотацию к книге (предисловие), увидеть рецензии тех, кто произведение уже прочитал и их экспертное мнение о прочитанном.
Кроме того, в библиотеке онлайн my-library.info вы найдете много новинок, которые заслуживают вашего внимания.

Название:
Язык Си - руководство для начинающих
Автор
Издательство:
-
ISBN:
-
Год:
-
Дата добавления:
17 сентябрь 2019
Количество просмотров:
433
Читать онлайн
M. УЭИТ - Язык Си - руководство для начинающих

M. УЭИТ - Язык Си - руководство для начинающих краткое содержание

M. УЭИТ - Язык Си - руководство для начинающих - описание и краткое содержание, автор M. УЭИТ, читайте бесплатно онлайн на сайте электронной библиотеки My-Library.Info
M. УЭИТ   С. ПРАТА    Д. МАРТИНЯзык Си — руководство для начинающих

Язык Си - руководство для начинающих читать онлайн бесплатно

Язык Си - руководство для начинающих - читать книгу онлайн бесплатно, автор 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 могут показаться похожими на определенные пользователем порядковые типы языка Паскаль. Действительно, сходство есть, но есть и существенные различия, поэтому, если вы знаете Паскаль, то нс придете к такому заключению.


M. УЭИТ читать все книги автора по порядку

M. УЭИТ - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки My-Library.Info.


Язык Си - руководство для начинающих отзывы

Отзывы читателей о книге Язык Си - руководство для начинающих, автор: M. УЭИТ. Читайте комментарии и мнения людей о произведении.

Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*
Все материалы на сайте размещаются его пользователями.
Администратор сайта не несёт ответственности за действия пользователей сайта..
Вы можете направить вашу жалобу на почту librarybook.ru@gmail.com или заполнить форму обратной связи.