7-mavzu: C++ dasturlash tilida takrorlanuvchi jarayonlar Reja


Download 175.5 Kb.
Sana28.04.2020
Hajmi175.5 Kb.
#102006
Bog'liq
7- mavzular C dasturlash tili takrorlanuvchi jarayonlar


7-mavzu: C++ dasturlash tilida takrorlanuvchi jarayonlar
Reja

  1. Takrorlanuvchi (tsiklik) algoritmlar.

  2. while оператори орқали циклларни ташкил этиш

  3. do…while конструкцияси ёрдамида цикл ташкил этиш

  4. for оператори орқали циклларни ташкил этиш



  1. Tayanch iboralar: Takrorlanuvchi algoritmlar, while оператори, do…while конструкцияси, for оператори


Dars maqsadi: Talabalarda C++ dasturlash tilida takrorlanuvchi jarayonlar foydalanish ko’nikmalarini hosil qilish.
Takrorlanuvchi (tsiklik) algoritmlar

Har qanday dasturning strukturasi tarmoqlanish va tsikllar to’plamining kombinatsiyasidan iborat bo’ladi. Yuqorida dasturning tarmoqlanishi, if operatori orqali tashkil etilishini ko’rib chiqqan edik.



Tsikllarni tashkil etish

Qator masalalarni echish uchun ko’pincha bitta amalni bir necha marotaba bajarish talab qilinadi. Amaliyotda bu rekursiyalar va iterativ algoritmlar yordamida amalga oshiriladi. Iterativ jarayonlar – bu operatsiyalar ketma-ketligini zaruriy sonda takrorlanishidir.



while operatori orqali tsikllarni tashkil etish

while operatori yordamida tsikllarni tashkil etishda operatsiyalar ketma-ketligi tsiklning davom etish sharti «to’g’ri» bo’lsagina uning navbatdagi operatsiyalari amalga oshiriladi. Dasturda counter o’zgaruvchisi qiymati toki 5 ga teng bo’lgunga qadar oshib borar edi. Bu while operatori yordamida amalga oshirilgan.



while операторини қўллаш.

