русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Case N of


Дата додавання: 2014-11-27; переглядів: 1297.


1…10: Writeln (N:4, ‘саны 1-10 аралығында жатады’);

11…20: Writeln (N:4, ‘саны 11-20 аралығында жатады’);

21…30: Writeln (N:4, ‘саны 21-30 аралығында жатады’);

Else Writeln (N:4, ‘саны бақылау аралығында жатпайды’);

End;

Көрсеткіш бүтін типті болса:

Case N of

1: Z:=N+10;

2: Z:=N+100;

3: Z:=N+1000;

End;

Көрсеткіш аталу типті болса:

Var

season: (winter, spring, summer, autumn);

Begin

….

Case season of

Winter: Writeln (‘қыс’);

Spring: Writeln (‘көктем’);

Summer: Writeln (‘жаз’);

Autumn: Writeln (‘күз’);

end;

4.6-мысал.Берілген жылға байланысты айдың реті бойынша сол айда неше күн барын анықтайтын программа құру керек.

Program M6;

Var

n, m: integer;

Begin

Read (m, n);

Case n of

1,3,5,7,8,10,12: writeln (’31 күн бар’);

4,6,9,11: writeln (’30 күн бар’);

2: if (mod 4=0) and not (m mod 100=0) and (m mod 400<>0)) then writeln (’29 күн бар’)

else writeln (’28 күн бар’)

end;

end.

Мұнда m - берілген жыл, n - сол жылдағы айдың реті.

 

Бұл тақырыптың мақсаты, Паскаль тілінде сызықтық және тармақталу есептеу процесстерін программалау тәсілдерімен танысып, жүйелі программалау тілдеріне сәйкес болып табылатын қарапайым программалау технологияларын игеру болатын. Сондықтан, төменде келтірілген бақылау сұрақтарына жауап беріп, тапсырмаларды орындағанды жөн санаймыз.

 

Бақылау сұрақтары

  1. Оператор деген не?
  2. Операторлардың қандай түрлері бар?
  3. Операторлық жақша деген не және олар қалай пайдаланылады?
  4. Операторлар программаның қай тарауына жатады?
  5. Меншіктеу операторында қандай өрнектерді пайдалануға болады?
  6. Read, Readln, Write, Writeln операторларының қызметтері қандай?
  7. Read операторы қалай орындалады?
  8. Read және Readln процедураларының айырмашылығы неде?
  9. Write және Writeln процедураларының айырмашылығы неде?
  10. Тармақталу операторлары қандай қызмет атқарады және олардың қандай түрлері бар?
  11. Тармақталу операторлары жазылуының жалпы түрін келтіріп, түсіндіріңіз.
  12. Тармақ деген не?
  13. Сызықтық және тармақталу есептеу процестерінің негізгі айырмашылығы неде?
  14. Таңдау операторлары қандай жағдайда қолданылады?
  15. Таңдау операторында көрсеткіш қандай мән қабылдай алады?

 

Өзіндік жұмыстың тапсырмалары

  1. Паскаль тіліндегі программаны теру және оны редакциялау.
  2. Паскаль тіліндегі программаны компиляциялау, компиляцияның қателерін іздеу және оларды жою.
  3. Терілген программаны іске қосу және нәтижелерін қарап шығу.
  4. Программаның дұрыс істеуін ұйымдастыруға арналған қарапайым әдістер.

 

Жаттығулар

  1. x, y, z нақты сандары берілген. Төмендегі өрнектердің мәндерін есептейтін программа құру керек.

 

a) ; б) 1 + x + ; c) 1 + │x│+ │x + 1│;

d) ; e) - 2.5 ; f) ;

g) + S ; h) ; k) ;

  1. Тік бұрышты үшбұрыштың гипотенузасы мен катеті берілген. Екінші катетін және үшбұрышқа іштей сызылған шеңбердің радиусын табыңыздар.
  2. Екі санның қосындысы 157-ге тең, әрі олардың біреуі екіншісінен 28-ге артық. Осы сандарды табыңыздар.
  3. Ойланған санды 2 есе кемітіп, осы нәтижені 19 санымен қосқанда 37 шығады. Ойланған санды анықтайтын программа құру керек.
  4. x, y нақты сандары берілген. Табу керек:

a) max (x, y);

b) min (x, y);

c) max (x, y)* min (x, y);

  1. x, y, z нақты сандары берілген. Табу керек:

a) max (x, y, z);

b) min (x, y, z);

c) max (x, y, z)* min (x, y, z);

  1. x, y, z нақты сандары берілген. Табу керек:

a) max (x + y + z; xyz);

b) min (x +y*z; x*y; x*z/y);

c) max2 ((x + y + z)/2; xyz/2);

  1. a, b, c нақты сандары берілген. Егер a<b<c болса, онда осы сандарды абсолют шамаларымен алмастырыңыз, кері жағдайда оларды екі еселеңіз.
  2. x, y нақты сандары берілген. z - тің мәнін есептеу керек:

z - y, егер x>y;

z =

y - x + 1, кері жағдайда;

10. Екі нақты сан берілген. Егер бірінші сан екіншісінен үлкен болса, бірінші санды, әйтпесе екеуін де

экранға шығару керек.

11. Екі нақты сан берілген. Егер бірінші сан екіншісінен кіші болса, онда оны нөлмен алмастырыңыз,

кері жағдайда сандарды өзгеріссіз қалдырыңыз.

12. Үш нақты сан берілген. Осы сандардың ішінен берілген (1;2.5) аралығында жататын сандарды табу

керек.

13. x, y нақты сандары берілген. Осы екі санның кішісін олардың жартылай қосындысымен, ал үлкенін олардың екі еселенген көбейтіндісімен алмастырыңыздар.

14. Үш нақты сан берілген. Олардың теріс еместерін үш еселеу, ал терістерін квадраттау керек.

15. Егер өзара әртүрлі үш x, y, z нақты сандардың қосындысы 1-ден кіші болса, онда осы үш санның ең кішісін, қалған екеуінің жартылай қосындысымен, әйтпесе x, y сандарының кішісін қалған екі мәнінің жартылай қосындысымен алмастыру керек.

