Algoritmi un programmana Praktiskie darbi Cikli Funkcijas C

Algoritmi un programmēšana Praktiskie darbi Cikli Funkcijas C++ un Python Doc. Dr. Sc. Comp. Edgars Rencis, Latvijas Universitāte, Datorikas fakultāte, 30. septembris – 2. oktobris, 2020.

KD 1 – 7. -9. oktobrī!

Cikli

Cikli n n Iespēja izpildīt noteiktas darbības atkārtoti Trīs veidu cikli q ar skaitītāju – for n q ar priekšnosacījumu – while n q ja precīzi zināms, cik reizes cikls jāizpilda ja nav zināms, cik reizes cikls jāizpilda ar pēcnosacījumu – do. . . while n ja nav zināms, cik reizes cikls jāizpilda, bet ir zināms, ka tas jāizpilda vismaz vienu reizi

Cikls ar priekšnosacījumu C++ n n n while (<loģiska izteiksme>) {. . . } Sākuma vērtības jāpiešķir pirms cikla Cikla mainīgā izmaiņas jāveic cikla ķermenī Loģiskās izteiksmes vietā drīkst būt arī aritmētiska izteiksme Figūriekavas blokam obligātas gadījumā, ja tas satur vairāk par vienu komandu

while cikla piemērs C++ n n Izdrukāt vienā stabiņā ciparus no 0 līdz 9 int i=0; while (i<10) { cout << i << endl; i++; } int i=0; while (i<10) cout << i++ << endl;

Cikls ar priekšnosacījumu Python n n while <loģiska izteiksme>: . . . Izdrukāt vienā stabiņā ciparus no 0 līdz 9 q x=0 while x<10: print(x) x+=1

Cikls ar pēcnosacījumu C++ n n n do {. . . } while (<loģiska izteiksme>) Sākuma vērtības jāpiešķir pirms cikla Cikla mainīgā izmaiņas jāveic cikla ķermenī Loģiskās izteiksmes vietā drīkst būt arī aritmētiska izteiksme Figūriekavas blokam obligātas gadījumā, ja tas satur vairāk par vienu komandu Šāds cikls izpildās vismaz vienu reizi!

do. . . while cikla piemērs C++ n n Izdrukāt vienā stabiņā ciparus no 0 līdz 9 int i=0; do { cout << i << endl; i++; } while (i<10); int i=0; do cout <<i++<<endl; while (i<10);

Vadības nodošanas komandas n Komandu izpildes secība q q q n pamatā atbilst fiziskajai komandu secībai main funkcijā ir stingri definēta atsevišķām komandām (zarošanās, cikliem, . . . ) atsevišķos gadījumos ir koriģējama Vadības nodošanas komandas q break n q continue n q nodod vadību laukā no cikla nākamajai komandai nodod vadību nākamajai cikla iterācijai (for cikla gadījumā izpildot arī pēc-iterācijas darbību (-as)) goto n nodod vadību citai patvaļīgai komandai (nav ieteicams izmantot, jo padara kodu nelasāmu)

break un continue n for (int i=0; i<10; i++) { if (i>6) break; Ja i>6, iet laukā no cikla (beigt darbu) Nepāra skaitļiem pārejam pie if (i%2) continue; nākamās iterācijas, izlaižot drukāšanas komandu cout << i << endl; Līdz šejienei nokļūstam tikai, ja i ir } pāra skaitlis, kas nav lielāks par 6: 0 2 4 6

Uzdevums 1 n n Lietotājs ievada naturālu skaitli. Noskaidrot, vai tas ir pirmskaitlis! q katram pirmskaitlim ir tieši 2 pozitīvi dalītāji #include <iostream> using namespace std; int main() { int x; cin >> x; int i, count=0; for(i=1; i<=x; i++) if(x%i==0) count++; if (count==2) cout << "Ir"; else cout << "Nav"; return 0; }

