§3. Тармақталу программасы
Паскальда Бейсиктегі сияқты мұндай программаны ұйымдастыру үшін мына түрдегі шартты оператор қолданылады:
if шарт then 1-оператор else 2-оператор
мұнда шарт – логикалық өрнек, ол Бейсиктегіше жазылады;
1-оператор – Паскальдың шарттыдан басқа кезкелген операторы;
2-оператор – Паскальдың шартты операторы да кіретін кезкелген операторы; ол шарт жалған болғанда орындалады. Мыс, екі санның үлкенін табуға арналған шартты оператор былай жазылады:
if ab then max:=a else max:=b;
3.1-мысал. Берілген х-тің мәні бойынша мына у функциясының
мәнін есептеу программасын құру:
![]()
program mys3_1;
var x,y:real;
begin write('х-ті енгіз:'); read(x);
if x then y:=sin(x) else y:=cos(x);
writeln; write('Y=',Y)
end.
Мыс, х=0 болғанда у=0 (sin0=0), ал х=3,14159265(
радиан) болғанда y=-9,99999E-01 (яғни, шамамен -1 - ге тең, себебі cos
= -1) болады. Бұрын атап өтілгендей, шарт жалған болған жағдайда тағы да бір шартты оператор қолданылады. Бұл шарттардың біршама күрделі тізбегін бір шартты оператор түрінде жазуға мүмкіндік береді.
3.2-мысал. Берілген х-тің мәніне сәйкес у функциясының мәнін есептеу программасын құру:
program mys3_2;
var x,y:real;
begin
write('х-ті енгіз:'); read(x);
if x then y:=x else if x then y:=2 else y:=5-x;
writeln; write('Y=',Y)
end.
![]()
Шартты операторда then не else-ден соң бірнеше операторларды жазуға болады. Мұндай кезде оларды құрама операторға біріктіру қажет. Құрама оператор түрі:
begin 1-оператор; 2-оператор; ...;n-оператор; end; Мұнда 1-оператор; 2-оператор; ... – Паскальдың құраманы қоса алғандағы кезкелген операторы.
3.3-мысал. Берілген Х,У мәндерінің х-қа үлкенін, ал у-ке кіші мәнін
бөліп беретіндей программа құру.
program mys3_3;
var x,y,z:real;
begin
write('х,y-ті енгіз:'); read(x,y);
if x then begin z:=x; x:=y; y:=z end;
writeln; write(x,y)
end.
Жоғарыдағы программада шартты оператордың қысқаша түрі:(if шарт then оператор ) қолданылғандығына назар аударыңыз. Бейсиктегі сияқты шарт біршама күрделі де бола алады. Мұнда шарттың конъюнкциясын (and көмегімен байланысқан шарттар), шарттың дизъюнкциясын(or) және шарттың инверсиясын(not) пайдалануға рұхсат етіледі. Паскальда әрбір байланысқан шарттар жақшаға алынып жазылады. and, or, not амалдары ,
3.4-мысал. (х,у) координатасымен берілген нүкте сыртқы радиусы r1, ішкі радиусы – r2 болатын сақинаға тиісті ме, жоқ па соны анықтау.
program mys3_4;
var x,y,r1,r2:real;
begin
writeln('х,y,r1,r2-ні енгіз:'); read(x,y,r1,r2);
if (sqrt(sqr(x)+sqr(y)) and (sqrt(sqr(x)+sqr(y))r2)
then write('сақинаға тиісті')
else write('сақинаға тиісті емес');
end.
Программаны тексеру үшін: x =1, y =1, r1=1, r2=1 мәндерін берсек, онда «сақинаға тиісті» деген жазу, ал x =2, y =2, r1=2, r2=1 болғанда «сақинаға тиісті емес» деген жазуы алынады.
Бақылау сұрақтары
1. Шартты оператордың толық және қысқаша түрін жазыңыз. Шарттың тура немесе жалған болған кезінде қандай операторлар
қолданылады?
2.Құрама оператор деген не?
3.Паскальда күрделі шарттар қалай жазылады және олардың ерекшелігі неде?
Практикалық тапсырмалар
3.1. Бір шартты оператор түрінде жазыңыз:
а) y =
б) d=max(a,b,c); в) z =![]()
г) к айнымалысына координатасы (х,у) болатын нүкте жатқан ширектің нөмірін меншіктеңіз;
д) n айнымалысына төрт а1,а2,а3,а4 сандарының ішінен үшеуінен өзгеше, өзара тең болатын реттік нөмірді меншіктеңіз.
3.2. а,b,с сандары берілген. a
3.3. Нақты үш а,b,с сандары берілген. Осылардың ішінен (1,3) интервалында жататынын таңдаңыз.
3.4. х,у (х≠у) сандары берілген. Олардың кішісін қосындының орта шамасымен, ал үлкенін – екі еселенген көбейтіндімен алмасты-
рыңыз.
3.5. Берілген a,b,c сандарының ең үлкенін табыңыз.
3.6. Қабырғаларының ұзындығы x,y,z болатын үшбұрыш бола ма, соны анықтаңыз.
3.7. Центрі (х0,у0) нүктесі болатын шеңберде бастапқы координатасы (xn,yn), соңғы координатасы (xk,yk) болатын доға берілген.
Доғаның бастапқы және соңғы нүктелері жататын шеңбер ширегінің нөмірін анықтаңыз.
3.8. (х,у) нүктесінің координатасы берілген. Осы нүкте мына суретте көрсетілген аумаққа тиісті ме, соны анықтаңыз:
а) б) в)
г) д) е)
3-сурет
3.9. Нақты a,b,c,x,y оң сандары берілген.Қырлары a,b,c-ға тең кірпіш қабырғалары х, утіктөртбұрышты қуысқа сия ма, соны
анықтаңыз. Кірпішті тек оның әрбір қыры қуыс қабырғаларына параллель немесе перпендикуляр болғанда ғана тығуға рұхсат
етіледі.
3.10*. Нақты х1,х2,х3,у1,у2,у3 сандары берілген.Координат басы төбесі (х1,у1),(х2,у2),(х3,у3) болатын үшбұрышқа тиісті ме?.
3.11*. Өзінің төбесінің координаталарымен берілген бесбұрыштағы тік бұрыш санын есептеңіз (егер ол бар болса).
Есептің шешулері.
§3. Тармақталу программасы.
3.1. Бір шартты оператор түрінде жазыңыз:
а) y =
б) d=max(a,b,c); в) z =![]()
Шешуі: a) if (x0) and (x
б) if (ab) and (bc) then d:=a else if (ba) and (bc) then d:=b else d:=c;
в) if (xy) then z:=x else
if (x
if (x=0) and (x
if (x=0) and (x=y) then z:=y;
г) к айнымалысына координатасы (х,у) болатын нүкте жатқан ширектің нөмірін меншіктеңіз;
Шешуі: if (x0) and (y0) then k:=1 else if (x0) then k:=2 else if (x
д) n айнымалысына төрт а1,а2,а3,а4 сандарының ішінен үшеуінен өзгеше, өзара тең болатын реттік нөмірді меншіктеңіз.
Шешуі: if (a1a2) and (a1a3) then n:=1 else
if (a2a1) and (a2a3) then n:=2 else
if (a3a1) and (a3a2) then n:=3 else n:=4;
3.2. а,b,с сандары берілген. a
program e3_2;
var a,b,c: real;
begin writeln; write(‘a,b,c сандарына мән енгізіңіз:’); read(a,b,c);
if (a then writeln(‘теңсіздік орындалады’)
else writeln(‘теңсіздік орындалмайды’);
end.
3.3. Нақты үш а,b,с сандары берілген. Осылардың ішінен (1,3) интервалында жататынын таңдаңыз.
program e3_3;
var a,b,c: real;
begin writeln; write(‘a,b,c сандарына мән енгізіңіз:’); read(a,b,c);
if (a1) and (a then writeln(‘а жатады’);
if (b1) and (b then writeln(‘b жатады’);
if (c1) and (c then writeln(‘c жатады’)
else writeln(‘ешқайсысы жатпайды’);
end.
3.4. х,у (х≠у) сандары берілген. Олардың кішісін қосындының орта шамасымен, ал үлкенін – екі еселенген көбейтіндімен алмасты-
рыңыз.
program e3_4;
var x,y: real;
begin writeln; write(‘x,y сандарына мән енгізіңіз:’); read(x,y);
if (x then begin x:=(x+y)/2; y:=2*y end
else begin y:=(x+y)/2; x:=2*x end;
writeln;write(‘х,у-тің жаңа мәндері:’,x,y)
end.
3.5. Берілген a,b,c сандарының ең үлкенін табыңыз.
program e3_5;
var a,b,c,d: real;
begin writeln; write(‘a,b,c –ға мән енгізіңіз:’); read(a,b,c);
if (ab) and (ac) then d:=a else
if (ba) and (bc) then d:=b else d:=c;
writeln; write(‘сандардың ең үлкені:’,d)
end.
3.6. Қабырғаларының ұзындығы x,y,z болатын үшбұрыш бола ма, соны анықтаңыз.
Үшбұрыштың үлкен қабырғасы қалған екі қабырғасының қосындысынан кіші болуы керек.
program e3_6;
var x,y,z: real;
begin writeln; write(‘x,y,z-ке мән енгізіңіз:’); read(x,y,z);
if (x then writeln(‘үшбұрыш
болады’) else writeln(‘үшбұрыш болмайды’);
end.
3.7. Центрі (х0,у0) нүктесі болатын шеңберде бастапқы координатасы (xn,yn), соңғы координатасы (xk,yk) болатын доға берілген.
Доғаның бастапқы және соңғы нүктелері жататын шеңбер ширегінің нөмірін анықтаңыз.
program e3_7;
var x0,y0,xn,yn,xk,yk: real;
begin writeln; write(‘x0,y0,xn,yn,xk,yk –ға мән енгізіңіз:’);
read(x0,y0,xn,yn,xk,yk);
if (xnx0) and (yny0) then
write(‘бастапқы нүкте 1-ширекте’);
if (xnx0) and (yn then
write(‘бастапқы нүкте 4-ширекте’);
if (xny0) then
write(‘бастапқы нүкте 2-ширекте’);
if (xn then
write(‘бастапқы нүкте 3-ширекте’); writeln;
if (xkx0) and (yky0) then write(‘соңғы нүкте 1-ширекте’);
if (xkx0) and (yk then write(‘соңғы нүкте 4-ширекте’);
if (xky0) then write(‘соңғы нүкте 2-ширекте’);
if (xk then write(‘соңғы нүкте 3-ширекте’);
end.
3.8. (х,у) нүктесінің координатасы берілген. Осы нүкте мына суретте көрсетілген аумаққа тиісті ме, соны анықтаңыз:
а) б) в)
![]()
г) д) е)
Мұнда есепті шешу программасы алдыңғы есептегідей, сондықтан шартты оператордың жазылуын ғана келтіреміз.
а) if x0 then write(‘тиісті’) else write(‘тиісті емес’);
б) if y then write(‘тиісті’) else write(‘тиісті емес’);
в) if yx then write(‘тиісті’) else write(‘тиісті емес’);
г) if x-1 and y-1 then write(‘тиісті’) else write(‘тиісті емес’);
д) if yx-1 and y-x-1 then
write(‘тиісті’) else write(‘тиісті емес’);
е) if (sqr(x)+sqr(y)1) then write(‘тиісті’) else write(‘тиісті емес’);
3.9. Нақты a,b,c,x,y оң сандары берілген.Қырлары a,b,c-ға тең кірпіш қабырғалары х, утіктөртбұрышты қуысқа сия ма, соны
анықтаңыз. Кірпішті тек оның әрбір қыры қуыс қабырғаларына параллель немесе перпендикуляр болғанда ғана тығуға рұхсат
етіледі.
Мұнда есепті шешу программасы алдыңғы есептегідей, сондықтан шартты оператордың жазылуын ғана келтіреміз:
if ((a
((b
((c
then write(‘қуысқа сияды’) else write(‘қуысқа симайды’);
3.10*. Нақты х1,х2,х3,у1,у2,у3 сандары берілген.Координат басы төбесі (х1,у1),(х2,у2),(х3,у3) болатын үшбұрышқа тиісті ме?.
Есепті шешу программасы:
Бұл есепті шешу үшін екі нүкте арқылы өтетін түзу теңдеуі қалай жазылатындығын еске түсіру керек. Содан соң үшбұрыш төбесін беретін екі нүкте арқылы өтетін түзу теңдеуін құрады.Координат басы осы үшбұрышта жатуы үшін осы түзулердің бірінің мәні(х=0 нүктесіндегі) басқа екі түзудегіден басқа таңбалы болуы керек. Яғни бір түзу координат басының үстіңгі жағында(басқасы астыңғы жағында) немесе керісінше бір түзу координат басының астыңғы (басқасы үстіңгі) жағында жатады деуге болады.
program e3_10;
var x1,y1,x2,y2,x3,y3,y12,y23,y13: real;
begin writeln; write(‘x1,y1,x2,y2,x3,y3 –ке мән енгізіңіз:’);
read(x1,y1,x2,y2,x3,y3);
if x2x1 then y12:=y1-x1*(y2-y1)/(x2-x1) else y12:=0;
if x2x3 then y23:=y2-x2*(y3-y2)/(x3-x2) else y23:=0;
if x3x1 then y13:=y1-x1*(y3-y1)/(x3-x1) else y13:=0;
if (y12*y23 then
write(‘тиісті’) else write(‘тиісті емес’);
end.
Программада нүктелердің тең болып қалу мүмкіндігі ескеріліп, сонан да түзу OY осіне параллель болуына орай(яғни у-тің мәні кезкелген болуы мүмкін болатындықтан, біз оны нольге тең дейміз) қосымша шарт(көрші нүктелердің х мәнінің теңсіздігі) енгізілді.
3.11*. Өзінің төбесінің координаталарымен берілген бесбұрыштағы тік бұрыш санын есептеңіз (егер ол бар болса).
Шешуі: Есепті шешу үшін векторлар арасындағы бұрышты қалай есептеуді еске түсіру керек. Әуелі әрбір екі нүкте арқылы өтетін вектор координаттарын табады. Содан соң екі вектор арасындағы бұрышты есептеп, оның тік бұрыш екендігін тексереді. Сонымен а(ха,уа) және b(xb,yb) векторлары берілсе, онда оның арасындағы бұрыштың косинусы мынаған тең: cos
=
, егер бұрыштың косинусы нольге тең болса, бұрыш тік болғаны.
Біздің жағдайда мына векторлар берілген(жақша ішіндегі-коодинаттары):
a12(x2-x1,y2-y1), a23(x3-x2,y3-y2), a34(x4-x3, y4-y3), a45(x5-x4, y5-y4), a51(x1-x5, y1-y5) .
Мына суретті пайдаланып, бұрыш косинустарын былай белгілейік: a123(2 нүктесінде), а234(3 нүктесінде), а345(4 нүктесінде), а451(5 нүктесінде), а512(1 нүктесінде).
program e3_11;
varx1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x21,y21,x32,y32,x43,y43,x54,y54,x15,y15,a123,a234,a345,a451,a512: real; s: integer;
begin
writeln; write(‘x1,y1,x2,y2,x3,y3,x4,y4,x5,y5 мәндерін енгізіңіз:’);
read(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5);
x21:=x2-x1;y21:=y2-y1; x32:=x3-x2;y32:=y3-y2; x43:=x4-x3;
y43:=y4-y3; x54:=x5-x4;y54:=y5-y4; x15:=x1-x5;y15:=y1-y5;
a123:=(x21*x32+y21*y32)/((sqrt(x21*x21+y21*y21))*(sqrt(x32*x32+y32*y32)));
a234:=(x43*x32+y43*y32)/((sqrt(x43*x43+y43*y43))*(sqrt(x32*x32+y32*y32)));
a345:=(x43*x54+y43*y54)/((sqrt(x43*x43+y43*y43))*(sqrt(x54*x54+y54*y54)));
a451:=(x15*x54+y15*y54)/((sqrt(x15*x15+y15*y15))*(sqrt(x54*x54+y54*y54)));
a512:=(x15*x21+y15*y21)/((sqrt(x15*x15+y15*y15))*(sqrt(x21*x21+y21*y21)));
if a123=0 then begin writeln('тік бұрыш =',1,2,3); s:=s+1 end;
if a234=0 then begin writeln(' тік бұрыш =',2,3,4); s:=s+1 end;
if a345=0 then begin writeln(' тік бұрыш =',3,4,5); s:=s+1 end;
if a451=0 then begin writeln(' тік бұрыш =',4,5,1); s:=s+1 end;
if a512=0 then begin writeln(' тік бұрыш =',5,1,2); s:=s+1 end;
writeln('Барлық тік бұрыш саны=', s);
end.
Егер нүктелер координаттары: 1-нүкте(0;0), 2-(0;1), 3-(0.5;2), 4-(1;1), 5-(1;0) болса, онда тік бұрыштар: 451 және 512 болады.