1.include



  1. int main()

  2. {

  3. int counter=0; //Бирламчи кийматни ўзлаштириш

  4. while(counter<5)//Цикл шартини текшириш

  5. {

  6. counter ++;

  7. cout << “counter :’’ << counter << “. \n” ;

  8. }

  9. cout<<“Tsikl tugadi.Counter:”<

  10. return 0;

НАТИЖА:

counter : 1

counter : 2

counter : 3

counter : 4

counter : 5

Цикл тугади.Counter: 5.

while operatori orqali murakkab konstruktsiyalarni tuzish

while operatori shartida murakkab mantiqiy ifodalarni ham qo’llash mumkin. Bunday ifodalarni qo’llashda && (mantiqiy ko’paytirish), || (mantiqiy qo’shish ) , hamda !(mantiqiy INKOR ) kabi operatsiyalardan foydalaniladi. Quyidagi listingda while operatori konstruktsiyasida murakkabroq shartlarni qo’yilishiga misol keltirilgan .



while konstruktsiyasidagi murakkab shartlar

1: include

2: int main()

3:{unsigned short кичик;

4:unsigned long катта;

5:const unsigned short MaxКичик=65535;

6:cout << “Кичик сонни киритинг:”;

cin >> кичик;



  1. cout << “Катта сонни киритинг:”;

  2. cin >> катта;

  3. cout << “кичик сон:” << кичик << “…”;

  4. //Xар бир итерацияда учта шарт текширилади.

  5. while (кичик<катта && катта>0 &&

  6. кичик< MaxКичик)

  7. {

  8. if(кичик%5000==0) //Xар 5000 сатрдан

  9. //кейин нукта чиқарилади

  10. cout<<“.” ;

  11. kichik++;

  12. katta-=2 ;

  13. }




  1. cout<<“\n кичик сон:”<<кичик<<“ катта сон :”

  2. <<катта << endl ;

  3. return 0 ;

  4. }

НАТИЖА:


Кичик сонни кирит : 2

Катта сонни кирит : 100000

кичик: 2 ………

кичик сон :33335 катта сон : 33334


TAHLIL

Yuqorida keltirilgan dastur quyidagi mantiqiy o’yinni ifodalaydi. Oldin ikkita son – kichik va katta kiritiladi. Undan so’ng toki ular bir biriga teng bo’lmaguncha, ya’ni «uchrashmaguncha» kichik son birga oshiriladi, kattasi esa ikkiga kamaytiriladi. O’yinni maqsadi qiymatlar «uchrashadigan» sonni topishdir.

9 – 12 – catrlarda qiymatlar kiritiladi. 15 – satrda esa tsiklni davom ettirishning quyidagi uchta sharti tekshiriladi:


        1. kichik o’zgaruvchisi qiymati katta o’zgaruvchisi qiymatidan oshmasligi.

        2. katta o’zgaruvchisi qiymati manfiy va nolga teng emasligi.

        3. o’zgaruvchisi qiymati MaxKichik qiymatidan oshib ketmasligi

17– satrda esa kichik soni 5000 ga bo’lingandagi qoldiq hisoblanadi. Agarda kichik 5000 ga qoldiqsiz bo’linsa bu operatsiyaning bajarilishi natijasi 0 ga teng bo’ladi. Bu holatda hisoblash jarayonini vizual ifodasi sifatida ekranga nuqta chiqariladi. Keyin esa kichik qiymati bittaga oshiriladi, katta qiymati esa 2 taga kamaytiriladi. Tsikl agarda tekshirish sharti tarkibidagi birorta shart bajarilmasa to’xtatiladi va boshqaruv 24 – satrga o’tadi.
while операторини қўллашга оид яна бир мисол
1. include

  1. int main()

  2. {

  3. int counter = 0 ;

  4. while(true)

  5. {

  6. counter++ ;

  7. if(counter>10)

  8. break ;

  9. }

  10. cout<<“counter:”<

  11. return 0 ;

  12. }

HАТИЖА:

Counter: 11



while операторининг ишлатилишига яна бир мисол.

  1.  include < iostream. h>

  2. int main()

  3. {

  4. int counter=0;

  5. while (counter <5)

  6. {

  7. counter++ ;

  8. cout << “Looping!”

  9. }

  10. cout << “\n Counter:” << Counter << “\n”;

  11. return 0;

  12. }

НАТИЖА:


Looping! Looping! Looping! Looping! Looping!

Counter: 5


do…while конструкцияси ёрдамида цикл ташкил этиш

Айрим ҳолларда while опeратори ёрдамида циклларни ташкил этишда унинг танасидаги амаллар умуман бажарилмаслиги мумкин. Чунки циклни давом этиш шарти ҳар бир итерациядан олдин текширилади. Агарда бошланғич берилган шарт тўғри бўлмаса цикл танасининг бирорта оператори ҳам бажарилмайди. Бу ҳолга 11 – листингда мисол келтирилган.



while цикли танасидаги амаллар бажарилмай қолиши

1.  include



  1. int main()

  2. {

  3. int counter ;

  4. cout << “How manу hellos ?:”;

  5. cin >> counter ;

  6. while (counter>0 )

  7. {

  8. cout << “Hello ! \n”;

  9. counter -- ;

  10. }

  11. cout<<“Counter is OutPut ;” << counter ;

  12. return 0;

  13. }

HАТИЖА:

How manу hellos ? : 2

Hello !

Hello !


counter is OutPut : 0

How manу hellos ? : 0

counter is OutPut : 0
do…while конструкциясининг қўлланилиши

do…while конструкциясида цикл шарти унинг танасидаги операциялар бир марта бажарилгандан сўнг текширилади. Бу цикл операторларини ҳеч бўлмаганда бир марта бажарилишини кафолатлайди.

Олдинги дастурда келтирилган вариантнинг бир оз ўзгартирилган шакли, яъни while оператори ўрнига do…while конструкцияси қўлланган шакли келтирилган .

Ушбу мисолда while операторининг умумий ишлаш принципи келтирилган.

# include

# include

main()

{

int a=1,b; clrscr();



while (a<=10)

}

b=2*(a+5);



printf(“a=%d b=%d\n”, a,b);

a++;


}

