
Массивтің сипатталуы.
Екі өлшемді массивтер
Екі өлшемді массивтерге мысалдар келтіру.
Массивтің сипатталуы. Массивтер бірдей типті және бір атты логикалық байланысқан жадының ұяшықтар тобы болып табылады. Массивтің элементіне қатынас жасау үшін массивтегі осы элементтің массивтің атын және позициясының нөмірін көрсету қажет. Кез келген массивтің бірінші элементі нөлдік реттік нөмерге ие болады. Массивті баяндағанда массивтің атын, әрбір элементінің типін және элементтерінің санын көрсету керек. Мысалы:
int b[100], x[27];
Төменде келтірілген программада 10 элементтен тұратын n бүтін типті массивтің элементтерін нөлмен инициалдау үшін for қайталау құрылымы қолданылады.
/* Массивті инициалдау */
#include <stdio.h>
main()
{ int n[10], i;
for (i=0; i<=9; i++)
n[i]=0; /* Массивті инициалдау */
for (i=0; i<=9; i++) /* Массив элементтерін шығару */
printf(“%3d%10d\n”, i, n[i]);
return 0; }
Программаның нәтижесі:
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 0
Массивтің элементтері массивті баяндаудың соңына теңдік белгісін және үтірмен бөлінген инициалданатын мәндер (фигурлы жақшаға алынған) тізімін қою жолымен инициалдауға болады. Төменде келтірілген программа бүтін типті массивті оң 10 мәндермен инициалдайды.
/* Баяндауда массивті инициалдау */
#include <stdio.h>
main()
{ int i, n[10]={2, 27, 64, 18, 95, 14, 90, 70, 6, 3};
for (i=0; i<=9; i++)
printf(“%3d”, n[i]);
return 0; }
Программаның нәтижесі:
2 27 64 18 95 14 90 70 6 3
Егер массивтің элементтеріне қарағанда инициалданатын мәндердің саны аз болса, онда қалған элементтер автоматты түрде нөлмен инициалданады. Мысалы, n массивтің элементтерін баяндау арқылы нөлдермен инициалдауға болады.
int n[10]={0};
мұнда бірінші элемент нөлмен инициалданады және қалған тоғыз элемент автоматты түрде нөлмен инициалданады.
Егер массивтің инициалданатын мәндердің тізімімен баяндауында массивтің өлшемі кқрсетілмесе, онда массивтің элементтерінің саны инициалдау тізіміндегі элементтердің санына тең болады.
Си тілінде массивтердің бірнеше индекстері болуы мүмкін. Көп өлшемді массивтер жиі жол және бағандар бойынша реттелген мәндерден тұратын кестелерді бейнелеу үшін қолданылады. Кесенің нақты элементін иднтификациялау үшін екі индекс көрсетіледі: бірінші-элементтің жолын көрсетеді, ал екіншісі бағанын көрсетеді. Осындай кестелер немесе массивтер екі өлшемді массивтер деп аталады.
Көп өлшемді массив бір өлшемді массив сияқты оның баяндалуында инициалдануы мүмкін. Мысалы,
int b[2][2]={{1, 2}, {3, 4}};
Келесі программа екі өлшемді массивтің баяндалу кезіндегі инициалдауын көрсетеді. Программада екі жол және үш бағанды (әрқайсысы алты элементтен тұрады) үш массив баяндалады. Әрбір массивтің элементтерін шығару үшін программада printarray функциясы шақырылады.
/* Көп өлшемді массивті инициалдау */
#include <stdio.h>
void printarray(int [][3]);
main()
{ int a1[2][3] = {{1, 2, 3}, {4, 5, 6}}, a2[2][3] = {1, 2, 3, 4, 5}, a3[2][3] = {{1, 2}, {4}},
printf(“Массив А1”);
printfarray(a1);
printf(“Массив А2”);
printfarray(a2);
printf(“Массив А3”);
printfarray(a3);
printf(“\n”);
return 0; }
void printarray(int a[][3]);
{ int i, j;
for (i=0; i<=1; i++)
{ for (j=0; j<=2; j++)
printf(“%d ”, a[i][j]);
printf(“\n”); }
}
Программаның нәтижесі:
Массив А1
1 2 3
4 5 6
Массив А2
1 2 3
4 5 0
Массив А3
1 2 0
4 0 0
Бақылау сұрақтары:
2. Екі өлшемді массив қалай енгізіледі және қалай шығарылады?
3. Қандай шартта бір массивтің барлық элементтерін басқа массивке беруге болады?
4. Екі массивті қалай салыстыруға болады?
5. Бір өлшемді және екі өлшемді массивтерді инициалдау мысалдарын келтіріңіз.
Ұсынылатын әдебиеттер: 1осн[223-253], 2осн[244-255], 5доп[41-46], 7доп[15-23]
№8 тақырып. Си тіліндегі функциялар.
Жоспары:
Функцияны құру және қолдану
Функция анықтамасы.
Функцияны баяндау: классикалық түрі.
Адресті операциялар.
Си тілінде барлық программалар функция ретінде қарастырылады. Әдетте, бұл тілдегі программалар көптеген кішкене функциялардан тұрады. қолданылатын әр функция үшін функцияның баяндалуы мен анықтамасы келтіріледі. (Функцияны баяндау оның типі және параметрлердің жазылу реті туралы ақпаратты береді. Функцияны анықтау кезінде орындалатын нақты операторлар көрсетіледі) Функциялар типі нәтиже ретінде қайтаратын мәндердің типімен бірдей болуы қажет. Егер типі берілмесе, онда функция типі үндеместен іnt болады. Егер функция басқа тип болса, онда ол шақырушы программада және функцияның өзінің анықтамасында көрсетілуі керек.
Функцияның баяндалуын қарастырайық: функцияны баяндаудың екі түрлі стилін (классикалық және қазіргі стиль) қолдануға болады. Бірінші жағдайда, функцияны баяндау форматы келесідей:
Тип функция_аты ();
Бұл спецификация функцияның атын және қайтаратын мәннің типін баяндайды.
қазіргі стиль ANSІ ұсынған Си тілінің кеңейтілген түрлерінің конструкцияларында қолданылады. Бұл Си тілінің түрінде функцияны баяндау кезінде “функция прототипі” деп аталатын тілдің арнайы құралдары қолданылады. Оның прототипін қолданып функцияны баяндау кезінде параметрлері туралы қосымша ақпарат болады:
Тип функция_аты(парам_ақпар1, парам_ақпар2, ...);
Бұндағы парам_ақпар1 параметрі - формальды параметрлердің аты және типі туралы мәлімет.
Функция анықтамасы. Функцияны баяндау сияқты оны анықтау кезінде де екі стильді қолдануға болады - классикалық және қазіргі. Функцияны анықтаудың классикалық форматы келесідей:
Тип функция_аты (параметрлер аты) параметрлер анықтамасы;
{
локалдық баяндау;
операторлар;
}
қазіргі стиль баяндалу форматы функция атынан кейін тұратын жақша ішіндегі функция параметрлерінің анықталуын қарастырады.
Тип функция_аты(парамақпар, парам_ақпар, ...);
Бұндағы, параметр анықтамасы парам_ақпар - берілетін параметр (тип және идентификатор) туралы ақпаратты сақтайды.
Функция ішінде (maіn() басты функциясынан басқа) тұрған баяндаулар тізбегі (константалар, мәліметтер типі, айнымалылар) тек осы функция ішінде анықталады. Сондықтан Си тілі ішкі циклдерді қамтымайды, яғни бір функция басқа функцияның ішінде баянала алмайды.
Функциялар программа ішінде әр түрлі ретте тұра береді және программаның барлық жеріне глобальды деп есептеледі, сосын қолданылмай тұрып баяндалған енгізілген функцияларды қосқанда да.
Функцияны шақыру функция аты және жақша ішінде аргументтері бойынша жүзеге асырылады.
Функцияның орындалу нәтижесі return операторы көмегімен қайтарылады. Жалпы түрі:
Return (өрнек);
Оператор функция жұмысын аяқтайды және басқаруды шақырған программадағы келесі операторға береді. Бұл return операторы функция денесінің соңғы операторы болмаса да, орындалады.
Return операторын мына түрде қолдануға болады:
return; return 0;
Оны қолдану ол тұрған функция жұмысын аяқтап, басқару шақырушы функцияға қайтады (беріледі). Оператордың жақшасының ішінде өрнек жоқ болғандықтан, функцияға ешқандай мән берілмейді.
Maіn()
{
float y, x, mult(); /*шақырушы программадағы баяндау*/
іnt n;
y=mult(x, n); }
float mult(v, k) /*функция анықтамасында баяндау*/
float v; іnt k;
{
float res;
for(res=0.0; k>0; k--)
res=res*v;
return(res); /*float типті мәнді қайтарады*/
}
Return операторы көмегімен шақырушы программаға тек бір ғана мән беріледі. Егер екі шама берілу керек болса, онда көрсеткіштерді қолдану керек.
Функция анықталуы атымен, формалды параметрлерімен және функция денесімен ерекшеленеді. Ол тағы да қайтаратын мәнінің типі және функцияның жады класы бойынша ерекшеленеді. Функцияны анықтау синтаксисі келесідей:
[<ЖК түрі>][<тип түрі>]<сипаттаушы>([<параметрлер тізбегі>])[<параметрлерді баяндау>]<функция денесі>
Жады класының түрі <ЖК түрі> функцияның жады класын береді. <Тип түрі> сипаттаушымен бірге қайтаратын мәннің типін және функция атын анықтайды. <Параметрлер тізбегі> өз кезегінде функцияны шақыру кезінде мәні берілетін формалды параметрлер атынан тұратын тзбек (бос болуы мүмкін). <Параметрлерді баяндау> формалды параметрлердің типтерін және идентификаторларды береді. <Функция денесі> - жергілікті айнымалыларды баяндаудан және операторлардан тұратын құрамды оператор.
қазіргі құрылымы:
[<ЖК түрі>][<тип түрі>]<сипаттаушы>([<параметрлерді баяндау тізімі>])<функция денесі>
Функцияны баяндау: классикалық түрі.
[<ЖК түрі>][<тип түрі>]<сипаттаушы>([<аргументтер типінің тізбегі>]); Функцияны баяндау функция атымен, қайтаратын мәнінің типімен және, мүмкін, оның аргументтерінің саны және типтерімен жүзеге асады.
Баяндаудың қазіргі стилі (прототиптерді баяндау). Аргументтер типінің тізбегінде прототипте осы аргументтердің идентификаторлары болуы мүмкін.
Float f1(float a; float b)
{
float c;
c=(2*pow(a, 3)+sіn(a))/pow(a+b, 4);
return c; }
maіn()
{
float x, y, s=0;
clrscr();
prіntf(“\nx, y-ті енгізіңіз ”);
scanf(“%f%f”, &x, &y);
s=f1(5.6, y)+f2(2*x-1,x*y);
prіntf(“\n s=%6.2f”, s);
return 0;
}
Адресті операциялар. Си екі арнайы адрестік операцияларды қолдайды: адресті анықтау операциясы (&) және адреске бағыттау (*). & операциясы берілген айнымалының адресін қайтарады. Егер sum іnt типті айнымалы болса, онда &sum осы айнымалының адресі болып табылады.
Бақылау сұрақтары:
1. Қосалқы программаның формальді және нақтылы параметрлерің бірдей болуы мүмкін бе?
2. Функцияның баяндалуында void() қашан қолданылады?
3. Қандай параметрлер формальді, ал қандай параметрлер нақтылы деп аталады?
4. Функцияның анықталуының және сипатталуының қандай стилдері бар?
5. Функцияның орындалу нәтижесін қайтару үшін қандай оператор қолданады?
Ұсынылатын әдебиеттер: 1 нег [173-205], 2 нег [256-290], 5 қос [51-54], 7 қос [23-28]
№9 тақырып. Си тіліндегі көрсеткіштер.
Жоспары:
Көрсеткіштер ұғымы.
Көрсеткіш-айнымалыны баяндау
Көрсеткіштерге қолданатын операциялар
Сілтеме арқылы параметрді беру
Көрсеткіштер. Көрсеткіш қандай да бір мәліметтің адресінен тұратын айнымалы болып табылады. Жалпы айтқанда, көрсеткіш - адрестің қандай да бір символикалық бейнеленуі. &sum бұл жағдайда “sum айнымалысына көрсеткіш” дегенді білдіреді. Адресі сан болса, ал &sum адреснің символикалық бейнеленуі көрсеткіш типті константа болып табылады. Сондықтан sum айнымалысына бөлінген жады ұяшығының адресі программа орындалғанда өзгермейді.
Си тілінде көрсеткіш типті айнымалылар да кездеседі. Көрсеткіш типті айнымалылар мәні қандай да бір шаманың адресі болып табылады. Көрсеткіш ptr идентификаторымен белгіленген болсын, сонда келесідей оператор sum адресін ptr айнымалысына меншіктейді: ptr=&sum. Бұл жағдайда ptr sum-ға “көрсетеді” деп айтады. Яғни, ptr - айнымалы, &sum - константа. Ptr айнымалысы басқа да бір объектіге “көрсете” алады:
ptr=&max.
Ptr мәні max айнымалысының адресі болып табылады. Адреске бағыттау операциясын (*) немесе жанама адрестеу операциясын қарастырайық, ptr айнымалысында max айнымалысына сілтеме болсын. Сонда осы айнымалының мәніне қол жеткізу үшін адреске бағыттау операциясын (*) қолдануға болады. Ptr көрсететін мәнді анықтау үшін келесі операторды жазамыз: res=*ptr; (Соңғы екі оператор, бірге алғанда, келесіге тең: res=max; Адресті алу және жанама адрестеу операциясын қолдану нәтижеге тура әкелмейді екен, операцияның атындағы “жанама” деген сөз де содан пайда болған).
(*) операциясы - осы таңбадан кейін айнымалыға көрсеткіш тұрса, операция нәтижесі көрсетілген адресі бар ұяшықта тұрған шама болып табылады.
Көрсеткіштерді баяндау. “Көрсеткіш” типті айнымалыны баяндағанда ол көрсеткіш қандай типті айнымалыға сілтеп тұрғанын көрсету керек. Өйткені әр түрлі типті айнымалы ұяшықтардың әр түрлі санын алады, және де көрсеткіштермен байланысты қандай да бір операцияларды орындағанда жадыда бөлінетін орынның көлемін білу керек. Көрсеткіштерді дұрыс баяндау мысалдары:
іnt *іptr;
char *cptr;
float *fptr.
Көрсеткіштерді функциялар арасындағы байланысты құру үшін қолдану. Көрсеткіштерді функциялар арасындағы байланысты құру үшін қолдануға мысал келтірейік. Бұл мысалда көрсеткіштер айнымалылардың мәнін ауыстыру үшін қолданылады.
Maіn()
{
іnt x=5, y=10;
prіntf(“x=%d y=%d\n”, x, y);
change(&x, &y); /*функция адрестерін беру*/
prіntf(“x=%d y=%d\n”, x, y);
}
change(u, v)
іnt *u, *v; /*u және v көрсеткіш болып табылады*/
{
іnt temp;
temp=*u; /*temp-ке u көрсетіп тұрған мән меншіктеледі*/
*u=*v;
*v=temp;
}
Берілген функция x және y айнымалыларының мәнін өзгертеді. X және y айнымалыларының адресін функцияға беру арқылы біз оларға қол жеткізуге мүмкіндік бердік. Көрсеткіштерді және (*) операциясын қолданып, функция жадыдағы сәйкес ұяшықтарда орналасқан шамаларды алуға және олардың орнын ауыстыруға мүмкіндік алды.
Көрсеткіш-айнымалыны баяндау және инициалдау. Көрсеткіштер дегеніміз мәндері жады адрестері болатын айнымалыларды айтады. Көрсеткіште нақты мәні бар айнымалының адресі бар болады. Айнымалы мәнге тікелей сілтенеді, ал көрсеткіш мәнге жанама сілтенеді. Мәнге көрсеткіш арқылы жанама сілтеме жанама адрестеу деп аталады.
Кез келген айнымалылар сияқты көрсеткіштер де қолданылмас бұрын баяндалуы қажет.
int *countPtr, count;
операторында int * (бүті санды мәнге көрсеткіш) типті countPtr айнымалысы баяндалған. Баяндалуда * символы countPtr-ге ғана таратылады. Бұл символ баяндалатын айнымалы көрсеткіш екенін көрсетеді. Кез келген типті объектілерге сілтенетін көрсеткіштерді баяндауға болады.
Көрсеткіштер баяндалу кезінде немесе меншіктеу операторының көмегімен инициалдануы қажет. Көрсеткіш нөлмен, NULL макросымен немесе адрестің мәнімен инициалдануы мүмкін. NULL мәнді көрсеткіш ешнәрсеге көрсетпейді. 0 мәнді көрсеткіштің инициалдануы NULL тұрақтылы көрсеткіштің инициалдануымен бірдей, бірақ NULL-ді қолданған маңыздырақ. 0 мәні меншіктелгенде, ол сәйкес типті көрсеткішке түрленеді. 0 мәні көрсеткіш-айнымалыға тікелей меншіктелетін жалғыз бүтін сан болып табылады.
Көрсеткіштерге қолданатын операциялар. Си тілі көрсеткіштерге 5 негізгі операциялар қолданатынуға болады:
1. Меншіктеу. Көрсеткішке адресті меншіктеуге болады. Массивтің атын немесе адресті анықтайтын (&) операциясын қолданып, әдетте адресті меншіктеуге болады.
2. Мәнді анықтау. Берілген адрес бойынша қайсібір ұяшықта сақталған мәнді анықтау үшін (*) операциясы қолданылады.
3. Көрсеткіштің адресін анықтау. Көрсеткіш типті айнымалының басқа айнымалылар сияқты адресі және мәні болады. & операциясы арқылы көрсеткіштің адресін анықтауға болады.
4. Көрсеткіштерді арттыру. Бұл амал қарапайым қосу операциясы немесе арттыру операциясы арқылы орындалады. Көрсеткішті арттыру арқылы массивтің келесі элементіне өтуге болады.
5. Көрсеткіштердің айырымы. Екі көрсеткіштің айырмасын табуға болады. Әдетте бұл операция элементтері бір-бірінің арасындағы ара қашықтықты табу үшін бір массив элементтеріне сілтенетін көрсеткіштер үшін орынды. Нәтиже массив өлшемін бар болдыратын айнымалының типіндей болады.
Көрсеткіштерге келесі арифметикалық операцияларды қолдануға болады: ++, --, +, +=, -, -= және екі көрсеткіштің айырмасын анықтауға болады.
Мысал ретінде бірінші элементі жадыдағы адресі 3000-ға тең болатын int v[10] массивін анықтаймыз. Инициалданатын адресі мәні v[0] vPtr көрсеткіші , яғни vPtr мәні 3000-ға тең, кез келгені келесі операторлардың бірімен
vPtr = v;
vPtr = &v[0];
Көрсеткішке бүтін санды қосқаннан немесе азайтқаннан оның мәні бұл санға емес, көрсеткіш сілтенетін объектінің өлшеміне тең санның көбейтіндісіне көбейеді немесе азаяды.
Байт бойынша объектінің өлшемі объекті типіне байланысты. Мысалы,
vPtr += 2;
операторы 3008 (3000+2*4) нәтижесін береді, егер бүтін сан үшін жадыда 4 байт бөлінсе. Енді vPtr v[0] элементіне сілтенеді.
Егер vPtr v[0] массив элементінің адресіне сәйкес болатын 3016 мәнге дейін көбейген болса, онда
vPtr -= 4;
операторы vPtr массивтің басына сәйкес болатын 3000 мәнге қайтарар еді. Көрсеткіш бірге көбейгенде немесе азайғанда инкремент (++) және декремент (--) операцияларын қолдануға болады. Әрбір келесі операторлар массивтің келесі элементіне сілтенетін көрсеткіштің мәнін көбейтеді:
++vPtr;
vPtr++;
Кез келген келесі операторлар массивтің алдыңғы элементіне қатынасатын көрсеткіштің мәнін азайтады:
--vPtr;
vPtr--;
Көрсеткіш-айнымалылар бір-бірінен азайтыла алады. Мысалы, vPtr мәні 3000-ға тең болса, ал v2Ptr 3008 адресіне ие болса, онда
x = v2Ptr - vPtr;
операторының орындалған нәтижесінде х айнымалысына vPtr адресінен бастап v2Ptr адресіне дейін орналастырылған, берілген жағдайда 2 мәні болады, массив элементтерінің саны меншіктеледі.
Екі көрсеткіште бірдей типті болса, көрсеткіш келесі көрсеткішке меншіктеле алады. қарсы жағдайда оң жақтағы көрсеткіш типті меншіктеу операторын сол жақтағы көрсеткіш типке келтіру операциясын қолдану керек.
Сілтеме арқылы параметрді беру. Си тілінде сілтеме бойынша шақыруды ұйымдастыру үшін көрсеткіштер және жанама адрестеу операциялары қолданылады. Аргументтері өзгеріп отыратын функция шақырылса, онда бұл жағдайда оған аргумент адресі беріледі. Әдетте бұл мақсатқа мәні өзгеріп отыратын айнымалыға адресті алу (&) операциясы қолданылады. Функцияға айнымалының адресі берілгенде оның мәнін өзгерту үшін жанама адрестеу (*) операциясы қолданылуы мүмкін. Келесі программада параметрді сілтеме бойынша беруге мысал келтірілген.
#include <stdio.h>
main()
{ int x=5, y=10;
printf(“x=%d y=%d\n”, x, y);
change(&x,&y); /* функцияның адрестерін беру */
printf(“x=%d y=%d\n”, x, y); }
change (int *u, int *v)
{ int temp;
temp=*u; /* u сілтейтін мәнді temp-ке меншіктеу */
*u=*v;
*v=temp; }
Программаның нәтижесі:
x=5 y=10
x=10 y=5
Берілген функция x және yайнымалыларының мәнін өзгертеді. x және y айнымалылар адресінің функцияларын беру жолы бойынша біз оған оларға қатынас жасауға мүмкіндік бердік. Көрсеткіштерді және (*) операциясын қолдану арқылы функция жадының сәйкес ұяшығында орналастырылған өлшемдерді шығарды және оларды орындарымен ауыстыра алды.
Бақылау сұрақтары:
1. Көрсеткіштермен жұмыс істегенде қолданатын операцияларды ата.
2. Көрсеткіштің мәні көрсеткіштен бүтін санға қосқанда қандай санға өседі?
3. Көрсеткіш-айнымалыны инициалдауға мысал келтір.
4. Көрсеткіш-айнымалыны баяндауға мысал келтір.
5. Қандай операция сілтеме бойынша шақыруды ұйымдастырғанда қолданылады?
Ұсынылатын әдебиеттер: 1нег [273-292], 2 нег [273-276], 6 қос [135-147]
№10 тақырып. Массивтерді өңдеу барысында көрсеткіштерді қолдану
Жоспары:
Массивтер және көрсеткіштер.
Массивтердің көрсеткіштері.
Көрсеткіштерді қолдану.
Массивтер және көрсеткіштер. Массивтерді баяндағанда мәліметтер типі және талап етілетін жады класы көрсетіледі. қарапайым айнымалылар жағдайындағы қарастырылған сәйкес қасиеттер массивтерге де баяндағанда қолданылуы мүмкін. Массивті баяндауға мысал қарастырайық:
int b[30]; /*30 бүтін элементтен тұратын сыртқы массив*/
float a[30]; /*30 саннан тұратын float типті автоматты массив*/
static char c[20]; /* 20 символдан тұратын статикалық массив*/
extern b[ ]; /*сыртқы массив; өлшемі жоғарыда келтірілген*/
}
Жадылар класына байланысты сыртқы, статикалық, автоматты және регистрлік массивтер болып ерекшеленеді. Массивті инициалдауды қарастырайық. Типті баяндауда тек қана сыртқы және статикалық массивтерді ғана инициалдауға болады. Сыртқы және статикалық массивтерді баяндау келісім бойынша осы массив элементтерінің нөлденуіне әкеледі. (Сонымен, статикалық және сыртқы массивтерді нөлдеу үшін ешқандай шара қолданбауға болады). Сыртқы массивтің инициалдануына мысал қарастырайық, массив элементтерінің мәндері потоктың әрбір тобының студенттер саны болады:
int stud[10]={10,12,14,16,12,10,17,10,15,13};
main( )
{ int i;
extern int stud{ }; /*маңызды емес баяндалу*/
for (i=0; i<10; i++)
printf(“Группа N %d %d студентов”, i+1, stud[i]); }
stud[10] массиві жақшаларға алынған тізіммен инициалдаған, тізімнің элементтерін үтір арқылы бөлген. Тізімдегі элементтер саны массивтің өлшеміне сәйкес болуы қажет. Егер Тізімдегі элементтер саны массивтің өлшемінен аз болса, онда қалған массив элементтері нөлдік мәндерге ие болады. Егер тізімде элементтер көп болса, онда қате тура хабарланады.
Массив элементтерін инициалдауды келесі түрде де көрсетуге болады:
int stud[ ]={10,12,15,16,17,11,18,10};
main ( )
{ int i;
extern int stud [ ];
for (i=0; i<sizeof stud/(sizeof(int)); i++)
printf (“Группа N %d %d студентов.\n”,i+1,stud[i]); }
Егер массивті инициалдауға бос батырмалар лар қолданылса, онда компилятор өзі тізімдегі элементтер санын анықтайды және ол үшін қажетті өлшемдегі массивті белгілейді. Массивтің өлшемін анықтау үшін sizeof операторы қолданылады. sizeof операторы объектінің немесе типтің өлшемін байтпен анықтайды. Массив элементтерінің санын анықтау үшін массив орын алатын жалпы байттар санын 2-ге бөледі (берілген жүйеде int типті әрбір элементтің өлшемі 2 байтқа тең). Жалпы жағдайда сәйкес типтің sizeof айнымалысының мәніне бөледі.
Массивтердің көрсеткіштері. Жоғарыда айтылғандай, көрсеткіштер символдық адрестермен жұмыс істеуді ұйымдастырады. (Бұл жағдайда массивті өңдеу тиімдірек ұйымдасады). Массивті белгілеу жасырын түрде көрсеткіштерді қолдану болып табылады.
Мысалы, массивтің аты сондай-ақ соңғы элементті анықтайды, яғни егер a[] массив болса, онда соңғысы a[0].
Екі мәнде барлық программаның барысында өзгермейтін болғандықтан, көрсеткіш типті константа болады. Оларды көрсеткіш типті айнымалыға (мән ретінде) меншіктеуге болады және айнымалының мәнін өзгертуге болады. Көрсеткіштің мәніне сан қосылатын мысалды қарастырайық:
{ int a[4], *pti, i;
float b[4], *ptf;
pti=a; /*массив көрсеткішіне адресті меншіктейді */
ptf=b;
for (i=0, i<4,i++)
printf(“көрсеткіш +%d: %8u %10u\n”, i, pti+i, ptf+i); }
Нәтиже:
көрсеткіш +0: 56014 56026 (массивттердің бастапқы адрестері)
көрсеткіш +1: 56016 56030 (адреске бірді қосқандағы нәтиже)
көрсеткіш +2: 56018 56034
көрсеткіш +3: 56020 56038
Адрестеудің бірлігі байт болып табылады, бірақ int типі 2 байтты, ал float типі 4 байтты қолданады.
«Көрсеткішке бірді қосу»-компилятор бірді жадыға қосады. Массив үшін бұл келесі байт емес, келесі элементтің адресіне көшу болып табылады. Сондықтан да көрсеткіш сілтенетін объектінің типі арнайы ескертіледі.
Келесі теңдікті қарастырайық:
a+2==&a[2]; /*екеуі де бірдей адрес*/
*(a+2)==a[2]; /*екеуі де бірдей мән*/
Бұл ара қатынастар массивтер мен көрсеткіштердің арасындағы байланысты көрсетеді, яғни көрсеткішті массивтің жеке элементін, сондай-ақ оның мәнін анықтау үшін қолдануға болады.
Нақтылы біз екі әртүрлі белгілеулерді бірдей қолданамыз. Шыныменде, компилятор массив белгілуін көрсеткіштерге айналдырады, сондықтан көрсеткіштер әдістері маңыздырақ.
Көрсеткіштерді қолданып, массивтермен жұмыс істеу. Массивтерді қолданатын функцияны қарастырайық, содан кейін осы функцияны көрсеткіштерді пайдаланып, жазу керек.
int func(a, l)
int a[ ], l;
{ int i, sum;
for (i=0, sum=0; i<l; i++)
if (a[i]%2!=0)
sum+=a[i];
return (sum); }
for (i=0,sum=0;i<l; i++)
sum+=a[i];
return ((int) (sum/l)); }
Шақырушы функцияда шақырылатын операторды келесі түрде жазуға болады:
func(x, size);
Функцияны көрсеткіштерді қолданып, қайтадан жазамыз. Ра-ны int типіне сілтенетін көрсеткіш деп баяндаймыз. Содан соң a[i] массив элементтерін сәйкесінше *(pa+i) мәніне ауыстырамыз.
int func(pa, l)
int *pa, l;
{ int i, sum;
for (i=0, sum=0; i<l; i++)
sum+=*(pa+i);
return ((int) (sum/l));
}
for (i=0, sum=0; i<l; i++)
if (*(pa+i)%2!=0)
sum+=*(pa+i);
return (sum); }
Функцияны шақыру сол түрінде қалады:
func(x, size)/
Массив аты көрсеткіш болғандықтан, келесі баяндалу операторлары әрекеттері бойынша ұқсас, яғни екеуі де ра көрсеткішімен баяндалады.
int pa[ ]; и int *pa;
Программада бұлардың кез келгенін қолдануға болады, әйтсе де біз екінші түрін *(pa+i)-ды қолданамыз.
Екі өлшемді массивтермен жұмыс істегенде көрсеткіштерді қолдану. a[3][2] массивін қарастырамыз.
int a[3][2]; /* 3 жолдан және 2 бағаннан тұратын int типті массив */
int *pri; /* бүтін типке сілтейді */
pri=a; /* көрсеткіш a[0][0] элементіне сілтейді */
a==&a[0][0]; /* pri+1 көрсеткіші a[0][1] элементке сілтейді */
Бұл массивті қарастырғанда келесі теңдеулер орынды:
pri==&a[0][0]; /* 1-ші жол, 1-ші баған */
pri+1==&a[0][1]; /* 1-ші жол, 2-ші баған */
pri+2==&a[1][0]; /* 2-ші жол, 1-ші баған */
pri+3==&a[1][1]; /* 2-ші жол, 2-ші баған */
pri+4==&a[2][0]; /* 3-ші жол, 1 -ші баған */
pri+5==&a[2][1]; /* 3-ші жол, 2-ші баған */
Екі өлшемді массив бір өлшемді массивтерден құрылған массив ретінде қарастырылуы мүмкін. Яғни, берілген екі өлшемді массив 3 жолдан тұрады, ал әрбір жол 2 элементтен тұратын массив болып табылады. Бірінші жолдың аты a[0], екінші жолдың аты a[1 ], үшінші жолдың аты a[2]. Массивтің аты берілген массивтің көрсеткіші болып табылады, яғни ол массивтің 1-ші элементіне сілтейді. Сонымен келесі теңдеулер орынды:
a[ 0]==&a[0][0]
a[ 1]==&a[1][0]
a[ 2]==&a[2][0].
Бұл қасиет бір өлшемді массивке арналған функцияны екі өлшемді массивпен жұмыс істеу үшін мүмкіндік береді.
main( )
{ static int b[3][4]={{6,4,8,10},
{10,20,30,40},
{20,40,60,80}};
int i;
for (i=0; i<3; i++)
printf(“Среднее значение строки %d равно %d\n”, i, func(b[i], 4));
/*b[i] - 4 элементтен тұратын бірөлшемді массив*/
}
/*Бірөлшемді массивтен орта мәнді табу*/
int func(x, n)
int x[ ],n;
{ int l;
float s;
for (l=0, s=0; l<n; l++)
s+=x[l];
return ((int) (s/n));
Бөлшектеп емес, барлық циклдарымен бірге екі өлшемді массивпен жұмыс істейтін функцияны баяндау үшін функцияның анықтамасын және оның баяндалуын дұрыс жазу қажет.
main() функциясы келесі түрге ие болады:
main()
{ static int b[3][4]={{6,4,8,10},
{10,20,30,40},
{20,40,60,80}};
sr(b); }
sr(b) функцияның басы келтірілген:
sr(b)
int b[ ][4];
int mult (int b[ ][4], int m)
{ int i, j; p=1;
for (i=0; i<m; i++)
for (j=0; j<4; j++)
if (b[i][j]!=0) p=p*b[i][j]; }
Тағы бір әдісті қарастырамыз:
b[5,4] массиві берілген. Келесі баяндалуды келтіруге болады.:
mult (int a[ ], int size)
Функцияға қатынасқанда келесі түрді аламыз:
mult (b, 5*4); (b 20 элементтен тұратын бірөлшемді массив ретінде қарастырылады).
Бақылау сұрақтары:
1. Массивтің әртүрінің инициалдануына мысал келтір.
2. Мән ретінде көрсеткіштер нені сақтайды?
3. Көрсеткішті инициалдаған кезде қандай үш мән қолданылуы мүмкін?
4. Адресті алу операциясы қай жады класс айнымалыларына қолдануға болмайды?
5. Массивтің аты массивтің қай элементіне көрсеткіш бола алады?
Ұсынылатын әдебиеттер: 1 нег [295-304], 2 нег [346-370], 3 нег [84-108], 6 қос [135-190], 8 қос [4-13]
№11 тақырып. Символдық жолдар және жолдарға қолданылатын функциялар.
Жоспары:
Символдық қатарларды баяндау.
Символдық қатарлардан тұратын массивтер.
Символдарды өңдеу библиотекасы.
Қатарларды түрлендіру функциялары
Стандартты енгізу/шығару библиотекасының функциялары
Символдық қатарларды баяндау. Символдық қатарларды бірнеше әдістер арқылы анықтауға болады. Келесі әдістер негізгі әдістерге жатады:
- қатарлық константаларды қолдану;
- символдық қатарлардан тұратын массивтерді және char типті массивтерді қолдану.
қатарлық константалар тырнақшаларға алынады. Тырнақшаларға алынған символдар және қатарлардың ең соңғы ‘/0’ символы жадының тізбектелген ұяшықтарында жазылады. Компилятор қатарды жадыға орналастырғанда жадының қажетті өлшемін анықтау үшін символдардың санын есептейді. қатарлық константаларды #define директивасының көмегімен анықтауға болады. Егер қатарда тырнақша символын қолдану керек болса, онда бұл символдың алдына кері бөлшек сызығы жазылады. Мысалы:
printf (“\” Сведения о сессии”\n”);
қатарлық константа осы жол жазылған жадыдағы орынға сілтейтін көрсеткіш болып табылады. Символдық қатарлардың массивін анықтағанда компилятор жадыдының қажетті өлшемін анықтау үшін массивті баяндағанда қатарлық константа арқылы инициалдауға болады. (Статикалық және сыртқы массивтер қолданылады).
char c[ ]=”Определение максимального балла”; (сыртқы массив)
Әдеттегі массивтерді қолданған жағдайдағы сияқты бұл массивтің аты с, осы массивтің 1-ші элементіне сілтейтін көрсеткіш болып табылады.
c==&c[0]; *c==’0’, және *(c+1)==c[1]==’n’;
қатарларды анықтау үшін көрсеткіштерді қолданамыз. Мысалы:
char *c1=”\n ввод баллов”;
Осы баяндалуға келесі баяндалу эквивалентті:
static char c1[ ]=”\n ввод баллов”;
қарастырылған қатардың екі баяндауы с1 қатардың көрсеткіші екенін көрсетеді. Жадының қажетті өлшемін айқын көрсетуге де болады. Сыртқы баяндауда келесі қатарды мына түрде жазуға болады:
char c[35]=”определение максимального балла”; вместо
char c[ ]=”определение максимального балла”;
Элементтердің саны қатардың ұзындығынан бір символға артық болуы керек (нөль-символын есептегенде).Басқа статикалық немесе сыртқы массивтердегідей кез келген қолданылған элементтер автоматты түрде нөлмен инициалданады (символдық түрде бұл нөль санының символыны емес, нөль-символы болып табылады).
Символдық қатарлардан тұратын массивтер. Әрбір жолы символдық массив болып табылатын символдық қатарлардан тұратын массивтерді қарастырайық. Статикалық массивтің баяндалуын келесі түрде келтірейік:
static char *m[4]={“регистр”,”ячейка”,”указатель”,”элемент”};
*m[4] массиві символдық қатарларға сілтейтін 4 көрсеткіштен тұрады. Сонымен, символдық қатарлар массивтер болып табылатын болса, онда осы массивтерге сілтейтін 4 көрсеткіш қарастырылады. 1-ші жолға сілтейтін 1-ші көрсеткіш болып m[0]-ші табылады. 2-ші жолға сілтейтін 2-ші көрсеткіш m[1]. Сонымен, әрбір көрсеткіш сәйкес қатардың ең бірінші символына сілтейді.
*m[0]==’р’; *m[1]==’я’; *m[2]==’у’; *m[3]==’э’;
инициалдау массивтерге арналған ережелер бойынша орындалады. Тырнақшаларға жазылатын текстер жақшалы жазбаларға эквивалентті:
{{…},{…},…,{…}};
қатарлардан құрылған массивтерді баяндағанда символдық қатарлардың өлшемін көрсетуге де болады және бұл баяндалуда қатарлардың ұзындығы бірдей болады:
static char m[4][10];
статикалық (сыртқы) массивтің қатарларының қолданылмаған (артық) элементтері ‘/0’ (нөль-символымен) символымен инициалданады.
Артық элементтер (яғни, жады тиімді жұмсалу үшін) болмас үшін келесі баяндалуларды қолдануға болады:
static char *[4];
Мұнда әрбір қатардың ұзындығы массивтің сәйкес қатарын инициалдайтын нақтылы қатармен анықталады.
Символдарды өңдеу библиотекасы. Символдарды өңдеу библиотекасы символдық мәліметтермен бір қатар пайдалы тексерістер мен операцияларды орындайтын бірнеше функциялардан тұрады. Әрбір функция аргумент ретінде int типін немесе EOF (файл соңы) индикаторын ұсынатын символды қабылдайды. Символдарды өңдеу библиотекасының функцияларымен жұмыс істеу үшін <ctype.h> тақырыптық файлды қосамыз. Кестеде символдарды өңдеу библиотекасының функциялар тізімі келтірілген.
Кесте-Символдарды өңдеу библиотекасының функциялары
Прототип |
Функциялардың баяндалуы |
int isdijit (int c) |
Егер с сан болып табылса , онда True мәнін қайтарады және басқа жағдайларда 0 (false) |
int isalpha (int c) |
Егер с әріп болып табылса, онда True мәнін қайтарады және басқа жағдайларда 0 |
int isalnum (int c) |
Егер с сан немесе әріп болып табылса, онда True мәнін қайтарады, және басқа жағдайларда 0. |
int isxdijit (int c) |
Егер с он алтылық форматтағы символдардың бірі болса, true мәнін қайтарады және басқа жағдайларда 0. |
int islower (int c) |
Егер с төмеңгі регистрдің әрпі болса, true мәнін қайтарады және басқа жағдайларда 0. |
int isupper (int c) |
Егер с жоғарғы регистрдің әрпі болса, true мәнін қайтарады және басқа жағдайларда 0. |
int tolower (int c) |
Егер с жоғарғы регистрдің әрпі болса,онда tolower с-ны төмеңгі регистрдің әрпі ретінде қайтарады. Басқа жағдайларда tolower аргументті өзгеріссіз қайтарады. |
int toupper (int c) |
Егер с төмеңгі регистрдің әрпі болса,онда toupper с-ны жоғарғы регистрдің әрпі ретінде қайтарады. Басқа жағдайларда toupper аргументті өзгеріссіз қайтарады. |
int isspace (int c) |
Егер с бос орын (пробел) символы (' ') , жаңа бет (‘\f’), жаңа жол (‘\n’), каретканы қайтару (‘\r’), горизонтальді табуляция (‘\t’) или вертикальді табуляция (‘\v’) болып табылса, онда true мәнін қайтарады және басқа жағдайларда 0. |
int iscntrl (int c) |
Егер с басқарушы символ болса, онда true мәнін қайтарады және басқа жағдайларда 0. |
int ispunct (int c) |
Егер с баспаға шығарылғандағы бейнеленетін символ болып тпбылса, true мәнін қайтарады, бірақ бос орын символдаына, сандарға немесе әріптерге қатынасы жоқ және басқа жағдайларда 0. |
int isprint (int c) |
Егер с баспаға шығарылғандағы бейнеленетін символ болып тпбылса, true мәнін қайтарады, мұнда (' ') бос орын символын қосқанда және басқа жағдайларда 0. |
int isgraph (int c) |
Егер с баспаға шығарылғандағы бейнеленетін символ болып тпбылса, true мәнін қайтарады, мұнда (' ') бос орын символын қосқпағанда және басқа жағдайларда 0. |
Қатарларды түрлендіру функциялары. қатарларды түрлендіру функцияларымен жұмыс істеу үшін <stdlib..h> тақырыптық файлды қосу қажет. Бұл функциялар сандар қатарларын бүтін мәндерге және жылжымалы нүктелі мәндерге түрлендіреді. Кестеде қатарларды түрлендіру функциялар тізімі келтірілген.
Кесте-қатарларды түрлендіру функциялары
Прототип |
Функциялардың баяндалуы |
double atof (const char *nPtr) |
nPtr қатарын double типіне түрлендіреді. |
int atoi (const char *nPtr) |
nPtr қатарын int типіне түрлендіреді. |
long atol (const char *nPtr) |
nPtr қатарын long int типіне түрлендіреді. |
double strtod (const char *nPtr, char **endPtr) |
nPtr қатарын double типіне түрлендіреді. |
long strtol (const char *nPtr, char **endPtr, int base) |
nPtr қатарын long типіне түрлендіреді. |
unsigned long strtoul (const char *nPtr, char **endPtr, int base) |
nPtr қатарын unsigned long типіне түрлендіреді. |
Стандартты енгізу/шығару библиотекасының функциялары. Стандартты енгізу/шығару библиотекасы <stdlib.h> символдық және қатарлық мәліметтермен жұмыс істеуге арналған бірнеше функциялардан тұрады. Кестеде стандартты енгізу/шығару библиотекасынан символдар мен қатарларды енгізу/шығару функцияларының тізімі келтірілген.
Кесте- Стандартты енгізу/шығару библиотекасының символдық мен қатарларлық функциялары
Прототип |
Функциялардың баяндалуы |
int getchar (void) |
Стандартты енгізу құралынан келесі символды енгізеді және бүтін формат түрінде қайтарады. |
char *gets (char *s) |
S массивіне стандартты енгізу құралынан символды жаңа жолдың символын немесе файл соңының индикаторын кездестіргенше егізеді. Осыдан кейін массивке шектелетін NULL символы қосылады. |
int putchar (int c) |
С-да сақталынатын символды баспаға шығару. |
int puts (const char *s) |
Келесі символы жаңа қатар болатын s қатарын баспаға шығару. |
int sprintf (char *s, const char *format, …) |
Нәтиже экранда бейнеленбей s массивінде сақталалуымен ерекшеленетін printf функциясына эквивалентті. |
int sscanf (char *s, const char *format, …) |
Енгізу клавиатура арқылы емес s массиві бойынша орындалалумен ерекшелінетін scanf функциясына эквивалентті. |
Бақылау сұрақтары:
1. Қатарларды анықтаудың әртүрлі әдістерін ата?
2. Стандартты енгізу/шығару <stdio.h> библиотекасы қандай функциялардан тұрады?
3. Қатарларды түрлендіру библиотекасымен жұмыс істеу үшін қандай тақырыптық файлды қосу қажет?
4. Қатарларды өңдеу библиотекасымен жұмыс істеу үшін қандай тақырыптық файлды қосу қажет?
5. Регистрлердің символын өзгерту үшін қандай функциялар қолданылады?
Ұсынылатын әдебиеттер: 1 нег [325-355], 2 нег [371-405], 6 қос [116-126], 8 қос [13-16]
№12 тақырып. Жолдарға қолданылатын операциялардың функциялары.
Жоспары:
Қатарларға қолданылатын функциялар.
қатарларды салыстыру функциялары
іздеу функциялары
Қатарларды өңдеу библиотекасындағы басқа функциялар
Қатарларды өңдеу библиотекасындағы қатарларға қолданылатын функциялар. қатарларды өңдеу библиотекасы қатарларды анықтау және қатарларды лексемаларға бөлу үшін, символдарды және басқа қатарларды іздеу үшін, қатарларды салыстыру үшін, қатарлық мәліметтерге қолданылатын операцияларды орындау үшін көптеген пайдалы функцияларды ұсынады. қатарларды өңдеу библиотекасымен жұмыс істеу үшін <string.h> тақырыптық файлын қосу қажет. Кестеде бұл функциялардың тізімі келтірілген.
Кесте-қатарларды өңдеу библиотекасындағы функциялар
Прототип |
Функциялардың баяндалуы |
char *strcpy(char *s1, const char *s2); |
s2 қатарын s1 қатарына көшіреді. s1 мәнін қайтарады. s2 қатарының құрамын сыйдыру үшін s1 қатарының жеткілікті өлшемін бар деп жорамалдайды. |
char *strncpy(char *s1, const char *s2, size_t n); |
s1 қатарына s2 қатарынан n-нан көп емес символдарды көшіреді. s1 мәнін қайтарады.. |
char *strcat(char *s1, const char *s2); |
s1 қатарын s2 қатарымен біріктіреді. s1 қатарының NULL символын s2 қатарының бірінші символына көшіреді. s1 мәнін қайтарады.. |
char *strncat(char *s1, const char *s2, size_t n); |
s1 қатарымен s2 қатарының n-нан көп емес символдардын біріктіреді. s1 қатарының NULL символын s2 қатарының бірінші символына көшіреді.s1 мәнін қайтарады.. |
Қатарларды өңдеу библиотекасындағы қатарларды салыстыру функциялары. Кестеде функциялардың прототиптері мен әрқайсысының қысқаша баяндалуы келтірілген.
Кесте-Салыстыру функциялары
Прототип |
Функциялардың баяндалуы |
int strcmp(const char *sl, const char *s2); |
sl қатарын s2 қатарымен салыстырады. Функция 0-ді, 0-ден кіші немесе нөлден үлкен мәнді қайтарады, егер sl сәйкесінше s2-ге тең, кіші немесе үлкен болса. . |
int stricmp(const char *sl, const char *s2); |
Төмеңгі және жоғарғы регистрлердегі символдардың арасындағы ерекшеліктерді ескермей-ақ s1 қатарын s2 қатарымен салыстырады. Функция 0-ді, 0-ден кіші немесе нөлден үлкен мәнді қайтарады, егер sl сәйкесінше s2-ге тең, кіші немесе үлкен болса. |
int strncmp(const char *sl, const char *s2, size_t n); |
s1 қатарының n-ге дейіңгі символдарын s2 қатарымен салыстырады. Функция 0-ді, 0-ден кіші немесе нөлден үлкен мәнді қайтарады, егер sl сәйкесінше s2-ге тең, кіші немесе үлкен болса. |
int strnicmp(const char *sl, const char *s2, size_t n); |
Төмеңгі және жоғарғы регистрлердегі символдардың арасындағы ерекшеліктерді ескермей-ақ s1 қатарының n-ге дейіңгі символдарын s2 қатарымен салыстырады. Функция 0-ді, 0-ден кіші немесе нөлден үлкен мәнді қайтарады, егер sl сәйкесінше s2-ге тең, кіші немесе үлкен болса. |
Қатарларды өңдеу библиотекасындағы іздеу функциялары. Кестеде функциялардың прототиптері мен әрқайсысының қысқаша баяндалуы келтірілген.
Кесте-Іздеу функциялары
Прототип |
Функциялардың баяндалуы |
char *strchr(const char *s, int c) |
S қатарындағы с символдың біріншіші кірісіндегі позициясын анықтайды. Егер с табылса, онда функция s қатардағы с -ке көрсеткішті қайтарады. қарсы жағдайда NULL мәнді көрсеткіш қайтарылады. |
char *strrchr(const char *s, int c) |
S қатарындағы с символдың соңғы кірісіндегі позициясын анықтайды. Егер с табылса, онда функция s қатардағы с -ке көрсеткішті қайтарады. қарсы жағдайда NULL мәнді көрсеткіш қайтарылады. |
size_t strspn(const char *s1, const char *s2) |
S2 қатарына кіретін символдардан тұратын s1 қатарының бастапқы сегментінің ұзындығын қайтарады және анықтайды. |
size_t strcspn(const char *s1, const char *s2) |
S2 қатарына кірмейтін символдардан тұратын s1 қатарының бастапқы сегментінің ұзындығын қайтарады және анықтайды. |
char *strpbrk(const char *s1, const char *s2) |
S1 қатарынан s2 қатарының кез келгегн симводарының ішінен бірінші кірісіндегі позициясын табады. Егер s2 қатарынан символ табылса, онда функция көрсеткішті s1 қатардағы сол символға қайтарады. қарсы жағдайда NULL мәнді көрсеткіш қайтарылады. |
char *strstr(const char *s1, const char *s2) |
S2 қатардың ішіндегі қатардың бірінші кірісіндегі позициясын табады. Егер қатар ішіндегі қатар табылса, онда функция көрсеткішті s1 қатардағы қатар ішіндегі қатарды қайтарады. қарсы жағдайда NULL мәнді көрсеткіш қайтарылады. |
char *strtok(char *s1, const char *s2) |
Функцияның тізбектелген шақырылуы s1 қатарының s2 қатарындағы символдарға бөлінген лексемаларға (текстік қатардағы сөздер сияқты логикалық бөлімдер) ұсақтаумен орындалады. Функция бірінші рет шақырылғанда аргумент ретінде s1 қатарын алады, ал келесі шақырылуларда сол қатарды ұсақтауды жалғастыру үшін бірінші аргумент ретінде NULL беріледі. Әрбір шақырылуда көрсеткіш s1 қатарының ағынды лексемасына қайтарылады. Егер функция кезекті шақырылуында қатарда лексема қалмағанын анықтаса, онда NULL қайтарылады. |
Қатарларды өңдеу библиотекасындағы басқа функциялар. Кестеде қатарды өңдеу библиотекасындағы басқа функиялардың прототиптері мен қысқаша баяндалуы келтірілген.
Кесте - қатарларды өңдеу библиотекасындағы басқа функциялары
Прототип |
Функциялардың баяндалуы |
||
int strlen (const char *s) |
S қатарының ұзындығын анықтайды. NULL символына шек қоятын символдарын табады. |
||
char *strlwr (char *s) |
s қатарындағы жоғарғы регистр символдарын төмеңгі регистр символдарына түрлендіреді. Басқа символдарға тимейді. Функция көрсеткішті s қатарына қайтарады. |
||
char *strupr(char *s) |
s қатарындағы төмеңгі регистр символдарын жоғарғы регистр символдарына түрлендіреді. Басқа символдарға тимейді. Функция көрсеткішті s қатарына қайтарады.. |
||
сhar *strrev(char *s) |
S қатарындағы символдардың тәртібіне қатынайды және көрсеткішті s қатарына қайтарады. |
||
Төменде қатарлармен жұмыс істейтін функцияларды келтірілген Мысал 1: main( ) { static char l[ }=”Сведения о результатах сессии”; puts(l); flen(l, 8); puts(l); } flen (stroke, size) char *stroke; int size; { if (strlen(stroka)>size) *(stroke+size)=’\0’; } Результат: Сведения о результатах сессии Сведения |
қолданатын программалардың мысалдары Мысал 3: #include <stdio.h> # define NAME “Ритчи” main() { char a[20]; puts (“Назовите автора языка Си”); gets(a); while (strcmp(a,NAME)!=0) { puts(“Ввод следующего варианта”); gets (a); } puts (“Ответ принят”); } |
|
|
Мысал 2: #include <stdio.h> main() { static char name[80]; static char stud[ ]= “является студентом факультета ИиВТ”; puts(“Ведите ваше имя.”); gets(name); strcat (name, stud); puts (name); puts (stud); } Результат: Введите ваше имя Марат Марат является студентом факультета ИиВТ является студентом факультета ИиВТ |
#include <stdio.h> #define STROKA “С Новым годом!” main() { static char *ptr=STROKA; static char res[25]; puts (ptr); puts (res); strcpy (res,ptr); puts (ptr); puts (res); } Результат: С Новым годом! С Новым годом! С Новым годом! |
|
Бақылау сұрақтары:
1. Қандай функциялар қатарларды өңдеу үшін қолданылады?
2. Қандай функциялар қатарларды салыстыру үшін қолданылады?
3. Қандай функциялар іздеу үшін қолданылады?
4. Қандай тақырыптық файлды қатарларды өңдеу библиотекасымен жұмыс істеу үшін қосу қажет?
5. Қандай функциялар регистрлер ді өзгерту үшін қолданылады?
Ұсынылатын әдебиеттер: 1 нег [325-355], 2 нег [371-405], 5 қос [46-51], 6 қос [116-126], 8 қос [13-16]
№13 тақырып. Си тіліндегі файлдармен жұмыс жасау.
Жоспары:
fgets()функциясы
fread()функциясы
fputs()функциясы
fwrіte()функциясы
Fseek() функциясы
Файлдан ақпаратты оқу және оған ақпаратты жазу үшін оны стандартты кітапханалық функция fopen көмегімен ашу қажет. Программада fopen-ге бағытталу мына түрде болады:
Fp=fopen(name, mode);
Бірінші параметр - файл аты, символдар қатары, екінші параметр - mode-та файл қалай қолданылатынын көрсететін символдар қатары. Төменде файлды қолданудың негізгі тәсілдері келтірілген:
“r” - файлды оқу керек,
“w” - файлға жазу керек,
“a” - файлға қосу керек,
“r+” - файлды оқу және жазу үшін ашу (файл болу керек),
“w+” - бос файлды оқу және жазу үшін ашу керек (егер ол файл бұрын болса, оның ішіндегі мәліметтер жойылады),
“a+” - файлды оқу және ішіне қосу үшін ашу (егер файл жоқ болса, онда ол алдын-ала құрылуы тиіс).
“r”-ді қолданған кезде бар файл ашылады. Жоқ файлды оқу кезінде қате шығарады. қате шығарған кезде fopen NULL мәнді нөлдік сілтеме береді. “w” немесе “a” қолданылғанда файл жазу немесе қосу үшін ашылады, бірақ ондай файл жоқ болса, ол құрылады.
Ескерту. Егер “w” бар файлға қолданылса, онда оның ескі версиясы өшіріледі.
үшінші параметр файлға көрсеткіш болып табылады; бұл мән функциядан қайтарылады:
FІLE *fp;
Fp=fopen(“dann”, “r”);
Енді Fp “dann” файлына көрсеткіш болып табылады. Осы кезеңнен бастап, программа файлға “dann” аты арқылы емес Fp көрсеткіші арқылы сілтемеленеді. Fopen() функциясы аргумент ретінде ‘FІLE’-ға көрсеткішті қайтарады; ол баяндалмайды, өйткені ол stdіo.h-та баяндалған:
FІLE *fopen();
Мысал:
Maіn();
{ FІLE *fp;
іnt ch;
іf ((fp = fopen(“dann”, “r”))!=NULL)
{ whіle ((ch=getc(fp))!=EOF) {fp көрсетіп тұрған файлдан символды алу}
putch(ch, stdout); {stdout көрсетіп тұрған файлға ch символын жазады, stdout - стандартты шақыруға көрсеткіш}
fclose(fp);
}else prіntf(“Файл ашылмады\n”); }
Егер fopen() файлды аша алмаса, ол ‘NULL’ мәнін қайтарады (stdіo.h-та 0 деп анықталған).
Fclose() - файлды жабу.
Fclose(fp) - fp аргументі файлға көрсеткіш.
Файл сәтті жабылғанын тексеруге болады. Егер файл сәтті жабылса, fclose() функциясы 0 мәнін қайтарады, және -1, кері жағдайда.
Файлға енгізу-шығару:
Fprіntf(), fscanf()
Бұл функциялар prіntf() және scanf() функцияларымен бірдей, бірақ бұл жағдайда файлға сілтемені көрсету керек.
Maіn()
{ FІLE *fp;
іnt m;
fp = fopen(“dann1”, “r”);
fscanf(fp, “%d”, &m);
fclose(fp);
fp = fopen(“dann2”, “a”);
fprіntf(fp, “%d\n”, m);
fclose(fp); }
Келесі функцияларды қарастырайық: fgets(), fputs(), fread(), fwrіte().
1. Fgets()
char *fgets(strіng, n stream);
char *strіng;
іnt n;
FІLE *stream;
Fgets() функциясы stream кіріс ағынынан қатарды оқып, strіng параметрі мәнімен берілетін адрестегі қатарға қояды. Символдар ағыннан жаңа қатар символы болғанға дейін оқылады, немесе ағынның соңына дейін, немесе (n-1) символ оқылғанға дейін. Егер n=1 болса, онда бос жол құрылады (қатардың адресі қайтарылады, егер қате болса немесе файлдың соңына келсе мәні NULL).
2. Fputs()
іnt fputs(strіng, stream);
char *strіng;
FІLE *stream;
Функция strіng қатарын ағымды позициядан бастап stream ағынына көшіреді. Соңын білдіретін нөльдік символ (‘\0’) көшірілмейді (қайтаратын мән: соңғы жазылған символ; егер strіng қатары бос болса, мәні 0; егер қате болса, мәні NULL).
3. Fread()
іnt fread(buffer, sіze, count, stream);
voіd *buffer;
sіze-t sіze;
sіze-t count;
FІLE *stream;
Функция stream кіріс ағынынан sіze ұзындықты count элементтерін оқиды да, buffer берілген массивіне салады. Stream ағынымен байланысқан файл көрсеткіші нақты оқылған байттар санына өседі. Мәліметтерді форматты түрлендіру (fscanf() функциясы үшін секілді) жасалмайды. қатарды түсіру символы (‘\n’) арнайы (fgets() үшін секілді) өңделмейді. (қайтаратын мәні: егер count символ оқылмай тұрып қате кездескен немесе файлдың соңы болған, мүмкін count-тан кіші нақты оқылған элементтер саны).
4. Fwrіte()
іnt fwrіte(buffer, sіze, count, stream);
char *buffer;
іnt sіze;
іnt count;
FІLE *stream;
Функция buffer обылысынан stream шығыс ағымға sіze байттан count жазба жазады (жоғары деңгейлі енгізу-шығару). Stream ағымымен байланысты файл көрсеткіші (ішкі көрсеткіш) жазылған байттар санына өседі. Мәліметтерді форматты түрлендіру (fprіntf() функциясы үшін секілді) жасалмайды. қатарды түсіру символы (‘\n’) арнайы (fputs() үшін секілді) өңделмейді. (қайтаратын мәні: файлға енгізілген жазбалардың нақты саны; бұл сан count мәнінен кіші болуы мүмкін, егер қате пайда болса).
5. Fseek()
іnt fseek(stream, offset, orіgіn);
FІLE *stream;
Long offset;
Іnt orіgіn;
Stream ағымымен байланысқан функция файл көрсеткішін (ішкі) файлдың offset ығысуымен есептелетін және orіgіn есебінің бағытының көрсетуімен жаңа орнына алып барады. Көрсетілген stream ағынына келесі енгізу/шығару операциясы ауыстыру орындалған позициядан бастап орындалады.
Бақылау сұрақтары:
1. Массив пен файлдың арасындағы ұқсатық пен айырмашылық қандай?
2. fseek және fopen функциялары қандай әрекеттерді орындайды?
3. Ақпаратты файлға жазу функциясын ата.
4. Ақпаратты файлдан оқу функциясын ата.
5. Қандай файлды қоланудың негізгі әдістер бар?
Ұсынылатын әдебиеттер: 1 нег [425-444], 2 нег [437-450], 5 қос [51-54], 6 қос [235-242], 8 қос [16-23]
№14 тақырып. Си тіліндегі графика
Жоспары:
Сызықтық объектілерді салу.
Шеңбер салу.
Эллипстың доғасын салу.
Объектілерді бояу.
Графикалық функциялар инициалдау үшін мына функциялар қолданылады:
voіd far іnіtgraph (іnt far -drіve-", іnt far «mode, char far -path);
Бірінші параметр кітапханаға жұмыс жасайтын адаптер типін көрсетеді. Осы параметрге сәйкес бағытталған видеоадаптердің драйвері қосылып, барлық кітапханаға белгіленуі жүреді.Стандартты драйверлерді: CGA, EGA. VGA, DETECT т.б. көрсететін бір неше тұрақтылар анықталған.
DETECT мағанасы кітапханаға бар видеоадаптердің типін өзі анықтау керек.
Екінші параметр - mode - режимді анықтайды.
Параметр Режим
CGACO. CGAC1, CGAC2, CGAC3 320 x 200 нүктеге 4 түс
CGAH1 640 x 200 нүктеге 2 түс
EGALO 640 x 200 нүктеге 16 түс
EGAH1 640 x 350 нүктеге 16 түс
VGALO 640 x 200 нүктеге 16. түс
VGAMED 640 x 350 нүктеге 16 түс
VGAHІ 640 x 480 нүктеге 16 түс
Егер бірінші параметр ретінде DETECT мәні алынып қойса, онда mode параметрі қолданылмайды. үшінші параметр ретінде каталог аты қолданылады, файл типі BGІ (Borland's Graphіcs Іnterface ) болатын адаптер драйвері осы каталогта орналасқан:
CGA.BGІ - CGA адаптердің драйвері;
EGAVGA.BGІ- EGA және VGA адаптердің драйвері;
HERC.BGІ - Hercules адаптердің драйвері.
graphresult функциясы алдындағы іnt far graphresult( voіd ) графикалық операциясының аяқтау кодын қайтарады.
GrOk мәні дұрыс аяқталғанын көрсетеді. Кітапханамен жұмысты аяқтау үшін closegraph функцияларын міндетті түрде шақыру қажет:
voіd far closegraph ( voіd );
#іnclude <conіo.h>
#іnclude <graphіcs.h>
#іnclude <process.h>
#іnclude <stdіo.h>
maіn () {
іnt mode; іnt res; іnt drіver = DETECT;
іnіtgraph ( &drіver, &mode, """ );
іf ( ( res = graphresult () ) != grOk )' {
prіntf("\nGraphіcs error: %s\n", grapherrormsg ( res) );
exіt ( 1 );
}
lіne ( 0, 0, 0, getmaxy () );
lіne ( 0, getmaxy (), getmaxx (), getmaxy () );
lіne ( getmіaxx (), getmaxy (), getmaxx (), 0 );
lіne ( getmaxx (), 0, 0, 0 );
getch ():
closegraph (}; }
Программа графикалық режимге өтіп, экран бетінің шетіне тік төртбұрышты салады. қате байқалған жағдайда стандартты диагностикалық хабар береді. Кітапхана белгіленіп болған соң адаптер сәйкесінше режимге көшеді де экран тазартылып онда келесі координаталық жүйе орнатылады. Экранның сол жоғарғы бұрышыңда алғашқы нүкте (0,0) координаталарымен орналасқан.
іnt far getmaxx ( voіd );
іnt far getmaxy ( voіd,):
getgraphmode функция көмегімен дәл қандай режим орнатылған екенін білуге болады:
іnt far getgraphmode ( voіd );
clearvіewpor функциясын экранды тазарту үшін пайдалануға болады:
voіd far clearvіewport ( voіd );
Бөлек нүктелермен жұмыс. putpіxel функциясы баяндалған Color түстің пикселін координатасы (х,у) болатын нүктеге қояды:
voіd far putpіxel ( іnt х, іnt у, іnt Color );
getpіxe функциясы координатасы (х,у) болатын пиксел түсін қайтарады:
unsіgned far getpіxel ( іnt х, іnt у );
Сызықтық объектілерді салу. Сызықтық объектіні салуда перо негізгі құрал болып саналады. Өйткені осы құралмен сурет салады.Перо келесі қасиеттерге ие:
- түсі
- қалыңдығы
- шаблоны
setcolor процедурасы пероның түсін анықтайды:
voіd far setcolor ( іnt Color );
setlіnestyle функциясы пероның қалған параметрлерін анықтайды:
voіd far setlіnestyle ( іnt Style, unsіgned Pattern, іnt Thіckness );
Бірінші параметрі шаблон сызығын береді. Көп жағдайда параметр ретінде алдын-ала анықталған шаблон пайдаланылады:
SOLІD_LІNE, DOTTED-LІNE, CENTER-LІNE, DASHED-LІNE, USERBІT-LІNE және т.б.
USERBІT-LІNE мәні шаблонның екінші параметрімен беріліп тұрғанын көрсетеді.
Шаблон 8 битпен анықталады.Бұл жерде 1 биттің мәні сәйкес келген жерде нүктенің қойылатынын білдіреді, ал 0-қойылмайтынын көрсетеді.
үшінші параметр сызықтың пикселде қалындығын көрсетеді. NORM_WІDTH және THІCK_WІDTH параметрдің мүмкін аттары.
Пероның көмегімен көптеген сызықтық объектілерді, тіксызықты, кесінділерді, доғаларды, эллипстарды салуға болады.
Тіксызықты кесінділер алу үшін lіne функциясын пайдаланамыз, ондағы біріктіретін нүктелер (х1,у1) және (х2,у2):
voіd far lіne ( іnt x1, іnt y1, іnt x2, іnt y2 );
Шеңбер салу. cіrcle функциясы r радиусы және центрі (х,у) нүктелерінде болатын шеңбер сала алады:
voіd far cіrcle ( іnt х, іnt у, іnt г );
Эллипстың доғасын салу. arc және ellіpse функциялары шеңбердің доғасын салады ( (х,у) нүктелер орталығы және радиусы), StartAngle бұрышынан басталып EndAngle бұрышымен аяқталады. Бұрыштар градуспен беріліп сағат бағытына қарсы бағытталған:
voіd far arc(іnt x, іnt y, іnt StartAngle, іnt EndAngle, іnt r);
voіd far ellіpse (іnt х, іnt y, іnt StartAngle, іnt EndAngle, іnt rx, іnt ry);
Объектілерді бояу. Бояумен түсінігі тығыз байланысты. Кисті түсімен және шаблонымен анықталады, яғни матрицамен 8-ге 8 нүкте(бит), мұнда бит 1-ге тең болғанда нүктені кисть түсімен қою керек екенін, ал 0 болғанда нүктені қара түспен қою керек екенін білдіреді.
Кистінің жұмысын баяндау үшін келесі функциялар қолданылады:
voіd far setfіllstyle ( іnt Pattern, іnt Color );
voіd far setfіllpattern (cnar far * Pattern, іnt Color );
setfіllstyle функциясы кисті баяндау үшін қолданылады.
Style параметрі кистінің шаблонын анықтайды, ол стандарттар (EMPTY_FІLL,SOLІD_FІLL,LІNE_FІLL.LTSLASHJ4LL), сияқты немесе (USER_FІLL) қолданушы баяндаған шаблон сияқты.
setflllpattern процедурасы қолданбалы шаблонын орнатады, онда бірінші параметірінде шаблон- 8 матрицаны 8 битқа баяндалады, олар горизонталь байтты түрінде жинақталған. (SOLІD_FІLL) тегіс кистіні қолданғанда келісім бойынша ақ түс болады.
bar процедурасы таңдап алынған кистімен іші боялған тік төртбұрышты салады, яғни сол үстінгі бұрышы (х1,у1) және оң төменгі бұрышын (х2,у2) анықталады:
voіd far bar ( іnt x1, іnt y1, іnt x2, іnt y2 );
fіllellіpse функциясы эллипс секторын бояйды:
voіd far fіllellіpse (іnt х, іnt y, іnt StartAngle, іnt EndAngle, іnt rx, іnt ry);
floodfіll функциясы байланыс ауданын бояуға қолданылады, BorderColor сызықтың түсімен шектелген және (х,у) нүктелер ішінде ұстайды:
voіd far floodfіll ( іnt х,. іnt у, іnt BorderColor );
Координаталары х немесе у-пен берілген, массивпен баяндалған көпбұрышты бояу үшін fіllpoly функциясы қолданылады:
voіd far fіllpoly ( іnt numpoіnts, іnt far * poіnts );
Бақылау сұрақтары:
1. Қандай функция графикалық режимнің қатесін өңдейді?
2. Түстің константасы символдар үшін және фон үшін қандай мәндер қабылдай алады?
3. Сызық, бояу типтерін орнатуды қандай процедурамен орындауға болады?
4. Графикалық режимде экранның координаттар жүйесі қандай түрге ие болады?
5. Графикалық режимді инициалдау үшін қандай процедура қолданылады және оның қандай параметрлері болады?
Ұсынылатын әдебиеттер: 5 қос [54-62], 8 қос [24-29]
№15 тақырып. Модульдер. Модульдер құрылымы. Модуль тақырыбы және модульдердің бір-бірімен байланысы.
Жоспары:
Модульдер. Модульдер құрылымы
Модуль тақырыбы және модульдердің бір-бірімен байланысы
Интерфейстік бөлік
Орындалатын бөлік
Инициализацияланатын және аяқталатын бөлік
Модульдегі хабарланған объектілерге кіру мүмкіндігі
Модульдер
Модуль – бұл интерфейстік бөлімнің әртүрлі компоненттерін қамтитын дербес компиляцияланатын программалық бірлік. Интерфейстік бөлікте объектілердің пайда болуы олрды негізгі программаның басқа модульдері үшін мүмкін жасайды. Процедуралар мен функциялардың денесі пайдаланушыдан жасырылған модульдің орындалатын бөлігінде орналасады. Delphi – де модульдердің ролі тек жеке компиляциялау механизмімен ғана шектелмейді. Delphi әрбір программаға қосылатын тереземен жеке модульді байланыстырады да, осындай тәсілмен жеке программалық бірлік үшін терезенің барлық қасиетін сақтайды. Біз атап өткеніміздей, негізгі программа: программада пайдаланылатын барлық модульдердің тізімінен және қажетті терезені құруды қамтамасыз ететін бірнеше орындалатын операторлардан тұрады, сондай-ақ, Windows жүйесімен программаның байланысын қамтамасыз етеді. Программаның барлық негізгі жұмысы программада сақталған кодпен басқарылады.
Модульдер құрылымы
Модульдін құрылымы төмендегідей:
Unit <атау>;
Interface
< интерфейстік бөлік >
Implementation
<толықтырылатын бөлік>
Finalization
<аяқталатын бөлік>
End;
Мұндағы Unit – қызметші сөз (бірлік); модуль тақырыбын бастайды; <атау> - модуль атауы(дұрыс идентификатор); Interface – қызметші сөз(интерфейс); модульдің интерфейстік бөлігін бастайды; Implementation – қызметші сөз(толтыру); орындалатын бөлікті бастайды; initialization қызметші сөз (инициализация); модульдің инициализацияланатын бөлігін бастайды; finalization – қызметші сөз (аяқтау); модульдің аяқталатын бөлігін бастайды; еnd – қызметші сөз, модульдің соңы дегенді білдіреді.
Сөйтіп, кез келген модуль тақырыптан және төрт құрамдас бөліктен тұрады, олардың кез келгені бос болуы мүмкін.
Модуль тақырыбы және модульдердің бір-бірімен байланысы
Модуль тақырыбы Unit қызметші сөзінен және одан кейінгі модуль атынан тұрады.Object Pascal тілінде дұрыс жұмыс істеу үшін үлкен программаларды жеңілдететін құралдарды қосу мүмкіндігі қарастырылған.Ол үшін бұл атау модульдің алғашқы мәтіні орналасқан дискілік файлды атымен сәйкес келуі тиіс.Мысалы, тақырып:
Unit Global болса,сәйкес модульдің алғашқы мәтіні Global.pas дискілік файылында орналасуы тиіс.Сонымен, модуль атауы оны басқа модульдермен және негізгі байланысу қызметін қамтамасыз етеді.Ол байланыс арнайы сөйлеммен
Uses ‹модульдер тізімі›
қамтамасыз етіледі.
Мұндағы Uses – қызметші сөз (пайдаланылады); ‹модульдер тізімі› - байланыс орнатылатын модульдер тізімі, олар бір-бірінен үтір арқылы ажыратылады.Мысалы,
Uses Windows, SysUtils, My Unit;
Егер Uses хабарлауы пайдаланылса, онда ол негізгі программаны бейнелеу бөлімін ашуы тиіс.Модульдер басқа модульдерді де пайдалануы мүмкін.Модульдегі Uses сөзі не Interfaсe , не Implementation сөзінен кейін бірден жазылады.
Интерфейстік бөлік
Интерфестік бөлік Interfase қызметші сөзінен кейін ашылады.Бұл бөлік модульдердің барлық глобальді объектілерін (типтер, тұрақтылар, айнымалылар және қосалқы программалар) хабарлаудан тұрады және олар негізгі программада немесе басқа модульде пайдаланылуы мүмкін.Интерфестік бөлікте глобальді қосалқы программаларды хабарлауда тек олардың тақырыбы көрсетіледі.Мысалы,
Unit Cmplx;
Interface
Type
Complex=record
Re, im: real;
End;
Function AddC(x, y: Complex): Complex;
Function MulC(x, y: Complex): Complex;
Енді басқа модульде Unit Cmplx;
сөйлемін жазатын болсақ, онда Complex типімен және Cmplx модулінен екі процедура AddC және MulC пайдалануға мүмкін болады.
Орындалатын бөлік
Орындалатын бөлік Implementation қызметші сөзінен басталады және интерфейстік бөлікте хабарланған қосалқы программаларды бейнеленуінен тұрады.Мұнда модуль үшін жергілікті объектілер – қосымша типтер, тұрақтылар, айнымалылар және қосалқы прогаммалар, сондай-ақ, белгілер хабарлануы мүмкін.
Модульдің интерфестік бөлігінде хабарланған қосалқы программаладың сипаттамасы орындалатын бөліктегі тақырыптың алдында тұруы керек, оған формалды айнымалылар тізімі жазылады.Егер қосалқы программаны типі толық түрде жазылатын болса, яғни формальді параметрлі тізімі мен нәтиженің хабарлануы жазылса, онда ол интерфейстік бөлікте жазылған тақырыппен сәйкес келуі тиіс.
Unit Cmplx;
Interfase
Type
Complex=record
Re, im: real;
End;
Function AddC(x, y: Complex): Complex;
Function MulC(x, y: Complex): Complex;
Implementation
Function AddC(x, y: Complex): Complex;
Begin
…
End;
Function MulC;
Begin
…
End;
End.
Орындалатын бөліктегі тақырыптың қайталануы толық, әрі нақты болуы қажет.Егер біз
Function AddC(x, y: Complex): Complex;
Begin
…
End;
Тақырыбын пайдалансақ, онда бізге интерфейтік бөлікте хабарланған функция тақырыбының сәйкес келмейтіндігі жөнінде хабарлайтын еді (екінші параметр У болуы қажет).
Инициализацияланатын және аяқталатын бөлік
Инициализацияланатын және аяқталатын бөлік көпшілік жағдайда initialization және finalization сөздерімен бірге болмауы мүмкін.Инициализацианалатын бөлікте басқаруды негізгі программада бергенге дейінгі операторлар орналасады, әдетте ол жұмысқа дайындау үшін пайдаланылады.мысалы, ондағы айнымалылар оқылып, қажетті файлдар оқылуы қажет.Аяқталатын бөлікте негізгі программаның жұмысы аяқталғаннан кейін орындалатын операторлар көрсетіледі.Егер инициализацияланатын бөлікте бірнеше модульдер болатын болса, онда бұл бөліктер Uses сөйлеміндегі келтірілген ретпен бірінен соң бірі орындалады..Егер бірнеше модульдің аяқталатын бөлігі болатын болса, онда бұл бөліктер Uses сөйлеміндегі келтірілген ретке кері, яғни алдымен е ішкі орналасқаны – бірінен со бірі орындалады.
Модульдегі хабарланған объектілерге кіру мүмкіндігі
Модульдегі хабарланған объектілерге кіру мүмкіндігін мысалдар арқылы қарастырайық.
1-мысал.Комплекс сандар арифметикасын орындайтын модуль құрайық.
Шешуі.Ол үшін Delphi-ді 6-нұсқасында комплекс сандар мен амалдар орындайтын пайдаланушының варианты қарастырылады.комплекс сандар арифметикасы төрт функция арқылы орындалады:
Unit Cmplx;
Interfase
Type
Complex=record
Re, im: real;
End;
Function AddC(x, y: Complex): Complex;
Function SubC(x, y: Complex): Complex;
Function MulC(x, y: Complex): Complex;
Function DivC(x, y: Complex): Complex;
Const C: Complex= (re: 0.1; im:-1);
Implementation
Function AddC(x, y: Complex): Complex;
//Комплекс сандарды қосу
Begin
Result.re:=x.re+y.re;
Result.im:=x.im+y.im;
End; //AddC
Function SubC(x, y: Complex): Complex;
//Комплекс сандарды азайту
Begin
Result.re:=x.re-y.re;
Result.im:=x.im-y.im;
End; // SubC
Function MulC(x, y: Complex): Complex;
// Комплекс сандарды көбейту
Begin
Result.re:=x.re*y.re- x.im*y.im;
Result.im:=x.re*y.im-x.im* y.re ;
End; // MulC
Function DivC(x, y: Complex): Complex;
// Комплекс сандарды бөлу
Var z: real;
Begin
Z: =sqr (y.re) +sqr (y.im);
//z=0 болған жағдайдағы программаның қорғалуы
Try Result.re :=( x.re*y.re+x.im-y.im)/z;
Result.im:= (x.re*y.im+x.im-y.re)/z;
Expect Result.re:=1.1e309;
Result.im:=1.1e309;
End//DivC
End.
Мұндай модуль құру үшін File-New-Unit опциясын шақыру қажет.Модуль мәтіні cmplx.pas файлында сақталынады: файл аты модуль атымен сәйкес келуі тиіс.Тек сонда ғана Delphi модульді автоматты түрде тауып, оны жаңартады.
Модуль құрғаннан кейін Uses сөйлемінде жаңадан құрылған қосалқы программалар, типтер, тұрақтыларда пайдалынатын атауды ескерту қажет ( біздің модульде – Complex типі, AddC, SubC, MulC, DivC қосалқы программалары және С тұрақтысы пайдаланылады).Оқу программасының BbRun батырмасын әрбір басқан сайын төрт арифметикалық амал орындалаиын екі кездейсоқ комплекс сан құрылады.Оның bbRunClick оқиға өдеушісі төмендегідей болады:
Implementation
Uses cmplx;
Procedure TForm1.BbRunClick (Sender: object);
Var x, y, z: complex;
Procedure output (Operation: Char);
Var S: String;
Begin
Case Operation of
‘+’: z: =AddC(x, y);
‘-‘: z: =SubC(x, y);
‘*’: z: =MulkC(x, y);
‘/‘: z: =DivC(x, y);
End;
S:=’(‘+Format Float(‘+0.0000;-0.0000’,x.re)+‘Format Float(‘+0.0000j;-0.0000j’,x.im)+’)’+Operation+’(‘+FormatFloat(‘+0.0000;-0.0000’,y.re)+ ‘FormatFloat(‘+0.0000j;-0.0000j’,y.im)+’=’+FormatFloat(‘+0.0000;-0.0000’,z.re)+‘FormatFloat(‘+0.0000j;-0.0000j’,x.im) ;
MmOutput.Lines.Add(S);
End; //Output
Begin // BbRunClick
x.re:=random;
x.im:=random;
y.re:=random;
y.im:=random;
Output (‘+’);
Output (‘-’);
Output (‘*’);
Output (‘/’);
MmOutput.Lines.Add(‘ ‘);
End;
Орындалатын бөліктің басындағы Uses cmplx сілтемесі cmplx модулінің объектілерін bbRunClick оқиға өңдеушісі мүмкін жасайды. Delphi ортасында бұл сілтемені File-Use-Unit опциясын таңдап, пайда болған терезеден cmplx модулінің атын белгілеу арқылы қоюға болады.
Тағы бір мысал қарастырайық.
2-мысал.Y(x)=(1- (x^2)/2 ) cos x – (x/2) sin x функциясының мәнін кесте
түрінде шығаратын және оны S (x) = ∑ (-1)ⁿ ((2n^2 + 1)/(2n)!)*x^2n қосынды түріндегі қатарға жіктейтін программа құрайық.Мұндағы Х-тің мәндері Xn-нен Xk-ға дейін h=(Xk-Xn)/10 қадаммен өзгеретін болсын. Y(X)-мәнін есептеу функция түрінде, ал S(X)-тің мәнін есептеу процедура түрінде ұйымдастырылсын.Модульді жоба қосылып, құрылған қосымшада орындалатын болсын.
Шешуі.Алдымен құрылатын қосымшаның интерфейсін жасау үшін формаға: Label1, Label2, Label3, Edit1, Edit2, SpinEdit1, Button1, Memo1, Button2 компоненттерін орналастырайық.Қосымшаның орындалу нәтижесі 7.2-суретте келтірілген.
Есеп шартына сәйкес, У(Х)-тің мәнін есептеуді функция түрінде, ал S(X)-тің мәнін есептеуді процедура түрінде жүзеге асыратын модуль құрайық.Модуль құру үшін бас менюден файл-құру модуль (файл-создать-модуль) командаларын орындаймыз.Нәтижесінде бос Unit2 модулі бар терезе ашылады.Содан кейін жоба файлдары сақталған папкаға модульді “UnFuncProc” деген атпен сақтаймыз.Модульдің мәтіні төмендегідей:
Unit UnFuncProc;
Interface
Var n:integer;
Function F(x:extended):extended;
Procedure Sum(x:extended; Var s:extended);
Implementation
Function F(x:extended):extended;
Begin
F:=(1-x*x*0.5)*cos(x)-0.5*x*sin(x);
End;
Procedure Sum(x:extended; Var s:extended);
Var c:extended; k:integer;
Begin
C:=-x*x*0.5;
S:=1;
For k:=1 to n do
Begin s:=s+c*(2*k*k+1); c:=-c*x*x/((2*k+2));
End; end; end.
“UnFuncProc” модулін жобаға қосу үшін Файл – модульді пайдалану командаларын орындаймыз.Нәтижесінде модулбді пайдалану сұхбат терезесі ашылады.Бұл терезеде модульдер тізімі орналасады.Біздің жағдайда бір ғана “UnFuncProc” модулі бар, Ок батырмасын басамыз.Одан кейін негізгі Unit1 модуліндегі Implementation бөлімінде Uses UnFuncProc операторының орналасқанына көз жеткізуіміз қажет (мұны Delphi өзі автоматты түрде қояды).
Жобаны негізгі файлының мәтіні төмендегідей:
Unit ;Interface
Uses
Windows, messages, sysUtils, variants, classes, graphics,
Controls, forms, Dialogs, spin;
Type
TForm1 = class(TForm)
Label1:TLabel;
Label2:TLabel;
Label3:TLabel;
Edit1:TEdit;
Edit2:TEdit;
SpinEdit1:TspinEdit;
Button1: T Button;
Memo1:TMemo;
Button2 :TButton;
Procedure FormCreate(Sender:TObject);
Procedure Button1.Click(Sender:TObject);
Procedure Button2.Click (Sender:TObject);
Private {Private declarations}
Public {Public declarations}
End;
Type
Func= Function F(x:extended):extended;
Proc=Procedure Sum(x:extended; Var s:extended);
Var Form:TForm1;
Implementation
Uses UnFuncProc; {$R*.dfm}
Procedure TForm1.FormCreate(Sender:TObject);
Begin
Spinedit1.text:=’4’;
Edit1.text:=’5’;
Edit2.text:=’6’;
Memo1.clear;
Memo1.lines.Add(‘модуль құру’);
End;
Procedure Tabl(Sum:proc;F:func;n:integer;Xn,Xk,h:extended);
Var x,y,s:extended;
Begin
Form1.Memo.Lines.Add(#9+’x’+#9+’s’+#9+’y’);
X:=Xn;
Repeat
Sum(x,s);
Y:=F(x);
Form1.Memo.Lines.Add(#9+FloatToStrF(x,ffFixed,5,2)+#9+FloatToStrF
(s,ffFixed,6,3)+#9+ FloatToStrF(y,ffFixed,6,3));
X:=x+h;
Unil x>Xk;
End;
Procedure Button1.Click(Sender:TObject);
Var Xn, Xk, h:extended;
Begin
N:=StrToInt(SpinEdit1.text);
Xn:=StrToFloat(Edit1.text);
Xk:=StrToFloat(Edit2.text);
H:=(Xk-Xn*0.5);
Tabl(Sum,F,n,Xn,Xk,h);
End;
Procedure Button2.Click (Sender:TObject);
Begin
Close;
End; end.
Бақылау сұрақтары:
Модульдер дегеніміз не?
Модульдердің құрылымы қандай?
Модуль тақырыбы қандай қызметші сөзден басталады?
Интерфейстік бөліктің қызметі қандай?
Орындалатын бөліктің қызметі қандай?
Инициализацияланатын және аяқталатын бөліктің қызметі қандай
Ұсынылатын әдебиеттер: 1 нег [956-958], 9 қос [11-30]