16. a, b, c нақты сандары берілген (a≠0), ax4+bx2+c=0 биквадратты теңдеуді толығымен зерттеңіз. Егер нақты түбірлері бар болса, онда оларды табыңыз, кері жағдайда олардың жоқ екендігін хабарлайтын информация экранға шығарылсын.

17. a нақты саны берілген. F(a)-ны есептеу керек. Егер:

a2, егер -2 ≤ a < 2;

a) F(a) =

4, кері жағдайда;

 

a2 +4a+3.5, егер a ≤ 2;

b) F(a) =

4/( a2 +4a+3.5), кері жағдайда;

 

0, егер a ≤ 0;

c) F(a) = a, егер 0 < a ≤ 1;

a2, басқа жағдайда;

 

0, егер a ≤ 0;

d) F(a) = a2 - a, егер 0 < a ≤ 1;

a2 - sin π a, басқа жағдайда;

 

  1. ҚАЙТАЛАНУ ҚҰБЫЛЫСЫН ПРОГРАММАЛАУ ТЕХНОЛОГИЯЛАРЫ

5.1. Циклдік өңдеу операциялары

Математикада, экономикада көптеген есептерді шығару кезеңінде бір теңдеуді немесе формуланы пайдаланып, ондағы айнымалының өзгеруіне байланысты бірнеше рет қайталап есептеуге тура келетін сәттер жиі кездеседі. Осындай қайталанып орындалатын есептеу процесінің белгілі бір бөліктерін цикл деп атайды. Ал осы құбылысты программа түрінде жазу керек болса, ол үшін арнайы операторлар қолданылады.

Қайталану (цикл) операторлары белгілі бір оператордың немесе операторлар тобының бірнеше рет қайта орындалуын ұйымдастыруда қолданылады. Программада қайталанатын операторлар тобы циклдің денесін құрайды.

Паскаль тілінде цикл ұйымдастыру операторларының үш түрі бар:

While (әзір), Repeat (дейін), For (параметрлі цикл).

While, Repeat операторлары қайталану саны белгісіз, бірақ циклге кіру немесе циклден шығу шарттары белгілі жағдайда қолданылады. Егер де қайталану саны белгілі болса, параметрлі For-циклін пайдаланған жөн.

While - Do операторы, Паскаль тілінің While және Do қызметші сөздерінен, циклдік қайталануды орындау шартынан және цикл денесінен тұрады.

Жазылуы: While<шарт>Do <цикл денесі>;

Шарт типі Boolean (логикалық) болғандықтан ол тек TRUE - «ақиқат» немесе FALSE - «жалған» мәндерін қабылдай алады.

Цикл денесін әрбір қайталау алдында белгілі бір шарт тексеріледі. Шарт «ақиқат» болған жағдайда, цикл денесі орындалады, әйтпесе программа орындалуы цикл денесінен кейін тұрған, кеелсі операторға көшеді. Егер алғаш рет тексерілгенде шарттың мәні «жалған» болса, цикл денесі бір рет те орындалмастан, программа цикл соңына шығады.

While - Do операторының орындалуы схема түрінде 14а суретте келтірілген.

Кейбір жағдайларда циклдік қайталану шарты тексерілмей тура мәліметтерді өңдеу операцияларының кемінде бір рет орындалуының қажеттілігі туындайды. Бұл жағдайларда циклдық қайталануды тексеретін шарт, цикл денемінен кейін орналасқан вариантын қолданғанды жөн деп санаймыз.

Repeat - Until.Бұл оператор цикл басынан (Repeat), цикл денемінен және циклден шығу (Until)бөлімдерінен тұрады.

Жазылуы: Repeat <цикл денесі> Until <шарт>;

(Repeat) пен (Until)қызметші сөздерінің арасында жазылған операторлар цикл денесін құрайды да, бір немесе бірнеше операторлардан тұратын болады. Схема түрінде 14-суретте келтірілген.

басқарушы айнымалының мәнін өзгерту
цикл денесі
бастапқы меншіктеу
басқарушы айнымалының мәнін өзгерту
цикл денесі
бастапқы меншіктеу
a) б)

 

 

ақиқат

 

 

жалған

 

 

ақиқат

 

 

жалған

 

 

14-сурет a) While - Do және б) Repeat - Until қайталану (цикл) операторларының орындалу схемалары

Мысалы, келесі цикл:

repeat

A:=A*A;

i:= i - 1;

until

i:= 0;

i нөлге тең болғанша орындалады.

Программаны көп рет қайталауда Repeat операторы өте қолайлы болып саналады. сонымен қатар кез-келген программаны көп рет пайдалануға мүмкіншілік беретін модификациялар еңгізу жолдарын келтірейік.

Бұл үшін: программада Char типті айнымалыны сипаттама бөлімінде жариялап, мысалға CH болсын; программаның басында BEGIN қызметші сөзінен кейін Repeat операторынан тұратын бір жол енгізілуі тиіс; ал программаның соңында end қызметші сөзінің алдындағы жолға келесі үш жолдан тұратын программа үзіндісін енгізу керек:

Writeln (‘Жұмысты жалғастыру үшін - Y, әйтпесе кез келген клавишаны бас’);

Read (CH);

Until UpCase (CH)<>’Y’

Бұл әдіс осы құралда қарастырылатын көптеген программаларда кездеседі.

Repeat - Until және While - Do циклдік операторларының арасында негізінен үш айырмашылығы бар, енді соларды қарастырайық:

  1. Repeat операторында циклден шығу шарты соңында тексеріледі, сондықтан да цикл денесі, шартқа тәуелсіз болып, міндетті түрде бір рет орындалады;

2. Repeat операторында циклден шығу шарты осы шарт «ақиқат» болғанда қанағаттандырылады, While операторында, керісінше, шарт «жалған» болғанда цикл соңына шығады;

3. Repeat - Until қызметші сөздерінің арасында бір немесе бірнеше операторлар орналасуы мүмкін, ал While операторында цикл денесі бір ғана жай немесе құрмалас оператордан тұрады.

Енді осы операторларды қолданып цикл ұйымдастыру әдістерін келесі мысалдарда көрсетейік.

5.1-мысал.a, (a > 1) сандары берілген болсын. Осы a1, a2, a3, …an тізбектің, алдын ала берілген b санынан кіші болатын, мүшелерін баспаға шығару программасын түзу керек болсын.

 