getch();


}

Шарти кейин текшириладиган цикл оператори.


Унинг умумий кўриниши қуйидагича:

. . .


do

operator(lar);

while (mantiqiy ifoda);

. . .

Бу ерда хам шарти аввал текшириладиган цикл оператори каби қоидаларга амал қилинади, яъни шартли ифода қиймати 0 га тенг бўлган ҳолда do while цикли ўз функциясини тўхтатади. while цикли учун бўлганидек do while цикли учун хам қуйидаги циклдан чиқиш ҳолатларини келтириш мумкин:

  • Шартли ифода 0 га тенг бўлган ҳолда;

  • Цикл ичида break операторига дуч келганда;

  • Цикл ичида return оператори бажарилганда.


Масалан : y=sinx функцияни ҳисоблаш дастурини тузиш керак бўлсин. Бу ерда h=0,1 деб олинсин.

#include

#include

#include

main()
{float x=1, y; clrscr();

do

{y=sin(x);



printf(“x=%g y=%f\n”, x,y);

x+=0.1;}

while(x<=2);

getch()


}

2- misol.

#include

main()


{

int n;


do

scanf(“%d”, &n);

while(n!=20);

}

Изох : дастур бажарилиши клавиатурадан 20 сонини киритгунча хисоблаш давом этади. Бу ерда != белгиси тенг эмас деган маънода ишлатилади.


for оператори

while оператори ёрдамида циклларни ташкил этишда 3 та зарурий амаллар: цикл ўзгарувчисига бошланғич қиймат бериш, ҳар бир итерацияда циклни давом этиш шарти бажарилишини текшириш ва цикл ўзгарувчиси қийматини ўзгартиришни бажаришимиз керак.


Масалан: y=cosx функциясини ҳисобланг. Бу ерда қадам, dx= 0,2.


# include

# include

# include

main()


{ float x,y; clrscr();

for(x=2; x<=3; x+=0.2)

{y=cos(x); printf(“x=%g y=%g\n”, x,y);}

getch();


}
{Циклик жараёнлар}

#include

#include

using namespace std;

void main()

{ double p,s=0,f1,f2,n,m;

for(n=1;n<=4;n++)

{ p=1; for(m=1;m<=5;m++)

{f1=sqrt(abs(exp(m*log(n))+exp(n*log(m))));

f2=exp(m*log(n))+exp(n*log(m));

p=p*(f1/f2);

}

s=s+p;



}

cout<<"Natija : \n";

cout<<"s= "<

}

for оператори циклни ишлаши учун зарур бўладиган учта операцияни ўзида бирлаштиради. Бу операцияларни қисқача қуйидагича характерлаш мумкин: бошланғич қийматни ўзлаштириш, шартни текшириш, цикл счётчигини қийматини ошириш. for оператори ифодасидаги қавснинг ичида шу уччала операцияни амалга оширувчи ифодалар ёзилади. Қавс ичидаги ифодалар нуқтали вергул орқали ажратилади.



for циклининг биринчи ифодаси цикл счётчигига бошланғич қийматни ўзлаштиради. Счётчик – тўғридан–тўғри for циклида эълон қилинадиган ва қиймат ўзлаштириладиган бутун сонли ўзгарувчидир. С++ да бу ўринда счётчикка қиймат берадиган ихтиёрий ифода ёзилишига имкон берилган. for циклининг иккинчи параметрида циклни давом этиш шарти аниқланади. Бу шарт while конструкциясининг шарти бажарадиган вазифани амалга оширади. Учинчи параметрда эса цикл счётчиги қийматини ўзгартирувчи (оширувчи ёки камайтирувчи) ифода ёзилади. for циклидан фойдаланишга мисол. for циклининг қўлланилишига.

