Работа с графикой в с++ и подпрограммы

Автор работы: Пользователь скрыл имя, 26 Сентября 2012 в 18:23, лекция

Краткое описание

Функции ввода/вывода с консольного терминала
Функции ввода/вывода для консоли используют специфические особенности IBM совместимого компьютера, такие как наличие специального видеоадаптера, и не являются переносимыми на другие типы компьютеров. Прототипы функций содержатся в файле conio.h. Консольные функции позволяют читать и записывать строки (cgets и cputs), форматированные данные (cscanf и cprintf) и отдельные символы. Функция kbhit определяет, было ли нажатие клавиши и позволяет определить наличие символов для ввода с клавиатуры до попытки чтения.

Вложенные файлы: 1 файл

Эти подпрограммы выводят текст на экран.doc

— 108.50 Кб (Скачать файл)

Эти подпрограммы выводят текст  на экран. 
 
clreol (conio.h)

gotoxy (conio.h) 
clrscr (conio.h)

highvideo (conio.h) 
delline (conio.h)

insline (conio.h) 
gettext (conio.h)

lowvideo (conio.h) 
gettextinvo(conio.h)

movetext (conio.h) 
normvideo (conio.h)

textcolor (conio.h) 
puttext (conio.h)

textmode (conio.h) 
necursortype (conio.h)

wherex (conio.h) 
textattr (conio.h)

wherey (conio.h) 
textbackground(conio.h)

window (conio.h)

 

 

conio.h (от англ. console input-output — консольный ввод-вывод) — заголовочный файл, используемый в старых компиляторах, работающих в операционных системах MS-DOS, для создания текстового интерфейса пользователя. Тем не менее, он не является частью языка программирования Си, стандартной библиотеки языка Си, ISO C или требуемой стандартом POSIX.

Этот заголовочный файл объявляет  несколько библиотечных функций  для работы с «консольным вводом и выводом» программы. Большинство компиляторов языка Си, предназначенных для DOS, Windows 3.x, Phar Lap, DOSX, OS/2 или Win32 имели этот файл и обеспечивали сопутствующие библиотечные функции в библиотеке Си по умолчанию. Большинство компиляторов языка Си, предназначенных для UNIX и Linux, не имеют этого файла и не обеспечивают сопутствующих библиотечных функций.

 [править] Члены-функции

int kbhit(void)

Определяет, было ли нажатие клавиш клавиатуры

int ungetch(int c)

Помещает символ c обратно в буфер клавиатуры.

int getch(void)

Считывает символ напрямую из консоли  без использования буфера и echo-вывода.

int getche(void)

Считывает символ напрямую из консоли без использования буфера, но с использованием echo-вывода.

int putch(int c)

Функция _putch выводит символ c в консоль  без буферизации. В случае успеха возвращает c. В противном случае возвращает EOF.

char *_cgets(char *buffer)

Считывает строку из консоли и хранит ее в массиве, указывающим на буфер. buffer[0], должен содержать максимальную длину (в символах) строки, то есть сколько символов нужно считать. Второй элемент массива buffer[1] указывает «где». _cgets хранит текущую длину строки. _cgets считывает символы до символа возврата, перевода строки или указанного максимума числа символов.

int _cprintf(const char *format, arg0,... argn)

Форматирование и вывод («печать») строки напрямую в консоль.

int _cputs(const char *string)

Вывод строки напрямую в консоль.

int _cscanf(char *format, arg0,... argn)

Считывание и форматирование данных напрямую из консоли.


 

 

 

 

8.9. Функции ввода/вывода  с консольного терминала 

Функции ввода/вывода для  консоли используют специфические  особенности IBM-совместимого компьютера, такие как наличие специального видеоадаптера, и не являются переносимыми на другие типы компьютеров. Прототипы функций содержатся в файле conio.h. Консольные функции позволяют читать и записывать строки (cgets и cputs), форматированные данные (cscanf и cprintf) и отдельные символы. Функция kbhit определяет, было ли нажатие клавиши и позволяет определить наличие символов для ввода с клавиатуры до попытки чтения.

Во-первых, существуют функции для работы с окном консоли, аналогичные библиотеке Crt Паскаля. В табл. 8.13 кратко перечислены основные из них. 

 

Таблица 8.13. Функции для работы с окном консоли

Функция

Краткое описание

window

void window(int left, int top, int right, int bottom); Устанавливает текущее окно консоли по указанным координатам

clrscr

void clrscr(void); очищает текущее окно

clreol

void clreol(void); очищает текущую строку окна от позиции курсора до конца

delline

void delline(void); удаляет строку окна, в которой установлен курсор

insline

void insline(void); вставляет пустую строку в позиции курсора

gotoxy

void gotoxy(int x, int y); перемещает курсор в указанные столбец (x) и строку (y) окна

textbackground

void textbackground(int newcolor); устанавливает указанный фоновый цвет окна. Цвета указываются номерами 0-15 или названиями, определенными в conio.h (BLUE, GREEN и т. д.)

textcolor

void textcolor(int newcolor); устанавливает указанный цвет вывода текста в окне. Цвета указываются аналогично функции textbackground

wherex

int wherex(void); возвращает номер столбца окна, в котором находится курсор

wherey

int wherey(void); возвращает номер строки окна, в которой находится курсор


 

 

Во-вторых, в файле conio.h описаны прототипы ряда специфичных для Си функций (см. табл. 8.14). 

 

Таблица 8.14. Функции ввода/вывода для консоли

Функция

Краткое описание

Cgets

char *cgets(char *str); чтение строки  с консоли до комбинации CR/LF или достижения максимально возможного числа символов.  Если cgets читает комбинацию CR/LF, она заменяет ее на нулевой байт перед сохранением строки. Перед вызовом функции str[0] должен быть установлен в максимально возможное число символов для чтения. В случае успеха str[1] содержит реально прочитанное число символов, возвращается указатель на str[2]. При чтении комбинации CR/LF она заменяется нулевым байтом. Нулевой байт добавляется в конец строки. Таким образом, длина буфера должна быть не меньше str[0]+2 байт.

cprintf

int cprintf(const char *format[, argument, ...]); запись данных на консольный терминал по формату. Требования к строке формата и последующим аргументам аналогичны функции fprintf. Не переводит '\n' (символ LF) в пару символов '\r\n' (CR/LF). В случае успеха вернет число выведенных символов, в случае ошибки - EOF.

Cputs

int cputs(const char *str); вывод строки в текущее окно консольного терминала, определенное по умолчанию или функцией window. Не добавляет символов новой строки.

Getch

int getch(void); чтение символа  с консоли. Символ не отображается  на экране (нет эхо-печати). Вернет код символа.

getche

int getche(void); чтение символа с консоли с эхо-печатью. Вернет код символа.

Kbhit

int kbhit(void); проверка нажатия  клавиши на консоли. Пример:

while (!kbhit())  

 /*до нажатия клавиши */ ;

cprintf("\r\nНажата клавиша...");

Putch

int putch(int c); Вывод символа  на консольный терминал. Не переводит '\n' (символ LF) в пару символов '\r\n' (CR/LF). В случае успеха вернет символ, в случае ошибки - EOF

ungetch

int ungetch(int ch); возврат последнего  прочитанного символа с консольного  символа обратно с тем, чтобы  он стал следующим символом для чтения. Ограничения те же, что для ungetc.


Приведенный ниже пример демонстрирует чтение строки с помощью  функции cgets.

char buffer[83];

char *p;

/* Место для 80 символов + нулевого байта */

buffer[0] = 81;

printf("Введите строку:");

p = cgets(buffer);

printf("\ncgets прочитала %d \    

       символов:\"%s\"\n", buffer[1], p);

printf("Возвращен указатель %p, \     

 buffer[0] содержит %p\n", p, &buffer);

В следующем примере  строка текста печатается в центре стандартного окна консоли.

#include <conio.h>

int main(void){   

clrscr();   

gotoxy(35, 12);   

textcolor (RED);   

cprintf("Hello world");   

getch();   

 return 0;

}                                   

Наконец, приведенный далее код  демонстрирует обработку нажатий  клавиш для консольного терминала.

#include <stdio.h>

#include <conio.h>

int main(void) { 

int ch; 

do { 

ch=getch(); 

if (ch=='\0') { //расширенный код  

 ch=getch();  

switch (ch) {   

case 72: printf ("\nUp");    break;   

case 80: printf ("\nDown");  break;   

 case 75: printf ("\nLeft");  break;   

case 77: printf ("\nRight"); break;   

default: printf      

 ("\nExtended key %2d",ch); break;  

else {  

switch (ch) {   

case 13: printf ("\nEnter"); break;   

case 27: printf ("\nEsc"); break;   

default: printf ("\nKey %4d",ch);    

 break;  

 } 

} while (ch!=27);

 

 

 

8.10. Работа  с каталогами файловой системы

Прототипы функций, описанных  в табл. 8.15, содержатся в стандартном заголовочном файле dir.h. Не все функции описаны в стандарте языка Си, но обычно все они предоставляются комилятором.  

 

Таблица 8.15. Функции для работы с каталогами

Функция

Краткое описание

Chdir

int chdir(const char *path); изменение текущего каталога, заданного полным или относительным путем path. Возвращает 0 в случае успеха, -1 в случае ошибки

Getcwd

char *getcwd(char *buf, int buflen); получить имя текущего рабочего каталога. В случае успеха buf!=NULL. Ограничения, такие как MAXPATH (макс. длина пути к каталогу) определены в <dir.h>. Аналог - int getcurdir (int drive, char *directory); Диск по умолчанию кодируется как 0, 1 обозначает диск A: и т. д.

Mkdir

int mkdir(const char *path); пытается создать новый каталог, заданный полным или относительным путем path. В случае успеха вернет 0, иначе -1

Rmdir

int rmdir(const char *path); удаление каталога, заданного путем path. В случае успеха вернет 0, иначе -1

Findfirst

int findfirst(const char *pathname, struct ffblk *ffblk, int attrib); начинает поиск файла по шаблону имени pathname. для работы с поиском определен структурный тип ffblk:

struct ffblk { 

long ff_reserved; 

long ff_fsize; //размер файла 

unsigned long ff_attrib;//атрибуты  

unsigned short ff_ftime; //время 

unsigned short ff_fdate; // дата 

char ff_name[256]; //найденное имя

};

Атрибуты  определены в библиотеке dos.h:

FA_RDONLY Read-only

FA_HIDDEN Hidden

FA_SYSTEM System

FA_LABEL  Volume label

FA_DIREC  Directory

FA_ARCH   Archive

Поле ff_ftime определяет время следующим образом: биты от 0 до 4 обозначают секунды, деленные на 2, биты 5-10 - минуты, биты 11-15 - часы.

Поле ff_fdate определяет дату следующим образом: биты 0-4 обозначают день месяца, биты 5-8 - номер месяца, биты 9-15 - год с 1980 (например, 9 означает 1989). В случае успеха вернет 0, иначе -1

Findnext

int findnext(struct ffblk *ffblk); продолжает поиск файла по ранее указанному для findfirst шаблону имени

Fnmerge

void fnmerge(char *path, const char *drive, const char *dir, const char *name, const char *ext); создает полное имя файла из отдельных компонент

Fnsplit

int fnsplit(const char *path, char *drive, char *dir, char *name, char *ext); разбивает полное имя файла на отдельные компоненты. Вернет целое число, биты которого показывают наличие отдельных компонент

Getdisk

int getdisk(void); возвращает  номер текущего диска. 0 обозначает диск A:, 1 - B: и т. д.

searchpath

char *searchpath(const char *file); выполняет поиск файла в каталогах, перечисленных в системной переменной PATH. Если файл найден, вернет полный путь к нему в статическом буфере (обновляется при каждом вызове функции)

setdisk

int setdisk(int drive); задает текущее дисковое устройство. Диски обозначаются как для getdisk. Возвращает общее число дисков, доступных в системе


Приведенный далее пример формирует листинг из всех файлов текущего каталога.

#include <stdio.h>

#include <dos.h>

#include <dir.h>

int main(void) {  

struct ffblk ffblk;  

int done;  

printf("Directory listing of *.*\n");  

done = findfirst("*.*",&ffblk,    

FA_ARCH|FA_DIREC);  

 while (!done) {   

unsigned t=ffblk.ff_ftime;   

char s=(t&0x001F)<<1, m=(t&0x07E0)>>5,     

h=(t&0xF800)>>11;   

t=ffblk.ff_fdate;   

char d=(t&0x001F), mon=(t&0x01E0)>>5;   

int y=(t&0xFE00)>>9;       

printf("%s %15ld \

%02d/%02d/%4d,%02d:%02d:%02d\n",     

ffblk.ff_name,ffblk.ff_fsize,    

d,mon,y+1980,h,m,s);   

 done = findnext(&ffblk);  

 } 

getchar(); return 0;

}

В следующем примере  иллюстрируется работа с функцией fnsplit.

#include <stdlib.h>

#include <stdio.h>

#include <dir.h>   

char *s;   

char drive[MAXDRIVE];   

char dir[MAXDIR];   

char file[MAXFILE];   

char ext[MAXEXT];   

int flags;   

s=getenv("COMSPEC");    

flags=fnsplit(s,drive,dir,file,ext);   

printf("Command processor info:\n");    

if(flags & DRIVE)      

printf("\tdrive: %s\n",drive);   

if(flags & DIRECTORY)      

printf("\tdirectory: %s\n",dir);    

if(flags & FILENAME)      

printf("\tfile: %s\n",file);   

if(flags & EXTENSION)      

printf("\textension: %s\n",ext);  

 

8.11.  Операции над файлами

В табл. 8.16 описаны основные стандартные функции, служащие для работы с файлами. В левом столбце таблицы под именем функции указаны имена библиотечных файлов, содержащих прототипы.  

 

Таблица 8.16. Функции для работы с файлами

Функция

Краткое описание

access

<io.h>

int access(const char *filename, int amode); определение прав доступа к файлу. Допустимы значений amode=06 (проверка на чтение и запись), 04 (чтение),  02 (запись), 01 (выполнение), 00 (проверка на существование файла)

chmod

<io.h>

int chmod(const char *path, int amode); изменение прав доступа к файлу. Допустимые значения amode определены в sys\stat.h: S_IWRITE (разрешение на запись), S_IREAD (на чтение), S_IREAD | S_IWRITE           (то и другое). Вернет 0 в случае успеха, -1 при ошибке

mktemp

<dir.h>

char *_mktemp(char *template); генерация  уникального имени файла. Пример:

char *fname = "TXXXXXX", *ptr;

ptr = mktemp(fname);

remove

<stdio.h>

int remove(const char *filename); удаление файла. Вернет 0 в случае успеха, -1 при ошибке

rename

<stdio.h>

int rename(const char *oldname, const char *newname); переименование файла из oldname в newname. Вернет 0 в случае успеха, -1 при ошибке


 

 

 

Лабораторная работа №8 - Программирование в текстовом режиме

Лабораторная работа №8. Программирование в текстовом режиме 
 
(Библиотека conio.h) 
Функции ввода/вывода с консоли 
 
Функции работы с текстами выполняются в любом (из пяти возможных) текстовом режиме; выбор режима зависит от типа видеоадаптера и монитора. Текстовый режим определяется вызовом textmode. 
 
Вывод текста и манипуляция с ним 
Запись и чтение текста: 
cprintf посылает форматированный вывод на экран 
cputs посылает строку на экран 
putch посылает один символ на экран 
getche читает символ и отображает его на экране 
 
Манипулирование текстом (и курсором) на экране: 
clrscr очищает текстовое окно 
clreol очищает строку с позиции курсора 
delline удаляет строку, на которой находится курсор 
gotoxy устанавливает курсор 
insline вставляет пустую строку под строкой, содержащей курсор 
movetext копирует текст с одного места экрана на другое 
 
Пересылка блоков текста в (из) память(и): 
gettext копирует блок текста с экрана в память 
puttext копирует блок текста из памяти на экран. 
 
Программы вывода текста на экран предусматривают использование по умолчанию полноэкранных окон, так что вы можете писать, читать и манипулировать текстом без какой-либо предварительной установки режима. Текст пишется сразу на экран функциями консольного вывода cprintf, cputs и putch, а для отображения вводимого символа (эхо) используется функция getche. Текст укладывается внутрь окна следующим образом: если текст заходит за правую границу окна, то соответствующий отрезок текста переносится на начало следующей строки. 
Когда текст находится на экране, вы можете: стереть его (т. е. очистить активное окно) - clrscr, уничтожить часть строки - clreol, удалить строку целиком - delline, вставить пустую строку - insline. Последние три функции действуют в соответствии с положением курсора; вы можете передвигать курсор к определенному месту при помощи функции gotoxy. Вы также можете скопировать целый блок текста из одного прямоугольного участка окна в другой командой movetext. 
Перенос прямоугольного блока текста с экрана в память вызывается функцией gettext, а обратная пересылка на экран (в любое желаемое место) выполняется функцией puttext. 
Управление режимами и окнами 
textmode установка экрана в текстовый режим 
window задание окна в текстовом режиме 
Экран может быть установлен в один из нескольких текстовых режимов с помощью textmode (ограничения связаны только с типами адаптера и монитора вашей системы). Эта функция устанавливает полноэкранное текстовое окно в заданный режим и очищает его. 
Когда установлен текстовый режим, вы можете работать с полным экраном или с его частью - окном, которое ограничивает программный вывод. Окно создается вызывом функции window, определяющей, какую область экрана займет окно. 

Управление атрибутами

 
Установка цвета символов и цвета фона: 
textcolor устанавливает цвет текста (атрибут) 
textbackground устанавливает цвет фона (атрибут) 
textattr устанавливает цвет символа и цвет фона (атрибуты) одновременно. 
Изменение интенсивности: 
highvideo устанавливает повышенную интенсивность текста 
lowvideo устанавливает пониженную интенсивность текста 
normvideo устанавливает нормальную интенсивность текста 
 
Функции управления атрибутами устанавливают текущий атрибут, который задается 8-битным значением: четыре младших бита управляют цветом текста, следующие три определяют цвет фона, а самый старший бит является признаком мигания. 
После установки дальнейший текст будет выводиться в соответствии с текущими атрибутами. С помощью функций управления атрибутами вы можете устанавливать цвет символа и цвет фона раздельно (textcolor и textbackground) или одновременно вызовом textattr с заданной комбинацией цветов. Также может быть указан признак мигания символа. Большинство цветных мониторов в цветовых режимах правильно передают цвета. Нецветные мониторы могут переводить цветное изображение в нецветное или создавать различные визуальные эффекты: жирный шрифт, подчеркивание, инверсное отображение и т. д. 
Вы можете поменять изображение высокой интенсивности на низкую вызовом lowvideo (выключает бит высокой интенсивности для символов) или, наоборот, поменять изображение низкой интенсивности на высокую вызовом highvideo (включает бит высокой интенсивности). Оперируя интенсивностью символа, вы можете вернуться к исходному уровню с помощью normvideo. 
 
Запрос состояния 
gettextinfo заполняет структуру text_info информацией о текущем текстовом окне 
wherex сообщает x координату ячейки с курсором 
wherey сообщает y координату ячейки с курсором 
 
Текстовые окна 
 
По умолчанию текстовое окно занимает весь экран. Вы можете изменить его, сократив вызовом функции window. Текстовые окна могут включать до 25 строк (максимальное количество строк экрана для всех текстовых режимов) и до 40 или 80 колонок (в зависимости от установленного текстового режима). 
Отсчет координат текстового окна Турбо Си ведется от верхнего левого угла. Координаты текстового окна в левом верхнем углу - (1,1); координаты правого нижнего угла (при 80-символьном полноэкранном текстовом окне) - (80,25). 
 
Тип text_modes 
Вы можете перевести ваш монитор в один из пяти текстовых режимов, вызвав функцию textmode. Перечислимый тип text_modes, определенный в CONIO.H, дает возможность использовать символические имена для установки аргумента mode в функции textmode, взамен "сухого" номера режима. Конечно, если вы используете символичес кие константы, то должны включить #include conio.h в текст вашей программы. 
 
Числовые и символьные значения, определенные text_modes, следующие: 
 
LASTMODE -1 Предыдущий текстовый режим 
BW40 0 Черно-белый, 40 колонок 
C40 1 16-цветный, 40 колонок 
BW80 2 Черно-белый, 80 колонок 
C80 3 16-цветный, 80 колонок 
MONO 7 Монохромный, 80 колонок 
 

Информация о работе Работа с графикой в с++ и подпрограммы