Program M51;

жоқ ия Var

a, b, c, n: real;

Begin

Read (a, b);

c:=a; n:=1;

While n < 10 do

с:=c*a
Begin

n:= n + 1;

if c < b then writeln (c);

c:= c * a;

End;

End.

Бұл программаның орындалу барысында с айнымалысы a1, a2, a3, …an мәндерін біртіндеп қабылдайды, с-ның мәні b-ға тең не артық болғанша өзгеріп отырады да, соған сәйкес мәндері әр қайталауда экранға шығарылады. Егер әуелден a > b болса, экранға еш нәтиже шықпайды. Мұнда цикл денесі құрмалас оператор түрінде келтірілген.

5.2-мысал.1 + + + …шексіз қосындының жуық мәнін ε-дәлдікпен есептейтін программа құру керек.

Бұл мысалдың ерекшелігі - итерациялық цикл ұйымдастыру тәсілдерін қолдану арқылы икемді программа құру.

Программада циклды ұйымдастырғанда оның әр қадамына алдыңғы қадамының нәтижесін толық пайдаланатындай етуге ұмтылу керек, сондықтан бұл мысалда х-тің дәрежелерін және факториалды жай есептемей, алдыңғы (i-1)-қадамына табылған қосылғышты мүшесіне көбейтіп, есептелінгені тиімді деп санаймыз. Есептің шарты бойынша қосылғыштар саны алдын ала белгісіз.

Мұндағы циклге кіру шарты - кезекті қосылғыш берілген ε-дәлдіктен үлкен болуы. Цикл денесі шарт «жалған» болғанша қайталанады. Бұл типтес есептерді алгоритмдеу тәсілдері [1,6,17] оқұлықтарында толығынан қарастырылған.

 

Program M52;

Var

жоқ ия x, eps, y, s: real;

i: byte;

Begin

Read (x, eps);

S:=0; y:=1; i:=0;

While abs(y) >=eps do

Begin

S:=s+y; i:=i+1;

y:=y*x/I;

End;

Write(s);

End.

15-сурет. While - Do операторының жұмысы

 

5.3-мысал.Енді 0 мен 10-ның арасындағы жүп сандардың қосындысын есептейтін программаны Repeat - Until операторының көмегімен көрсетейік:

sum:=sum+i i:=i + 2
...

Program M53;

Var

i, sum: integer;

Begin

i:=0; sum:=0;

жоқ ия Repeat

sum:=sum+i;

i:=i+2;

Until (i > 10);

Writeln (‘sum =’, sum);

End.

 

16-сурет. Repeat - Until операторының жұмысы

 

Мұнда цикл денесі қайталану шарты i > 10 орындалмаса (яғни «жалған» болған жағдайда), қайталана береді. Программадағы Repeat - Until операторының жұмысы 16-суретте көрсетілген.

Егер де қай циклден болса да цикл аяқталмай шығукерек болса, шартсыз өту Goto операторын қолдануға болады, мысалға келесі программа үзіндісі:

...

Repeat

S:=100/f;

D:=f/5;

If S < 0.5 then Goto metka;

A:=A+1;

Until (A<=100) and (d<>0);

metka:= x:=x*x+2

 

5.4-мысал. Берілген n натурал саны неше цифрдан тұратынын анықтайтын программа құру керек болсын.

While және Repeat операторларын пайдаланып, программаны екі түрде құрайық. Бұл мысалдың табиғи тілде жазылған алгоритмі: берілген санды 10-ға бүтіндей бөліп, табылған санды тағы да 10-ға бөліп т.с.с. осы процксті бөлінді нөлге тең болғанша қайталаймыз.

 

Program M54A; Program M55B;

Var Var

i, n, m: integer; i, n, m: integer;

Begin Begin

Write (‘n=’); Read (n); Write (‘n=’); Read (n);

i:=0; m:=n; i:=0; m:=n;

While m > 0 do Repeat

Begin m:= m div 10;

m:= m div 10; i:=i+1;

i:=i+1; Until m=0;

End; Write (n,‘санында’, i, ‘цифр’);

Write (n,‘санында’, i, ‘цифр’); End.

End.

Бұл программада жоғарыда айтылған While - Do және Repeat - Until операторларының арасындағы айырмашылықтары айқын көрінеді.

Кейбір жағдайларда While және Repeat арқылы ұйымдастырылған циклдер қолайсыз үлкен болады.

For-Do, For-Downto.For-Do циклдік операторы қайталау саны алдын ала белгілі болған жағдайларда қолданылады. Бұл оператор екі түрде беріледі.

Жазылуы:

  1. For <циклдік параметр>:=<алғашқы мән>to <соңғы мән>

do <циклдің денесі>;

  1. For <циклдік параметр>:=<алғашқы мән>downto <соңғы мән>

do <циклдің денесі>;

Мұндағы циклдік параметріміз кейде басқару айнымалысы деп аталады. Алғашқы және соңғы мәндер нәтижесі - нақты типтен басқа стандартты жай тип болатын өрнектер. Басқару айнымалысының типі, алғашқы және соңғы мәндерінің типтері бірдей болуы керек. Олар нақтыдан басқа кез келген жай типті болуы мүмкін. Цикл денесі жай немесе құрмалас операторлар бола алады.

Циклдік оператор орындалғанда, бірінші болып өрнектің мәні есептеледі, For-to (немесе For-downto) операторында циклдік параметрге алдымен алғашқы (соңғы) мәні меншіктеледі. Басқару айнымалысының мәні 1-ге ((-1)-ге) тең қадаммен біртіндеп өзгеріп отырады. Do қызметші сөзінен кейінгі цикл денесі басқару параметрінің әр бір мәні үшін бір реттен орындалып отырады. Егер басқару айнымалысының алғашқы мәні соңғы мәнінен артық (to-үшін) немесе кем (downto-үшін) болса, ондацикл денесі бір рет те орындалмайды.

Енді осы операторды пайдаланып программада қайталану алгоритмдерін ұйымдастыру тәсілдерін келесі мысалдарда қарастырайық:

А) For I = 1 to 20 do write ( ‘*’ ) операторы * символын бір жолдың бойына 20 рет экранға шығарады;

В) циклдық параметр бүтін типті болып келсе:

Оператор Орындалу нәтижесі

For і: = 10 to 14 do write (i:3); 10 11 12 13 14

For і: = 14 downto 10 do write (i:3); 14 13 12 11 10

С) циклдық параметр char типті болып келсе:

Оператор Орындалу нәтижесі

For ch : = ‘a’ to ‘e’ do write (ch:4) a b c d e

For ch : = ‘e’ downto ‘a’ do write (ch:4) e d c b a

D) циклдык параметр атау типті болып келсе,мысалға:

Var

sort (s1,s2,s3);

For sort : = s1 to s3 do

5.5-мысал.Параметрлі циклдің көмегімен есептеулерде жиі кездесетін n! (n-нің факториалы) мәнін есептеу программасын екі жолмен қарастырайық.

Program M55A; Program M55B;

Var Var

i,n,p: integer; i,n,p,: integer;

Begin Begin

Write (‘n=’); Read (n); Write (‘n=’); Read (n);

p: =1; p: =1;

For i:=1 to n do For i :=n downto 2 do

p:=p*I p:=p*I

Write (‘n!=’,p); Write (‘n!=’,p);

End. End.

5.6-мысал.Берілгені n-натурал саны. a1, a2, a3 ….an тізбегінің мәні ең үлкен aк мүшесін және оның k-реттік нөмірін табу керек болсын.

Program M56;

Var i ,k, a, n,M: integer;

Begin

Write (‘n=’ );

Read (n); Write (‘1-ші санды енгізіңіз’ );

Read (M); k:=1;

For i : =2 to n do

Begin

Write (i,‘-шы санды енгізіңіз’); Read (a);

If a > M then

Begin

M:=a; k:=I;

End;

End;

Writeln ( ‘ең үлкені =’ ,М, ‘реттік нөмірі =’,к )

End.

 

Бұл программа орындалу барысындағы диалог және экранға шығатын нәтиже:

n=4 Enter

1-ші санды енгізіңіз: 8 Enter

2-ші санды енгізіңіз: 67 Enter

3-ші санды енгізіңіз : 11 Enter

4-ші санды енгізіңіз : 85 Enter

ең үлкені =85 реттік нөмірі =4

Шартсыз өту операторы, бос ператор.Паскаль тіліндекез келген оператор таңбалануы да мүмкін. Таңба (метка) оператордың алдына қойылады да, одан қос нүкте арқылы ажыратылады. Мысалы, 21 таңбасымен белгіленген Write(x) операторы былай жазылады: 21: Write (x). Таңба оператордың орындалуына әсер етпейді.

Бұған дейін қарастырылған программалар оператордың орналасу ретімен орындалатын. Егер де біз программаның осындай табиғи орындалу ретін бұзғымыз келсе, өту операторын пайдалануға болады. Өту операторы соңынан таңба қойылған Goto қызметші сөзінен тұрады.

Жазылуы: Goto <таңба>;

Оператор бойынша орындалатын іс-әрекет: өту операторынан кейін көрсетілген таңбалы оператор орындалады.

5.7-мысал.Берілген cos(i3)*sin(i*n) (i=1,2…n) санның ішінде 0,0001-ден кіші сан кездесетінін, иә кездеспейтінін анықтайтын программа құру керек. Кездессе мұндай санды іздеуді тоқтатып, экранға қойылған талапқа сәйкес «бар» немесе «жоқ» деген жауап алайық.

Program M57;

Label 1;

Var

I, n: integer;

Begin

Read (n);

For i:=1 to n do

If cos(i*i*i)*sin(i*n)<0.0001 then

Begin

Write (‘бар’); Goto 1;

End;

Write (‘жоқ’);

1: Write;

End.

 

Программада Goto 1 операторы берілген санның кезекті мәні 0,0001 ден кіші болса, цикл аяқталмастан соңына шығуға мүмкіндік береді. 1 таңбасымен программа соңында бос оператор таңбаланып отыр. Ал егер де экранға «бар/жоқ» информациясы шығарылған сәттегі берілген өрнектің мәнін де көру керек болса, онда программада нәтижелік информацияны баспаға беру жолына тағы бір операторын қосу керек, ол: Write (cos(i*i*i)*sin(i*n)).

5.8-мысал.Берілген 20 бүтін сандардың ішінде 5 санына еселі бірінші оң санды, егер ондай бірде-бір сан табылмаса, «табылмады» деген информацияны беретін программаны құру керек.

Program M58;

Label 13, 12;

Var

k, a: integer;

Begin

For k:=1 to 20 do

Begin

Writeln (‘?’); Read (a);

If a<=0 then Goto 12;

If a mod 5 = 0 then

Begin

Write (a); Goto 13;

End;

12: End;

Write (‘табылмады’);

13: End.

Ескерту. Қайталау немесе тармақталу операторларының сыртында орналасқан өту операторының көмегімен басқаруды бұл операторлардың ішіне беруге болмайды.

 

5.2. Қайталау немесе тармақталу операторларының сатылы орналасуы

 

Кейде қызметші сөзінен кейін орналасқан оператор циклдік немесе ішінде циклдік операторы бар басқа оператор болуы мүмкін. Мұндай жағдайда циклдік оператордың сатылы орналасқан түрлерін көруге болады. Осындай циклдердің сатылы орналасуын мысалдармен көрсетейік.

5.9-мысал. түрінде берілген дәрежелердің қосындысын есептейтін программа құрайық. N - берілген натурал саны.

Program M59;

Var

n,i,j: integer;

a,s,p: real;

Begin

Read (n); s:=0;

For i:=1 to n do

Begin

a:=1/i; p:=a;

For j:=0 to n do

P:=p*a;

S:=s+p;

End;

Write (‘қосынды =’,s);

End;

j параметрі бойынша ашылған ішкі циклде әрбір қосылғыштың n-дәрежесі есептелінеді. i параметрі бойыеша ашылған сыртқы цикл кезекті қосылғыштың мәнін а айнымалысында есептейді де, p айнымалысына меншіктеп отырады.

