Шеңбердің доғасын салу
arc (x, у, бұрыш_басы, бұрыш_соңы, радиус);
Бұрыштар градуспен өрнектеледі және сағат тіліне қарсы есептеледі. Бұрыш мәндері
[0..360] интервалынан сәйкес эквивалентті мәндерге түрленеді. Сонымен, arc (х, у, -
45, 45, r) және arc (x, у, 675, -315, r) бірдей шеңбердің төрттен бір бөлігін салады.
Эллипстің доғасын сызу
ellipse (x, у, бұрыш_басы, бұрыш_соңы, rх, rу);
мұндағы rх, rу – пиксельмен берілген эллипстің жарты осьтері.
6. Тіктөртбұрышты бояуды
bar (xl, yl, х2, у2);
функциясы жүзеге асырады. мұндағы x1, y1 – жоғары сол жақ бұрыш
координаттары; х2, у2 – төменгі оң жақ бұрыш координаттары. Бояу стилі
setfillstyle() функциясымен тағайындалады.
7. Көпбұрыш салу және бояуға
fillpoly (n, указатель на массив целых);
функциясы мүмкіндік береді. Мұндағы n – төбелер саны. Әрбір төбенің
координаттары бүтін типті екі шамамен беріледі. Бұл функция төбелер тізімінің
бірінші нүктесін соңғысымен байланыстырады, тұйықтайды және оны бояйды. Бояу
шаблоны мен түсі setfillstyle() и setfillpattern() функцияларымен берілуі мүмкін.
8. Контурлы боялған эллипсті мына функция арқылы салуға болады:
fillellipse (х, у, rх, rу);
мұндағы х, у – центр координаттары; rх, rу – пиксельмен берілген эллипстің жарты
осьтері
9. Контурлы боялған шеңбер секторын
pieslice (x, у, бұрыш_басы, бұрыш_соңы, радиус);
функциясы арқылы салуға болады.
10. Контурлы боялған эллипстік секторды
sector (х, у, нач_угол, кон_угол, rх, rу);
функциясын пайдаланып салуға болады.
11. Тұйық облысты бояу
floodfill (x, у, граница);
функциясымен жүзеге асырылады. мұндағы х, у – облыс ішіндегі нүкте
координаттары.
Контур түсі шекара параметрінің мәнімен сәйкес болуы керек. Бояу (түсі мен
типі) setflllstyle() функциясымен тағайындалады.
Тапсырмалар
Вариант1 Вариант 2 Ввариант 3
Вприант 4 Вариант 5 Вариант 6
Вариант 7 Вариант 8 Вариант 9
Вариант 10 Вариант11 Вариант 12
Вариант 13 Вариант14 Вариант 15
Блиц- тест:
1. Ағымдағы драйвер үшін графикалық режимнің максимал мәнін
қайтаратын функция:
A) getmaxmode ( );
B) getmaxxy ( );
C) maxxy( );
D) getmax( );
E) maxmode ( );
2. Тексттік режимнен графиктік режимге қайта ауысу функциясы:
A) setgraphmode( );
B) restorecrtmode( );
C) detectgraph( );
D) initgraph( );
E) grapherrormsg ();
3. Тұйық облысты бояу функциясы:
A) floodfill (x,y, шекара );
B) floodfill (x,y);
C) fillpoly(x,y, шекара );
D) fillellips(x,y, rx, ry);
E) settextfill (x,y, шекара);
Бақылау сұрақтары
1. Пиксел дегеніміз не?
2. Графикалық ақпарат қалай сақталады?
1. Графикалық режимге қалай ауысуға болады?
2. Текстік режимге қалай оралуға болады?
3. Шрифттерді қалай таңдауға болады?
6. Сызық сипаттамасы мен қалындығын қалай тағайындауға болады?
7. Бояу стилін қалай тағайындауға болады?
8. Графикалық экранда терезені қалай ашуға және қалай жабуға
болады?
9. Горизонталь және вертикаль бойынша нүктелердің максимальді
координат мәндерін қалай алуға болады?
10. Терезенің координаттар жүйесінде ағымдық координаттарды алуға
болады?
11. Терезеге текстті қалай шығаруға болады?
12. Тұйық фигураны қалай бояуға болады?
Глоссарий:
Пиксель- (әдістемелік нұсқауды қараңыз).
Графиктик режим - (әдістемелік нұсқауды қараңыз)
Түстер- (әдістемелік нұсқаудағы түстер кестесін қараңыз)
Бейне адаптер- құрылғы
Коорбинаталық жүйе – экранның пиксельдер жиынтығын реттеп санауға
қатысты жүйесі.
Графика - (әдістемелік нұсқауды қараңыз)
Әдебиеттер:
[14],[13],[15].
ЛАБОРАТОРИЯЛЫҚ ЖҰМЫС №10
Тақырыбы : КӨРСЕТКІШТЕР.
Мақсаты:
Көрсеткіштер түсінігін тереңірек зерттеу,
Көрсеткіштерді қолдану машығын қалыптастыру;
Мысалдар арқылы бекіту.
Қажетті материалдар мен жабдықтар: ДК, лабораториялық жұмысты орындауға
арналған әдістемелік нұсқаулар.
Лабораториялық жұмыстың мазмұны және орындалу реті:
1. С/С ++ тілінің көрсеткіштер мен сәйкес типтері, адрестер ұғымдарына қатысты
әдістемелік нұсқау – матриалдарды алдын ала танысып меңгеру.
2. Ұсынылған мысалды орындау және талқылау.
3. Өзіндік жеке тапсырмалардың оқытушы ұсынған нұсқасын орындау.
4. Лабораториялық жұмыстың есебін (отчет) дайындап тапсыру.
Әдістемелік нұсқау:
Көрсеткіш- бұл компьютердің жадысын басқаруға қосымша мүмкіндік беретін
конструкция.
Көрсеткіш- бұл айнымалының жадыдағы адресі деп түсінуге болады.
Компьютер жадысын нөмерленген ұяшықтарға бөлінетінің еске түсірсек (байттар),
онда программаның айнымалылары тізбектелген ұяшықтар арқылы жүзеге
асырылады. Айнымалаға мәлімет алу мүмкіндігін атын атамай оның адресін
пайдалануға болады, адрес дегеніміз айнымалының жадыда орналасқан
үяшықтардың біріншісінің адресі.Осы мақсатпен пайдаланған айнымалының адресі
Көрсеткіш деп аталады.
Көрсеткіш айнымалыда сақталу мүмкін. Он жадыдағы адрес деп анықталғасын, оны
сақтау үшін int немесе double типті айнымалылар сәйкес келетін сияқты. Бірақ
негізінде олай емес. Көрсеткіштер үшін ерекше типті айнымалылар қажет. Ол
айнымалыларды хабарлау үшін арнаулы * символы пайдаланады. Мысалы : double
*p; Бұл оператор р айнымалыны double типті деп хабарлап түр. Келесі оператор
Int *r, *p, v1,v2; p және r айнымалыларды int типті Көрсеткіштер, ал v1,v2
айнымалыларды int типті деп хабарлағаны.
Айнымалының адресін алу үшін & операторын пайдаланады: р1=&v1;
р1 айнымалыға v1 айнымалысына көрсеткіш меншіктенелі.
С++ тілінде р1 айнымалысы нұсқайтын айнымалы қатынас жасау былай
орындалады: *p1.
Келесі кодты қарастырайық:
V1=0;
P1=&v1;
*p1=42;
Cout <
Cout <<*p1<
Орындалу нәтижесі экранға шығарылған кезде:
42
42
Көрсеткіш типтері:
Егер функцияда int типті айнымалыға көрсеткіш болатын, типті параметр қажет
болса, ол Көрсеткіш типін int* деп көрсетеді. Мысалы:
Void manipulatePointer(int* p);
Ал егер сол типті айнымалыны хабарлағыныз келсе, онда * символын типіне емес,
айнымалынын атына қосып жазу керек:
Int *p,*p2;
Бір айнымалы-Көрсеткіштын мәнін екінші айнымалы-Көрсеткішқа меншіктеуге
болады, нәтижесінде бірінші айнымалыда сақталған адрес екінші айнымалыға
көшіріледі:
Мысалы: Егер р1 айнымалыда v1 айнымалының адресі болса, онда опeратор
p2=p1; бұл адресті р2 айнымалыға меншіктейді де, ол да v1 айнымалыға Көрсеткіш
болады. Егер v1 айнымалысы ішінде 42 саны болса, оператор:
cout<<*p2;
экранға 42 санын шығарады:
Көрсеткіш-айнымалылары бар, меншіктеу операторын пайдалану.
Мысал:
Cin >>*p1;
*p1=*p2+7;
p1=p2
8
9
Р1
Р2
Орындалмай тұрып:
Орындалғаннан кейін:
8
9
Р1
Р2
*p1=*p2
8
9
Р1
Р2
Орындалмай тұрып:
9
9
Р1
Р2
Орындалғаннан кейін:
Cout <<*p1;
пернетақтаған int типті мәнді орналастырады де, 7 санын қосады және нәтижесін
шығарады.
Мысал: Көрсеткіштерге қолданылатын негізгі операциялар:
//Көрсеткіштермен
және
динамикалық
айнымалылармен
орындалатын
операцияларды демонстрациялау программасы//
# include
Using std:: cout;
Using std::endl;
Int main()
{
Int *p1, *p2;
p1=new int;
*p1=42;
p2=p1;
cout <<”*p1==”<<*p1<
жолға көшу үшін endl немесе “\n” жазылуы мүмкін, ол С++ версиясына
байланысты
cout <<”*p2==”<<*p2<
*p2=53;
Cout <<”*p1==”<<*p1<
Cout <<”*p2==”<<*p2<
p1=new int;
*p1=88;
Cout<<”*p1==”<<*p1<
Cout<<”*p2==”<<*p2<
Cout<<”Hope you got the point of this example!\n”;
Return 0;
}
Диалог мысалы:
*p1==
42
*p2==
42
*p1==
53
*p2==
53
*p1==
88
*p2==
53
Hope
you
got the
a
?
?
p1
p2
p1=new int;
?
p1
p2
?
б
?
p1
p2
42
*p1=42;
p1
p2
4
р2=р1;
г
5
*р2=53;
д
?
р1=new int;
e
5
8
*р1=88;
ж
5
Int *p1, *p2;
a
в
point of this example!
2.Массивтер-айнымалылар және көрсеткіштер- айнымалылар.
Массив типті айнымалы жадыдағы массивтің бірінші элементінің адресі деп
түсіндірілді. Енді сіздің біліміңіз айнымалы басқа айнымалының адресін іште
сақтайтын болса ол Көрсеткіш деген анықтамамен толықтырылды. Сондықтан С++-
те массив типті айнымалы, массивтің бірінші индекстелген айнымалысына
Көрсеткіш деп түсінуге де болады.
Мысал:
//Массив типті айнымалы Көрсеткіш екенің көрсететін программа//
#include
Using std::cout;
Using std::endl;
typedef int* InPtr;
Int main()
{
IntPtr p;
Int a[10];
Int index;
For (index=0; index<10;index++)
a[index]=index;
p=a;
for (index=0; index<10;index++)
cout<<
cout<<”\n”;
for (index=0; index<10; index++)
p[index]=p[index]+1; // P mассивінің элементтерің өзгерткенде
for (index=0; index<10; index++) //а массивінің элементтері өзгеретіне
cout<
cout<<”\n”;
return 0;
}
Диалог мысалы:
0 1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9 10
А int типті айнымалыға Көрсеткіш болғандық ( a[0]) , а айнымалының мәнің р
Көрсеткіш айнмалыға меншіктеуге болады: р=a;
Онда р[0],p[1],… өрнегі ,бұл а массив элементтеріне a[0],a[1],… сілтеме болып
табылады.
3. Көрсеткіштермен орындалатын арифметикалық операциялар:
Программада төменде берілген код бар болсын делік:
Typedef double* DoublePtr;
DoublePtr d;
D= new double[10];
Орындалу нәтижесінде d айнымалысы d[0] элементінің адресін сақтайды. d+1 өрнегі
d[1] элементінің адресін, d+2 - d[2] элементінің т.б. сақтайды. Мысалы: егер double
типті айнымалыға 8 байт (жадының сегіз үяшығы) қажет болса және d 2001 адресің
іште сақтаса, онда d+1 өрнегі 2009 адресін қайтарады. Түсіндірілген арифметикалық
операциялар бұл массив элементтеріне альтернативтік мәлімет алу мүмкіндігі.
Сонымен, arraySize-d динамикалық массивтің өлшемін нұсқайтын айнымалы, циклi
For (int i=0; i
Cout << *(d+i)<<” “;
Массивтің ішіндегі мәліметерді экранға шығарады. Бұл цикл төмендегі циклге
эквивалентті:
for (int i=0; i
cout <
Көбейту және бөлу операциялары Көрсеткіштерға қолданылмайды..
d++ өрнегі, d Көрсеткіш-айнымалын мәнің көбейтеді, d-- өрнегі, Көрсеткіш-
айнымалыға, алдында тұрған элементтің адресің кіргізіп, берілген мәнді азайтады.
Өзіндік жеке тапсырмалар:
1. Оперативтік жадыда вектор Int X[10] векторы b7f0 адресінен бастап
орналасқан. Мына өрнектердің мәнін табыңыз:
а) Х+1;
б) Х+5;
в) Х-4;
2. Программада
Int
P[]={0.2.4.5.6.7.9.12}
массиві
хабарланған.
Мына
өрнектердің мәнің табыңыз:
а) P[3];
б) *P;
в) *[P+4];
г) *(P+P[2]);
3. Өсу тәртібімен, үш айнымалының мәнің сұрыптау функциясың жазыңыз:
4. [0,1] диапазонына түсетің кездейсоқ сандармен, бүтін санды, бір өлшемді
массивті толтыру функциясың жазыңыз.
5. Заттық, бір өлшемді массивтің элементтерінің орта мәнің есептейтің
функцияны жазаңыз. Осы функцияны, ең үлкен орта мәнді жолды анықтау
үшін пайдаланығыз.
Блиц-тест:
1. Int *p;
Int a;
…
p=&a;
p++;
p--;
…
фрагментінің орындалу нәтижесінде р қайда сілтейді?
A) А мәні орналасқан орынға;
B) Ешқайда;
C) А орналасқан орыннан кейінгі ұяшыққа;
D) А орналасқан орынға дейінгі ұяшыққа;
E) Р ұяшығына.
2.
…
int *p;
int x[]={5,4,7};
p=x;
p++;
printf(“%i”,*p);
…
Орындалу нәтижесінде экранға не шығады?
A) 4
B) 5
C) 7
D) 6
E) 8
Бақылау сұрықтары:
1. С++ тілінде Көрсеткіш деп нені атайды ?
2. * операторын пайдалану үш мысалын келтіріп және әр қайсысы қалай жұмыс
жасайтының түсіндіріңіз.
3. Келесі код нені шығарады ?
Int *p1, *p2;
p1=new int;
p2=new int;
*p1=10;
*p2=20;
cout<<*p1<<” “ <<*p2<<”\n”;
p1=p2;
cout <<*p1<<” “<<*p2<<’\n”;
*p1=30;
cout<<*p1<<” “<<*p2<<”\n”;
Программа нәтижесі қалай өзгеретінеді, егер p1=30; жолы *p2=30; жолына
ауыстырылса.
4. Төменгі код нені шығарады?
Int *p1,*p2;
p1=new int;
p2=new int;
*p1=10;
*p2=20;
cout <<*p1<<” “<<*p2<<”\n”;
*p1=*p2;//бұл жол 3 сұрақтағы дай емес.
cout<<*p1<<” “<<*p2<<”\n”;
*p1=30;
cout<<*p1<<” “*p2<<’\n’;
Әдебиеттер:
[1],[4],[7],[8],[10-13],[15].
ЛАБОРАТОРИЯЛЫҚ ЖҰМЫС №11
Тақырыбы: СТРУКТУРАЛАР
Мақсаты: Студенттерді С/С++ тіліндегі
структуралық тип ұғымымен таныстыру, структура типті берілгендерді енгізу,
шығару және структуралық мәліметтерді қолданып программалау дағдыларын
қалыптастыру;
біріктіру ұғымымен таныстыру, біріктіруді қолданып программалау дағдыларын
қалыптастыру;
программалауда Typedef құралын қолдану.
Қажетті материалдар мен жабдықтар: ДК, С/С++ тілінің IDE ортасы,
лабораториялық жұмысты орындауға арналған әдістемелік нұсқаулар.
Лабораториялық жұмыстың мазмұны және орындалу реті:
1. С/С ++ тілінде циклдық алгоритмдерді программалауға қатысты әдістемелік
нұсқау – матриалдарды алдын ала танысып меңгеру.
2. Ұсынылған мысалды орындау және талқылау.
3. Өзіндік жеке тапсырмалардың оқытушы ұсынған нұсқасын орындау.
4. Лабораториялық жұмыстың есебін (отчет) дайындап тапсыру.
Әдістемелік нұсқаулар:
Структура
Структура – бір атпен біріктірілген бір немесе бірнеше әр түрлі типті
айнымалылар тобы. Структура struct қызметші сөзімен құрылады. Структураның
жалпы құрылымы төмендегідей:
struct тег {
тип1 иден1;
тип2 иден2;
… …
типN иденN;
};
мұндағы тег мәліметтердің жаңа типі болып саналады және оны айнымалыны
сипаттауда қолдануға болады.
Сипатталған структура негізінде айнымалы құру үшін
struct <тег> <айнымалы>
С++ тілінде struct қызметші сөзін көрсетпесе де болады:
<тег> <айнымалы>
Айнымалыны структураны құру кезінде де анықтауға болады:
struct тег {
тип1 иден1;
тип2 иден2;
… …
типN иденN;
} <айнымалы>;
Егер структура типті басқа айнымалылар құрылмайтын болса, структура тегін
көрсетпеуге болады. Мұндай структура атаусыз (безымянный) деп аталады:
struct {
тип1 иден1;
тип2 иден2;
… …
типN иденN;
} <айнымалылар тізімі>;
Структуралар іштестірілген де болуы мүмкін:
struct тег1 {
тип1 иден1;
тип2 иден2;
тип3 иден3;
};
struct тег2 {
тип1 иден1;
тип2 иден2;
struct тег1 иден3;
};
Структура элементтерін нүкте операторының көмегімен алуға болады:
<айнымалы>.<элемент>
Кейбір жағдайларда структураны функция денесінде қолдану қажеттігі
туындайды. Ондай жағдайда функция прототипінде структураны функция параметрі
ретінде беру керек (С++ тілінде struct қызметші сөзін көрсету міндетті емес):
// С және С++ тілдерінде
<функция типі> <функция аты> (struct <тег> <айнымалы>)
// Тек қана С++ тілінде
<функция типі> <функция аты> (<тег> <айнымалы>)
Структуралар массиві. Структуралар массивін сипаттау структура типті
айнымалыны сипаттауға ұқсас. Мысалы, struct <тег> <айнымалы-массив>
Структураларға көрсеткіш. Көрсеткіш келесі түрде сипатталуы мүмкін:
struct <тег> *<айнымалы>
Бұндай жағдайда структуралық айнымалының кез-келген элементін мына
әдістердің бірімен алуға болады:
(*<айнымалы>).<элемент> немесе <айнымалы> –> <элемент>
Біріктіру
Біріктіру структураған ұқсас. Жазылу ерекшелігі: struct қызметші сөзінің
орнына union сөзі қолданылады.
union тег {
тип1 иден1;
тип2 иден2;
… …
типN иденN;
};
Біріктірудің структурадан басты айырмашылығы жадыны ұйымдастыру
тәсілінде, яғни біріктірудің барлық элементтері жадыда бір байттан басталады.
Айталық, программада төмендегідей структура сипатталған болсын:
struct P
{ int i;
char ch;
long int L;
};
Бұл элементтердің жадыда орналасуы келесі түрде болады:
байт
байт
байт
байт
байт
байт
байт
i
ch
L
Структураның жалпы өлшемі оның өрістерінің ұзындықтарының қосындысына тең.
Енді, дәл осындай біріктіруді қарастырайық:
union P
{ int i;
char ch;
long int L;
};
Бұл элементтердің жадыда орналасуы келесі түрде болады:
байт
байт
байт
байт
ch
i
L
Біріктірудің жалпы өлшемі оның ең үлкен өрісінің өлшеміне тең.
Typedef қызметші сөзінің көмегімен бұрыннан бар типтердің негізінде жаңа
тип құруға болады. Бұл программа текстін ықшамдау үшін қажет. Мысалы,
Typedef int butin;
өрнегі butin сөзін int типінің синонимі ретінде қабылдауға мүмкіндік береді.
Мысал.
Мекеме қызметкерлері туралы мынадай мәліметтер берілген: аты-жөні, мекен-
жайы, еңбек стажы, еңбек ақысы. Қызметкердің мекен-жайы көшенің атынан,
үйінің және пәтерінің номерінен тұрсын.
Еңбек стажы 10 жылдан артық қызметкерлердің еңбек ақысын 20%-ке арттырып,
фамилиясымен қоса экранға шығаратын программа жазу.
Есептің қойылымы. Программада іштестірілген структура қолданамыз. Work
структурасы
қызметкерлер
туралы
мәліметтерден
тұрсын.
Структура
элементтері: fam, address, stazh, zarp. Address –– ul, dom, kv элементтерінен
тұратын cтруктуралық айнымалы. n – қызметкерлер саны.
Математикалық моделі.
zarp = zarp * 1.2 , егер stazh>=10
Программасы.
С тілінде
#include
struct adr {
char ul[15];
int dom;
int kv;
};
struct work {
char fam[25];
struct adr address;
int stazh;
float zarp;
} rab[10];
void main()
{ int i,n;
printf("\n Қызметкерлер саны n=");
scanf("%i",&n);
for(i=0;i
{ printf("%i- қызметкердің фамилиясы: ",i); scanf("%s",rab[i].fam);
printf("%i- қызметкердің тұратын көшесі: ",i);
scanf("%s",rab[i].address.ul);
printf("%i- қызметкердің үйінің номері: ",i);
scanf("%i",&rab[i].address.dom);
printf("%i- қызметкердің пәтерінің номері: ",i);
scanf("%i",&rab[i].address.kv);
printf("%i- қызметкердің еңбек стажы: ",i); scanf("%i",&rab[i].stazh);
printf("%i- қызметкердің еңбек ақысы: ",i); scanf("%f",&rab[i].zarp);
}
printf("\n Еңбек стажы 10 жылдан асатын қызметкерлер");
printf("\n Фамилиясы \t Еңбек ақысы");
for(i=0;i
if (rab[i].stazh>=10)
{ rab[i].zarp*=1.2;
printf("\n %s \t %f \n Мекен-жайы: %s \t %i-%i ", rab[i].fam, rab[i].zarp,
rab[i].address.ul, rab[i].address.dom, rab[i].address.kv);
}
}
С++ тілінде
#include
struct adr {
char ul[15];
int dom;
int kv;
};
struct work {
char fam[25];
struct adr address;
int stazh;
float zarp;
};
void main()
{ work rab[10];
int i,n;
cout<<"\nҚызметкерлер саны n="; cin>>n;
for(i=0;i
{ cout<>rab[i].fam;
cout<>rab[i].address.ul;
cout<>rab[i].address.dom;
cout<>rab[i].address.kv;
cout<>rab[i].stazh;
cout<>rab[i].zarp;
}
cout<<"Еңбек стажы 10 жылдан асатын қызметкерлер";
cout<<"Фамилиясы \t Еңбек ақысы";
for(i=0;i
if (rab[i].stazh>=10)
{ rab[i].zarp*=1.2;
cout<<"\n"<
<
}
}
Достарыңызбен бөлісу: |