1.include< iostream. h>



  1. int main()

  2. {

  3. int counter;

  4. for (counter=0 ; counter<5; counter++ )

  5. cout<< “Looping!”;

  6. cout<< “\n Counter:” << counter<< “.\n”;

  7. return 0;

  8. }

НАТИЖА:

Looping! Looping! Looping! Looping! Looping!

Counter: 5
for оператори учун мураккаб ифодаларни берилиши

for цикли дастурлашнинг кучли ва қулай инструментидир. for операторида циклни ўзаро боғлиқ бўлмаган параметрлар (бошланғич қиймат ўзлаштириш, бажарилиш шарти ва қадам) ни қўлланилиши цикл ишини бошқаришда жуда яхши имкониятларни очиб беради.

for цикли қуйидаги кетма–кетликда ишлайди.


        1. Цикл счетчигига бошланғич қиймат ўзлаштирилади.

        2. Циклни давом этиш шартидаги ифода қиймати ҳисобланади.

        3. Агарда шарт ифодаси true қиймат қайтарса олдин цикл танаси бажарилади, кейин эса цикл счётчиги устида берилган амаллар бажарилади.

Ҳар бир итерацияда 2 чи ва 3чи қадамлар такрорланади.

Циклда бир нечта счётчик (ҳисоблагич)ни қўлланилиши

for циклининг синтаксиси унда бир нечта ўзгарувчи ҳисоблагични қўлланилишига, циклни давом этишини мураккаб шартларини текширишга ва цикл ҳисоблагичлари устида кетма-кет бир нечта операцияни бажарилишига имкон беради.

Агарда бир нечта ҳисоблагичга қиймат ўзлаштирилса ёки улар ўртасида бир нечта операция бажарилса, бу ифодалар вергул билан ажратилган ҳолда кетма – кет ёзилади. Қуйидаги листингда иккита счётчикли for операторининг қўлланилишини кўриб чиқамиз.

Масалан: for циклида бир нечта счётчикни қўлланилиши

1. include< iostream. h>



  1. int main()

  2. {

  3. for (int i=0, j=0; i<3; i++, j++)

  4. cout<< “i:” <

  5. return 0;

  6. }

HАТИЖА:

i: 0 j: 0

i: 1 j: 1

i: 2 j: 2


for циклида нол параметрларни ишлатилиши

for циклининг ихтиёрий параметри тушириб қолдирилиши мумкин. Нол параметрлар for циклини бошқа параметрларидан нуқтали вергул (;) билан ажратилади. Агарда for циклини 1 – ва 3 – параметрларини тушириб қолдирсак, у худди while операторидек қўлланилади.



for циклининг нол параметрлари

1.  include < iostream. h>



  1. int main()

  2. {

  3. int counter=0;

  4. for ( ; counter<5 ; )

  5. {

  6. counter++;

  7. cout << Looping!”;

  8. }

  9. cout<< “\n Counter:” << counter<< “.\ n”;

  10. return 0;

  11. }

НАТИЖА:

Looping! Looping! Looping! Looping! Looping!

Counter: 5
ТАҲЛИЛ: бу циклни бажарилиши юқоридаги листингда келтирилган while циклини бажарилишига ўхшаш тарзда амалга оширилади. 4-сатрда сounter ўзгарувчисига қиймат ўзлаштирилаяпти. for циклида эса параметр сифатида фақатгина циклни давом этиш шартини текшириш ифодаси ишлатилган. Цикл ўзгарувчиси устида операция ҳам тушириб қолдирилган. Бу ҳолда ушбу циклни қуйидагича ифодалаш мумкин:

while(counter<5)

