5.4. Цикл Инструкциялары.
5.1. Инструкция және блоктар түсінігі.
С/С++ тілдерінде кезкелген өрнек соңына нүктелі үтір (;) қойылса, онда ол
инструкция болып табылады.
Мысалы, x=0;
I++;
Printf(…); -инструкциялар.
Демек, нүктелі үтір Паскаль тіліндегідей ажыратқыш емес, инструкцияның
соңын білдіретін литер болып табылады.
Фигуралық жақша ({…}) инструкциялар мен сипаттамаларды біріктіріп блок
құруға мүмкіндік береді. Блок соңына нүктелі үтір қойылмайды.
5.2. IF-ELSE және ELSE-IF конструкциясы
if-else конструкциясы.
Төмендегі конструкция программадағы бірнеше жолдың біреуін таңдауға
қолданылады:
Ол келесі түрде жазылады:
If (өрнек)
инструкция1
else
инструкция2
Мұнда else тармағы болуы да болмауы да мүмкін. Алдымен «өрнек»
есептеледі, егер ол ақиқат болса, онда инструкция1 орындалады. Егер өрнек жалған
және else тармағы бар болса, онда инструкция2 орындалады.
If өрнектің сандық мәнін ғана тексеретіндіктен, шартты кейде қысқартылған
түрде жазуға болады.
Мысалы:
If (өрнек)
жазуы
if (өрнек!=0).
54
Кейде бұндай қысқартулар анық болады, ал кейбір жағдайларда керісінше
программаны түсінуді қиындатады.
Бір-біріне іштестірілген If конструкцияларының бірінің else тармағы болмауы
конструкция жұмысын түсінуде қиындықтар туғызады. Мұндай жағдайда блокты
орынды қолданған жөн.
If (n>0)
If (a>b) z=a;
Else z=b;
else ішкі if-ке тиісті. Егер бізге басқа интерпретация қажет болса, фигуралық
жақшаларды дұрыс қоюымыз қажет:
if (n>0){
if(a>b) z=a;
}
else
z=b;
Мұндағы z=a-дан кейін тұрған нүктелі үтірге көңіл бөліңіз:
If (a>b)
z=a;
else
z=b;
Мұндағы нүктелі үтір міндетті түрде керек, себебі грамматика ережесі
бойынша If-тен кейін инструкция тұру қажет, ал z=a; түріндегі инструкция әрқашан
нүктелі үтірмен аяқталады.
else-if конструкциясы.
Конструкция
If (өрнек)
инструкция
еlse if(өрнек)
инструкция
еlse if(өрнек)
инструкция
еlse if(өрнек)
инструкция
еlse
инструкция
Келтірілген if инструкциялар тізбегі -көпсатылы шешім қабылдайтын
сипаттаудың жалпы әдісі. Алдымен өрнек рет бойынша есептеледі, ''ақиқат'' мәнді
өрнек кездескеннен кейін, оған сәйкес инструкция орындалады; осымен тексеру
тізбегі аяқталады. Мұнда инструкция деп не бір инструкция не фигуралық жақшаға
алынған инструкциялар тобы айтылып отыр.
Егер алдыңғы шарттар орындалмаса,Сонда соңғы еlse тармағы орындалады.
Көпжолдық тармақталуды көрсету үшін v-массивінен x мәнін іздейтін
функцияны қарастырайық. v-массивінің элементтері өсу реті бойынша орналасқан
делік. Функция v-массивінен x мәнінің орнын көрсетеді (0-ден n-1-ге дейінгі
сандар). Егер ол онда кездессе оның орынын, ал, егер ол жоқ болса -1-ді қайтарады.
55
Бинарлық іздеуде алдымен х-тің мәні v-массивінің ортасында орналасқан
элементпен салыстырылады. Егер х ол мәннен кіші болса, онда v-массивінің
''жоғары'' бөлігі іздеу облысы болады, кері жағдайда -''төменгі''. Қай жағдайда да
келесі қадам - ол ортанғы элементтің кері бөлікпен салыстыру. Диапазонды бөліктеу
процесі мән табылғанша немесе диапазон бос болғанға дейін қайталанады.
Бинарлық іздеу функциясы денесі мынадай:
/*binsearch:v[0]<=v[1]<=...<=v[n-1]-ден x-ті табу*/
int binsearch(int x,int v[ ],int n)
{
int low,high,mid;
low=0;
high=n-1;
while(low<=high){
mid=(low+high)/2;
if (xhigh=mid-1;
else if (x>v[mid])
low=mid+1;
else /*x табылды*/
return mid;
}
return -1; /*x табылған жоқ*/
}
5.3. switch инструкциясы
Программалауда
екі
немесе
оданда
көп
тармақтық
жағдайларды
ұйымдастыруда тармақталу алгоритмдері құрылады. Ол үшін арнайы инструкция
қарастырылған:
Switch (өрнек) {
Case <тұрақты-өрнек> : <инструкциялар>
Case : <инструкциялар>
Default : <инструкциялар>
}
Switch инструкциясы өрнектің мәні берілген тұрақтылар жиынынан алынған
мәндердің біріне тең болса, онда оған сәйкес тармақты, ал ешқайсысына тең
болмаса, онда default сөзінен кейінгі тармақ орындалады, егер ол жоқ болса, ештеңе
орындалмайды.
case және default тармақтарын әртүрлі ретпен қоюға болады. Әрбір тармақтың
соңына break инструкциясын қойған дұрыс. Тұрақты мәндер қайталанбау керек.
Мысалы,
While ((c=getchar())!=EOF){
Switch{
Case ”0”: k0++;
56
Case ”5”: k5++; break;
Case ’ ‘: kp++; break;
Default n++; break;
}
}
Түсіндіру:
“,” операторы - бір жолда жазылған екі өрнекті орындауға мүмкіндік береді.
Нәтижесі
“,”-ң оң жағындағы өрнек мәні болады, <өрнек1>, <өрнек2>
Мысалы,
for (min=1, max=5; min Printf(“%d,%d”, min, max)}
5.4. Цикл инструкциялары.
Программалау
негіздеріндегі
қайталау
алгоритмдерін
ұйымдастыруда
қолданылатын негізгі үш циклдық конструкция қарастырылған. Олардың бір-
бірінен басты ерекшелігі циклдың қайталану шартына қарай цикл денесінің
орындалу ретінің анықталуына байланысты.
While циклы
Жалпы форматы:
While <өрнек> инструкция
Мұндағы, <Өрнек> есептелінеді, егер мәні 0-ге тең емес болса, онда
инструкция орындалады да өрнек қайта есептеледі және ол өрнек мәні 0-ге дейін
қайталанады.
for циклы
For (өрнек1;өрнек2; өрнек3) инструкция
Мұндағы: өрнек1 және өрнек3 көбінесе меншіктеу немесе функцияны шақыру,
ал өрнек2 қатынас өрнегі болып табылады. Өрнек1 цикл орындалғанға дейін
қабылданғаннан кейін қатынас өрнегі тексеріледі. Егер қатынас өһрнегі ақиқат мән
қабылдаса, онда циклдың денесі ретінде анықталған инструкция орындалады. Цикл
денесі орындалған соң, яғни итерация аяқталғаннан кейін өрнек3 орындалады да
қатынас өрнегі қайта тексеріледі. Осы процесс оның мәні жалған мән қабылдағанға
дейін жалғасады.
Бұл өрнектердің кез-келгені болмаса да ; қойылуы міндетті.
Мысалы,
for(;;) {
…
}
57
Мұнда өрнек2 мәні барлық уақытта ақиқат деп есептелінеді, бұл шексіз
циклды көрсетеді. Мұның жұмысы breаk немесе return инструкцияларының
көмегімен тоқтатылуы мүмкін.
Цикл мысалы:
For(i=0,i
Do-while циклы
Жалпы форматы:
Do
инструкция
while (өрнек);
Инструкция орындалған соң өрнек есептеледі, ақиқат болса онда инструкция
қайта орындалады.
Break және Continue
Break-циклдан немесе ажыратқыштан уақытынан бұрын шығару.
Continue-циклды келесі итерациясына көшіру
Return инструкциясы-программаның орындалу барысында жұмысын тоқтату үшін
қолданылады,аяқталу кодын меншіктейді.
Goto инструкциясы және белгі
Іштестірілген күрделі құрылымдарды үзу үшін кейде goto қолданылады. Ол
көрсетілген белгіге көшеді. Белгі - айнымалы атауы секілді, белгілі бір атпен
аталады да соңына : қойылады.
Мысалы, for(…)
For(…) {…
If() goto error;
Бақылау сұрақтары:
1. Басқару конструкцияларындағы жазылу формасына мән беріңіз.
2. Блок қай жағдайда қолданылады?
3. Дейін-циклы
мен
Әзір-циклын
ұйымдастырыуында
қандай
конструкцияларды пайдаланған дұрыс?
4. Циклды уақытына бұрын тоқтату инструкциясы қандай?
Әдебиеттер:[1-5, [10], [16-17].
Дәріс №6. МАССИВТЕР
Дәріс мақсаты: Массив, оның қасиеттері мен сипатталуы, қолданылу реттері
мен алдын-ала инициялизациялануы туралы түсініктерді беру. С/С++ тілдерінде бір
немесе бірнеше өлшемді массивтердің құрылымы мен қолданылуын үйрету.
58
Кілттік сөздер: Массив, массив элементтері, индекс, элементтер типі, массив
элементтерінің саны, атауы, инициялизациялау, бір өлшемді массив, көп өлшемді
массивтер.
Жоспары:
6.1. Массив дегеніміз не? Массив қызметтері және сипатталуы.
6.2. Массивтің инициялизациялануы.
6.3. Массив элементтерімен жұмыс жасау.
6.4. Символдық массивтер.
6.5. Көп өлшемді массивтер.
6.1. Массив дегеніміз не? Массив қызметтері және сипатталуы
Массив дегеніміз - бір атпен аталған, әртүрлі индекстелген бір типті
элементтер жиынтығы.
Қасиеттері:
Массивтің қасиеттерін анықтайтын 4 негізгі принципі бар:
-массивте элементтер деп аталатын мәндер сақталады;
-массивтің барлық элементтері бір типті болуы керек;
-жадыда массивтің барлық элементі тізбектеліп орналасады және бірінші
элемент адрестің нөлдік индексін білдіреді;
-массив атауы тұрақты болып табылады және массивтің бірінші элементінің
адресінен тұрады.
Mассивтің сипатталуы:
<элементтің типі> <массив аты> [<элементтер саны>];
Мысалы, int a[12]; {12 элементтен тұратын массив}
char s[20]; {20 элементтен тұратын массив}
#define KOL 10 {}
int [KOL];
6.2. Массивтің инициялизациялануы
Массивті инициялизациялау 3 тәсілмен анықталады:
- массивті құру барысында;
- массивті құру барысында бастапқы тұрақтыларды көрсету;
- программаның орындалу барысында;
- құру барысында массивтің бастапқы мәндері берілмесе, онда автоматты түрде
массив 0-мен толтырылады(NULL).
59
Мысалдар:
int a[3]={-1,0,1};
char buk [ ]={‘A’,’.’,’*’,’-‘,’!’,’i’,’u’};
float x[4]={0,1.5,7.55,-3.3E1,0,1.1457890,-1.1};
Массив элементінің саны мәндер санына сәйкес келмесе (3-ші мысал) көпшілік
компиляторда қате хабарланады, ал кейбірі автоматты түрде өлшемін үлкейтеді
немесе жетпесе (мән) 0-мен толықтырылады.
2-ші мысалда массивтің элементтер саны мәндері санына қарай анықталады.
6.3. Массив элементтерімен жұмыс жасау
Массив элементтерін қолдану үшін квадрат жақшада бүтін мәнді индекс
көрсетіледі. Мұндағы индекс массивтің базалық адресіне қарағанда элементтің
орнынының ығысу адресін анықтайды. С/С++ машиналық-бағытталған тіл
болғандықтан массивтің бірінші элементті 0-ші индекстен басталып нөмірленеді,
себебі массивтің бірінші элементті оның базалық адресінің басынада орналасады да
бірінші элементтің адресін алу үшін ешқандай ығысу жасалудың қажеті жоқ.
Мысалы, 5-ші элементтің адресін алу үшін базалық адрестен бастап, 4 элементке
ығысу орындалуы тиіс.
Массивпен жұмыс жасауда алдымен массив сипатталады. Мұнда квадрат
жақшада оның элементтерінің саны көрсетіледі, ол өз кезегінде жадыдан бөлінетін
ұяшықтар санын анықтайды.
Мысалы:
Int imas[6];
Сипатталуына сәйкес анықталған массивтің элементтерінің саны -6 және
элементтері 0-ден 5-ке дейін индекстелгендіктен мынадай қолданылу жолы дұрыс
болмайды:
Imas[6]=3667;
Массив элементін қолданғанда индекс ретінде үш түрлі мән беруге болады:
1.
Сандық тұрақты.
2.
Айнымалы.
3.
Өрнек.
Мұндағы мәндердің нәтижесі массивтің сипаттамасындағы мәліметтерге
сәйкес логикалық корректі сан болуы тиіс.
Қолданылу мысалдары:
#define K 8
int imas[k]; /*8 элементтерен тұратын массив сипаты */
int w=6; /* w бүтін типті айнымалысының сипаты*/
imas[3];
/*массивтің 4-ші элементті */
imas[w];
/* массивтің 7-ші элементі */
60
imas[k-6]; /*массивтің 3-ші элементі */
Индекс массивтің жадыдан қанша байт орын алатынынан тәуелсіз тікелей
реттік нөмініне сілтейді.
6.4. Символдық массивтер
Егер программада жолдық мәліметтерді өңдеу қажет болса, онда оны
символдар массив ретінде қарастыру қажет. Мұндай массивте жолдың әр
элементі үшін жеке ұяшықтар бөлінеді және ең соңғы элементі ретінде
жолдың соңы таңбасы (\о) қойылуы тиіс.
Символдық массивті енгізу және инициализациялау мысалдарына
программа келтірейік:
#include
main ()
{
char pan[12], razm[5];
static char opr[11]=”информация”;
razm[0]=’б’;
razm[1]=’а’;
razm[2]=’й’;
razm[3]=’т’;
razm[4]=\o’;
printf(“\n информатика сөзін енгізіңіз:“);
scanf(“%s”, pan);
printf(“\n %s \n”, pan);
printf(“\n %s \n”, razm);
printf(“\n %s \n”, opr);
}
Көріп отырғанымыздай символық массивке енгізілетін жолдық мәннің
ұзындықтары бірге арттырылып алынып отыр. Ол орын жолдың соңы таңбасына
арналады. Инициализациялау барысында ол таңб арнайы қойылады.
6.5. Көп өлшемді массивтер
Бір типті элементтер жиынтығын өңдеуде олардың жадыда санына қарай және
элементтерін қолдану моделіне қарай анықтап сипаттау мүмкіндігі бар. Соған
байланысты массивтің өлшемі анықталады деп есептеледі. Демек, индекстерінің
61
көрсетілуіне қарай бір өлшемді, екі өлшемді т.с.с. массивтерді анықтауға болады.
Екі немесе одан да көп өлшемді массивтеркөп өлшемді массивтер деп аталады.
Сәйкес өдшемде сипаттау үшін квадрат жақшаларда олардың өлшемдері
көрсетіледі. Мысалы, екі өлшемді массив екі квадрат жақшамен анықталып
төмендегідей сипатталады:
float massiv[3][4];
Мұндағы massiv массив атауы, ал массивтің 12 элементі бар, массив 0-ден 2-ге
дейін индекстелетін 3 жолдан және 0-ден 3-ке дейін индекстелетін 4 бағаннан
тұрады.
Пратикада массив өлшемі көбінесе үш өлшемдіден аспайды.
Масиивті екі өлшемді түрде сипаттағанмен ол ЭЕМ жадысында тізбектелген
бірдей типті мәндер тізбегі ретінде орналатырылады да, массивтің алғашқы
элементінің орынының адресі-базалық адресі массив атуына беріледі. Жалпы массив
атауы - өз бетінше көрсеткіш болып табылады.
С/С++ тілдерінде праткиада математикалық моделі матрица түрінде
анықталатын есептерді қарастырғанда көп өлшемді массив құру міндетті емес. Оны
бір өлшемді массив түрінде ұйымдастыруға болады. Ал, элементтерін ретімен
қолдану үшін оның реттік нөмірін сәйкес анықтау формуласын дәл анықтаса
жеткілікті. Себебі компьютерде көп өлшемді массив түрінде сипатталғанымен
бірдей элементтер тізбегі басқарылады.
Мысалы, a[3,4] массивінің a[і,j] –ші элементін қолдану ретін қарастырайық. Ол
үшін 12 элементтен тұратын бір өлшемді массивті төмендегідей сипаттайық:
Float a[12];
Ал, a[і,j] –ші элементін мына түрде өрнектеледі - a[i*4+j].
Мысалы, 2 жолы мен 3 бағанының қиылысуындағы элементті қолдану үшін
оның a[1][2] индекстерімен анықталатыны белгілі. Ал жоғарыдағы a[i*3+j] өрнегіне
қоятын болсақ a[1*4+2]=a[6] болады. Бұдан екінші жолдың 3-ші элементті тізбекте
7-ші екендігін, ал оны қолдану үшін массивтің базалық адресіне қарағанда 6
элементке жылжу қажеттігін аңғару қиын емес.
Бақылау сұрақтары:
1. Массив атауы айнымалы ма?
2. Массивтің нөлден бастап нөмірленуі неден тәуелді?
3. Көп өлшемді массивтің бір өлшемді массив ретінде басқарылуына мән
беріңіз.
Әдебиеттер:[1-5],[7 -10], [11].
62
Дәріс №7. ФУНКЦИЯЛАР. РЕКУРСИЯ
Дәріс мақсаты: Ішкі программалар: функциялар түсінігін қалыптастыру.
Функцияларды сипаттау және қолдану реттерін үйрету. Рекурсивті алгоритмдерді
программалау жолдарын көрсету.
Кілттік сөздер: Функция, функция прототипі, функция аргументтері, функция
қайтаратын мән, формалды және нақты аргументтер, аргументтердің берілу
тәсілдері, рекурсия, рекурсивті алгоритмдер.
Жоспары:
.
7.1. Функциялар. Функцияны сипаттау.
7.2. Функцияның формальды және нақты аргументтері.
7.3. Аргументтерді берілу тәсілдері.
7.4. Рекурсия. Рекурсивті алгоритмдер.
7.1. Функция. Функцияны сипаттау.
Си-дегі кез-келген программа - бұл айнымалылар сипаттамасы мен
функциялар жиынтығы.
Функциялар арсындағы байланыс мән қайтаратын аргументтер мен сыртқы
айнымалылар арқылы орнатылады.
Return инструкциясы нәтижені шақыратын функциядан шақырған
функцияға қайтару механизмін орындайды және return сөзінен кейін кез келген
өрнек тұруы мүмкін.
Return <өрнек>;
Өрнекті жақшаға да жазуға болады, бірақ ол міндетті емес.Си-дегі функция Раscal-
ғы процедура мен функция секілді.
Айырмашылығы:-Си-де функцианың барлық аргументі параметрлер ретінде
беріледі, яғни шақырылатын функцияға аргументтің өзі емес оның аргументтерінің
мәні беріледі.
Си-гі кез келген функцияның прототипі болуы тиіс, яғни функция аты,
аргументтерінің типі және қайтарылатын нәтиже типі көрсетілген тақырыбы
хабарланады. Прототипі программа денесінде немесе бөлек тақырыптар файлында
айқындалады. Функция прототипі компиляторға функция туралы информация
береді де, сәйкесінше компилятор типтер сай келуін тексереді. Функция әртүрлі
типті мән қайтара алады, М, int,void,float т.б.
63
7.2. Функцияның формальды және нақты аргументтері
Айнымалылар жергілікті және сыртқы болуы мүмкін. Жергілікті айнымалылар
функция ішінде сипатталады да сонда ғана “көрінеді”.
Сыртқы айнымалылар кез келген функция сыртында сипатталады да, сол
функцияның кез келген жерінде қолданылады.
Кез келген функцияны анықтау үшін форматы:
<тип нәтиже> <функция аты> (параметр тізімі)
{
<функция денесі>
}
Mысалы:
#include
Int max (int m, int n, int k);
Main ( )
{ int a,b,c;
Printf (‘a,d,c=’);
Scanf (“%i,%i”,&a,&b,&c);
Priktf (“max (a,b,c)=%i”, max (a,b,c));
Return (0);
}
Int max (int m, int n, int k);
{
Int d;
D=(m>n)? m:n;
D=(dReturn d;
}
Формальды және нақты параметрлер
Кез келген функцияның формалды аргументтер тізімі болады (болмауы да
мумкін).
Программадан функция шақырғанда аргумент тізімі беріледі.
Аргументтер адрес алу мысалын қарастырайық:
#include
int prim (int *pa, int *pb);
int main ( )
{
int ia, ib, ic;
scanf (“%i,%i”,&ia,&ib);
ic=prim (&ia,&ib);
printf (“kob=%d\n”,ic);
return (0);
}
64
int prim (int *pa, int*pb);
{
int q;
q=*pa * *pb;
return (q);
}
С++-те аргументтерді беру барысында көрсеткіш орнына тікелей сілтеме
беруге болады. Сілтеме де аргументке сілтейді, бірақ көрсеткішті айқындау
операторын қолдануды қажет етпейді.
Мысалы, төмендегі С++ тіліндегі программада функцияны шақырғанда адрес
алу операторы, ал функция денесінде көрсеткіш опраторлары қатыспайды.
#include
Int prim (int &pa, int &pb);
Int main ( )
Int ia, ib, ic;
cin >>ia; cin >>ib;
Ic=prim (ia,ib);
cout >< “kob=”<Return (0);
}
Int prim (int &pa, int &pb)
{int q;
q=pa +pb;
return (q);
}
7.3. Функция аргументтерінің берілу тәсілдері
Аргументтерінің айнымалы-мән ретінде берілу тәсілі:
Аргументтер мән ретінде берілгенде функцияның ішінде аргумент аттас
жергілікті айнымалы құрылады да оның мәні функцияда өзгеруі мүмкін, бірақ
аргументтің мәні өзгермейді.
Айнымалы-сілтеме арқылы берілу тәсілі:
Аргументтегі айнымалы сілтеме арқылы берілгенде функция аргументтің
мәнін емес, оның адресін алады. Ал мұнда құрылған жергілікті айнымалы
көрсеткіш болады. Бұл, жадыны үнемдеуге мүмкіндік береді және функцияның
орындалу барысында айнымалы аргумент мәні өзгереді. Бұл жағдайда функция
аргумент айнымалы сілтеме арқылы бірнеше мән қайтара алады.
Әртүрлі типті аргументті функцияларды қарастырайық:
Функция аргументтері Char, int, float, double, массив типті бола алады.
Функция аргументтері болмауы да мүмкін. Онда Void қызметші сөзі
қолданылады және ол функцияның аргументтерінің жоқ екенін білдіреді.
65
Mысалы,
#include
Void primer(void);
Int main ( )
{
printf (“cанның кубын анықтау”);
Primer ( );
Return (0);
}
Void primer (void)
{
int t=8;
Printf (“t-ның кубы=%d\n”,t*t*);
}
Достарыңызбен бөлісу: |