- •Введение
- •Достоинства и недостатки языка c
- •Типы данных в с
- •Модификаторы
- •Константы
- •Арифметические операции
- •Логические операции
- •Оператор присваивания
- •Организация множественных выражений
- •Комбинированные операции
- •Локальные и глобальные объекты
- •Модификатор extern
- •Статические и динамические объекты
- •Регистровые переменные
- •Описание неизменяемых объектов
- •Указатели
- •Явное преобразование типа
- •Оператор if
- •Операторы циклов Оператор while
- •Оператор do ... While
- •Оператор for
- •Оператор switch (переключатель)
- •Операторы передачи управления
- •Прототипы функций
- •Передача данных в функцию
- •Структуры и определения типов пользователя
- •Битовые поля
- •Объединения
- •Псевдофункция sizeof
- •Основные директивы препроцессора
- •Основные директивы условной компиляции
- •Дополнительные данные по Turbo-c
- •Организация памяти на машинах класса pc. Виды указателей
- •Работа с указателями на функцию
- •Основные регистры общего назначения процессора
- •Модели памяти
- •Использование стека
- •Организация прерываний в программе. Модификатор volatile
- •Порядок передачи данных в функцию. Модификатор pascal
- •Передача данных в программу. Функция main
- •Разбор типовых ошибок и недочетов при программировании
- •Некоторые функции библиотеки Turbo-c
- •Функции работы с оперативной памятью эвм
- •Функции работы с клавиатурой
- •Работа с дисплеем в символьном режиме
- •Работа с дисплеем в графическом режиме
- •Функции работы с дисками
- •Функции работы с временными интервалами и звуком
- •Функции преобразования данных
- •Функции работы со строками
- •Математические функции
- •Функции работы с файлами и каталогами
- •Функции работы со временем и датой
- •Функции процессов
- •Функции работы с портами машины
- •Интерфейс с дос
- •Задачи на практические занятия
- •Литература
- •Оглавление
Некоторые функции библиотеки Turbo-c
В этом разделе будут представлены некоторые функции стандартной библиотеки Turbo-C. Представленного набора функций достаточно для начала самостоятельной работы и выполнения практических заданий.
Функции работы с оперативной памятью эвм
Эти функции позволяют занимать “взаймы” оперативную память у операционной системы в ходе выполнения задачи и возвращать ее операциооной системе после использования.
1. Отвести память. Прототипы функций:
void *malloc(unsigned size);
void far *farmalloc(unsigned long size);
Функции возвращают указатель на блок памяти длиной size байт. Если памяти недостаточно, то возвращается NULL (число ноль).
2. Освободить память. Прототипы функций:
voif free(void *block);
void farfree(void far *block);
Пример использования функций:
int *a;
. . .
/* получаем память на 5000 элементов типа int */
a=(int *)malloc(sizeof(int)*5000);
/* используем массив */
. . .
/* освобождаем память */
free(a);
. . .
Пример работы с массивом памяти длиной более 64 Кбт:
/* работа с массивом длиной более 64 Кбт */
#define sizett 120000
#include <stdio.h>
#include <alloc.h>
void main(void)
{
long huge *mass;
long i;
FILE *f;
/* отводим память */
mass=(long huge *)farmalloc(sizeof(long)*sizett);
if (mass==NULL) { printf("Not memory!\n"); return; }
/* заполняем массив числами, начиная с 1-цы */
for (i=0; i<sizett; i++) *(mass+i)=i+1L;
. . .
/* освобождаем память */
farfree((long far *)mass);
}
Функции работы с клавиатурой
1. Получение кода символа с клавиатуры без отражения. Прототип функции:
int getch(void);
Код символа находится в младшем байте принятого значения. Функция ждет нажатия клавиши, если она не была нажата.
2. Получение кода символа с клавиатуры с отражением. Прототип функции:
int getche(void);
Возвращаемое значение то же, что и для функции getch.
3. Проверка на нажатие клавиши. Прототип функции:
int kbhit(void);
Функция возвращает не ноль, если была нажата хоть одна клавиша.
4. Прием кода клавиши, нажатой на клавиатуре. Прототип функции:
int bioskey(int cmd);
Если cmd=0, то функция возвращает код клавиши, нажатой на клавиатуре и удаляет его из буфера клавиатуры. Если младший байт не ноль, то это и есть код символа. Если младший байт - ноль, то в старшем байте находится расширенный код.
Если cmd=1, то производится проверка клавиатуры на нажатую клавишу. Если возвращаемое значение ноль, то считывать нечего, в противном случае возвращается значение следующего символа без удаления из буфера клаватуры.
Использование данной функции предпочтительней использования функции типа getch, так как в случае нажатия расширенной клавиши (типа, например, функциональных клавиш F1-F10) данные функции принимают вначале код 0, затем расширенный код, а функция bioskey примет сразу расширенный код. Следует отметить, что при приеме обычного кода он располагается в младшем байте принимаемого значения, а в старшем байте может быть любое значение, и его следует игнорировать.
Работа с дисплеем в символьном режиме
В этом режиме весь экран разбит на позиции (как правило, 25 строк и 80 колонок), в которых располагаются изображения символов. Причем для каждой позиции существует информация о цвете символа и цвете фона, на котором изображен этот символ.
1. Установка цвета текста. Прототип функции:
void textcolor(int color);
Цвет может быть указан как числом, так и символической константой - это константа, определенная посредством директивы препроцессора #define.
Символическая константа |
Численное значение |
Цвет символа или фона |
Цвет |
BLACK |
0 |
оба |
черный |
BLUE |
1 |
оба |
синий |
GREEN |
2 |
оба |
зеленый |
CYAN |
3 |
оба |
морской волны |
RED |
4 |
оба |
красный |
MAGENTA |
5 |
оба |
малиновый |
BROWN |
6 |
оба |
коричневый |
LIGHTGRAY |
7 |
оба |
светлосерый |
DARKGRAY |
8 |
символа |
темносерый |
LIGHTBLUE |
9 |
символа |
голубой |
LIGHTGREEN |
10 |
символа |
яркозеленый |
LIGHTCYAN |
11 |
символа |
светлый морской волны |
LIGHTRED |
12 |
символа |
яркокрасный |
LIGHTMAGENTA |
13 |
символа |
светломалиновый |
YELLOW |
14 |
символа |
желтый |
WHITE |
15 |
символа |
белый |
BLINK |
128 |
символа |
мерцающий |
2. Установка цвета фона. Прототип функции:
void textbackground(int color);
3. Установка текстовых атрибутов. Прототип функции:
void textattr(int attribute);
Формат атрибута побитно:
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
бит мерцания |
цвет фона |
цвет текста |
4. Установка размера окна. Прототип функции:
void window(int left, int top, int right, int bottom);
Функция задает соответственно координаты левого верхнего и правого нижнего углов окна. При этом координата левого верхнего угла экрана - (1,1).
5. Очистка текстового окна. Прототип функции:
void clrscr(void);
Курсор устанавливается в позицию (1,1) в текущем текстовом окне (при его отсутствии оно считается открытым на весь экран) и окно закрашивается текущим цветом фона.
6. Перемещение курсора. Прототип функции:
void gotoxy(int x, int y);
Координаты устанавливаются в текущем текстовом окне.
7. Вывод данных в текстовом окне. Прототип функции:
int cprintf(const char *format[, аргумент, аргумент ...]);
Форматы используются те же, что для функции printf. Функция, как и printf, возвращает количество выведенных символов.
8. Ввод данных в текстовом окне. Прототип функции:
int cscanf(const char *format[, аргумент, аргумент ...]);
Форматы используются те же, что для функции scanf. Функция, как и scanf, возвращает количество введенных символов.
9. Копирование текста из окна в буфер. Прототип функции:
int gettext(int left, int top, int right, int bottom, void *destin);
Каждая позиция на экране занимает в памяти 2 байта (байт кода и байт атрибута). Функция возвращает 0, если ошибка, и 1, если операция закончилась успешно.
10. Копирование текста из буфера на экран. Прототип функции:
int puttext(int left, int top, int right, int bottom, void *source);
Каждая позиция на экране занимает в памяти 2 байта. Функция возвращает 0, если ошибка, и 1, если операция закончилась успешно.
11. Перенос содержимого прямоугольника экрана в другое место. Прототип функции:
int movetext(int left, int top, int right, int bottom, int newleft, int newtop);
Функция возвращает 0, если ошибка, и 1, если операция закончилась успешно.
12. Изменение яркости выводимых символов. Прототипы функций:
void highvideo(void); /* повышенная */
void lowvideo(void); /* пониженная */
void normvideo(void); /* нормальная */
13. Получение текущей позиции x и y курсора внутри окна. Прототипы соответствующих функций:
int wherex(void);
int wherey(void);
14. Перевод экрана в текстовый режим. Прототип функции:
void textmode(int mode);
Параметр mode:
Символическая константа |
Численное значение |
Описание |
LAST |
-1 |
предыдущий режим |
BW40 |
0 |
черно-белый, 40 колонок |
C40 |
1 |
цветной, 40 колонок |
BW80 |
2 |
черно-белый, 80 колонок |
C80 |
3 |
цветной, 80 колонок |
MONO |
7 |
монохромный, 80 колонок |
Пример работы с меню из трех пунктов с подписью в рамке перед рамкой с меню. Программа реагируем на стрелки вверх-вниз и прекращает работу при нажатии на клавишу Escape.
#include <dos.h>
#include <conio.h>
#include <bios.h>
/* --------------------------------------------------------- */
/* функции для удаления курсора с экрана и восстановления его
на прежнем месте */
union REGS RG;
int CB,CE,CS,CURB,CURE;
/* погасить курсор */
void curs_off(void)
{
RG.h.ah = 0xf;
int86(0x10,&RG,&RG);
CS = RG.h.bh;
RG.h.ah = 3;
int86(0x10,&RG,&RG);
CURB = RG.h.ch;
CURE = RG.h.cl;
CB = RG.h.dh;
CE = RG.h.dl;
RG.h.ah = 1;
RG.h.ch = 0x20;
int86(0x10,&RG,&RG);
return;
}
/* восстановить курсор */
void curs_on(void)
{
RG.h.ah = 1;
RG.h.ch = CURB;
RG.h.cl = CURE;
int86(0x10,&RG,&RG);
RG.h.ah = 2;
RG.h.dh = CB;
RG.h.dl = CE;
RG.h.bh = CS;
int86(0x10,&RG,&RG);
return;
}
/* --------------------------------------------------------- */
/* функция вывода окна */
void windowt(int lx, int ly, int rx, int ry,
int color_g, int color_s)
/* ------------------------------------------ */
/* описание параметров: */
/* lx,ly - координаты соответственно по x и y */
/* левой верхней границы окна */
/* rx,ry - координаты соответственно по x и y */
/* правой верхней границы окна */
/* color_g,color_s - цвета фона и символов */
/* ------------------------------------------ */
{
/* рисуем прямоугольник */
textattr(color_s+(color_g<<4));
window(lx,ly,rx,ry);
clrscr();
}
/* функция вывода окна с ограничивающей рамкой */
void windowr(int lx, int ly, int rx, int ry,
int color_g, int color_s)
/* ------------------------------------------ */
/* описание параметров: */
/* lx,ly - координаты соответственно по x и y */
/* левой верхней границы окна */
/* rx,ry - координаты соответственно по x и y */
/* правой верхней границы окна */
/* color_g,color_s - цвета фона и символов */
/* ------------------------------------------ */
{
char o1=201,o2=205,o3=187,o4=186,o5=200,o6=188;
int i,j;
/* рисуем прямоугольник */
textattr(color_s+(color_g<<4));
window(lx,ly,rx,ry);
clrscr();
/* верхняя строка рамки */
gotoxy(2,1); cprintf("%c",o1);
j=rx-lx-3;
for (i=0; i<j; i++) cprintf("%c",o2);
cprintf("%c",o3);
/* левая и правая линии */
j=ry-ly-1;
for (i=0; i<j; i++)
{ gotoxy(2,2+i); cprintf("%c",o4);
gotoxy(rx-lx,2+i); cprintf("%c",o4); }
/* нижняя строка */
gotoxy(2,ry-ly+1); cprintf("%c",o5);
j=rx-lx-3;
for (i=0; i<j; i++) cprintf("%c",o2);
cprintf("%c",o6);
}
/* начало программы */
void main(void)
{
int col1=BLACK, col2=BLUE, col3=LIGHTGRAY,
col4=CYAN, col5=BLACK,
col6=RED, col7=YELLOW;
/* col1 - общий цвет экрана */
/* col2 - цвет фона подписи меню */
/* col3 - цвет символов подписи меню */
/* col4 - цвет фона рамки меню и пассивного режима */
/* col5 - цвет символов рамки меню и пассивного режима */
/* col6 - цвет фона активного режима */
/* col7 - цвет символов активного режима */
char strp[]="Подпись меню";
char *pm[3]= {"Пункт меню 1",
"Пункт меню 2",
"Пункт меню 3"};
int nm=1; /* номер текущего активного пункта меню */
int nd; /* номер действия при работе с меню */
int i;
/* гасим курсор */
curs_off();
/* чистим экран */
textattr(col1<<4);
clrscr();
/* вывод рамки и подписи меню в центре рамки */
windowr(19,7,62,9,col2,col3);
for (i=0; strp[i]!=0; i++) ;
i=(40-i)/2+3;
gotoxy(i,2); cprintf("%s",strp);
/* выводим рамку меню */
windowr(19,12,62,20,col4,col5);
/* вывод начальной картинки меню */
for (i=0; i<3; i++)
{
if (nm==(i+1)) windowt(21,14+i*2,60,14+i*2,col6,col7);
else windowt(21,14+i*2,60,14+i*2,col4,col5);
gotoxy(12,1); cprintf("%s",pm[i]);
}
/* работаем с клавиатурой */
for (;;)
{
/* ждем нажатия клавиш стрелок вверх-вниз и Escape */
for (;;)
{
while (bioskey(1)==0) ; /* ждем нажатия клавиши */
i=bioskey(0); /* принимаем код клавиши */
if ((i&0xff)==27) { nd=0; break; } /* клавиша Escape */
if (i==(80<<8)) { nd=1; break; } /* клавиша вниз */
if (i==(72<<8)) { nd=2; break; } /* клавиша вверх */
}
/* если была нажата клавиша Escape */
if (nd==0) break;
/* если была нажата клавиша стрелок */
windowt(21,14+(nm-1)*2,60,14+(nm-1)*2,col4,col5);
gotoxy(12,1); cprintf("%s",pm[nm-1]);
if (nd==1) nm++; if (nm>3) nm=1;
if (nd==2) nm--; if (nm<1) nm=3;
windowt(21,14+(nm-1)*2,60,14+(nm-1)*2,col6,col7);
gotoxy(12,1); cprintf("%s",pm[nm-1]);
}
/* восстанавливаем курсор */
curs_on();
}