algoritmika leks while
DESCRIPTION
Algoritmika Leks WhileTRANSCRIPT
Instruksionet ciklike (të përsëritjes)
1) Instruksionet ciklike
2) Instruksioni ciklik while
3) Instruksionet e kapërcimit
•break
•continue
•return
Instruksionet ciklike në gjuhën C++
Ekzekutimi i instruksioneve një herë të vetme
mund të mos japë zgjidhje të problemit.
Shpesh herë ato duhen ekzekutuar me shumë
se një herë.
Mekanizëm i përsëritjes së ekzekutimit të
instruksioneve quhet “cikël”.
Përdoren tre struktura ciklesh në C++: cikli
“while”, cikli “for” dhe cikli “do while”, me
të cilët do të njihemi në këtë leksion.
Supozojmë se duam të afishojmë 100 herë shprehjen:
"Pershendetje studente!“
Do të ishte shumë e mërzitshme të shkruajmë 100 herëinstruksionin:
cout<<"Pershendetje studente"<<endl;cout<<"Pershendetje studente!“<<endl;……………………………………………………………..………..cout<<"Pershendetje studente!“<<endl;cout<<"Pershendetje studente!“<<endl;
Me instruksion ciklik afishimi i 100 përshëndetjeve përstudentët do të shprehej mjaft shkurt:
int nr = 0; while (nr < 100) {
cout<<"Pershendetje studente!“<<endl;++nr;
}
Sintaksa:
while(<kusht>) {instruksion1;.....................
}
Semantika:• Kur programi arrin fjalën çelës “while”,
kontrollohet kushti.
• Nëse kushti është i vërtetë ekzekutohet dhevazhdon të ekzekutohet trupi i ciklit, derisakushti të bëhet false.
• Një instruksion i trupit të ciklit ndryshonvariablin e ciklit.
• Kur kushti bëhet false, trupi i ciklit kapërcehetdhe kalohet në instruksionin pasues.
Instruksioni “while”
Të llogaritet shuma e N numrave të dhënë nga tastiera
Trupi iciklit
#include <iostream>#include <cstdlib>using namespace std;int main() {
int vl, i; int N; // numri i vlerave qe do te mblidhenint S = 0;cout<<"Sa vlera do te mblidhni?"<<endl;cin>>N;i = 0;while (i < N ){
cout<<"Jepni numrin:"<<endl;cin>>vl;S = S + vl; i = i + 1;
} cout<<"shuma S = "<<S<<endl; system ("PAUSE");return 0;
}
Llogarisim mesataren e një sërë numrash të futur nga tastiera dukepërdorur ciklin while:
#include <cstdlib>#include <iostream>using namespace std;int main() {
int n; // numri i notaveint nr_note; //variabli i ciklitdouble note; // notatdouble Sh = 0, nmes;cout << "Sa nota? " << endl;cin >> n;nr_note = 1;while (nr_note <= n) {
cin>>note; //lexon nje noteSh = Sh + note;//shuma e notavenr_note = nr_note + 1; //variabli i ciklit + 1
}nmes = Sh/n;cout<<"nmes ="<<nmes<<endl; system("PAUSE");return 0; }
Kujdes!! Mos bëni këto gabime:1) Pikpresje tek koka e ciklit
int i=0; while (i < 10);{cout<<“i = " << i; //trupi i ciklit shkëputet nga ciklii++;
}
2) Trup cikli që nuk ekzekutohet asnjëherë:Kur shprehja e kushtit të instruksionit while është false që në testin e parë, trupi i ciklit nuk ekzekutohet asnjëherë. P.sh. Instruksionet e ciklit të mëposhtëm:
int num = 100;
while (num < 100) { // testi është false që herën e parë
cout<<“num = " << num;
num = num + 1; }
nuk do të ekzekutohen asnjëherë, pasi 100 <100 është false.
3)Trup cikli që ekzekutohet numër infinit herësh:
Kur ndërtohet një instruksion ciklik, duhet patjetër që një ngavariablat në shprehjen e testit të ndryshojë vlerë, në mënyrë që pasnjë numri përsëritjesh kushti të bëhet false. Në të kundërt, vlera etestit do të mbetet gjithnjë e vërtetë dhe trupi i ciklit do tëpërsëritet (teorikisht) në infinit.
int num = 0;while (num < 100) {
cout<<“num= “ << num; // përsëritet pa fundnum = num * 1;
} //OOPS! Variabli ciklik mbetet 0
ose
int num = 0;while (num < 100) {
cout<<“num= “ << num; // përsëritet pa fund} //OOPS ! Variabli ciklik harrohet të ndryshohet
•Shprehja e kushtit në një cikël while jo gjithnjë duhet të jetë njëshprehje relacionale, mund të jetë dhe një variabël i vetëm, si nëshembullin më poshtë:
OUTPUT:
Vlera e vjeter j = 4, Vlera e re j = 3, S = 4Vlera e vjeter j = 3, Vlera e re j = 2, S = 7Vlera e vjeter j = 2, Vlera e re j = 1, S = 9Vlera e vjeter j = 1, Vlera e re j = 0, S = 10
#include <iostream>#include <cstdlib>using namespace std;int main(){int j = 4, s = 0;while( j ) {cout<<" Vlera e vjeter j = " <<j ;s = s + j;j = j - 1;cout<<", Vlera e re j = " << j << ", S = " << s <<endl;}system ("PAUSE");return 0;}
Kujtojmë që në C++ njëvlerë integer = 0konsiderohet si vlerë FALSEne kushtin e while dheTRUE ne rastet e tjera.
#include <iostream>#include <cstdlib>using namespace std; int main(){
int num = 0; char c;cout<<"\nShkruani nje fjali:"<<endl; while ( (c=getchar()) != ‘\n’ ) {
num++; cout<<"c="<<c<<", num="<<num<<endl;
} cout<<"\nNumri i karaktereve = "<<num<<endl;system ("PAUSE");return 0;
}
Më poshtë paraqitet shembulli i vendosjes në kushtin einstruksionit while i funksionit getchar() që shërben për futjen enjë karakteri nga tastjera. Kur karakteri i shtypur është Return,kushti konsiderohet false dhe dilet nga cikli.
#include <iostream>#include <cstdlib>using namespace std; int main(){
int num = 0 , char c; // deklarojmë c një variabël karakterc = '#'; // i japim c vetë një vlerë që të hyjmë në cikëlcout<<"\nShkruani nje fjali:"<<endl; while ( c != '\n') {
c=getchar(); cout<<"c="<<c<<", num="<<num<<endl;num++; }
cout<<"\nNr.karaktereve = "<<num<<endl;system ("PAUSE");return 0;}
Modifikojmë ushtrimin e mëparshëm për ta bërë më të qartë.
Nga rezultati shihet se kësaj here numri i karaktereve është 10, pasi numrritet herën e fundit që cikli përsëritet e pastaj testohet kushti false se shtypetReturn.
Kapërcimi i strukturuarInstruksionet që lejojnë ndryshimin e rregullt të fluksit tëinstruksioneve dhe në rastin e cikleve janë:
• break : provokon daljen e menjëhershme nga cikli për të vazhduar në instruksionin që pason ciklin.
• continue: kapërcen instruksionet e mbetura të ciklit korrent dhe vazhdon me ciklin pasardhës.
while ( kusht ) {instruksione;...break;instruksione
}
while ( kusht ) {instruksione;...continue;instruksione
}
Instruksioni break
#include <cstdlib>#include <iostream>using namespace std;int main() {
char c;while (1) { // kusht gjithnjë true
cout << “Jepni një karakter!" << endl; cin >> c;if (c != 'a')
cout << c << endl;else
break; // dilet nga cikli kur shtypet a }
system("PAUSE");return 0;
}
#include <cstdlib>#include <iostream>using namespace std;int main(){
int vl, s = 0;cout<<"Jepni vlerat qe do te mblidhni: "<<endl;while (cin >> vl) { // kusht i ciklit është një vlerë int që lexohet me cin
if (vl == 0) {
cout<<"Shtypet 0, Dolet nga cikli."<<endl;break; // dilet nga cikli kur shtypet numri 0
}s = s + vl;
} // mbyllet ciklicout<<"s="<<s<<endl; system("PAUSE");return 0;
}
Llogaritet shuma e disa vlerave int që jepen nga tastiera, derisa tështypet 0.
Instruksioni continue#include <cstdlib>#include <iostream>using namespace std;int main(){
int x=0 ;while(x <10){
++x;if (x == 7) continue;cout<<"x=" << x<<endl;
} system("PAUSE");return 0;
}
Dalloni që numri 7 nuk është shtypur se instruksioni continue kabërë kapërcimin në ciklin pasardhës, duke penguar ekzekutimin eafishimit të tij e kaluar në ciklin pasardhës.
Ciklet e ndërfutura while
Ciklet while mund të përfshihen brenda njëri tjetrit duke formuarkështu ciklet e ndërfutur, si shihet në shembullin më poshtë:
#include <cstdlib>#include <iostream>using namespace std;int main() {int i = 1;
while(i <= 10){ // cikli i jashtëmint j =1;while(j <=10){ // cikli i brendshëm
cout<<i*j<<"\t";++j;
} // mbyllet cikli i brendshëmcout<<endl;++i;
} // mbyllet cikli i jashtëmsystem("PAUSE");return 0;}
OUTPUT: TABELA E SHUMËZIMIT
•Në këtë program cikli i brendshëm ( var j) shërben për të lëvizursipas kolonave, kurse i jashtmi (var i ) sipas rreshtave.•Për çdo rresht, ekzekutohet cikli i brendshëm, i cili lëviz në dhjetëkolonat dhe afishon vlerat, dhe më pas bëhet kalimi në rreshtin e ri.
#include <cstdlib>#include <iostream>using namespace std;int main() {
long faktorial;int num = 1;while(num != 0) { //cikli i jashtëm
cout<<“Shkruani nje numer: ";cin>>num;faktorial = 1;while(num > 1) //cikli i brendshëm
faktorial = faktorial * num--;cout<<"Faktoriali= “ <<faktorial<<endl;}system("PAUSE");
return 0;}
• Llogariten Faktorialet e disanumrave.• Cikli jashtëm përseritet përnumra të ndryshëm, derisatë shtypet 0.• Cikli i brendshëm llogaritfaktorialin e një numri
Llogaritje e faktorialit
Tipe strukturash të ndërfutura
• Mënyra e kombinimit të cikleve varet së pari nga problemi qëduhet zgjidhur.
• Modelet e ndërfutjes së cikleve mund të jenë të ndryshme, sip.sh. në figurat më poshtë:
#include <cstdlib>#include <iostream>using namespace std;int main() {
int n; // numri i notaveint nr_note; //variabli i ciklitdouble note; // notatdouble Sh, nmes;cout << "Sa nota? " << endl;cin >> n;int nr_stud =1;while(nr_stud <= 3) {
Sh = 0;nr_note = 1;while (nr_note <= n) {
cin>>note; //lexon nje noteSh = Sh + note; //shuma e notave
++nr_note;// ndryshon variabli i ciklit}
nmes = Sh/n;cout<<"nmes = "<<nmes<<endl; ++nr_stud;
}system("PAUSE");
return 0; }
Llogaritja e mesatares për nr lëndë për 20 studentë.