Uzdevums 1 – alternatīvs risinājums n #include <iostream> using namespace std; int main() { int x; cin >> x; int i; for(i=2; i<x; i++) if(x%i==0) break; if (x==i) cout << "Ir"; else cout << "Nav"; return 0; }

Funkcijas C++

Problēma n Uzdevums q n Lietotājs vienu pēc otra ievada vairākus naturālus skaitļus. Ievade beidzas, kad lietotājs ievada kādu pirmskaitli. Izdrukāt visus pirmskaitļus, kas mazāki par lietotāja ievadīto pirmskaitli. Algoritms q pirmais cikls – likt lietotājam vadīt skaitļus n q katram skaitlim pārbaudīt, vai tas nav pirmskaitlis un iet laukā no cikla, ja ir otrais cikls – ciklā iet cauri visiem naturālajiem skaitļiem no 2 līdz iepriekš ievadītajam skaitlim n katram skaitlim pārbaudīt, vai tas nav pirmskaitlis un izdrukāt tos, kas ir

Problēma n Uzdevums q n Lietotājs vienu pēc otra ievada vairākus naturālus skaitļus. Ievade beidzas, kad lietotājs ievada kādu pirmskaitli. Izdrukāt visus pirmskaitļus, kas mazāki par lietotāja ievadīto pirmskaitli. Algoritms q pirmais cikls – likt lietotājam vadīt skaitļus n q katram skaitlim pārbaudīt, vai tas nav pirmskaitlis un iet laukā no cikla, ja ir otrais cikls – ciklā iet cauri visiem naturālajiem skaitļiem no 2 līdz iepriekš ievadītajam skaitlim n katram skaitlim pārbaudīt, vai tas nav pirmskaitlis un izdrukāt tos, kas ir

Problēmas risinājuma variants #include <iostream> using namespace std; int main() { int x; bool is. Prime; do { cin >> x; if (x<2) is. Prime=false; else is. Prime=true; for (int i=2; i<x; i++) if (x%i==0) is. Prime=false; } while (!is. Prime); cout <<"Pirmskaitļi, kas mazāki par " << x << ": n"; for (int y=2; y<x; y++) { is. Prime=true; for (int i=2; i<y; i++) if (y%i==0) is. Prime=false; if (is. Prime) cout << y << endl; } return 0; }

Problēmas risinājuma variants #include <iostream> using namespace std; int main() { int x; bool is. Prime; do { cin >> x; if (x<2) is. Prime=false; else is. Prime=true; for (int i=2; i<x; i++) if (x%i==0) is. Prime=false; } while (!is. Prime); cout <<"Pirmskaitļi, kas mazāki par " << x << ": n"; for (int y=2; y<x; y++) { is. Prime=true; for (int i=2; i<y; i++) if (y%i==0) is. Prime=false; if (is. Prime) cout << y << endl; } return 0; } Koda dublēšana – ļoti slikta lieta

Problēmas risinājuma variants #include <iostream> using namespace std; int main() { Kods "is. Prime. Number" ar parametru sk int x; ------------------bool is. Prime; is. Prime=true; do { for (int i=2; i<sk; i++) cin >> x; if (sk%i==0) is. Prime=false; if (x<2) is. Prime=false; else is. Prime=true; for (int i=2; i<x; i++) if (x%i==0) is. Prime=false; } while (!is. Prime); cout <<"Pirmskaitļi, kas mazāki par " << x << ": n"; for (int y=2; y<x; y++) { is. Prime=true; for (int i=2; i<y; i++) if (y%i==0) is. Prime=false; if (is. Prime) cout << y << endl; } return 0; }

Problēmas risinājuma variants #include <iostream> using namespace std; int main() { Kods "is. Prime. Number" ar parametru sk int x; ------------------bool is. Prime; is. Prime=true; do { for (int i=2; i<sk; i++) cin >> x; if (sk%i==0) is. Prime=false; if (x<2) is. Prime=false; else izsaukt "is. Prime. Number" ar parametru x ielikt rezultātu iekš mainīgā is. Prime } while (!is. Prime); cout <<"Pirmskaitļi, kas mazāki par " << x << ": n"; for (int y=2; y<x; y++) { izsaukt "is. Prime. Number" ar parametru y ielikt rezultātu iekš mainīgā is. Prime if (is. Prime) cout << y << endl; } return 0; }

Problēmas risinājuma variants #include <iostream> using namespace std; Funkcija Kods "is. Prime. Number" ar parametru sk ------------------if (sk<2) is. Prime=false; else is. Prime=true; for (int i=2; i<sk; i++) if (sk%i==0) is. Prime=false; int main() { int x; bool is. Prime; do { cin >> x; izsaukt "is. Prime. Number" ar parametru x ielikt rezultātu iekš mainīgā is. Prime } while (!is. Prime); cout <<"Pirmskaitļi, kas mazāki par " << x << ": n"; for (int y=2; y<x; y++) { izsaukt "is. Prime. Number" ar parametru y ielikt rezultātu iekš mainīgā is. Prime if (is. Prime) cout << y << endl; } return 0; } Funkcijas izsaukumi

Problēmas risinājuma variants #include <iostream> using namespace std; Funkcija bool is. Prime. Number(int sk) { if (sk<2) return false; for (int i=2; i<sk; i++) if (sk%i==0) return false; return true; } int main() { int x; bool is. Prime; do { cin >> x; is. Prime=is. Prime. Number(x); } while (!is. Prime); cout <<"Pirmskaitļi, kas mazāki par " << x << ": n"; for (int y=2; y<x; y++) { is. Prime=is. Prime. Number(y); if (is. Prime) cout << y << endl; } return 0; Funkcijas } izsaukumi

Kas ir funkcija? n n Funkcija ir patstāvīgs programmas bloks, kas veic noteiktas darbības un atgriež noteikta tipa vērtību Katrā C++ programmā ir vismaz viena funkcija q n main Funkcija sastāv no q q nosaukuma atgriežamā datu tipa ķermeņa parametru saraksta

Funkcijas piemērs Atgriežamais datu tips – int Funkcijas nosaukums – main int main () { Parametru saraksts – tukšs (0 parametri iekavās) cout << "Hello!"; Funkcijas ķermenis (sastāv no 2 komandām) return 0; } Funkcijas atgrieztā vērtība – 0 (atbilst atgriežamajam datu tipam int)

Cits funkcijas piemērs Viens int tipa parametrs – sk bool is. Prime. Number(int sk) { if (sk<2) return false; for (int i=2; i<sk; i++) if (sk%i==0) return false; return true; }

Vēl cits funkcijas piemērs Divi int tipa parametri – a un b int sum (int a, int b) { int c=a+b; return c; } Funkcijas atgriežamā vērtība c – parametru a un b summa n Funkcija izsaucama, padodot kā parametrus divus veselus skaitļus q int x, y; cin >> x >> y; int z=sum(x, y); cout << z; q int x, y; cin >> x >> y; cout << sum(x, y);

Vērtību atgriešana n Funkcija var atgriezt tāda datu tipa vērtību, ar kādu šī funkcija definēta q q n parasts datu tips – int, double, char, bool, . . . speciālais datu tips – void Vērtības atgriešana notiek ar atgriešanas operatora `return` palīdzību q parastu datu tipu gadījumā n n q void gadījumā n n return 0; return c; return 'e'; return a+b; return a>3; return; Atgriešanas operators pārtrauc darbu ar funkciju

Netukša atgriešanas operatora piemērs n Atgriezt lielāko pāra skaitli, kas nepārsniedz doto skaitli x q int get. Even. Number(int x) { if (x%2==0) return x; else return x-1; }

Netukša atgriešanas operatora piemērs n Atgriezt lielāko pāra skaitli, kas nepārsniedz doto skaitli x q int get. Even. Number(int x) { if (x%2==0) return x; return x-1; }

Tukša atgriešanas operatora piemērs n Izdrukāt vienu zem otras divas vērtības – doto veselo skaitli x un tā apgriezto vērtību 1/x q void print. Numbers(int x) { if (x==0) return; cout << x << endl << 1. 0/x << endl; return; }

