Similar presentations:
Algoritmi un programmēšana Praktiskie darbi. Cikli. Funkcijas C++ un Python. Lekcija 4
1. Algoritmi un programmēšana Praktiskie darbi
CikliFunkcijas C++ un Python
Doc. Dr. Sc. Comp. Edgars Rencis, Latvijas Universitāte, Datorikas fakultāte, 27.-29. septembris, 2022.
2. KD1: 4.-6. oktobrī!
BlokshēmasProgrammēšana C++ un Python
pamata komandas
zarošanās komanda if
cikla komanda for
Funkcijas nebūs jāzina!
3. Cikli
4. Cikli
Iespēja izpildīt noteiktas darbības atkārtotiTrīs veidu cikli
ar skaitītāju – for
ar priekšnosacījumu – while
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
ja nav zināms, cik reizes cikls jāizpilda, bet ir zināms, ka tas jāizpilda vismaz
vienu reizi
5. Cikls ar priekšnosacījumu C++
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
6. while cikla piemērs C++
Izdrukāt vienā stabiņā ciparus no 0 līdz 9int i=0;
while (i<10) {
cout << i << endl;
i++;
}
int i=0;
while (i<10) cout << i++ << endl;
7. Cikls ar priekšnosacījumu Python
while<loģiska izteiksme>:
...
Izdrukāt vienā stabiņā ciparus no 0 līdz 9
x=0
while x<10:
print(x)
x+=1
8. Cikls ar pēcnosacījumu C++
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!
9. do... while cikla piemērs C++
Izdrukāt vienā stabiņā ciparus no 0 līdz 9int i=0;
do {
cout << i << endl;
i++;
} while (i<10);
int i=0;
do cout <<i++<<endl; while (i<10);
10. Vadības nodošanas komandas
Komandu izpildes secībapamatā 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
break
continue
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
nodod vadību citai patvaļīgai komandai (nav ieteicams izmantot, jo padara kodu
nelasāmu)
11. break un continue
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
12. Uzdevums 1
Lietotājs ievada naturālu skaitli. Noskaidrot, vai tas ir pirmskaitlis, uzrakstotprogrammu valodā C++.
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;
}
13. Uzdevums 1 – alternatīvs risinājums
#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;
}
14. Funkcijas C++
15. Problēma
UzdevumsLietotā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
pirmais cikls – likt lietotājam vadīt skaitļus
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
katram skaitlim pārbaudīt, vai tas nav pirmskaitlis un izdrukāt tos, kas ir
16. Problēma
UzdevumsLietotā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
pirmais cikls – likt lietotājam vadīt skaitļus
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
katram skaitlim pārbaudīt, vai tas nav pirmskaitlis un izdrukāt tos, kas ir
17. Problēmas risinājuma variants
#include <iostream>using namespace std;
int main() {
int x;
bool isPrime;
do {
cin >> x;
if (x<2) isPrime=false;
else
isPrime=true;
for (int i=2;i<x;i++)
if (x%i==0) isPrime=false;
} while (!isPrime);
cout <<"Pirmskaitļi, kas mazāki par " << x << ":\n";
for (int y=2;y<x;y++) {
isPrime=true;
for (int i=2;i<y;i++)
if (y%i==0) isPrime=false;
if (isPrime) cout << y << endl;
}
return 0;
}
18. Problēmas risinājuma variants
#include <iostream>using namespace std;
int main() {
int x;
bool isPrime;
do {
cin >> x;
if (x<2) isPrime=false;
else
isPrime=true;
for (int i=2;i<x;i++)
if (x%i==0) isPrime=false;
} while (!isPrime);
cout <<"Pirmskaitļi, kas mazāki par " << x << ":\n";
for (int y=2;y<x;y++) {
isPrime=true;
for (int i=2;i<y;i++)
if (y%i==0) isPrime=false;
if (isPrime) cout << y << endl;
}
return 0;
}
Koda dublēšana –
ļoti slikta lieta
19. Problēmas risinājuma variants
#include <iostream>using namespace std;
int main() {
int x;
bool isPrime;
do {
cin >> x;
if (x<2) isPrime=false;
else
isPrime=true;
for (int i=2;i<x;i++)
if (x%i==0) isPrime=false;
} while (!isPrime);
cout <<"Pirmskaitļi, kas mazāki par " << x << ":\n";
for (int y=2;y<x;y++) {
isPrime=true;
for (int i=2;i<y;i++)
if (y%i==0) isPrime=false;
if (isPrime) cout << y << endl;
}
return 0;
}
Kods "isPrimeNumber" ar parametru sk
-----------------------------------isPrime=true;
for (int i=2;i<sk;i++)
if (sk%i==0) isPrime=false;
20. Problēmas risinājuma variants
#include <iostream>using namespace std;
int main() {
Kods "isPrimeNumber" ar parametru sk
int x;
-----------------------------------bool isPrime;
isPrime=true;
do {
for (int i=2;i<sk;i++)
cin >> x;
if (sk%i==0) isPrime=false;
if (x<2) isPrime=false;
else
izsaukt "isPrimeNumber" ar parametru x
ielikt rezultātu iekš mainīgā isPrime
} while (!isPrime);
cout <<"Pirmskaitļi, kas mazāki par " << x << ":\n";
for (int y=2;y<x;y++) {
izsaukt "isPrimeNumber" ar parametru y
ielikt rezultātu iekš mainīgā isPrime
if (isPrime) cout << y << endl;
}
return 0;
}
21. Problēmas risinājuma variants
#include <iostream>using namespace std;
Funkcija
Kods "isPrimeNumber" ar parametru sk
-----------------------------------if (sk<2) isPrime=false;
else isPrime=true;
for (int i=2;i<sk;i++)
if (sk%i==0) isPrime=false;
int main() {
int x;
bool isPrime;
do {
cin >> x;
izsaukt "isPrimeNumber" ar parametru x
ielikt rezultātu iekš mainīgā isPrime
} while (!isPrime);
cout <<"Pirmskaitļi, kas mazāki par " << x << ":\n";
for (int y=2;y<x;y++) {
izsaukt "isPrimeNumber" ar parametru y
ielikt rezultātu iekš mainīgā isPrime
if (isPrime) cout << y << endl;
}
return 0;
}
Funkcijas izsaukumi
22. Problēmas risinājuma variants
#include <iostream>using namespace std;
Funkcija
bool isPrimeNumber(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 isPrime;
do {
cin >> x;
isPrime=isPrimeNumber(x);
} while (!isPrime);
cout <<"Pirmskaitļi, kas mazāki par " << x << ":\n";
for (int y=2;y<x;y++) {
isPrime=isPrimeNumber(y);
if (isPrime) cout << y << endl;
}
return 0;
Funkcijas izsaukumi
}
23. Kas ir funkcija?
Funkcija ir patstāvīgs programmas bloks, kas veic noteiktasdarbības un atgriež noteikta tipa vērtību
Katrā C++ programmā ir vismaz viena funkcija
main
Funkcija sastāv no
nosaukuma
atgriežamā datu tipa
ķermeņa
parametru saraksta
24. Funkcijas piemērs
Atgriežamais datu tips – intFunkcijas 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)
25. Cits funkcijas piemērs
Viens int tipa parametrs – skbool isPrimeNumber(int sk) {
if (sk<2) return false;
for (int i=2;i<sk;i++)
if (sk%i==0) return false;
return true;
}
26. Vēl cits funkcijas piemērs
Divi int tipa parametri – a un bint sum (int a, int b) {
int c=a+b;
return c;
}
Funkcijas atgriežamā vērtība c – parametru a un b summa
Funkcija izsaucama, padodot kā parametrus divus veselus
skaitļus
int x,y;
cin >> x >> y;
int z=sum(x,y);
cout << z;
int x,y;
cin >> x >> y;
cout << sum(x,y);
27. Vērtību atgriešana
Funkcija var atgriezt tāda datu tipa vērtību, ar kādu šī funkcija definētaparasts 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
parastu datu tipu gadījumā
return 0; return c; return 'e';
return a+b; return a>3;
void gadījumā
return;
Atgriešanas operators pārtrauc darbu ar funkciju
28. Netukša atgriešanas operatora piemērs
Atgriezt lielāko pāra skaitli, kas nepārsniedz doto skaitli xint getEvenNumber(int x) {
if (x%2==0) return x;
else return x-1;
}
29. Netukša atgriešanas operatora piemērs
Atgriezt lielāko pāra skaitli, kas nepārsniedz doto skaitli xint getEvenNumber(int x) {
if (x%2==0) return x;
return x-1;
}
30. Tukša atgriešanas operatora piemērs
Izdrukāt vienu zem otras divas vērtības – doto veselo skaitli xun tā apgriezto vērtību 1/x
void printNumbers(int x) {
if (x==0) return;
cout << x << endl << 1.0/x << endl;
return;
}
31. Tukša atgriešanas operatora piemērs
Izdrukāt vienu zem otras divas vērtības – doto veselo skaitli xun tā apgriezto vērtību 1/x
void printNumbers(int x) {
if (x==0) return;
cout << x << endl << 1.0/x << endl;
}
32. Funkcijas izsaukšana
Funkcija tiek izsaukta, norādot tās vārdu un argumentusArgumentu 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
33. 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;
}
34. 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;
}
35. Funkcijas izsaukšanas piemērs
void printNumbers(int x) {if (x==0) return;
cout << x << endl << 1.0/x << endl;
}
int main () {
int x; cin >> x;
printNumbers(x);
return 0;
}
36. Parametri un argumenti
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
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
37. Uzdevums 2
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
38. Uzdevums 2 – risinājums
int dalSk(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 dalA=dalSk(a),dalB=dalSk(b);
if (dalA==dalB) cout << "Abiem skaitļiem ir vienāds dalītāju skaits\n";
else {
cout << "Vairāk dalītāju ir skaitlim ";
if (dalA>dalB) cout << a << endl; else cout << b << endl;
}
return 0;
}
39. Funkcijas Python
40. Python funkcijas sastāvdaļas
NosaukumsParametru saraksts
katram parametram tikai nosaukums
var būt tukšs
Ķermenis
komandu bloks
41. Python funkcijas piemērs
def isPrimeNumber(sk):if sk<2: return False
for i in range(2,sk):
if sk%i==0: return False
return True
42. Python funkcijas piemērs
def isPrimeNumber(sk):if sk<2: return False
for i in range(2,sk):
if sk%i==0: return False
bool isPrimeNumber(int sk) {
return True
if (sk<2) return false;
C++
for (int i=2;i<sk;i++)
if (sk%i==0) return false;
return true;
}
43. Cits Python funkcijas piemērs
def sum (a, b):c=a+b
return c
Funkcija izsaucama, padodot kā parametrus divus saskaitāmus
lielumus
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))