Скачиваний:
0
Добавлен:
20.09.2026
Размер:
588 Кб
Скачать
☆
4-lekciya. Tákirarlanıwshı processlerdi shólkemlestiriw. Parametrli
tákirarlaw operatorı (for). Shárti aldın hám shárti keyin tákirarlaw
operatorları (while hám do while).
Programma orınlanıwın basqarıwdıń basqa bir kúshli meхanizmlerinen biri -
tákirarlaw operatorları esaplanadı. Tákirarlaw operatorı «tákirarlaw shárti» dep atalıwshı ańlatpanıń shın mánisinde programmanıń belgili bir bólegindegi operatorlardı (tákirarlaw denesin) kóp márte tákirar túrde orınlaydı (iterativ process) (3-súwret).
Tákirarlaw óziniń kiriw hám shıǵıw noqatlarına iye, biraq shıǵıw noqatınıń
bolmawı múmkin. Bul jaǵdayda tákirarlawǵa sheksiz tákirarlaw delinedi. Sheksiz tákirarlaw ushın tákirarlawdı dawam ettiriw shárti bárqulla ras boladı.
3-súwret. Tákirarlaw operatorınıń blok sxeması. Tákirarlaw shártin tekseriw tákirarlaw denesindegi operatorlardı orınlawdan
aldın tekseriliwi múmkin (for, while tákirarlawları) yamasa tákirarlaw denesindegi operatorları bir márte orınlanǵannan keyin tekseriliwi múmkin (do-while).
Tákirarlaw operatorları ishpe-ish jaylasqan bolıwı múmkin.
For tákirarlaw operatorı
For tákirarlaw operatorınıń sintaksisi tómendegi kóriniske iye: for (<ańlatpa1 >; <ańlatpa 2>;<ańlatpa3 >) <operator yamasa blok>; Bul operator óz jumısın <ańlatpa1> ańlatpasın orınlawdan baslaydı. Keyin
tákirarlaw qádemleri baslanadı. Hár bir qádemde <ańlatpa2> orınlanadı, eger
nátiyje 0 mánisinen parıqlı yamasa true bolsa, tákirarlaw denesi - <operator yamasa blok> orınlanadı hám aqırında <ańlatpa3 > orınlanadı. Eger <ańlatpa2 > mánisi 0 (false) bolsa, tákirarlaw processi toqtaydı hám basqarıw tákirarlaw operatorınan keyingi operatorǵa ótedi. Sonı aytıw kerek, <ańlatpa2> ańlatpası útir menen ajıratılǵan bir neshe ańlatpalar birlespesinen ibarat bolıwı múmkin, bul jaǵdayda aqırǵı ańlatpa mánisi tákirarlaw shárti esaplanadı. Tákirarlaw denesi sıpatında bir operator, sonday aq bos operator bolıwı yamasa operatorlar blogı keliwi múmkin.
Mısal ushın, 10 nan 20 ǵa shekem bolǵan pútin sanlar qosındısın esaplaw
máselesin kóreyik.
Programmadaǵı tákirarlaw operatorı óz jumısın, i tákirarlaw parametrine
(tákirarlaw sanaǵıshına) baslanǵısh mánis - 10 sanın beriwden baslaydı hám hár bir tákirarlaw qádeminen (iteraciyadan) keyin qawıs ishindegi úshinshi operator orınlanıwı esabına onıń mánisi birewge artadı. Hár bir tákirarlaw qádeminde tákirarlaw denesindegi operator orınlanadı, yaǵnıy Summa ózgeriwshisine i mánisi qosıladı. Tákirarlaw sanaǵıshı i mánisi 21 bolǵanda “i<=20” tákirarlaw shárti false (0-mánisi) boladı hám tákirarlaw juwmaqlanadı. Nátiyjede basqarıw tákirarlaw operatorınan keyingi cout operatorına ótedi hám ekranǵa qosındı shıǵarıladı.
Joqarıda keltirilgen mısalǵa qarap tákirarlaw operatorlarınıń qawıs ishindegi
ańlatpalarına túsindirme beriw múmkin:
<ańlatpa1> - tákirarlaw sanaǵıshı wazıypasın atqarıwshı ózgeriwshige
baslanǵısh mánis beriwge xızmet etedi hám ol tákirarlaw processi basında tek ǵana
bir márte esaplanadı. Ańlatpada ózgeriwshi járiyalawı ushırawı múmkin hám bul ózgeriwshi tákirarlaw operatorı denesinde ámel qıladı hám tákirarlaw operatorınan sırtta «kórinbeydi».
<ańlatpa2> - tákirarlawdı orınlaw yamasa orınlamawdı anıqlap beriwshi
logikalıq ańlatpa, eger shárt shın bolsa, tákirarlaw dawam etedi, keri jaǵdayda joq. Eger bul ańlatpa bos bolsa, shárt barqulla shın dep esaplanadı;
<ańlatpa3> - ádette tákirarlaw sanaǵıshınıń mánisin asırıw (kemeytiriw) ushın xızmet etedi yamasa onda tákirarlaw shártine tásir etiwshi basqa ámeller bolıwı múmkin. Tákirarlaw operatorında qawıs ishindegi ańlatpalar bolmawı múmkin, biraq sintaksis „;‟ bolmawına ruхsat bermeydi. Sol sebepli, eń ápiwayı kórinistegi tákirarlaw operatorı tómendegishe boladı:
for (;;)cout <<”Sheksiz tákirarlaw…” ;
Eger tákirarlaw processinde bir neshe ózgeriwshilerdiń mánisi sinхron túrde ózgeriwi kerek bolsa, tákirarlaw ańlatpalarında zárúr operatlorlardı „,‟ menen jazıw arqalı buǵan erisiw múmkin:
for(int i = 10, j = 2; i <= 20; i++, j = i + 10) {...};
Tákirarlaw operatorınıń hár bir qádeminde j hám i ózgeriwshilerniń mánisleri sáykes túrde ózgerip baradı.
For operatorında tákirarlaw denesi bolmawı da múmkin. Máselen, programma orınlanıwın belgili bir múddetke «toqtap» turıw zárúr bolsa, buǵan tákirarlawdıń hesh qanday qosımsha jumısların orınlamastan ámel qılıw arqalı erisiw múmkin:
Joqarıda keltirilgen 10 nan 20 ǵa shekem bolǵan sanlar qosındısın bos deneli tákirarlaw operatorı arqalı esaplaw múmkin:
...
for(int i = 10; i <= 20; Summa += i++);
...
Tákirarlaw operatorı denesi sıpatında operatorlar blogı isletiliwin faktorialdı esaplaw mısalında kórsetiw múmkin:
#include <iostream>
using namespace std;
int main()
{
int a;
unsigned long fact = 1;
cout << "Pútin sandı kiritiń:_ ";
cin >> a;
if((a >= 0) && (a < 33))
{
for(int i = 1; i <= a; i++)
fact *= i;
cout << a << " != " << fact <<'\n';
}
return 0;
}
Programma paydalanıwshı tárepinen 0 den 33 ge shekem aralıqtaǵı san kiritilgende ámel qıladı, sebebi 34! mánisi unsigned long ushın ajıratılǵan razryadlarǵa sıymaydı.
Másele. Tákirarlaw operatorın ishpe-ish orınlawǵa mısal sıpatında cifrları bir-birine ózara teń bolmaǵan úsh xanalı natural sanlardı ósiw tártibinde shıǵarıw máselesin kóriwimiz múmkin:
#include <iostream>
using namespace std;
int main()
{
unsigned char a2, a1, a0; // úsh xanalı san cifrları
for(a2 = '1'; a2 <= '9'; a2++) //sannıń 2-cifrı
for(a1 = '0'; a1 <= '9'; a1++) //sannıń 1-cifrı
for(a0 = '0'; a0 <= '9'; a0++) //sannıń 0-cifrı
//cifrlardıń ózara teń emesligin tekseriw
if(a0 != a1 && a1 != a2 && a0 != a2) //ózara teń emes
cout << a2 << a1 << a0 << '\n';
return 0;
}
Programmada úsh xanalı sannıń hár bir cifrı tákirarlaw operatorlarınıń parametrleri sıpatında jaratıladı. Birinshi, sırtqı tákirarlaw operatorı menen 2­хanadaǵı cifr (a2 tákirarlaw parametri) jaratıladı. Ekinshi, ishki tákirarlaw operatorında (a1 tákirarlaw parametri) san kórinisiniń 1-хanasındaǵı cifr hám aqırında, oǵan salıstırmalı ishki bolǵan a0 parametrli tákirarlaw operatorında 0­хanadaǵı cifrlar jaratıladı. Hár bir sırtqı tákirarlawdıń bir qádemine ishki tákirarlaw operatorınıń tolıq orınlanıwı tuwrı keliwi esabına barlıq úsh xanalı sanlar kórinisi jaratıladı.
While tákirarlaw operatorı
while tákirarlaw operatorı, operator yamasa bloktı tákirarlaw shárti jalǵan (false yamasa 0) bolaman degenshe tákirar orınlaydı. Ol tómendegi sintaksiske iye:
while (<ańlatpa>) <operator yamasa blok>;
Eger <ańlatpa> shın mánisli turaqlı ańlatpa bolsa, tákirarlaw sheksiz boladı. Tap sonday, <ańlatpa> tákirarlaw baslanıwında shın bolıp, onıń mánisine tákirarlaw denesindegi esaplaw tásir etpese, yaǵnıy onıń mánisi turaqlı, tákirarlaw sheksiz boladı.
while tákirarlaw shártti aldınnan tekseriwshi tákirarlaw operatorı esaplanadı. Eger tákirarlaw basında <ańlatpa> jalǵan bolsa, while operatorı quramındaǵı
< operator yamasa blok> bólegi orınlanbastan sheklep ótiledi.
Ayrım jaǵdaylarda <ańlatpa> mánis beriw operatorı kórinisinde keliwi múmkin. Bunda mánis beriw ámeli orınlanadı hám nátiyje 0 menen salıstırıladı. Nátiyje nolden parıqlı bolsa, tákirarlaw dawam ettiriledi.
Eger shın ańlatpanıń mánisi nolden parıqlı turaqlı bolsa, sheksiz tákirarlaw júzege keledi. Máselen:
while(1); //sheksiz tákirarlaw
Tap for operatorı kibi, „,‟ járdeminde <ańlatpa> da bir neshe ámeller sinхron túrde orınlaw múmkin. Máselen, san hám onıń kvadratların shıǵaratuǵın programmada usı jaǵday kórsetilgen:
#include <iostream>
using namespace std;
int main()
{
int n, n2;
cout << "Sandı kiritiń(1..10):_";
cin >> n;
n++;
while(n--, n2 = n * n, n > 0)
cout << "n = " << n << " n^2 = " << n2 << endl;
return 0;
}
Programmadaǵı tákirarlaw operatorı orınlanıwında n sanı 1 ge shekem kemeyip baradı. Hár bir qádemde n hám onıń kvadratı shıǵarıladı. Shárt ańlatpasında operatorlardıń jazılıw izbe-izliginiń áhmiyeti bar, sebebi eń aqırǵı operator tákirarlaw shárti sıpatında qaraladı hám n mánisi 0 bolǵanda tákirarlaw juwmaqlanadı.
Keyingi programmada berilgen onlıq sannıń ekilik kórinisin shıǵarıw máselesin sheshiwde while operatorın qollaw kórsetilgen.
#include <iostream>
using namespace std;
int main()
{
int sanagish = 4;
short san10, process = 1;
while(process)
{
//sheksiz tákirarlaw
cout << "Onlıq sandı kiritiń(0..15)_";
cin >> san10;
cout << '/n' << san10 << "Sanınıń ekilik kórinisi:";
while(sanagish)
{
if(san10 & 8)
//son10 & 00001000
cout << '1';
else
cout << '0';
san10=san10<<1; //razryadtı 1 orın shepke jiljitiw
sanagish--;
}
cout<<'\n';
cout << "Process toqtasın(0), dawam etsin(1):_ ";
cin >> process;
sanagish = 4;
}
return 0;
}
Programmada ishpe-ish jaylasqan tákirarlaw operatorları isletilgen. Birinshisi, sannıń ekilik kórinisin shıǵarıw processin dawam ettiriw shárti boyınsha ámel qıladı. Ishki jaylasqan ekinshi tákirarlaw operatorındaǵı ámeller - hár qanday,
0 den 15 ge shekemgi bolǵan sanlar tórt razryadlı ekilik san kórinisinde bolıwına tiykarlanǵan. Onda kiritilgen sannıń ishki, ekilik kórinisinde úshinshi razryadında 0 yamasa 1 turǵanlıǵı anıqlanadı (“san10 & 8”). Shárt nátiyjesi nátiyje 1 (shın) bolsa, ekranǵa „1‟, keri jaǵdayda „0‟ belgisi shıǵarıladı. Keyingi qádemde san razryadları shepke birewge jıljıydı hám jáne úshinshi razryadtaǵı cifr shıǵarıladı. Tákirarlaw sanaǵısh mánisi 0 bólgansha yaǵnıy tórt márte orınlanadı hám basqarıw ishki tákirarlaw operatorınan shıǵadı.
while tákirarlaw operatorı járdeminde ónimli programma kodın jazıwǵa jáne bir mısal, bul - eki natural sanlardıń eń úlken ulıwma bóliwshisin (EÚUB) Evklid algoritmi menen tabıw máselesin keltiriwimiz múmkin:
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int a, b;
cout << "A hám B natural sanlar EÚUB tabıw.\n";
cout << "A hám B natural sanlardı kiritiń: ";
cin >> a >> b;
while(a != b) a > b ? a -= b : b -= a;
cout << "Bul sanlar EÚUB = " << a;
return 0;
}
Pútin tiptegi a hám b mánisleri aǵımnan óqılǵannan keyin olardıń mánisleri ózara teń bolmaǵansha tákirarlaw processi isleydi. Tákirarlawdıń hár bir qádeminde a hám b sanlardıń úlkeninen kishisi alınadı. Tákirarlawdan keyingi kórsetpe quralında a ózgeriwshisiniń mánisi nátiyje sıpatında shıǵarıladı.
Do-while tákirarlaw operatorı
Do-while tákirarlaw operatorı while operatorınan parıqlı túrde aldın operator yamasa bloktı orınlaydı, keyin tákirarlaw shártin tekseredi. Bul qurılma tákirarlaw denesin keminde bir márte orınlanıwın támiynleydi. do-while tákirarlaw operatorı tómendegi sintaksiske iye:
do <operator yamasa blok>; while (<ańlatpa>);
Bunday tákirarlaw operatorınıń keń qollanılatuǵın jaǵdayları - bul tákirarlawdı baslamastan turıp, tákirarlaw shártin tekseriwdiń ilajı bolmaǵan
jaǵdaylar esaplanadı. Máselen, qandayda bir processti dawam ettiriw yamasa toqtatıw haqqındaǵı sorawǵa juwap alıw hám onı tekseriw zárúr bolsın. Kórinip turıptı, processti baslamastan aldın bul sorawdı beriwdiń mánisi joq. Hesh bolmaǵanda tákirarlaw processiniń bir qádemi ámelge asırılǵan bolıwı kerek:
#include <iostream.h>
using namespace std;
int main()
{
char juwap;
do
{
... // programma denesi
cout << ”Processti toqtatıw (N):_ ”;
cin >> juwap;
}
while(juwap != N)
return 0;
}
Programma tap “Processti toqtatıw (N):_ ” sorawına „N‟ juwabı kiritilmegenshe dawam etedi.
Bul operator da sheksiz tákirarlanıwı múmkin:
do; while(1);
Másele. Hár qanday 7 den úlken pútin sandaǵı pul muǵdarın 3 hám 5 sumlıqlarda beriw múmkinligi dáliyllensin. Qoyılǵan másele p=3n+5m teńlemesin qanaatlandırıwshı m, n sanlar juplıqların tabıw máselesi esaplanadı (p-pul muǵdarı). Bul shárttiń orınlanıwın m hám n ózgeriwshileriniń múmkin bolǵan mánisleriniń barlıq kombinaciyalarında tekseriw zárúr boladı.
#include <iostream.h>
int main()
{
unsigned int Pul; //Pul- kiritiletuǵın pul muǵdarı
unsigned n3, m5; //n-3 swmlıqlar, m-5 swmlıqlar sanı
bool qate = false; //Pul mánisin kiritiwdegi qátelik
do
{
if(qate)
cout << "Pul mánisi 7 den kishi!";
qate = true; //keyingi tákirarlaw qáte esaplanadı
cout << "\nPul mánisin kiritiń (>7): ";
cin >> Pul;
}
while(Pul <= 7); //7 ge teń yamasa úlken san
kiritilgenshe
n3 = 0;
//hesh qanday 3 swmliq joq
//hesh qanday 5 swmliq joq
do
{
m5 = 0;
do
{
if(3 * n3 + 5 * m5 == Pul)
cout<<n3<<" dana 3 swmlıq + "<<m5<<" dana 5
swmliq\n";
m5++;
//5 swmlıqlar birewge asırıladı
}
while(3 * n3 + 5 * m5 <= Pul);
n3++;
//3 swmlıqlar birewge asırıladı
}while(3 * n3 <= Pul);
return 0;
}
Programma pul mánisin kiritiwdi soraydı (Pul ózgeriwshisine). Eger pul mánisi 7 sanınan kishi bolsa, bul haqqında хabar beriledi hám tákirar túrde mánis kiritiw talap etiledi. Pul mánisi 7 den úlken bolǵanda, 3 hám 5 swmlıqlardıń múmkin bolǵan tolıq kombinaciyasın ámelge asırıw ushın ishpe-ish tákirarlawlar ámelge asırıladı. Sırtqı tákirarlaw n3 (3 swmlıqlar muǵdarı) boyınsha, ishki tákirarlaw bolsa m5 (5 swmlıqlar muǵdarı) boyınsha, bul muǵdardaǵı pullar mánisi Pul mánisinen artıp ketpegenshe dawam etedi. Ishki tákirarlawda m5 ózgeriwshisiniń hár bir mánisinde «3*n3+5*m5==Pul» shárti tekseriledi, eger ol orınlı bolsa, sheshim variantı sıpatında n3 hám m5 ózgeriwshiler mánisleri shıǵarıladı.
Pul mánisi 30 swm kiritilgende (Pul=30), ekranǵa
0 dana 3 swmlıq + 6 dana 5 swmlıq
5 dana 3 swmlıq + 6 dana 5 swmlıq
10 dana 3 swmlıq + 0 dana 5 swmlıq
sheshim variantları shıǵarıladı.
Break operatorı
Tákirarlaw operatorlarınıń orınlanıwında sonday jaǵdaylar júzege keliwi múmkin, onda qaysıdur qádemde, tákirarlawdı aqırına jetkermesten tákirarlawdan
shıǵıw zárúrligi bolıwı múmkin. Basqasha aytqanda, tákirarlawdı «úziw» kerek bolıwı múmkin. Bunda break operatorınan paydalanadı. break operatorın tákirarlaw operatorı denesiniń qálegen (zárúr) orınlarına qoyıw arqalı sol orınlardan tákirarlawdan shıǵıwdı ámelge asırıw múmkin. Itibar beretuǵın bolsaq,
switch-case operatorınıń túp mánisine de break operatorın qollanıw arqalı erisilgen.
Ishpe - ish jaylasqan tákirarlaw hám switch operatorlarında break operatorı
tek ǵana ózi jaylasqan bloktan shıǵıw imkaniyatın beredi.
Tómendegi programmada eki ishpe-ish jaylasqan tákirarlaw operatorınan paydalanǵan jaǵdayda paydalanıwshı tárepinen kiritilgen qandayda bir sandı 3 hám
7 sanlarına salıstırmalı qanday aralıqqa túsiwi anıqlanadı. Sırtqı tákirarlawda “San kiritin (0- toqtaw):_” sorawı beriledi hám juwap juwap_san ózgeriwshisine oqıladı.
Eger san nolden parıqlı bolsa, ishki tákirarlaw operatorında bul sannıń qandayda bir aralıqqa túsiwi anıqlanıp, sol haqqında хabar beriledi hám ishki tákirarlaw operatorınan shıǵıladı. Sırtqı tákirarlawdaǵı sorawǵa juwap sıpatında 0 kiritilse, programma óz jumısın juwmaqlaydı.
#include <iosteam >
using namespace std;
int main()
{
int juwap_san=0;
do
{
while(juwap_san)
{
if(juwap_san < 3)
cout << ”3 kishi !”; break;}
if(3 <= juwap_san && juwap_san <= 7)
cout << ”3 hám 7 aralıqta !”; break;}
if(juwap_san > 7)
cout << ”7 den úlken !”; break;}
{
{
{
}
cout << ”\nSan kiritiń (0-toqtaw):_”;
cin >> juwap_san;
}while(juwap_san != 0)
return 0;
}
Ámeliyatta break operatorınan sheksiz tákirarlawdan shıǵıwda paydalanıladı.
for (;;)
Соседние файлы в папке 1-semestr