10.2. Typedef құралы
Си тілінде мәндер типіне жаңа атау беруге болатын құрал - typedef құралы бар.
Мысалы:
typedef int butun;
Мұндағы butun int типінің синонимі. Мұны сипаттау барысында төмендегідей
қолдануға болады:
Butun i,k;
Butun Massiv[];
Сол секілді:
Typedef char * String;
79
Мұнда String сhar * синонимі, яғни char типті элементке сілтеуіш секілді
анықталады, қолданылуы:
String p, pt[M];
Мұндағы типтер атауы ерекшелеу мақсатында үлкен әріптен басталады. Бұл
құрал жаңа тип құрмайды, тек бұған дейін бар типке жаңа ат береді.
Бұл құралды қолданудағы басты мақсаттар мынадай:
1) Программаны басқа машинаға көшіруге байланысты мәселелерді шешуге
қажетті параметрлерді анықтау; яғни typedef арқылы машинадан тәуелді болатын
типтерді сипаттасақ,басқа машинаға программаны көшіру барысында тек typedef-ті
ғана қайта анықтай қоямыз.
2) Программа текстін түсінітірек болсын деген мақсатқа байланысты, яғни
мысалы Treeptz(tree-дерево, pointeг-сілтеуіш) атауы-ағылшын атауы күрделі
структураға көрсеткіш түрінде анықталған типке қарағанда түсініктірек;
10.3. Биттік өрістер
Жады жетіспеген жағдайда бірнеше обьектіні машинаның бір сөзіне сиғызу
қажет болуы мүмкін.
Осы жағдайда Си-де сөз-дегі өрістерді анықтау және тікелей мәлімет алмасу
мүмкіндігін қолдануға болады.
Сонымен, биттік өріс дегеніміз - жадының “сөз” деп аталатын бірлігінің ішіне
енетін биттер жиынтығы.Өрістерді анықтау және онымен мәлімет алмасу мүмкіндігі
структура арқылы анықталады.
Мысалы:
struct {
unsigned int is_keyword:1;
unsigned int is_txtern:1;
unsigned int is_static:1;
} flags;
Бұл жазбада flags үш бірбитті өрістерден тұрады, мұндағы (:)-ден кейінгісін
өрістер енін анықтайды. Ал, өрістер unsigned int түрінде сипатталуы - таңбасыз
шама ретінде анықталу қажет екенін көрсетеді.
Жеке өрістерін: flags.is_keyword
Flags.is_static
Түрінде қолданамыз.
Өрістерді арифметикалық өрнектерде “бүтіндер” секілді қолдануға болады.
Мысалы:
Flags.is_Extern=flags.is_static=1 /*сәйкес биттерге 1-ді орнатады.*/
Flags.is.extern=flags.is_static=0 /*оларды 0-ге айналдырады.*/
If (flags.is_extern= =0) /* тексеру*/
Өрістерге қатысты мәселелер жүзеге асыру барысында туындайды, мысалы,
өрістің сөз шекарасынан шығып кетуі..., өрісті атаусыз қолдануға болады (:ені
80
көрсетілген), мұнда қажетті мөлшерде разрядтар тастап кетуге болады. Кейбір
машиналарда өрістер солдан оңға қарай, кейбірінде-оңнан солға қарай
орналастырады. Өрістерді іnt типімен сипаттауға болады, олар массив бола алмайды
және адрестері болмайды, сондықтан & операторы өрістерге қолданылмайды.
Мысалы, компиляторға арналған символдар кестесін өңдеу есебінде кездесетін
ситуацияның бірі - бірбиттік флажактар біріктіруді қарастырайық.
Символдар
таблицасын басқаратын фрагмент, яғни компилятор фрагментін қарастырсақ:
Программаның әрбір идентификаторы нақты бір информацияны білдіреді;
мысалы бұл қызметші сөз бе?
Айнымалы қандай класқа жатады, статикалық н/емесе сыртқы т.б.
Осындай информацияларды кодтау тәсілінің ең тиімдісі - char немесе int типті
сөзде бірбиттік флажактар қою болып табылады.
Бақылау сұрақтары:
1. Typedef құралы қолдаылуына мысал келтіріңіз.
2. Біріктіру айнымалысына жадыдан бөлінетін орын неден тәуелді?
3. Биттік өрістер не үшін қарастырылады?
Әдебиеттер: [1-10],[16].
Дәріс №11. ГРАФИКА
Дәріс мақсаты: С/С++ тілінің графикалық мүмкіндіктеріне қысқаша шолу
жасау. Графикалық мәліметтерді өңдеу программаларын құруға бағыт бағдар жасау.
Кілттік сөздер: Графика, графикалық режим, графикалық режимді орнату,
графикалық функциялар тақырыптық файлы, графикалық функциялар, графикалық
драйвер, экранның координаталық жүйесі, пиксел.
Жоспары:
11.1.
Графикалық режимде жұмыс жасау туралы.
11.2.
Графикалық жүйені инициализациялау.
11.3.
Қателерді өңдеу. Режимдердің ауысуы.
11.1. Графикалық режимде жұмыс жасау туралы
Дербес компьютер экраны текстік және графиктік режимдердің бірінде жұмыс
істейді. Графикалық режимде жұмыстың қалай жүргізілетінін қарастырайық.
81
Қазіргі ДК-де, негізінен, растрлық дисплейлер қолданылады. Олардағы
бейненің ең кіші элементі болып нүкте – pixel (ағылш., picture element) табылады.
Дисплейдің мүмкіндігі – бұл көлденең және тік орналасқан пикселдер саны
(стандартты разрешение – 640*480 нүкте). Дисплейде бейнеленетін сурет орталық
процессор жадысының бейнежады (видеопамять) деп аталатын арнайы облысында
кодталып сақталады. Мәліметтер периодты түрде осы облыстан оқылып,
бейнесигналдарға түрлендіріледі де экранда бейнеленеді. Сурет кодтарын
бейнесигналдарға түрлендіруді арнайы электрондық схема – бейнеадаптар
(видеоадаптер) жүзеге асырады. Ең кең тараған адаптерлер VGA және SVGA.
C++ тілінде бейнежадының дербес бөліктеріне енуге, түстерді басқаруға, әр түрлі
формада графикалық бейнелер тұрғызуға, текстік хабарламалар шығаруға, курсорды
басқаруға мүмкіндік беретін көптеген функциялардын тұратын графикалық
кітапхана бар. Бұл функциялардың нақты бейнеадаптерлермен жұмысқа баптау
қажетті графикалық драйверді қосу арқылы қол жеткізіледі. Драйвер – бұл ДК-дің
құрылғыларын басқаруға арналған арнайы программа.
Адаптерлердің барлық түрлері үшін графикалық драйверлер Borland International
фирмасымен құрастырылған. Олар BGI (Borland Graphics Interface) кеңеймесімен
жеке файлдарда орналасқан. Графикалық драйверді қосу үшін арнайы initgraph()
функциясы қолданылады.
Көптеген графикалық функциялар ағымдағы позиция көрсеткіші деген ұғымды
қолданады. Ол таңдалған пикселді білдіреді және екі бүтін сан арқылы сипатталады:
экранның горизонталь және вертикаль координаттары. Нумерация солдан оңға және
жоғарыдан төмен қарай жүргізіледі (нольден бастап).
Мысалы, EGA үшін 640*480 режимінде экран бұрышы мен оның центрінің
координаттары мынадай болады:
11.2. Графикалық жүйені инициализациялау
1. Драйверді және графикалық режимді таңдау
detectgraph (&gd, &gm)
функция арқылы орындалады.
2. Драйверді жүктеу, графикалық жүйені инициализациялауды
initgraph (&gd, &gm, "BGI-файлдың жолы")
функциясы атқарады, мұндағы gd және gm айнымалылары қажет драйвер мен
графикалық режимнің номерлері.
Егер ВGI-файлдар ағымдағы директорияда орналасса, онда initgraph()
функциясының үшінші параметрі ретінде бос жолды беруге болады
initgraph (&gd, &gm, " ");
82
Графикамен жұмыс жаса барысында мына әрекеттер тізбегі арқылы графиктік
режимді орнату жолдары жазылады:
#include
#include
#include
void main ( )
{ int gd, gm, error;
detectgraph (&gd, &gm);
initgraph (&gd, &gm,” ”);
error=graphresult ( );
if (error !=grOk )
{ puts ("ошибка графики");
puts (grapherrormsg (error));
exit (1);
}
……………………………. // Тело программы
closegraph ( );
exit (0) ;
}
11.3. Қателерді өңдеу. Режимдердің ауысуы
3. Графикамен жұмыс жасағанда қате жағдайларды өңдеу үшін
graphresult ( );
функциясы қолданылады. Ол соңғы қолданылып отырған графикалық функцияның
аяқталу кодын қайтарады. Қате болмаса, «0» қайтарылады.
Әр түрлі қателер типі үшін өздерінің аяқталу коды қарастырылған:
Кесте 3.1. Тұрақтылар кесетесі.
Тұрақтылар
Қате коды
Хабарлама
GrOK
0
Қате жоқ
GrNoInitGraph
-1
Графика инициализацияланбаған
GrNoLoadMcm
-5
Драйверді
жүктеуге
жадының
жеткіліксіздігі
GrFontNotFound -8
Шрифт файлы табылмаған
Қате кодының сәйкес мәнін экранға шығару мүмкіндігі бар. Бұл үшін
grapherrormsg (қате коды);
функциясы қолданылады. Ол аргумент ретінде берілген аяқталу кодының
сипаттамасынан тұратын жолға көрсеткіш қайтарады.
4. Режимдерді ауыстыру. Дисплейлік адаптердің текстік режиміне уақытша
ауысу үшін мына функция қолданылады:
83
restorecrtmode ();
Қайтадан графикалық режимге ауысу
setgraphmode (gm);
функциясымен жүзеге асырылады.
Ағымдағы драйвер үшін графикалық режимнің максимал мәнінің номерін
getmaxmode ();
функциясы арқылы анықтауға болады.
Графикалық жүйемен жұмыс жасап болған соң, графикаға бөлінген жадыны
босату, бейнеадаптер буферін тазарту, алдыңғы текстік режимді қалпына келтіру
керек. Барлық әрекеттерді
closegraph ();
функциясы жүзеге ауыстырады.
5. Түстерді, шрифттерді сызықтардың стилін және бояу стилін тағайындау.
Түстерді көрсету үшін констандаларды пайдалануға болады. Стандартты түстер
палитрасы:
BLACK
0
Черный
DARKGRAY
8
темно-серый
BLUE
1
Синий
LIGHTBLUE
9
светло-синий
GREEN
2
Зеленый
LIGHTGREEN
10
светло-зеленый
GRAY
3
Серый
LIGHTCYAN
11
светло-
бирюзовый
RED
4
Красный
LIGHTRED
12
светло-красный
MAGENTA 5
Малиновый
LIGHTMAGENT
A
13
светло-
малиновый
BROWN
6
Коричневый YELLOW
14
Желтый
LIGHTGRA
Y
7
светло-
серый
WHITE
15
Белый
Графиктік мәліметтер нақты бір бейнелер арқылы берілетіні мәлім. Тілде
бейнелерді тұрғызуға арналған арнайы функциялар қолданылады. Оларды
лабораториялық сабақтарда нақты қарастырамыз. Немесе лабораториялық жұмыс
№11- дегі әдістемелік нұсқауларды қараңыз.
Бақылау сұрақтары:
1. Растрлық графика дегеніміз не?
2. Растрлық және векторлық графика айырмашылығы неде?
Әдебиеттер: [5-10], [16-17].
Дәріс №12. ФАЙЛДАРМЕН МӘЛІМЕТ АЛМАСУ МҮМКІНДІКТЕРІ
84
Дәрістің мақсаты: С/С++ тіліндегі программаларда файлдармен мәлімет
алмасу тәсілдері мен мүмкіндіктерін түсіндіру. Файлдармен байланыс орнату,
оларға енгізу-шығару, басқару жолдарын үйрету.
Кілттік сөздер: Файл, FILE структурасы, файлдық көрсеткіш, файлдан оқу,
файлға жазу, файлдармен мәлімет алмасу режимдері, тексттік режим, екілік режим,
ағымды көрсеткіш, файл соңы, файлды басқару функциялары.
Жоспары:
12.1.
Файлдық типті айнымалыларды сипаттау. Файлды қолдану
режимдері.
12.2.
Файлдық енгізу-шығару.
12.1. Файлды сипаттау.
С тілінде:
Файлдан оқу және файлға енгізу үшін ең алдымен файл fopen функциясының
көмегімен ашылуы тиіс. Бұл функция операциялық жүйе арқылы орындалатын
әрекеттерді ұйымдастыру жұмысын орындайды және файлмен мәлімет алмасуға
арналған көрсеткішті қайтарады.
Ал, файлға көрсеткіш файл туралы информациялардан тұратын құрылымға
(жазбаға) сілтейді. Мұндағы информация мынадай сұрақтарының жауабынан
тұрады:
буфер адресі,
буфердегі ағымды литердің күйі,
файлдан оқуға немесе жазуға ашық па?,
файлдың соңғы таңбасы кездесті ме?
Мұндай құрылым сипаттамасы кітапханасындағы FILE типінде
беріледі. Қолдану үшін мынадай декларация берілсе жеткілікті:
FILE * fp;
FILE * fopen (char * name, char * m);
Мұндағы: fp – FILE типіндегі көрсеткіш, ал fopen FILE – ге көрсеткішті қайтарады.
Fopen функциясы мына түрде қолданылады:
fp = fopen (name, m);
Мұндғы: name – файлдың атын меншіктейтін жол;
ал, m – файлды қолдану режимі; яғни бұл да жол, қолданушы файлды қалай
қолданатынын білдіреді, төмендегідей мәндердің бірін иелене алады:
" r " – (read) оқу режимі;
" w "- ( write) жазу;
" a "- ( apprnd) толықтыру;
Кейбір жүйеде тексттік және бинарлық файлдар болып жіктеледі, бұл жағдайда
режим жолына "в" (binary – бинарлық) немесе “t”(тексттік) таңбасы тіркеледі.
Файлмен жұмыс жасау барысында қате кездессе, онда fopen функциясы NULL
мәнін қайтарады.
85
Мысалы,
FILE*fin, * fout;
fin=fopen (“PRIMER.dat”,”’r”);
fout=fopen (“RESULT.dat”, “w”);
1-ші жолда 2:fin,fout – файл көрсеткіші құрылады, ал төменгі жолдарда
сәйкесінше оқуға және жазуға арналған файлдар ашылады.
Fopen() функциясы файлдың аталған көрсеткішін қабылдайды, программаның
орындалу барысында олардың мәндері жасанды өзгертілмеуі тиіс. Мұндай
файлдағы 2-ші параметр файлдарымен мәлімет алмасу режимін анықтайды. Файл
мынадай режимдерде ашылуы мүмкін:
- текстік;
- екілік;
Текстік режимде ашу үшін режимді көрсеткенде қасына «t» символын тіркеу
арқылы жүзеге асады;
Режимдер кестесі:
Режим
Сипаты
а
а+
r
r+
w
w+
Файл мәндерімен толықтырылуы үшін ашылады. Егер файл
жоқ болса, ол құрылады. Жаңа мән соңына тіркеледі;
Жоғарыдағы секілді, тек оқұға да болады;
Файлды тек оқу үшін ашады, файл жоқ болса, ашылмайды;
Файлды оқуға да, жазуға да болады;
Жаңа файл ашады, бұрын бар болса, мәнін өшіреді.
Жаңа файлды мән жазуға да, одан оқуға да мүмкіндік
береді. Файл болса, мәні тазартылады.
R+,w+,a+ режимдерін қолдануда, яғни оған оқуды және жазуды бір уақытта
орындалу барысында файл көрсеткішінің Fsetpos(), fseek(), немесе rewind()
файлдары көмегімен ағымды позицияларын модификациялау керек.
Порграмма жұмысы аяқталғанда Си-де автоматты түрде барлық ашық
файлдар жабылады, ал файлды жабу үшін fclose(fin) қолданылады.
С++ тілінде:
Файлмен мәлімет алмасу мақсатында ifstream және ofstream кластарын
қолданған тиімді. Ол үшін < fstream. h > тақырыптық файлы ашылуы тиіс.
Мұнда, сәйкесінше, ifstream класының объектісі myof және ostream класының
mygf лектері құрылып көрсетілген файлмен байланысады.
Мысалы, Ifstream myof(“prim.in”,ios::in);
Ofstream mygf(“prim.out”,ios::out);
86
Бір объектімен тізбектеп бірнеше лекті байланыстыру қажет болса, онда ол
төмендегідей ретпен орындалады:
Ifstream myof;
. . .
myof(“prim.in”);
. . .
myof.close();
myof.open (“prim2.in”);
. . .
myof.close();
Файлмен мәлімет алмасу мүмкіндігінің режимін өзгерту – файлдық объектінің
сипатындағы екінші аргументін өзгерту арқылы жүзеге асады.
Мысалы, Ofsetream myof ( “prim.in”,ios::app | ios::nocreate); - мұндағы файл бар
болса ғана myof объектісі құрылып, байланыс орнатылады, себебі ios::nocreate
аргументі берілген, яғни файл болмаса, объект құрылмайтынын білдіреді. Ал,
ios::app аргументі файлға шығарылатын мәндер файлдың соңына қосылатынын
анықтайды.
Флаг-аргументтер биттік | - «немесе» амалының көмегімен біріктіріліп
анықтала алады.
Файлдық лекті анықтау барысында қолданылатын аргументтерді анықтайтын
флагтар төмендегідей:
флаг
Мағынасы
ios::in
Файл оқуға ашылады
ios::out
Файл жазуға ашылады
ios::ate
Объект құрылған соң, ағымды көрсеткіш файлдың
соңына орнатылады
ios::app
Мәндер файлдың соңына жазылады
ios::trunc
Егер файл бар болса, ол тазартылады
ios::nocreate
Файл болмаса, онда объект құрылмайды
ios::noreplace
Файл бар болса, онда объект құрылмайды
ios::binary
Файл екілік режимде ашылады (қалыпты жағдайда
тексттік режим)
feоf (FILE * fp) – функциясы файлдың соңын анықтайды.
Файлды жабу үшін:
Int fclose(FILE *fp) функциясы қолданылады, яғни файлдық көрсеткішпен
орнатылған байланысты үзеді.
Файлмен мәлімет алмасу үшін fstream класының объектісі де қолданылады:
Fstream io(“update.dat”, ios::in|ios::app); - бұл жағдайда көрсетілген файл мәліметті
оқуға және жазуға ашылады.
Seekg() файлдан оқу ал, seekp() файлға жазу барысында функциялары файлдың
ағымды позициясының маркерін басқаруға қолданылады.
Мысалы,
io.seekg(5, ios::cur) – оқу барысында маркерді ағымды орынынан 5 байтқа
жылжыту;
87
io.seekg(-7, ios::end); - маркерді соңынан бастап 7 байтқа жылжыту
керектігін білдіреді.
Аргументтер:
Io::cur – ағымды орынынан; Io::beg – файл басынан;
Io::end - файл соңынан жылжытылатынын білдіреді.
Файлдық лектің күйін анықтау функциялары:
Функция
Түсініктеме
eof()
Файл соңын кездестірсе, 0-дік емес мән қайтарады
fail()
Лекте қате кездессе 0- ден өзге мән қайтарады
bad()
Енгізу-шығару барысында мағыналы қате кетсе, нөлден өзге
мән қайтарады, онда лекпен жұмыс тоқтатылғаны дұрыс. Лек
күйінің биттік мәндері анықталмаса, 0-ге тең емес мән береді.
rdstate()
Мына тұрақтылардың бірін, яғнм лектің ағымды күйін
анықтайтын мәнді қайтарады:
Ios::goodbit - қате жоқ
Ios::eofbit – файл соңына жетті
Ios::failbit – форматтау немесе түрлендіру қатесі
Ios::badbit - маңызды қате
clear()
0-ге тең болса тазарту
12.2. Файлдық енгізу-шығару
Файлдан оқығанда Pascal-дағы секілді,
fprinf(fin,’формат’, <айнымалы>);
fscanf(fin,'формат', <айнымалы>);
fseek() функциясы:
Жалпы форматы:
Int fseek (FILE *str, long offset, int orig)
М, fseek (f, K, r)
Fseek функциясы f Көрсеткіші арқылы берілген файлдағы ағымды көрсеткішті К
байтқа жылжытады. Жылжыту:
- файлдың басынан (r=0)
- ағымды көрсеткіш тұрған (r=1)
- файлдың аяғынан (r=1) басталуы мүмкін.
Си- де r-дің мәні ретінде көрсету үшін қолданылатын 3 const қарастырылған:
SEEK_SET (файл басынан жылжу)
SEEK_CUR(ағымдағы позициядан бастау)
SEEK_END(файл соңынан)
Fseek() функциясы қызметі сәтті аяқталса 0-ді, әйтпесе EOF мәнін қайтарады.
88
Ftell()-функциясы файл басынан бастап ығысқан шамамен анықталады, яғни long
типті мән қайтарады, ағымды көрсеткіштің рынын анықтайды.
Ж.Т: long ftell(FILE*str)
Ftell(f)
Rewind функциясы ағымды көрсеткішті файлдың басынан орындайды.
rewind(FILE*str);
rewind(f) мынаған сәйкес мәнді қайтарады;
fseek(f, ol, seek_set);
Мысалы:
# include
void main()
FILE *pf; “tect.dat”-да=”ABCD”
Char c;
Long l; {С тілінде 64 кб-өлшенді файлдармен жұмыс жасауға
болады, сондықтан L-long типті. }
pf=fopen (“test.dat”, “r+t”);
c=f getc (pf); {“A”-ны алады}
putchar (c);{“A”-ны экранға шығару}
с=f getc(pf);{“B”-ны оқу}
putchar (c);{“B”-ны экранға шығару}
l=ftell(pf);{ағымы көрсеткіш мәнін меншіктейді,в-оқылғандықтан,L=2}
C= f getc(pf); {c-ны оқып экранға шығару}
putchar(c);
fseek (pf,l,o);{ағымды көрсеткіш”Д”-да тұрған жерінен “С”-ны көрсетуге
көшеді,себебі функция басынан 2 бт жылжиды }
с=f getc(pf);
putchar(c); {экранға ''C''-ны экранға шығарады }
fseek (pf,l,o);{ағымды көрсеткіш қайтадан “С''-ға сілтейді,енді оның орнына “Е”
файлға жазылады}
fputc (‘E’,pf);
fseek (pf,l,o); {ағымды көрсеткіш файл басына l=2 байтқа байланысты жылжиды,
яғни “E”-ні көрсетеді}
с=f getc(pf); {экранға “Е''-ні шығарады}
putchar (c);
rewind (pf); {ағымды көрсеткіш файл басына көшіріледі.}
c=f getc (pf);
putchar (C);{С-ға файлдан «А» оқылады, экранға шығарады}
нәтижесінде:ABCCEA
get c () –берілген потоктан бір символды оқиды.
Бақылау сұрақтары:
1. Файл дегеніміз не?
2. Файлдық лекті сәйкестендіруді қалай түсінесіз?
89
3. Файл бойынмен жылжу, ағымдық көрсеткішті басқару функциялары
қандай?
Әдебиеттер: [1-10],[16].
90
Дәріс №13. ОБЪЕКТІЛІ-БАҒЫТТАЛҒАН ПРОГРАММАЛАУ (ОБП)
Дәрістің мақсаты:
Объектілі-бағытталған программалау негіздеріне және
негізгі түсініктеріне анықтамалық мәліметтер беру. Машиналық бағытталған тілдегі
объектілерді басқару жолдарын үйрету.
Кілттік
сөздер:
Объект,
қасиеттері,
тұқым
қуалау,
инкапсуляция,
полиморфизм, ОБП, кластар, кластар иерархиясы, класс экземпляры, конструктор,
деструктор.
Жоспары:
Достарыңызбен бөлісу: |