450 likes | 675 Views
Kontrola toka programa. *. Osnovne logičke strukture. Sekvencija (slijed) Selekcija (odabir) Iteracija (ponavljanje) Skokovi. *. Sekvencija. Blok naredbi. *. if. Preskok. Selekcije. Grananje. if-else, switch, ?. *. Na vrhu. while. S uvjetnim izlazom. Na dnu. do-while.
E N D
Osnovne logičke strukture Sekvencija (slijed) Selekcija (odabir) Iteracija (ponavljanje) Skokovi *
Sekvencija Blok naredbi *
if Preskok Selekcije Grananje if-else, switch, ? *
Na vrhu while S uvjetnimizlazom Na dnu do-while Iteracije S eksplicitnim brojačem for *
goto return Skokovi continue break exit *
Blok naredbi • format • { naredba_1; naredba_2; naredba_3; .... } primjer { cout << “Ovo je prva naredba u bloku” << endl; cout << “Ovo je druga naredba u bloku”<< endl; cout << “Ovo je treća naredba u bloku” << endl; } *
Grananje: if da ne ? • format • if (logički_izraz) // blok_naredbi I. II. • primjer • if (a < 0){ • cout << “a je negativan” << endl; • cout << “a nije pozitivan” << endl; • cout << “a nije nula” << endl; • } *
Grananje: if-else da ne format if (logički_izraz) // prvi_blok_naredbielse // drugi_blok_naredbi ? I. II. III. primjer if (a < 0)cout << “a je negativan” << endl;else cout << “a je pozitivan ili nula” << endl; *
Grananje: if-else • Kako radi sljedeći program? if(A = 0)if (B = 0)cout << “C”; elsecout << “D”; *
Grananje: if-else • Kako radi sljedeći program? if(A = 0)if (B = 0)cout << “C”; elsecout << “D”; A=0B=0 *
Grananje: if-else • Kako radi sljedeći program? if(A = 0)if (B = 0)cout << “C”; elsecout << “D”; A=0B=0 C *
Grananje: if-else • Kako radi sljedeći program? if(A = 0)if (B = 0)cout << “C”; elsecout << “D”; A=0B=0 C A=1B=0 *
Grananje: if-else • Kako radi sljedeći program? if(A = 0)if (B = 0)cout << “C”; elsecout << “D”; A=0B=0 C A=1B=0 A=0B=1 *
Grananje: if-else • Kako radi sljedeći program? if(A = 0)if (B = 0)cout << “C”; elsecout << “D”; A=0B=0 C A=1B=0 A=0B=1 D *
Pravilo!!! else pripada prvom prethodnom slobodnomif-u (računajući od najniže razine): if (a<b) if (c<d) if (e<f) akc_1 else akc_2 else akc_3 else akc_4 Prvi prethodni slobodni ‘if’ *
Grananje: switch (dijagram toka) default 1 cjelobrojni_izraz 0 3 2 blok_0 blok_2 blok_3 blok_1 blok_4 break break break *
Grananje: switch (format) switch (cjelobrojni_izraz) { case konstanta_0: // prvi_blok_naredbi; //slučaj 0 case konstanta_1: // drugi_blok_naredbi; break; //slučaj 0 i 1 case konstanta_2: case konstanta_3: // treći_blok_naredbi; break; //slučaj 2 i 3 . . . . . case konstanta_n // n_ti_blok_naredbi break; //slučaj n default: // m_ti_blok_naredbi; //ostalo} *
Grananje: switch (primjer) Izračunavanje prijestupne godine (1) int god; cout << “Unesi godinu (GGGG): ”; cin >> god; cout << endl; switch (god % 4) { case 0: cout << “Godina je prijestupna!” << endl;break; case 1: case 2: cout << “Godina nije prijestupna!” << endl;break; default: cout << “Godina nije prijestupna!” << endl;} *
Isto, samo malo drugačije: Izračunavanje prestupne godine (2) int god; cout << “Unesi godinu (GGGG: ”; cin >> god; cout << endl; switch (god % 4) { case 0: cout << “Prijestupna je!” << endl;break; case 1: case 2: case 3: cout << “Nije!” << endl;} *
Grananje: switch (primjer) Rezultat izvođenja Unesi godinu (GGGG): 1999 Godina nije prijestupna! Unesi godinu (GGGG): 2000 Godina je prijestupna! Unesi godinu (GGGG): 1900 Godina je prijestupna! | Prestupne godine su one koje sudjeljive s 4, a nisu sa 100 i one koje su djeljive sa 400!!! *
Grananje: uvjetni operator (?) format uvjet ? izraz_1: izraz_2; TRUE: izračunava se izraz_1 FALSE: izračunava se izraz_2 primjer x = (x < 0) ? -x: x; // x=abs(x) *
Sada možemo pravilno riješiti primjer s prijestupnom godinom *
int god; cout << “Unesi godinu (GGGG: ”; cin >> god; cout << endl; if ((god%400)==0) cout<<“Godina je prijestupna!”; //iznimka else if ((god%100)==0) //obrnuto ne bi bilo dobrocout<<“Godina nije prijestupna!”;else switch (god%4){ case 0: cout<<“Godina je prijestupna!”<<endl;break; case 1: case 2: cout<<“Godina nije prijestupna!”<<endl;break; default: cout << “Godina nije prijestupna!” << endl;} *
Rezultat izvođenja Unesi godinu (GGGG): 1999 Godina nije prijestupna! Unesi godinu (GGGG): 2000 Godina je prijestupna! Unesi godinu (GGGG): 1900 Godina nije prijestupna! | Pravilo Najprije valja isključiti iznimke: 2000 je djeljivo bez ostatka i s 4 i sa 100 i s 400! *
S izlazom na vrhu: while a = 5 • format • while (uvjet_izvođenja) // blok_naredbi ne a != 0 primjer int a = 5; int b; while (a != 0) { cin >> b >> endl; a -= b; } da učitaj:b (a = 0) Prekidponavljanja a = a -b *
S izlazom na dnu: do_while učitaj:b • format • do // blok_naredbi while (uvjet_izvođenja) a = a -b ne primjer int a = 5; int b; do { cin >> b >> endl; a -= b; } while (a != 0); a != 0 da (a = 0) prekidponavljanja *
S eksplicitnim brojačem: for format for (početni_izraz; uvjet_izvođenja; izraz_prirasta) // blok_naredbi n = 10 Primjer int n=10; cout << “i=“; for (int i=1; i<=n; i++) cout << i << “,“; cout << endl; i = 1 ne i <= n da Rezultat izvođenja i=1,2,3,4,5,6,7,8,9,10| ispis prekidponavljanja i = i + 1 *
Prijevremeni prekid ponavljanja: break Zadatak Program opetovano učitava varijablu a. Regularni prekid petlje: (a==0). Prijevremeni prekid petlje: (a= =5). učitaj: a Primjer int a; do { cout<<“a=“; cin >>a; cout<<endl; if (a==5) break; //prekida petlju cout<<“a= “<<a<<endl;} while (a!=0); da a= =5 ne prijevremeniprekidponavljanja ispis: a ne Rezultat izvođenja 1.primjer: 2.primjer: a=2 a=2 a=2 a=2 a=3 a=5 a=3 <prijevremeni a=0 prekid> <regularni prekid> a!=0 da regularniprekidponavljanja *
Skok na kraj petlje: continue Zadatak Program opetovano učitava varijablu a. Prekid ponavljanja: (a>100). Preskok akcije:a negativno ili nula. učitaj: a Primjer int a; do{ cout<<“a=“; cin >>a; cout<<endl; if (a<=0) continue; //preskok ispisa cout<<“a= “<<a<<endl;} while (a<=100); da a<=0 ne ispis: a ne Rezultat izvođenja 1.primjer: 2.primjer: a=2 <unos> a=2 <unos> a=2 <ispis> a=2 <ispis> a=0 <unos> a=5 <unos> <preskok ispisa>a=5 <ispis> a=101 <unos> a=101 <unos> a=101 <ispis> a=101 <ispis> <prekid><prekid> a<=100 da prekidponavljanja *
Zadatak Potrebno je izraditi program koji će izračunavati koliko je dana prošlo od 1. siječnja do nekog određenog dana u bilo kojoj godini između 1901. i 1999. Ulaz podataka: učitavanje cjelobrojnih varijabli GG (godina), MM (mjesec) i DD (dan). Izlaz: poruka na zaslonu računala. Izgled poruke: Od 1. siječnja do DD.MM.GG. prošlo je Suma dana. Napomene: (1) voditi računa o prestupnim godinama (veljača!); (2) omogućiti učitavanje podataka i izračunavanje za neodređeni broj slučajeva. *
Izračunavanje broja dana; obično rješenje #include<iostream>using namespace std;int main () { početak int Sij,Velj,Ozu,Tra,Svi,Lip; int Srp,Kol,Ruj,Lis,Stu,DD,MM,GG,i; deklaracija Sij=Ozu=Svi=Srp=Kol=Lis=31; Tra=Lip=Ruj=Stu=30; inicijalizacija ponavljanje do{ veljača! int Velj=28; cout<<“unesi godinu(GG): “; cin>> GG; cout<<“ unesi mjesec(MM): “; cin>> MM; cout<<“ unesi dan(DD): “; cin>> DD; cout<<endl; učitavanje if((GG%400==0) || ((GG%100!=0) && (GG%4=0))) Velj=29; prestupnagodina int Suma=0; suma dana! *
Izračunavanje broja dana; obično rješenje if (MM==1) Suma=DD; if (MM==2) Suma=Sij+DD; if (MM==3) Suma=Sij+Velj+DD; ... if (MM=12) Suma=Sij+Velj+ … +Stu+DD; izračunavanje cout<<“Od 1.siječnja do “<<DD<<“.” <<MM<<“.19”<<GG<<“.”<<“ prošlo je “ <<Suma<<“ dana.”<<endl; ispis cout<<“Za nastavak unesi 1, za prekid 0: “; cin>> i; cout<<endl; indikacija kraja kraj ponavljanja i programa } while (i==1); return 0; } *
Izračunavanje broja dana; switch-rješenje include<iostream> using namespace std; int main { //deklaracija mjeseci //inicijalizacija mjeseci do { //učitavanje datuma //prestupna godina int Suma=0; switch (MM) { case 12: Suma+=Stu; case 11: Suma+=Lis; case 10: Suma+=Ruj; case 9: Suma+=Kol; case 8: Suma+=Srp; case 7: Suma+=Lip; case 6: Suma+=Svi; case 5: Suma+=Tra; *
Rješenje br. 2 case 4: Suma+=Ozu; case 3: Suma+=Velj; case 2: Suma+=Sij; case 1: Suma+=DD; } //ispis //indikacija kraja } while (i==1); return 0; } *
Problem Mnoge matematičke veličine mogu se prikazati nizom aproksimacija (približnih vrijednosti) koji nastaje beskonačnim zbrajanjem članova niza. Ova se tehnika može upotrijebiti i za izračunavanje ‘e’ (2.718282e+000), baze prirodnih logaritama. Analiza Vrijednost ‘e’ može se približno odrediti izračunavanjem niza 1 + 1/1! +1/2! + 1/3! + ... + 1/N! gdje je N! faktorijel N: ako (N = 0) tada (N! = 1.0) ako (N =1) tada (N! = 1.0) ako (N > 1) tada (N! = N * (N-1)!) To se može prikazati kao N 1 / i! i=0 Što je veći N, više će članova biti uključeno u niz, pa će i rezultat biti precizniji. *
Podaci • Ulaz • int N: broj članova; granica zbrajanja • Izlaz • long double E: aproksimativna vrijednost ‘e’ • Varijable • long double ItiClan: i-ti član niza • int i: varijabla za kontrolu ponavljanja *
Oblikovanje algoritma Za izračunavanje će se upotrijebiti struktura iteracije tipa for (iteracija s eksplicitnim brojačem). Algoritam 1. Učitaj vrijednost N. 2. Inicijaliziraj: E = 1.0 3. Inicijaliziraj: ItiClan = 1.0 4. Ponavljanje (i=1; i<=N; i++) 4.1 Izračunavanje ( ItiClan u nizu): ItiClan=ItiClan/i 4.2 Zbroji: E=E+ItiClan 5. Ispiši vrijednost E *
Program #include<iostream> #include<iomanip>using namespace std; int main() { int Kraj=1; cout<<"Program izracunava 'e' (baza prirodnog logaritma)"<<endl; while(Kraj==1) { long double E=1.0; //baza prirodnog logaritma 'e' long double ItiClan=1.0; //i-ti int N; //ulaz - broj clanova niza int i; //eksplicitni brojac cout<<endl<<"Unesi broj clanova niza> "; cin>>N; //izracunavanje for(i=1;i<=N;i++) { ItiClan/=i; E+=ItiClan; } //for *
//ispis rezultata: znanstvena notacija cout<< setprecision(8)<< "Priblizna vrijednost e je "<<E<<endl; //kraj cout<<endl<<"Za nastavak <1>, za kraj <0>: "; cin>>Kraj; } //while return 0; } //main P5_2.exe *