- •Директивы препроцессора
- •Определяющие директивы Символические константы
- •Void main(void)
- •Void main(void)
- •Void main(void)
- •Void main(void)
- •Void main(void)
- •Void main(void)
- •Void main(void)
- •Void main(void)
- •Void main(void)
- •Void main(void)
- •Void main(void)
- •Void main(void)
- •Void main(void)
- •Void main(void)
- •Void main(void)
- •Void main(void)
Void main(void)
{ long i,port;
port=inportb(97); /* эапоминает состояние порта */
printf("%d\n",port);
outportb(97,79); /* включает громкоговоритель */
for(i=0;i<90000;i++); /* отметка эадержки времени */
outportb(97,port); /* Выключает громкоговоритель, */
}
/* Следующая функция tone(freq,time) позволяет извлекать звук определенной частоты freq (гц) и продолжительности time ( в десятых долях секунды). Продолжительность звука обеспечивается задержкой во времени, необходимой для выполнения цикла for. Частота звука устанавливается с помощью другого устройстватаймера. Таймер вырабатывает базовую частоту 1190000гц, которая не может быть воспринята человеком. Однако, мы можем послать на регистр таймера число для деления (divisor) для получения частоты freq = 1190000/divisor. Для этого используется еще два порта:
-
посылаем значение 182 через порт 67 для установки таймера в режим для приема делителя;
2. делитель посылается через порт 66 двумя приемами по 8 бит: сначала младший байт, затем старший.
Пример 2.
#define TIMERMODE 182 /* код установки таймера в нужный режим */
#define FREQSCALE 1190000L /* баэовая частота в герцах */
#define TIMESCALE 1230L /* число отсчетов времени в 0,1 сек */
#define T_MODEPORT 67 /*порт устанавливает режим работы таймера*/
#define FREQPORT 66 /* порт регулирует частоту эвука */
#define BEEPPORT 97 /* громкоговоритель */
void tone(int freq,int time)
{ int hibyt,lobyt,port;
long i,count,divisor;
divisor=FREQSCALE /freq; /* масштабирование частоты */
lobyt=divisor %256; /* раэбивает целое */
hibyt=divisor /256; /* на 2 байта */
count=TIMESCALE *time; /*преобразует время в единицы таймера*/
outportb(T_MODEPORT,TIMERMODE); /*подготавливает таймер*/
outportb(FREQPORT,lobyt); /* устанавливает младший байт */
outportb(FREQPORT,hibyt); /* устанавливает старший байт */
port=inportb(BEEPPORT); /* эапоминает состояние порта */
outportb(BEEPPORT,port|3); /* включает громкоговоритель */
for(i=0;i<count;i++); /* отметка эадержки времени */
outportb(BEEPPORT,port); /* Выключает громкоговоритель, */
/* восстанавливает состояние */
}
ЗАДАНИЕ
Используя функцию tone, написать программу, которая по-воляла бы использовать клавиатуру (часть ее) в качестве музыкального инструмента. Для примера воспроизвести мелодию, явно или отдаленно напоминающую широко известные произведения. Функцию и программу main поместить в разные файлы. Для получения загрузочного модуля создать файл проекта. Соответствие частоты (гц) нотам первой и второй октавы:
Нота 1 октава 2 октава
до 262 523
ре 294 597
ми 330 659
фа 349 698
соль 392 784
ля 440 880
си 494 988
/*ТЕМА ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ СТУДЕНТОВ: СТРУКТУРЫ
(STRUCT)
ЦЕЛЬ РАБОТЫ
Изучить материал и продемонстрировать умение работать со структурами в том числе:
1. описать шаблон структуры (в том числе вложенные структуры, структуры, содержащие объединение);
2. уметь объявить структурную переменную, массив структур, указатель на структуру, массив указателей на структуру;
3. уметь обращаться к полям структуры через имя структуры, указатель на структуру, элемент массива структур;
4. максимально просто копировать поля одной структуры в другую (пример 1);
5. максимально быстро осуществлять ввод (вывод) одной и более структур из файла (в файл) и хранить информацию в файле с минимальными затратами места на диске (функции fread, fwrite или read, write);
6. уметь передать структуру в функцию через параметры функции и, возможно, передать структуру в качестве результата;
7. уметь отсортировать массив структур, используя функцию qsort.
ПРИ НАПИСАНИИ ПРОГРАММЫ
1. Взять за основу программу оконного интерфейса.
2. Исходить из принципа модульного программирования:
2.1. отдельные функции должны быть написаны в соответствии с основными принципами построения функции (каждая функция решает только одну задачу, исходные данные передаются через параметры, результат всегда передается в вызывающую функцию);
2.2. разбить весь текст на раздел описаний и раздел реализаций. Раздел описаний (файл с расширением *.h) содержит заголовочные файлы, макроопределения, описания внешних переменных, прототипы собственных функций. Раздел реализаций (один или несколько файлов с расширением *.с) содержит тексты самих функций. Сборку программы производить с помощью файла проекта (пункт меню Project в BC или TC), на стадии отладки можно подключать файлы с помощью соответствующей директивы препоцессора.
3. Написать по тексту комментарии, особенно в файле описаний.
ПРИ ЗАЩИТЕ РАБОТЫ
1. Уметь выполнить программу.
2. Изложить узловые моменты и особенности алгоритма.
3. Дать объяснение любому оператору программы по требованию преподавателя.
СТРУКТУРЫ
Успех программы часто зависит от удачного выбора способа представления данных. С помощью структур возможно моделировать сложные объекты, возникающие при решении задач. Структуры представляют средство для доступа к записям, которые содержат поля одного или нескольких типов.
Для использования структуры необходимо:
1. установить шаблон для структуры
2. объявить переменную, соответствующую этому шаблону
3. осуществить доступ к компонентам структуры.
Шаблон структуры
Шаблон - это схема, описывающая содержание структуры.Установка структурного шаблона телефонный справочник:
struct sprav {
char fio[20];
long num;
};
Данный шаблон описывает структуру с именем типа структуры sprav, состоящую из двух компонентов: строки fio и целой переменной num типа long. Имя типа структуры sprav необязательно и используется для ссылки на эту структуру. Компоненты структуры - данные любого типа, включая и другие структуры. Имя внутри структуры может быть таким же, как имя объекта вне структуры. Если шаблон описан внутри функции - он доступен только этой функции, если шаблон описан вне функции - он доступен любой
функции программы. Установка шаблона не вызывает никаких действий в программе.
Структурные переменные
Объявление структурных переменных приводит к выделению памяти для компонент структуры, куда можно записать данные или откуда можно прочитать их. Для объявления структурных переменных имеются несколько способов.
1. Установить структурный шаблон:
struct sprav {
char fio[20];
long num;
};
Объявить простую переменную, массив структур, указатель на структуру: struct sprav tel1, tel2[5], *tel3;
2. Установить структурный шаблон с помощью макроопределения:
#define SPRAV struct sprav
SPRAV {
char fio[20];
long num;
};
Объявить переменные:
SPRAV sp1, sp2[6], *sp3;
3. Объявить переменные одновременно с установкой шаблона (если на данную структуру вы больше не ссылаетесь):
struct {
char fio[20];
long num;
} tel1, tel2[3], *tel3;
4. Ввести новый тип данных (TEL)-структура определенного вида:
typedef struct {
char fio[20];
long num;
} TEL;
Объявить переменные нового типа:
TEL tel1, tel2[6], *tel3;
Если программа достаточно объемна, представляется более удобным четвертый способ.
Инициализация структуры
Инициализировать можно только внешние или статические структуры.
static struct {
char fio[20];
long num;
} tel[2]={
"Иванов Ф.А.", 456756,
"Петров В.П.", 632345
};
Доступ к компонентам структуры
Доступ к компонентам структуры продемонстрируем с помощью примеров.
Пример 1.
/* Обращение к элементам структуры через имя переменной */
#include <stdio.h>
#include <conio.h>