Әдетте, көптеген есептерді шешуге арналған алгоритмдер күрделі болып, түрлі тармақтардан тұратындығы белгілі. Сондықтан бұл жағдайларда алгоритмнің тармақтары бойынша басқаруды дұрыс ұйымдастыру мәселесі туындайды.

Есепті шешу процесін басқаратын алгоритмдерді іске асыру үшін Паскаль тілінің құралдары көп жеңілдік береді. Осы операторлардың қатарында «шарт бойынша басқару» операторы да бар.

Әдетте, нақты программа құру барысында есептеудің түрлі варианттарын таңдауды жүзеге асыруға тура келеді. Бұл проблеманы шешудің бір жолы жоғарыда аталған If операторы.

For мен If операторларын бірдеу пайдалану барысында шешілген мысалдарды қарастырайық. Бір If операторы ішіне тағы бір If операторы салынуы мүмкін, яғни келесі құрылымдардың жүзеге асырылуын келтірейік:

  1. If 1-өрнек then

begin

If 2-өрнек then

оператор (немесе операторлар блогы)

else

оператор (немесе операторлар блогы)

end;

  1. If 1-өрнек then

оператор (немесе операторлар блогы)

else

If 2-өрнек then

оператор (немесе операторлар блогы)

else

оператор (немесе операторлар блогы);

Мұндағы - «1 өрнек», «2 өрнек» тағы басқа да өрнектердің мәндері тек False немесе True болуы мүмкін және де алгоритмде таңдауды басқаруға арналған.

Операторлар блогы бір оператордан, мысалға А:=13, немесе Begin… End операторлық жақшалармен шектелген бірнеше операторлардан тұруы мүмкін.

Жоғарыда айтылғандай, кейбір жағдайларда циклдік оператордың ішінде if операторы, ал if операторының тармақтарында циклдік операторлар кездесуі мүмкін. Келесі мысалдарда бұл операторлардың өзара сатылы орналасуының әр түрлі варианттарын қарастырайық.

5.10-мысал.X3+X2-A2=0 теңдігін А параметрінен тәуелді теңдеу ретінде қарастырайық. Х - белгісіз болсын. А-ның [1,2] аралығындағы 0.1 қадаммен өсетін мәндеріне сәйкес келетін теңдеулердің (0,2) кесіндіде жатқан жалғыз түбірін 0.0001 дәлдікпен табатын программаны, кесіндіні қақ бөлу алгоритмін пайдаланып құру керек болсын.

Program M510;

Var

i: integer;

u,a,b,c,fa,fc: real;

Begin

For i:=0 to 10 do

Begin

U:=sqr(1+0.1*i);

a:=0; b:=2; fa:=u;

While b-a >=0.0001 do

Begin

c:=(a+b)/2; fc:=sqr(c)*(c+i)-u;

If fa*fc<=0 then b:=c

else

Begin

a:=c; fa:=fc;

End;

End;

Writeln(a);

End;

End.

 

Мұнда сыртқы цикл параметрлі цикл де, ішкі цикл While шартты циклі болып келіп отыр. Ішкі циклде For операторын пайдалана алмайтынымыз, өйткені қайталану саны алдын ала белгісіз. Ішкі циклдің денесінде If операторы қолданылады, ал If операторының else тармағында құрмалас операторының қолдануын көруге болады.

Ескерту. Айнымалылардың әр сипаттамасы және тұрақтылар анықтамасы әр қашанда (;) символымен аяқталады. Программаның әр операторы, егер де осы оператордан кейін келесі қызметші сөздер: end, else, Until жазылмаса (;) символымен аяқталуы тиіс. then, else, var, const қызметші сөздерінен кейін (;) символы еш жағдайда жазылмайды.

5.11-мысал.Берілген n-санына дейінгі барлық бөлгіштерінің қосындыларына тең болатын барлық сандарды экранға шығаратын программа құрайық.

Program M511;

Var

n,i,m,j: integer;

u,a,b,c,fa,fc: real;

Begin

Read (n); Writeln;

For i:=2 to n do

Begin

m:=1;

For i:=2 to i div 2 do

If i mod j=0 then m:=m+j;

If m=i then Writeln(i);

End;

End.

Программадағы ішкі және сыртқы циклдер бағдаршамалармен көрсетілген. Ішкі циклдің денесін тармақталу операторы құрайды. Ішкі цикл әрбір i санының бөлгіштерін тауып, олардың қосындысын m-айнымалысында сақтап отырады. Сыртқы циклдің денесіне де тармақталу операторы енеді, ол берілген санды, оның бөлгіштерінің қосындысымен салыстырады.

5.12-мысал.Алдыңғы және кейінгі мәндерді анықтауға арналған іс-әрекеттерді көрсететін программа.

Program M512;

Uses Crt;

Var ch: char;

Begin

Repeat

TextBackground(Blue); {Фонның көгілдір түсін белгілеу}

TextColor(Yellow); {Символдар үшін сары түсті анықтау}

Write(‘Input symvol’);

Readln(ch);

If ord(ch)<33 then exit; {символдың талдауға ашықтығын шектейді}

{Келесі командалар нәтижені экранға шығарады}

writeln(‘Pred, Symvol Succ’);

writeln(‘---------------------------’);

writeln(‘pred(ch):5,ch:9,Succ(ch):9);

Delay(3000); {нәтижені көруге кідіріс}

ClrScr; {символдың келесі мәнін енгізу үшін экранды тазарту}

until UpCase(ch) = ‘?’ {бұл оператор repeat пен бірге программаның көп рет орындалуына

мүмкіндік береді}

End.

Егер де циклден шығу тым күрделі болса, repeat операторының әс-әрекетін келесі мысалда қарастырайық.

5.13-мысал.Кез келген натурал санды жай көбейткіштерге жіктеу операцияларын көрсететін программаны құрыңыздар.

Program M513;

Uses Crt;

Var I, N, F, J: Integer;

Begin

{Талдауға енгізілген санды тексеру командалар блогы}

Repeat

ClrScr;

Write(‘Натурал сан енгіз N=’);

Readln(N);

Until N>0;

Write (N:6, ‘=1’);

F:=0;

J:=N;

{Тексеру циклі: 2 ден енгізілген санның жартысын дөңгелектенген мәніне дейінгі

диапазон}