Tukša atgriešanas operatora piemērs n Izdrukāt vienu zem otras divas vērtības – doto veselo skaitli x un tā apgriezto vērtību 1/x q void print. Numbers(int x) { if (x==0) return; cout << x << endl << 1. 0/x << endl; }

Funkcijas izsaukšana n n n Funkcija tiek izsaukta, norādot tās vārdu un argumentus Argumentu skaitam un to datu tipiem jāsakrīt ar attiecīgās funkcijas parametru skaitu un to datu tipiem (pareizā secībā) Ja funkcija atgriež vērtību, to var izmantot kā parastu attiecīgā datu tipa vērtību

Funkcijas izsaukšanas piemērs int sum (int a, int b) { int c=a+b; return c; } int main () { int x, y; cin >> x >> y; int summa=sum(x, y); cout << summa << endl; return 0; }

Funkcijas izsaukšanas piemērs int sum (int a, int b) { return a+b; } int main () { int x, y; cin >> x >> y; cout << sum(x, y) << endl; return 0; }

Funkcijas izsaukšanas piemērs void print. Numbers(int x) { if (x==0) return; cout << x << endl << 1. 0/x << endl; } int main () { int x; cin >> x; print. Numbers(x); return 0; }

Parametri un argumenti n n Parametri – mainīgie, kas norādīti funkcijas deklarēšanas vietā Argumenti – mainīgie vai vērtības, kas padotas funkcijas izsaukšanas vietā Parametri – a un b n int sum (int a, int b) {return a+b; } int main () {int x, y; cin >>x >>y; cout << sum(x, y) << endl; return 0; } Argumenti – x un y

Uzdevums 2 n Lietotājs ievada divus veselus pozitīvus skaitļus. Noskaidrot, kuram no šiem skaitļiem ir vairāk dalītāju, izmantojot C++ funkciju, kas prot atrast dotā skaitļa dalītāju skaitu

Uzdevums 2 – risinājums int dal. Sk(int x) { int sk=0; for (int i=1; i<=x; i++) if (x%i==0) sk++; return sk; } int main() { int a, b; cin >> a >> b; int dal. A=dal. Sk(a), dal. B=dal. Sk(b); if (dal. A==dal. B) cout << "Abiem skaitļiem ir vienāds dalītāju skaitsn"; else { cout << "Vairāk dalītāju ir skaitlim "; if (dal. A>dal. B) cout << a << endl; else cout << b << endl; } return 0; }

Funkcijas Python

Python funkcijas sastāvdaļas n n Nosaukums Parametru saraksts q q n katram parametram tikai nosaukums var būt tukšs Ķermenis q komandu bloks

Python funkcijas piemērs def is. Prime. Number(sk): if sk<2: return False for i in range(2, sk): if sk%i==0: return False return True

Python funkcijas piemērs def is. Prime. Number(sk): if sk<2: return False for i in range(2, sk): if sk%i==0: return False return True bool is. Prime. Number(int sk) { if (sk<2) return false; C++ for (int i=2; i<sk; i++) if (sk%i==0) return false; return true; }

Cits Python funkcijas piemērs def sum (a, b): c=a+b return c n Funkcija izsaucama, padodot kā parametrus divus saskaitāmus lielumus q q q x=5 y=10 print(sum(x, y)) x=5. 5 y=10 print(sum(x, y)) x="abc" y="def" print(sum(x, y))

Uzdevums 3 n Uzrakstīt funkciju, kurai tiek padoti 2 veseli skaitļi a un b un kura atgriež visu veselo skaitļu intervālā no a līdz b summu, q n n realizēt šo funkciju gan C++, gan Python Risinājums C++ q int sum(int a, int b) { int sum=0; for (; a<=b; a++) sum+=a; return sum; } Risinājums Python q def sum(a, b): sum=0 for i in range(a, b+1): sum+=i return sum
- Slides: 44