Приклад. ofstream Flags( textl .dat, ios::app, ios::noreplace);
ofstream Flags( textl .dat, ios::app, ios::noreplace);
можна дописати до кінця вже існуючого файлу textl.dat потрібну інформацію. Якщо ж оголосити потік Flags так:
ofstream Rags("text1 .dat", ios::noreplace);
і спробувати щось записати у файл, то жодних дій не відбудеться, оскільки ознака ios::noreplace забороняє змінювати існуючий файл.
Проте якщо цю ознаку застосувати до нового файлу, якого ще немає на диску, наприклад, записати ofstream Flags("text3.dat", ios::noreplace);
то буде створено файл text3.dat, в який можна буде заносити дані.
Якщо потік оголосити так:
ofstream Flags("text4.dat", ios::nocreate);
то можливі два варіанти. Якщо файл text4.dat вже існує, то він може бути відкритий для записування даних. Якщо ж раніше такого файлу на диску не було, то в кращому випадку у файл нічого не запишеться, а в гіршому - програма зависне.
5. Перевірка помилок виконання файлових операцій
Stream-бібліотека C++ включає набір основних функцій, які контролюють стан помилки потокової операції. Ці функції включають наступні:
- Функція good() повертає ненульове значення, якщо при виконанні потокової операції не виникає помилки. Оголошення функції good: int good();
- Функція fail() повертає ненульове значення, якщо при виконанні потокової операції виникає помилка. Оголошення функції fail: int fail();
- Операція ! застосовується до екземпляра потоку для визначення стану помилки.
Приклад. В приведеному нижче фрагменті програми у разі помилки при відкритті файлу на екран видається повідомлення і програма завершує роботу за допомогою бібліотечної функції "exit()" :
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
int main()
{
ifstream in_stream;
in_stream.open( "Lecture_4.txt" );
if ( in_stream.fail() )
{
cout << "даруйте, відкрити файл не вдалося!\n";
exit(1);
}
...
Тема. Графічний режим в мові С++. Функції для графічних побудов.
План.
1. Графічний режим.
2. Завантаження графічного драйвера.
3. Функції для графічних побудов.
1. Графічний режим.
Графічний екран дисплея складається з точок, які можна засвічувати певним кольором чи гасити, у результаті чого на екрані утворюється деяке зображення. Точки називаються пікселями. Кількість точок на екрані може бути різною. Це залежить від характеристик і налаштування монітора. Розглянемо екран, який має 640 точок у горизонтальному (х) напрямку і 480 у вертикальному (у). Відлік точок ведуть з лівого верхнього кута екрана. Кожна точка характеризується двома координатами (х, у). Приклади розташування деяких точок на екрані показані на рис. 1.
Визначити кількість точок уздовж осей ОХ та OY можна відповідно за допомогою команд getmaxx () і getmaxy ().
Програми, що виконують графічні побудови, переважно є лінійними і складаються з викликів стандартних графічних функцій, які описані у бібліотечному файлі graphics.h.
Для того, щоб створити зображення, спочатку треба задати графічний режим. Це можна виконати так:
// Для опису характеристик дисплея
int gdriver = DETECT, gmode, errorcode;
// Задання графічного режиму
initgraph(&gdriver, &gmode, ");
errorcode = graph res ult();
if (errorcode != grOk)
{
cout << " графічний режим задати не вдалося. \n";
cout << "Помилка: " << grapherrormsg(errorcode);
cout << "\n Для виходу натисніть на будь-яку клавішу";
getch();
exit(1);}
2. Завантаження графічного драйвера.
Серед функцій настройки графічного режиму слід виділити наступні:
void far detectgraph(int far *gdriver, int far *gmode);
void far initgraph(int far *gdriver, int far *gmode,
char far *pathdriver).
Функція detectgraphпризначена для визначення типу графічного адаптера. Ця функція повертає значення по адресах, вказаних першим і другим параметрами. Тут gdriver - покажчик на ціле число, що містить номер графічного драйвера. Наприклад, для CGA цей номер буде рівний 1, для EGA - 3, для VGA - 9, для Hercules - 7. Можна надавати значення за допомогою констант, описаних в graphics.h, як CGA = 1, EGA = 3, HERCMONO = 7 і VGA = 9. Другим параметром функції detectgraph буде покажчик на ціле число, що містить номер графічного режиму, що забезпечує максимальну роздільну здатність екрану. Якщо немає графічного адаптера, то функція detectgraph привласнює *gdriver = -2.
Функція initgraph призначена для завантаження графічного драйвера, що має номер *gdriver, і для установки графічного режиму номер *gmode. Якщо за адресою gdriver записаний нуль (*gdriver=detect), то функція спочатку звертається до функції detectgraph, а потім завантажує драйвер, номер якого був встановлений функцією detectgraph. (При цьому встановлюється найбільший з можливих номерів режимів.) Необхідна пам'ять для завантаження драйвера надається в "купі". Залежно від графічного режиму максимальна роздільна здатність екрану рівна
для адаптера CGA: CGACi=i (i=0,1,2,3) - 320x200; CGAHI=4 – 640x200;
для адаптера EGA : EGALO=0 - 640x200, EGAHI=1 - 640x350;
для адаптера VGA : VGALO=0 - 640x200, VGAMED=1 - 640x350, VGAHI=2 - 640x480.
Для вивантаження графічного драйвера застосовується функція, оголошена як void closegraph(void). Ця функція звільняє пам'ять з "купи", зайняту графічним драйвером.
Щоб обчислити роздільну здатність екрану по x і у, застосовуються функції
int getmaxx(void), int getmaxy(void).
Приклад: В даному прикладі номеру графічного драйвера додається значення
Ega=3, номеру графічного режиму - Egalo=0 . Визначаються роздільні здатності по X і У.
Код на C++
#include <stdio.h>
#include <graphics.h>
#include <conio.h>
void main()
{
int gdriver = EGA, gmode = EGALO;
int maxx, maxy;
initgraph (&gdriver, &gmode, "");
maxx = getmaxx();
maxy = getmaxy();
closegraph();
printf("maxx = %d , maxy = %d \n", maxx, maxy);
Після запуску даної програми на екран буде видано повідомлення: maxx = 639, maxy = 199.
Модулі драйвера можна перетворити в об'єктний файл за допомогою утиліти BGIOBJ.EXE. Потім отриманий об'єктний файл підшивається до програми за допомогою вказівки імені об'єктного файлу в проекті (після імені головного модуля). В цьому випадку перед ініціалізацією графічного режиму слід викликати функцію int registerbgidriver (void (*driver) (void)) підтвердження графічного драйвера.
Приклад: Після команди BGIOBJ С:\bc\bgi\egavga буде створений файл EGAVGA.OBJ. Тепер треба включити ім'я EGAVGA.OBJ у проект .prj. Ініціалізація графічного режиму проводиться таким чином:
Код на C++
#include <stdio.h>
#include <graphics.h>
#include <conio.h>
void main(){
int driver, mode;driver=registerbgidriver(EGAVGA_driver);
driver = VGA; mode = VGAHI;
initgraph (&driver, &mode, "");
closegraph();
}
Після установки графічного режиму за допомогою initgraph екран монітора є прямокутною областю, розбитою на (getmaxx()+1) ? (getmaxy()+1) однакових прямокутників - пікселів, сторони яких паралельні верхній і нижній межам екрану. Слово піксель ( pixels ) утворилося від злиття двох англійських слів: picture і elemets. Під пікселом розуміється мінімальний елемент зображення на екрані, що складається з декількох (кольорових) крапок і розглядається в програмі як одна точка певної яскравості або кольору. Під координатами пікселя маються на увазі цілочисельні координати центрів цих прямокутників, відлічувані від координат центру лівого верхнього прямокутника. Координати пікселів (X,y) змінюються в діапазонах 0 ? X ? getmaxx(), 0 ? Y ? getmaxy().
Графічні функції, з якими ми можемо працювати після установки графічного режиму, умовно можна розділити на три групи. Перша група складається з функцій, які нічого не виводять на екран, але встановлюють деякі параметри. Наприклад, функція setcolor задає номер кольору для подальшого виведення ліній. Друга група складається з функцій, які здійснюють вивід на екран. Щоб вивести точку заданого кольору, застосовується функція void putpixel(int x, int у, int color). Третя група складається з функцій, які нічого не виводять на екран, але дозволяють отримати інформацію про виведене зображення. Наприклад, для читання кольору піксела призначена функція unsigned getpixel(int x, int у). Імена функцій першої групи починаються, як правило із слова set (ставити, поміщати), а функції третьої групи - із слова get (отримувати, діставати).
Графічні функції проводять вивід в сторінку, яка називається активною.
Коефіцієнтом стиснення екрану називається відношення ширини пікселя до висоти пікселя. Коефіцієнт стиснення можна дізнатися за допомогою функції void getaspectratio(int far *xasp, int far *yasp). Ця функція записує за адресою yasp число 10000, а за адресою xasp - твір коефіцієнта стиснення на 10000.
Коефіцієнт стиснення враховується при виведенні кіл, дуг кіл і секторів круга. Коефіцієнт стиснення встановлюється при ініціалізації графічного режиму, виходячи з режиму, відповідного максимальній роздільній здатності екрану, і може бути змінений за допомогою функції void setaspectratio(int xasp, int yasp); в цьому випадку новим коефіцієнтом стиснення буде відношення xasp / yasp .
3. Функції для графічних побудов.
Розглянемо функції бібліотеки graphics.h, які використовуються як команди.
initgraph (<драйвер>, <режим>, <шлях до драйвера>) - задає графічний режим.
Шлях до драйвера зазначають у лапках;
detectgraph(<драйвер>, <режим>) - повертає значення характеристик дисплея;
setcolor(<кoлip>) - задає колір майбутнього зображення;
setbkcolor(<кoлip>) - задає колір тла;
putpixel (x, у, <колір>) - висвітлює точку (х,у) заданим кольором;
line (х1, у1, х2, у2)- рисує лінію між двома точками;
lineto (x, у) - рисує лінію від поточної точки до точки (х, у);
linerel (dx, dy) - рисує лінію від поточної точки із заданими приростами;
bаr (х1, у1, х2, у2)- рисує зафарбований прямокутник;
bar3d (x1, у1, х2, у2, <об'ємна глибина>, n)- рисує паралелепіпед;
rectangle (x1, у1, х2, у2)- рисує прямокутник із заданими координатами діагонально протилежних вершин (лівої верхньої та правої нижньої);
setviewport (x1, y1, х2, у2, n) - задає координати нового графічного вікна.
Цілочисельна змінна n задає режим відсікання зображення, яке виходитиме за межі вікна;
clrcle (х, у, R)- рисує коло з радіусом R і центром у точці (х, у);
аrс (х, у, <початковий кут>, <кінцевий кут>, <радіус>) - рисує дугу;
pieslice (x, у, <початковий кут>, <кінцевий кут>, <радіус>) - рисує зафарбований сектор;
ellipse (x, у, <початковий кут>, <кінцевий кут>, <горизонт. радіуо, <вертик. радіуо) - рисує еліпс чи дугу еліпса;
setfillstyle (<заповнення>, <колір>) - задає спосіб заповнення замкнутої області залежно від значення параметра заповнення:
0 - заповнення кольором фону,
1 - суцільне заповнення,
2 - заповнення товстими горизонтальними лініями,
3 - заповнення нахиленими лініями,
10 - заповнення точками,
11- щільне заповнення точками;
floodfill (x, у, <колір межі>) - заповнює замкнену область, що містить точку (х,у);
closegraph() - закриває графічний режим;
outtext(<текст>) - виводить заданий текст із поточної позиції;
outtextxy (x, у, <текст>) - виводить текст у заданому місці;
settextstyle (<шрифт>, <напрям>, <розмір>) - задає вигляд символів, напрямок виведення: 0 - горизонтально чи 1 - вертикально, а також розміри символів 1,2,3.
Розглянемо деякі функції, які використовуються у виразах.
Graphresult() - повертає код помилки, якщо неможливо задати графічний
режим; 0-у разі задання;
Getmaxx()- повертає значення розміру екрана вздовж осі ОХ;
Getmaxy() - повертає значення розміру екрана вздовж осі OY;
Getcolor() - повертає значення поточного кольору;
Getx(), Gety() - повертають координати поточного пікселя
Кольори задають числами або англійськими назвами:
BLACK = 0- чорний; | DARKGRAY = 8 - темно-сірий; | |||
BLUE = 1 -синій; | LIGHTBLUE = 9 - яскраво-синій | |||
GREEN = 2- зелений; | LIGHTGREEN = 10 - яскраво-зелений; | |||
CYAN = 3 - блакитний; | LIGHTCYAN = 11- яскраво-блакитний; | |||
RED = 4 - червоний; | LIGHTRED = 12 - яскраво-червоний; | |||
MAGENTA = 5 - фіолетовий; | LIGHTMAGENTA = 13 - яскраво-фіолетовий; | |||
BROW = 6 - коричневий; | YELLOW = 14-жовтай; | |||
LIGHTGRAY = 7 - світло-сірий; | WHITE = 15 -білий. |
Приклад.Нарисувати графік функції y=sin2x+1 на проміжку [0; π], табулюючи функцію з кроком h=0,1.
#include <stdlib.h> // Графік
#include <iostream.h>
#include <math.h>
#include <conio.h>
#include <graphics.h>
float f(float x);
void main()
{
const float a = 0, b = 2*3.14, h = 0.1;
const int h1 = 5, x0 = 60, y0 = 240, M = 50;
int gdriver = DETECT, gmode, errorcode;
int x1, y1;
float x, y;
initgraph(&gdriver, &gmode,””);
errorcode = graphresult ();
if (errorcode != grOk)
{
cout << "Помилка" << grapherrormsg(errorcode);
cout << "\n Натисніть на будь-яку клавішу";
getch();
exit(1);
}
setbkcolor(1);
setcolor(14);
line(20, y0, 600, y0);
Iine(x0, 440, x0, 20);
x = a;
x1 = x0 + M * x;
y = f(x);
y1 = y0 - M * y;
moveto(x1, y1);
setcolor(15);
do {
y = f(x); y1=y0 - (M*y);
Iineto(x1, y1);
x1 += h1; x=x+h;
}
while (x<= b);
settextstyle( 0, 0, 1);
outtextxy(60, 245, "0");
outtextxy(360, 245, "6.3");
settextstyle( 0, 0, 2);
outtextxy(100, 380, "Графік функції y=2sin2x+1");
getch(); closegraph();
}
float f (float x)
{
float func;
func = 2*sin (2*x}+ 1;
return func;
}
Список використаної літератури
1. Язык программирования С++.Лекции и упражнения.Учебник:Пер.с англ. / Стивен Прата – К.: Издательство «ДиаСофт», 2001.- 656с.
2. Глинський Я.М., Анохін В.Є., Ряжська В.А. С++ і С++ Builder. – Львів: Деол, СПД Глинський, 2004.
3. Стивен Прата. Язык програмирования С. Лекции и упражнения.-К: “ДиаСофт”, 2000.
4. В.С.Проценко та ін.Техніка програмування мовою Сі.-К:”Либідь”,1993.
5. М.Уэйт, С.Прата, Д.Мартин. Язык Си.-М:Мир,1988.
Дата добавления: 2015-08-26; просмотров: 820;