For I:=2 to N div 2 do

Begin

If J mod I=0 then

F:=1;

While J mod I=0 do

Begin

Write (‘*’, I); {көбейткішті экранға шығару}

J:=J div I

End;

If F = 0 then writeln (‘*’, N)

else writeln;

Readln;

End.

Әртүрлі типті шамалар компьютер жадында түрлі көлем алатындығы белгілі, сондықтан бүтін типті санды басқа типті шамаларға айландыру тәсілдерін келесі мысалда қарастырайық.

 

Program TipNumber;

Uses Crt;

Var

X: Integer; {қажетті жады көлемі - 2байт}

Y: Longint; {қажетті жады көлемі - 4байт}

Z: Shortint; {қажетті жады көлемі - 1байт}

W: Byte; {қажетті жады көлемі - 1байт}

Q: Word; {қажетті жады көлемі - 2байт}

Ch: Char;

Begin

ClrScr;

Repeat

Write(‘Бүтін сан енгізіңіз =’);

Readln(Y);

X:=Y;

Z:=Y;

W:=Y;

Q:=Y;

{енді түрлі типтердің бейнеленуінің айырмашылығын көрнекті түрінде көре аласыздар}

writeln(‘Integer=’, X);

writeln(‘Longint=’, Y);

writeln(‘Shortint=’, Z);

writeln(‘Byte=’, W);

writeln(‘Word=’, Q);

writeln(‘Мәліметтерді енгізуді қайталайсыз ба? Yes/No’);

Readln (Ch);

Until UpCase(Ch) <> ‘Y’;

End.

Бұл тақырыпта Паскаль тілінде цикл ұйымдастыру тәсілдерін игеру мақсаты қойылған болатын, қайталану операторларымен танысып, жүйелі программалау тілдеріне сәйкес болып табылатын қарапайым программалау технологияларын игеру үшін келесі бақылау сұрақтарына жауап беріп, тапсырмаларды орындағанды жөн санаймыз.

 

Бақылау сұрақтары.

1. Оператор деген не?

2. Операторлардың қандай түрлері бар?

3. Операторлық жақша деген не және олар қалай пайдаланылады?

4. Операторлар программаның қай тарауына жатады?

5. Меншіктеу операторында қандай өрнектерді пайдалануға болады?

6. Тармақталу операторлары қандай қызмет атқарады және олардың қандай түрлері бар?

7. Қайталау операторларының түрлері қандай және олардың әрқайсысы қандай жағдайларда пайдаланылады?

8. Әзірше-циклын ұйымдастыру технологиясы.

9. Дейін-циклын ұйымдастыру технологиясы.

10. Параметрлі цикл және оның ерекшеліктері.

11. While-Do, Repeat-Until операторларының айырмашылықтары қандай?

12. Тармақталу және циклдік операторларына сырттан кіруге болмайтын себебі неде?

13. Циклдік операторлардын цикл аяқталмай шығуды қалай ұйымдастыруға болады?

14. Таңбалар программада не үшін қажет?

15. Бос оператордың атқаратын қызметі қандай?

16. Қандай жағдайларда цикл ұйымдастыру үшін For-операторын пайдаланған ұнемды болып табылады?

17. Күрделі цикл деген ұғым нені білдіреді және осы циклдарды ұйымдастыруда қандай шектеулер бар?

18. Бірінің ішіне бірі орналасқан шарттарды программа түрінде жүзеге асыру.

19. Шартты операторлардың жазылу түрін келтіріп, оператордың іс-әрекетін түсіндіріңіз.

20. Қайталау операторларының жазылу түрін келтіріп, оператордың іс-әрекетін түсіндіріңіз.

 

Жаттығулар

1. Берілген аралықта h қадамымен х-тің өзгеру барысында төменде көрсетілген функцияның мәндерін тауып, осы мәндер бойынша кесте құрастырыңыздар:

 

a) y = arctgx - 0,005, мұндағы х Є [1;2], hx = 0.05

b) y = ln x + 1,57 x, мұндағы х Є [1;2], hx = 0.1

c) Z = , мұндағы х Є [0,3;0,8], hx = 0.05

d) Z = 0,05 lg x - 3x, мұндағы х Є [1,5;2,5], hx = 0.1

e) Y = 3arctg(x2 + 1) - 0,5x, мұндағы х Є [1;2], hx = 0.1

 

 

x < 2,7

2. y = (a+b)/(x+1), 2,7 ≤ x ≤ 5 мұндағы х Є [0;7], hx = 0.5

ex + sin x, x > 5

 

, x < 4

3. y = x, 4 ≤ x ≤ 5 мұндағы х Є [0;12], hx = 1

ax +bx3, x > 6

 

, x < 0,1

4. y = x, x = 0,1 мұндағы х Є [-1;1], hx = 0.2

ax +bx3, x > 6

, x > 0,1

 
 


sin x ln x, x > 3,5

5. y = sin x + ln x, x = 3,5 мұндағы х Є [2;5], hx = 0.25

cos2 , x < 3,5

 

a lg x + , x < 3,6

6. y = , 3,6 ≤ x ≥ 8,5 мұндағы х Є [0;12], hx = 1

2a cos x + 3 x2, x > 8,5

 

 

cos x, 1-x2 < 0

7. f = 1/ , 0 ≤ (1-x2) < 1 мұндағы х Є [-0.5;1.5], hx = 0.25

, (1-x2) ≥ 1,

 

 

8. S =

 

9. S =

 

10. S =

 

11. S =

 

12. S =

 

13. S =

 

 

  1. P =
  2. S =
  3. Берілген а1, а2, а3...а50 тізбегінде мәндері 25-тен кіші болатын элементтерінің көбейтіндісін табу керек.
  4. Берілген а1, а2, а3...а50 тізбегінде төмендегі формула бойынша S мәнін анықтау керек:

S = 2а1 +

  1. Берілген а1, а2, а3...а50 тізбегінде төмендегі формула бойынша S мәнін анықтау керек:

S = а12 + а1а2+ а1а3+ а1а4+....+ а1а50

  1. Берілгені: а1, а2, а3...а50 тізбек элементтері, келесі формула бойынша S мәнін анықтау керек:

S = +2а2 + 2а3+ 2а4+...+2а49.+

  1. Берілгені: тізбек элементтері, келесі формула бойынша S мәнін анықтау керек:

S = 3,07(а123.* а4.*…*.а30 )-1.2(а3132 +…+а50)

21. Берілген а1, а2, а3...а50 элементтер тізбегінде оң элементтерінің S қосындысын және теріс элементтерінің P көбейтіндісін табу керек.

22. Берілген а1, а2, а3...а50 элементтер тізбегінде мәндері 5-тен кем болатын элементтерінің арифметикалық ортасын табу керек.

 

6. ПАСКАЛЬ ТІЛІНДЕ ПРОГРАММАЛАУДА МАССИВТЕРДІ ҚОЛДАНУ

6.1. Массив типінің сипатталуы

Паскаль тілінде жеке-дара мәліметтермен қатар, қандай да бір жүйеде жиналыстырылған олардың топтарын да қарастыруға болады. Осындай топтардың бірі - құрылымдық типті ARRAY (массив) мәліметтері.

Массив дегеніміз - бір типті шамалардың реттелген белгілі бір тобы. Массивке кіретін айнымалыларды массивтің элементтері дейіді, олардың саны сипаттама бөлімінде жарияланып анықталады да, программаның орындалу барысында өзгермейді. Массив элементтерінің типі файлдан басқа кез келген (бүтін, нақты, символдық, жолдық, массивтік т.б.) типті бола алады. Яғни Паскаль тілінде жолдар массивін, символдар массивін, массивтер массивін т.с.с. қарастыруға мүмкіншілік бар. Массив элементтерінің типін массивтің негізгі базалық типі деп атайды.

Массив тұтасымен бір атпен аталады, ал элементтерінің реті индекс арқылы көрсетіледі. Индекс массивтің идентификаторынан соң тік жақшаға алынып жазылады, мысалға: a[1], a[2], a[3],… a[i],… a[n]. Индекстің типі массив элементтерінің ретінің өзгеру аралығын көрсетеді де, шектелген жай типтердің (байттық, логикалық, аралық, атау) бірімен беріледі. Массивтің типін анықтау үшін Array … of (тұратын массив) қызметші сөздері қолданылады. Массив алдын ала типтерді сипаттайтын Type тарауында жарияланады немесе айнымалылар Var тарауында аталады.

Жазылуының жалпы түрі:

Type

<Массив аты>=array[<индекстер типі>]: of<элементтер типі>;

Var

<айнымалылар>:<типтің аты>;

Мұндағы: индекстер типі - 1-индекс, 2-индекс, ...

элементтер типі - массивті құрайтын негізгі элементтерінің типі.

Немесе массив айнымалылар тарауында анықталуы:

Var

<Массив аты>:array[<индекстер типі>]:of<элементтердің типі>;

 

Бір өлшемді массивтердің жариялануын көрсететін мысал.

Бірінші түрі.

Var

M1:array[1..10] of integer; - 10 бүтін саннан тұратын массивті жариялау.

Осы жариялау арқылы келесі айнымалылар келтіріледі:

M1[1] M1[2] M1[3] …M1[10]

Тура осылай басқа да типті элементтерден тұратын массивтерді жариялауға болады, мысалға:

M2:array[1..14] of Char; - 14 символдан тұратын массив.

M3:array[1..100] of Real; - 100 нақты саннан тұратын массив.

M4:array[1..5] of string; - 5 тестік жолдан тұратын массив.

M5:array[1..7] of Boolean; - 7 логикалық типті элементтерден тұратын массив.

Егер де екі массив элементтерінің типі бірдей болса және бірдей типті индекстері бар болса, онда бұл массивтерді (қатынас = немесе <> амалдарын қолданып) тұтасымен бір бірімен салыстыруға болады. Бірақ бұл операциялар өте сирек пайдаланады, әдетте массивті өңдеу элементтері бойынша жүргізіледі. егер де массив жарияланса, онда массивтің кез келген элементін шақыру үшін массивтің аты және де тік жақшаларымен шектелген массивтегі элементтің реттік нөмірі (индексі) жазылуы тиіс.

Екінші түрі.

Жоғарыда көрсетілген мысалдарда массив тікелей айнымалылар Var тарауында анықталуы қарастырылады, бірақ бұрынырақ айтқанымыздай массив көбінесе Type тарауында жарияланады да, кейін айнымалылар Var тарауында осы жарияланған типті айнымалылар аталады, мысалға,

Type

R1: array [1..10] of integer;

R2: array [1..6] of Char;

R3: array [1..3] of real;

R4: array [1..8] of string;

R5: array [1..5] of Boolean;

Бұл жағдайда, массивтердің типтері алдын ала типтер тарауында анықталғандықтан, айнымалылар тарауында массивтер жариялануы келесі түрде болады:

Var

M1 : R1;

M2 : R2;

M3 : R3;

M4 : R4;

M5 : R5;

Массивті Type тарауында жариялаудың басымдылығын келесі нақты мысалдан көруге де болады.

Type

Gruppa=(G1,G2,G3,G4);

Famil=array(byte) of char;

AI=(I,II,III,IV,V,VI,VII,VIII,IX,X,XI,XII);

Var

B2:Famil;

N2:array[1..60] of integer;

M3:array[‘a’..’d’] of gruppa;

Vector:array[1..10] of real;

M5:array[AI] of 28..31;

LOG: array[boolean] of integer;

B2 бұл мысалда типтер тарауында жарияланған Famil типімен сипатталған, мұнда индекстің типі байттық (byte) болғандықтан, B2 массиві char типті 255 элементтен (В2[0],B2[2],…B2[255]) тұрады.

N2 бірден айнымалылар тарауында сипатталған integer типті 60 элементтен (N2[1],N2[2],…N2[60]) тұрады.

M3 бірден сипатталған G1,G2,G3,G4 мәндерінің бірін қабылдай алатын 4 элементтен (M3[‘a’]), (M3[‘b’]), (M3[‘c’]), (M3[‘d’])

Vector real типті 10 элементтен (Vector[1], Vector[2], …, Vector[10]) тұрады.