Қаралган мисолимиз яна бир марта С++ тилида бир хил масалани бир неча усул билан ҳал қилиш имконияти борлигини кўрсатади. Бундан ташқари, for циклининг 3 та параметрини ҳам тушириб қолдириш ва циклни break ва continue операторларини қўллаш орқали бошқариш мумкин. for конструкциясини параметрларсиз қўлланилишига мисол ушбу листингда кўрсатилган.

for операторларини параметрларсиз қўлланилиши
1.  include


  1. int main()

  2. {

  3. int counter=0;

  4. int max;

  5. cout<< “How many hellos?”;

  6. cin>> max;

  7. for( ; ; )

  8. {

  9. if (counter

  10. {

  11. cout << “Hello! \h”;

  12. counter++;

  13. }

  14. else

  15. break;

  16. }

  17. return 0;

  18. }

НАТИЖА:

How many hellos? 3

Hello!

Hello!


Hello!
for циклининг танаси бўш бўлган ҳолда қўлланилиши

Циклда for оператори орқали унинг танасига ҳеч қандай оператор ёзмасдан туриб ҳам бирор бир амални бемалол бажариш мумкин. Бунда цикл танаси бўш сатрдан иборат бўлади. Танаси бўш бўлган for циклига мисол 7.13. – листингда келтирилган.



For циклининг танаси бўш бўлган ҳолда қўлланилиши

  1.  include< iostream. h>

  2. int main()

  3. {

  4. for (int i=0; i<5; cout<< “i” <

  5. ;

  6. return 0;

  7. }

HАТИЖА:

i: 0


i: 1

i: 2


i: 3

i: 4


Ички цикллар

Бошқа циклнинг ичида ташкил этилган цикл ички цикл деб айтилади. Бу ҳолда ички цикл ташқи циклни ҳар бир итерациясида тўлиқ бажарилади. Юыоридаааги дастурда матрица элементларини ички цикл орқали тўлдирилиши намойиш қилинган.



Ички циклларга мисол

1. include< iostream. h>



  1. int main()

  2. { int rows, columns;

  3. char theChar;

  4. cout << “How many rovs?”;

  5. cin >> rows;

  6. cout << “How many columns?”;

  7. cin >> columns;

  8. cout << “What character?”;

  9. cin>>theChar;

  10. for ( int i=0; i

  11. {

  12. for (int j=0; j

  13. cout << the char;

  14. cout<< “\n”;

  15. }

  16. return 0;

  17. }

HАТИЖА:

How many rows? 4

How many columns? 12

What character? x

х x x x x x x x x x x x

for цикл счётчигининг кўриниш соҳаси

ANSI нинг янги стандарти бўйича циклда эълон қилинган ўзгарувчининг кўриниш соҳаси фақат цикл ичидангина иборат. Лекин кўпгина компиляторлар эски стандартларни ҳам қўллаб – кувватлайдилар. Қуйида келтирилган дастур кодини киритиб ўзингизнинг компиляторингиз янги стандартга мос келиш- келмаслигини текширишингиз мумкин.

 include

int main()

{ for ( int i = 0; i<5; i++ )

{ cout << “ i: ” << i << endl ;

}

i=7; // i кўриниш соҳaси чегарасидан ташқарида



return 0;

}

Агарда бу дастур хатоликсиз компиляция қилинса демак у ANSI нинг янги стандартини қўллаб - қувватламайди. Янги стандартга мувофиқ компиляторлар i=7 ифода учун хатолик хақида хабар бериши керак. Дастур кодига озгина ўзгартириш киритилганда сўнг дастур барча компиляторлар учун хатоликсиз ишлайди.



 include< iostream. h>

int main ()

{int i;

for ( int i = 0; i<5; i++ )



{cout << “ i: ” << i << endl ;

}

i=7; //Энди i барча компиляторлар томонидан //хатоликсиз қабул қилиниши мумкин.



Қаторлар йиғиндисини ҳисоблаш алгоритмлари

Циклик жараёнлар учун реккурент формулалар



Реккурент формулаларнинг қуйидаги формалари мавжуд:
а)

бу умумий кўриниши бўйича с) кўринишга мансуб бўлганлиги учун, реккурент формула бўйича ҳисоблаш

Сn =(-1) – мақсадга мувофиқ

n =-Сn-1); n/n-1 sin nx



У холда, an=Cn n/n2-1 sinnx; Сn =-Сn-1; бу ерда n=2,3,…..25; С1 =-1 ва ҳисоблаш S=S+C n/n2-1 sin nx . бу ерда S- ҳар хил қийматга эга бўлади, яъни ўнг томондаги S (Sn-1) ни қийматини, чап томон навбатдаги қийматни қабул қилади Sn+1 ни.

Мисол3. Қаторлар йиғиндисини аниқликда ҳисоблаш дастурини тузинг.

  1. Дастури. (Паскал дастурлаш тилида).

uses crt;

var y,s,x,eps:real;

n:integer;

begin clrscr;

readln(x,eps);

y:=1; s:=1; n:=1;

Repeat

y:=y*(- x*x/(2*n+(2*n+(2*n-1))));



s:=s+y; n:=n+1;

Until y

writeln(‘s );

S: =12 +22 +32 +..+ n2 йиғиндини ҳисоблаш алгоритми ва

дастурини тузинг.

{қаторлар йиғиндиси}

#include

#include

using namespace std;

void main()

{

const double pi=3.14159265;



double s=0,x,y,k=1,i;

cout<<"x ni qiymatini kiriting : \n";

cin>>x;cout<<"\n";

if ((x>=0.1) && (x<=0.8))

{

for (i=1;i<=10000;i++)



{

k=k*x;


s=s+k*sin(i*(pi/4));

}

y=(x*sin(pi/4))/(1-2*x*cos(pi/4)+x*x);



cout<<"Summa:\n";cout<<"s= "<

cout<<"Formula:\n";cout<<"y= "<

}

else cout<<"0.1 va 0.8 oraliqda kiriting !!! ";



}

Бундан ташқари қаторлар йиғиндисини аниқлашда бир неча мисоларни келтиришимиз мумкин:


{Циклик жараёнлар}

#include

#include

using namespace std;

void main()

{

double p,s=0,f1,f2,n,m;

for(n=1;n<=4;n++)

{

p=1;

for(m=1;m<=5;m++)

{

f1=sqrt(abs(exp(m*log(n))+exp(n*log(m))));

f2=exp(m*log(n))+exp(n*log(m));

p=p*(f1/f2);

}

s=s+p;

}

cout<<"Natija : \n";

cout<<"s= "<

} }


Mavzuni jonlantirish uchun savollar

  1. C++ tilida Tsikllar nima va ular qanday ishlatiladi?

  2. C++ tilidagi old shartli sikl operatorining umumiy ko’rinishini ayting?

  3. C++ tilidagi so’ng shartli sikl operatorining umumiy ko’rinishini ayting?

  4. C++ tilidagi parametrik shartli sikl operatorining umumiy ko’rinishini ayting?


Foydalanilgan adabiyotlar

1.M.Ashurov, N.Mirzahmedova, N.Xaytullayeva. Algoritmlash va dasturlash asoslari. Uslubiy qo‘llanma. T. : “Bayoz”, 2016 y.

2.R. Azamatov, B. Boltayev. Algoritmlash va dasturlash asoslari. O‘quv qo‘llanma. T. : “Cho‘lpon”, 2013 y.

3.Sh. I. Razzoqov, M. J. Yunusova. Dasturlash: Kasb-hunar kollejlari uchun o‘quv qo‘llanma. T. : “Ilim Ziyo”, 2011y.



4.Nazirov Sh.A., Qobulov R.V., Bobojanov M.R., Raxmanov Q.S. С va С++ tili. “Voris-nashriyot” MCHJ, Toshkent 2013. 488 b.
Download 175.5 Kb.

Do'stlaringiz bilan baham:





Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling