Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C.doc
Скачиваний:
29
Добавлен:
08.05.2015
Размер:
1.17 Mб
Скачать

Некоторые функции библиотеки 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();

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]