M5 массивінің индексінің типі AI аталу типімен берілген, яғни элементтері: M5[I],M5[II], M5[III],… түрінде көрсетіледі де, 28, 29, 30, 31 сандарының бірін қабылдайды.

LOG массиві индексінің типі логикалық, яғни екі бүтін саннан тұратын массив. (LOG(True):=9; LOG(False):=4).

Массивтің индексі мен элементтерінің мәндерін ажырата білу керек: индекстің көмегімен элементтің мәнін табамыз. Мысалға М5 массивінің элементтерінің орналасуын схема түрінде көрсетейік.

I II III IV V VI VII VIII IX X XI XII

 

Жоғарыда бірінші жолдың ұяшықтарында массив элементтерінің мәндері, ал екінші жолда массив элементтерінің индекстері келтірілген, яғни М5[I]=31, М5[II]=28,… М5[VII]=31.

Егер массивтің негізгі (базалық) типі массивтік болса, онда қарастырып отырған массивтің өлшемі жоғарылайды.

Мысал.

Type

Vector=array[1..3] of integer;

Matrix=array[1..5] of vector;

Var

A: matrix:

Мұндағы А - екі өлшемді массив болып табылады, элементтері А[1][2] немесе А[1.2] түрлерінің бірімен көрсетіледі.

А массивін былайша сипаттауға да болатын еді:

Var

A: Array[1..3, 1..5] of integer;

Осылай кез келген өлшемді массивтерді сипаттауға болады. Паскаль тілінде массивтің өлшеміне шек қойылмайды, ол тек падаланатын компьютер жадының сыйымдылығымен шектеледі.

Іс жүзінде бір және екі өлшемді массивтер жиі қолданылады. Жалпы бір өлшемді массив элементтерін вектор, ал екі өлшемді массив матрица ұғымдарымен парапар болып саналады.

Массивті сипаттау үшін алдына ала анықталған тұрақтылар да пайдаланады:

Const

T1 = 4; T2 = 6;

Var

Tab1Y: array[1..T1, 1..T2] of real;

Массив элементтері жадыда жүйелі түрде бірінен соң бірі орналасады. Мысалы M: array[1..3,1..3] of integer массивінің элементтері жадында индекстерінің өсуі бойынша келесі түрде орналасады:

M[1,1] M[1,2] M[1,3] M[2,1] M[2,2] M[2,3] M[3,1] M[3,2]M[ 3,3]

 

6.2. Массив элементтерін өңдеу

Массив жарияланған соң оның әр элементі массив идентификаторы арқылы шақырылып, өңдеу процесіне қатыса береді. Мысалы келесі жазу Fam[3] болсын, онда Fam массивінің үшінші элементін, ал Tabl[2,3] - екі өлшемді Tabl массивінің 2-жолы мен 3-бағанасының қиылысқан элементін шақыруға мүмкіндік береді.

Массив элементтерін өңдеу операцияларына мысалдар қарастырудан бұрын келесі үш массивке және төрт қосымша айнымалыға сипаттамасын келтірейік:

Var

A,D : array [1..4] of real;

B : array [1..10,1..15] of integer;

I,J,K : integer;

S : real;

Массив элементтеріне бастапқы мәндерін меншіктеу. Бұл ұғым массивтің әр элементіне базалық типке сәйкес болатын бір мәнді меншіктеуді білдіреді. Бұл операцияның For операторы арқылы орындалуы тиімді болады:

For I:= 1 to 4 do A[I]:=0;

Екі өлшемді массив элементтеріне бастапқы мәнді меншіктеу үшін бірінің ішіне бірі орналасқан For операторлары арқылы ұйымдастырған жөн:

For I:= 1 to 10 do

For J:= 1 to 15 do

B[I,J]:=0;

Паскаль тілінде массив элементтерінің барлығын тұтасымен экранға немесе баспаға шығаратын құралдары жоқ болғандықтан шығару элементтеп жүргізіледі.

Массив элементтерінің мәнін жоғарыда көрсетілгендей меншіктеу операторы арқылы жүргізуге болады, бірақта іс жүзінде олардың мәндері Read немесе Readln операторлары арқылы клавиатурадан енгізіледі:

For I:=1 to 4 do Readln(A[I]);

Ал екі өлшемді массив үшін:

For I:=1 to 15 do

Readln(B[I,J]);

Программада Readln операторын пайдалануға байланысты енгізілетін әр шама жаңа жолдан бастап жазылады.

Массив элементтерін экранға немесе баспаға шығару үшін енгізуге ұқсас программалар жазылады, бірақ Read, Readln орнына Write немесе Writeln операторлары пайдаланылады:

For I:=1 to 4 do

Writeln (A[I]); {А массивінің элементтерін шығару}

Ал екі өлшемді массив үшін:

For I:=1 to 10 do

For J:=1 to 15 do

Writeln (B[I,J]); {B массивінің элементтерін шығару}

Массив элементтерін көшіру үшін бір массивтің барлық элементтерінің мәндерін екінші массивтің элементтеріне меншіктеу керек, қойылған мақсатқа жету үшін программада бір меншіктеу операторы А:=D немесе For операторынан құрылған операторлық жол жеткілікті:

For I:=1 to 4 do A[I]:=D[I];

Екі жағдайда да D массивінің элементтері өзгеріссіз қалады, ал А массивінің элементтерінің мәндері D массивінің элементтерінің мәндеріне тең болады.

Кейде массив бойынша белгілі бір шартқа сәйкес болатын элементтерін табу керек болады. Мысалы М массивінің неше элементінің мәні нөлге тең? Бұл сауалға жауап беру үшін К - қосымша айнымалысын және For мен If операторларын пайдаланамыз. К айнымалысын М массивінің нөлдік элементтер санын сақтауға арнайық. Енді программа келесі түрде жазылады:

K:=0;

For I:=1 to 5 do

If M[I] = 0 then K:=K+1;

Циклдік қайталану орындалып болған соң К айнымалысында нөлдік мәнде элементтер саны есептелінеді. К-ның бастапқы мәні 0-ге тең болып, программада For - операторына дейін жазылады.

Массив элемен


<== попередня лекція | наступна лекція ==>
Меншіктеу операторы | Массивтегі циклдік орын ауыстыруды программалау


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн