Элементы Языка СИ
РАБОТА С УКАЗАТЕЛЯМИ И ДИНАМИЧЕСКОЙ ПАМЯТЬЮ • Указатель – это переменная, в которой хранится адрес другой переменной или участка памяти. • int i, *pin; • Операция получения адреса переменной & • pin=&i; /* переменной pin присваивается адрес переменной i. */
Пример
Пример
Указатели • указатель – это переменная, в которой записан адрес другой переменной; • при объявлении указателя надо указать тип переменных, на которых он будет указывать, а перед именем поставить знак *; • знак & перед именем переменной обозначает ее адрес; • знак * перед указателем в рабочей части программы (не в объявлении) обозначает значение ячейки, на которую указывает указатель; • нельзя записывать по указателю, который указывает непонятно куда – это вызывает сбой программы, поскольку что-то стирается в памяти; • для обозначения недействительного указателя используется константа NULL; p. C = NULL; • при изменении значения указателя на n он в самом деле сдвигается к nому следующему числу данного типа, то есть для указателей на целые числа на n*sizeof(int) байт; • указатель печатаются по формату %p.
Операция косвенной адресации * • Когда за знаком * следует указатель на переменную, результатом операции является величина, помещенная в ячейку с указанным адресом.
Операция присвоения указателей • Указателю можно присвоить значение указателя того же типа или типа void. В последнем случае требуется использовать приведение к типу. Указателю на тип void может быть присвоен указатель любого типа. Тогда также требуется использовать приведение к типу. int *ip, *pin, nurse; void *pv; double *pd; pin=&nurse; ip=pin; pv=( void *) ip; pd=(double*) pv; /* В итоге, указатель на double ссылается на то же место, что и указатель на int. */
Массивы и указатели
Динамическое выделение памяти Для запроса памяти, чтобы размещать переменные в языке Си можно использовать две стандартные функции malloc() и calloc(). Аргументом функции malloc() является количество запрашиваемой памяти в байтах. Функция возвращает значение адреса начала выделенной области памяти, если выделение памяти произошло успешно, и NULL – если произошла ошибка. Аргументами функции calloc() являются две целые неотрицательные величины: размер блока памяти в байтах size и количество запрашиваемых блоков памяти n. Функция возвращает значение адреса начала выделенной области памяти, если выделение памяти произошло успешно, и NULL – если произошла ошибка. Для освобождения запрошенной памяти используется функция free().
Пример
Пример
Оператор выделения памяти new нельзя использовать оператор new при отрицательном или нулевом N;
Файлы • Текстовый файл – файл, содержащий текст, разбитый на строки парой специальных кодов: «возврат каретки» (0 x 13) и «перевод строки» (0 x 10). Если файл открыт в текстовом режиме, то при чтении из такого файла комбинация этих кодов преобразуется в один символ’n’ — переход к новой строке. При записи в файл осуществляется обратное преобразование. • Бинарный файл – файл, из которого байты считываются и выводятся в первоначальном виде без каких-либо преобразований. Если требуется указать на такой файл, то к параметру добавляется буква b. Например: rb, или wb, или r+b. В некоторых компиляторах текстовый режим обмена обозначается буквой t, т. е. записывается r+t или rt.
Функции чтения из файла и записи в файл: fputс(переменная типа char, указатель на файл) – посимвольная запись данных в файл fgetc(указатель на файл) – посимвольное чтение из файла fputs(переменная типа строка, указатель на файл) – построчная запись данных в файл. Записывает в файл строку, но в конце не добавляет символ окончания строки. fgets(переменная типа строка, длина, указатель на файл) – построчное чтение данных из файла. Читает строку целиком до символа новой строки, если ее длина не превышает значения параметра «длина» минус один символ. Параметр «длина» является целым числом или целочисленной переменной, указывающей максимально возможное количество символов в строке fprintf(указатель на файл, строка формата, список переменных) – форматированный вывод символов, строк или чисел в файл fwrite(указатель на буфер хранения данных, размер элемента, количество элементов, указатель на файл) – запись заданного количества блоков данных определѐнной длины из буфера в файл fscanf(указатель на файл, строка формата, список переменных) – форматированный ввод символов строк или чисел из файла. fread(указатель на буфер размещения данных, размер элемента, количество элементов, указатель на файл) – чтение блоков данных заданного размера в указанном количестве из файла в буфер. feof(указатель на файл) – функция определяет, достигнут ли конец файла. Если текущая позиция является концом файла (EOF), то функция возвращает ненулевое значение, в противном случае возвращается 0. fflush(указатель на файл) – принудительная очистка буфера вывода путем передачи содержимого на ВЗУ remove(имя файла) – удаляет файл. Функция remove() возвращает 0, если файл успешно удален rename(старое имя, новое имя) – переименовывает файл или директорию, указанную в параметре «старое имя» , и присваивает имя, указанное в параметре «новое имя» . Также может применяться для перемещения файла. fseek(указатель на файл, количество байт, начало отсчѐта) -- устанавливает указатель текущей позиции в файле. Количество байт отсчитывается от значения параметра «начало отсчета» , оно определяет новое значение указателя текущей позиции, а начало отсчѐта - это один из следующих макросов: начало файла (SEEK_SET), текущая позиция (SEEK_CUR), конец файла (SEEK_END). Обычно данная функция применяется только для бинарых файлов.
Пример • В программе создать текстовый файл ft, содержащий n случайных целых чисел. Считать числа из ft, подсчитать среднее значение всех чисел и записать в бинарный файл fd все числа меньше этого среднего значения.
Пример
Построение графика функции • Табулирование функции • Поиск максимального значения и расчет коэффициентов масштабирования • Линейная интерполяция значений • Вывод и оцифровка осей
Использование библиотеки BGI (Borland Graphic Interface ) Состоит: 79 графических процедур и функций; констант и типов данных; набор драйверов; набор шрифтов. Компьютерная графика 18
Группы функций и процедур: -Инициализации графики; -Вывод примитивов; -Вывод текста; -Работа с видеопамятью; -Управление выводом графики. Компьютерная графика 19
Инициализации графики Подключение заголовочного файла #include <graphics. h> И графической библиотеки GRAPHICS. LIB Вызов функций void initgraph(int far *graphdriver, int far * graphmode, char far pathtodriver) Компьютерная графика 20
Каталог с графическими драйверами и шрифтами Компьютерная графика 21
Графические драйвера Константа Значение Current. Driver -128 Detect 0 CGA 1 MCGA 2 EGA 3 EGA 64 4 EGAMono 5 IBM 8514 6 Herc. Mono 7 ATT 400 8 VGA 9 PC 3270 10 Компьютерная графика 22
Графические режимы для каждого драйвера Константа Значение Режим Константа Значение CGAC 0 0 320*200 EGALo 0 640*200 CGAC 1 320*200 EGAHi 1 640*350 CGAC 2 2 320*200 CGAC 3 3 320*200 EGA 64 Lo 0 640*200 CGAHi 4 640*200 EGA 64 Hi 1 640*350 MCGA 0 0 320*200 ATT 400 C 0 0 320*200 MCGAC 1 1 320*200 ATT 400 C 1 1 320*200 MCGAC 2 2 320*200 ATT 400 C 2 2 320*200 MCGAC 3 3 320*200 ATT 400 C 3 3 320*200 MCGAMed 4 640*200 ATT 400 Med 4 640*200 MCGAHi 5 640*480 ATT 400 Hi 5 640*400 EGAMono. Hi 3 640*350 IBM 8514 Lo 0 640*480 Herc. Mono. Hi 0 720*348 IBM 8514 Hi 1 1024*768 VGALo 0 640*200 PC 3270 Hi 0 720*350 VGAMed 1 640*350 VGAHi 2 640*480 Компьютерная графика Режим 23
Пример инициализации графического режима: Компьютерная графика 24
Использование видеостраниц Компьютерная графика 25
Использование не стандартного драйвера driver=installuserdriver('svga 256', svga 256); mode=1; initgraph(driver, mode, ”c: \BC\BGI\svga 256. bgi”; Компьютерная графика 26
Вывод простейших фигур В библиотеке вывод точки осуществляется процедурой putpixel(x, y, c); putpixel (320, 240, 4); или putpixel (320, 240, Red); Вывод линии line(x 1, y 1, x 2, y 2); В Line нет параметра для установки цвета. В этом случае цвет задается процедурой setcolor(c); Пример: setcolor(Gyan); line(1, 1, 600, 1); lineto(x, y) linerel(dx, dy) Компьютерная графика 27
Компьютерная графика 28
Значение параметров setlinestyle(a, b, c) Константа Значение( a) Описание Solid. Ln 0 Непрерывная линия Dotted. Ln 1 Линия из точек Center. Ln 2 Линия из точек и тире Dashed. Ln 3 Штриховая линия User. Bit. Ln 4 Тип пользователя Константа Значен ие(c) Описание Norm. Width 1 Нормальная толщина (1 пиксель) Thick. Width 3 Жирная линия (3 пикселя) Компьютерная графика 29
-Построение прямоугольников -Rectangle(x 1, y 1, x 2, y 2: integer), где x 1, y 1– координаты левого верхнего угла, x 2, y 2 - координаты правого нижнего угла прямоугольника. Область внутри прямоугольника не закрашена и совпадает по цвету с фоном. -Bar(x 1, y 1, x 2, y 2: integer), которая рисует закрашенный прямоугольник. Цвет закраски устанавливается с помощью Set. Fill. Style - Bar 3 D(x 1, y 1, x 2, y 2, d: integer, a: boolean) вычерчивает трехмерный закрашенный прямоугольник (параллелепипед). При этом используются тип и цвет закраски, установленные с помощью Set. Fill. Style. Параметр d представляет собой число пикселей, задающих глубину трехмерного контура. Чаще всего значение равно четверти ширины прямоугольника (d: =(x 2 - x 1) div 4). Параметр a определяет, строить над прямоугольником вершину (а: =True) или нет (a: =False). Примеры использования: 1. Set. Color(Green); Rectangle (200, 100, 250, 300); 2. Set. Fill. Style(1, 3); Bar(10, 50, 100); 3. Set. Fill. Style(1, 3); Bar 3 D(10, 50, 10, True); Построение многоугольников Draw. Poly( a: word, var Poly. Points) Параметр Poly. Points является нетипизированным параметром, который содержит координаты каждого пересечения в многоугольнике. Параметр а задает число координат в Poly. Points. Компьютерная графика 30
Процедура вычерчивания окружности текущим цветом имеет следующий формат: Cicrle (x, y, r: word), Set. Color(Light. Green); Circle(450, 100, 50); Дуги можно вычертить с помощью процедуры Arc(x, y: integer, a, b, R: integer), где x, y - центр окружности, a, b - начальный и конечный углы в градусах, R – радиус. Для задания углов используется полярная система координат. Цвет для вычерчивания устанавливается процедурой Set. Color. В случае a=0 и b=360, вычерчивается полная окружность. Например, выведем дугу красного цвета от 0 до 90° в уже вычерченной с помощью Circle(450, 100, 50) окружности: Set. Color(Red); Arc(450, 100, 0, 90, 50); Для построения эллиптических дуг предназначена процедура Ellipse (x, y: integer, a, b, Rx, Ry: integer), где x, y – центр эллипса, Rx, Ry: горизонтальная и вертикальная оси. В случае a=0 и b=360 вычерчивается полный эллипс. Например, построим голубой эллипс: Set. Color (9); Ellipse (100, 0, 360, 50); Фон внутри эллипса совпадает с фоном экрана. Чтобы создать закрашенный эллипс, используется специальная процедура Fill. Ellipse (x, y: integer, Rx, Ry: integer). Закраска эллипса осуществляется с помощью процедуры Set. Fill. Style(a, b: word), где а – стиль закраски , b – цвет закраски Например, нарисуем ярко-красный эллипс, заполненный редкими точками зеленого цвета: Set. Fill. Style (Wide. Dot. Fill, Green); { установка стиля заполнения} Set. Color (12); {цвет вычерчивания эллипса} Fill. Ellipse(300, 150, 50); Компьютерная графика 31
Стандартные стили заполнения Значение Маска Empty. Fill 0 Заполнение цветом фона Solid. Fill 1 Заполнение текущим цветом Line. Fill 2 Заполнение символами --, цвет – color Ltslash. Fill 3 Заполнение символами // нормальной толщины, цвет – color Slash. Fill 4 Заполнение символами // удвоенной толщины, цвет – color Bkslash. Fill 5 Заполнение символами \ удвоенной толщины, цвет – color Ltbk. Slah. Fill 6 Заполнение символами \ нормальной толщины, цвет – color Hatch. Fill 7 Заполнение вертикально-горизонтальной штриховкой тонкими линиями, цвет – color Xhatch. Fill 8 Заполнение штриховкой крест-накрест по диагонали «редкими» тонкими линиями, цвет – color Inter. Leave. Fill 9 Заполнение штриховкой крест-накрест по диагонали «частыми» тонкими линиями, цвет – color Wide. Dot. Fill 10 Заполнение «редкими» точками Close. Dot. Fill 11 Заполнение «частыми» точками User. Fill 12 Заполнение по определенной пользователем Компьютерная графика заполнения, цвет – color маске 32 Константа
Работа с текстом -Процедура Out. Text(Textst: string) выводит строку текста, начиная с текущего положения указателя. Например, Out. Text(‘нажмите любую клавишу’); Недостаток этой процедуры – нельзя указать произвольную точку начала вывода. В этом случае удобнее пользоваться процедурой Out. Text. XY (x, y: integer, Textst: string), где x, y – координаты точки начала вывода текста, Textst – константа или переменная типа String. Например, Out. Text. XY(60, 100, ‘Нажмите любую клавишу’) Компьютерная графика 33
Компьютерная графика 34
Шрифты: Вывод текста в графическом режиме может осуществляться различными стандартными и пользовательскими шрифтами. Различают два типа шрифтов: растровые и векторные. Растровый шрифт задается матрицей точек, а векторный – рядом векторов, составляющих символ. По умолчанию после инициализации графического режима устанавливается растровый шрифт Default. Font, который, как правило, является шрифтом, используемым драйвером клавиатуры. Установить нужный шрифт можно процедурой Set. Text. Style(Font, d, c: word), где Font – выбранный шрифт, d – направление (горизонтальное или вертикальное), с – размер выводимых символов (1 -10, 8 х8) Стандартные шрифты Шрифт Файл Triplex. Font Trip. chr Small. Font Litt. chr Sans. Serif. Font Sans. chr Gothic. Font Goth. chr Компьютерная графика 35
Пример: -settextstyle(0, 1); outtextxy(200, ” Вертикальная строка ”); settextstyle(0, 0, 2); outtextxy(200, 220, ‘”Горизонтальная строка”); Компьютерная графика 36
Выравнивание текста В некоторых случаях требуется в пределах одной строки выводить символы выше или ниже друга. Выравнивание текста выполняется с помощью settextjustify(Horiz, Vert) как по вертикали, так и по горизонтали посредством задания параметров Horiz и Vert (возможные значения в таблице 6). Параметры выравнивания Параметр Значение Комментарий Горизонтальное выравнивание Left. Text 0 Выровнять влево Center. Text 1 Центрировать Right. Text 2 Выровнять вправо Вертикальное выравнивание Bottom. Text 0 Переместить вниз Center. Text 1 Центрировать Top. Text 2 Переместить вверх Компьютерная графика 37
Построение с использованием генератора случайных чисел Пример1. Нарисовать в случайном месте экрана точку случайного цвета Фрагмент программы: randomize() x=random(640); y=random(480); c=random(15); putpixel(x, y, c); Пример2. Нарисовать 5000 точек случайного цвета в случайном месте. Фрагмент программы: for (i=1; i<=5000; i++) { x=random(640); y=random(480); c=random(15); putpixel(x, y, c); } Компьютерная графика 38
Создание иллюзии движения Способ 1. Имитация движения объекта на экране за счет многократного выполнения программой набора действий: нарисовать – пауза – стереть (нарисовать в том же месте цветом фона) – изменить координаты положения рисунка. Способ 2. Иллюзия движения создается при помощи специальных функций. Функция imagesize (x 1, y 1, x 2, y 2) getimage (x 1, y 1, x 2, y 2, Buf) Buf - специальная переменная, куда будет помещена копия видеопамяти с фрагментом изображения. Buf должна быть не меньше значения, возвращаемого функцией Image. Size с теми же координатами. putimage (x 1, y 1, x 2, y 2, Buf, Mode) выводит в заданное место экрана копию фрагмента изображения, ранее помещенную в память процедурой getimage. X, Y – координаты левого верхнего угла того места на экране, куда будет скопирован фрагмент изображения; Buf - специальная переменная, откуда берется изображение, Mode – способ копирования. Параметр Mode определяет способ взаимодействия размещаемой с уже имеющимся на экране изображением Компьютерная графика 39
Создание иллюзии движения Способ 3. Использование процедуры setwritemode(XORPut): Компьютерная графика 40
Константа Normal. Put Xor. Put Or. Put And. Put Not. Put Значение Операция Пояснения 0 Замена существующего на копию Стирает часть экрана и на это место помещает копию 1 Исключительное или Рисует сохраненный образ или стирает ранее нарисованный, сохраняя фон 2 Объединительное или Накладывает сохраненный образ на существующий Логическое и Объединяет сохраненный образ и уже существующий на экране Инверсия изображения То же самое, что и 0, только копия выводится в инверсном виде 3 4 Компьютерная графика 41
Общего назначения • cleardivice -Очищает экран и устанавливает текущий указатель в начало • setviewport(x 1, y 1, x 2, y 2, Clip)- устанавливает текущее окно для графического вывода • clearviewport - Очищает окно • setcolor(a); • setbkcolor(a); • moveto(x, y); • moverel(x, y); • getbkcolor getx gety getpixel Компьютерная графика 42