C++ pamati - Latvijas Universitāte

Download Report

Transcript C++ pamati - Latvijas Universitāte

Programmēšana I
Praktiskie darbi
C++ pamati
Zarošanās
Doc. Dr. Sc. Comp. Edgars Rencis, Latvijas Universitāte, Datorikas fakultāte, 18. septembris, 2014.
C++ programmas struktūra

Viena vai vairākas funkcijas
 vienmēr tieši viena galvenā funkcija ar nosaukumu main


pēc KD1 parādīsies arī citas funkcijas
Komandas (instrukcijas, priekšraksti)
 algoritma secīgie soļi
 atrodas funkciju iekšienē
 atbilst tādiem blokshēmu elementiem kā deklarācija, komanda,
ievads, izvads, zarošanās
Direktīvas
 paziņojumi kompilatoriem, par tiem vēlāk...
Komentāri
 paskaidrojumi cilvēkam, atbilst blokshēmu komentāriem




ar šo funkciju tiek sākta izpilde (atbilst blokshēmas starta simbolam)
šīs funkcijas beigās izpilde tiek pārtraukta (atbilst blokshēmas beigu
simbolam)
Vienkārša programmiņa
#include <iostream>
using namespace std;
int main () { //Sākas programmas izpilde
cout << "Hello, world!" << endl;
return 0;
}
Vienkārša programmiņa
#include <iostream>
using namespace std;
funkcijas
 priekšraksti
 direktīvas
 komentāri

int main () { //Sākas programmas izpilde
cout << "Hello, world!" << endl;
return 0;
}
Tuvākie plāni – līdz KD1

Apgūt dažādas C++ komandas







Apgūt dažas C++ datu struktūras




primitīvie datu tipi
masīvi
simbolu virknes
Apgūt C++ izteiksmju un operatoru veidus




mainīgo deklarācijas komandas
piešķiršanas operators un komanda
datu ievades un izvades komandas
zarošanās komandas
ciklu komandas
vadības nodošanas komandas
aritmētiskās izteiksmes un operatori
salīdzināšanas operatori
loģiskās izteiksmes un operatori
Apgūt dažādas C++ programmēšanas viltības un saīsinātos pierakstus
Mainīgie C++

Mainīgais pirms lietošanas ir jādeklarē
 jāpaziņo, kāda datu tipa vērtības mainīgais drīkstēs pieņemt





deklarācijā jānorāda datu tipa vārds un mainīgā vārds (drīkst arī
uzreiz piešķirt mainīgajam sākuma vērtību)






int – veselo skaitļu datu tips (17, 3, -5, 0, ...)
double – reālo skaitļu datu tips (17.5, 3.0, 0.0, -5.78, ...)
char – simboliskais datu tips ('a', 'R', '\n', '\\', '5', ...)
bool – loģiskais datu tips (true, false)
int x;
double x,y;
int x=0,y,z=17;
char c,c1='B';
bool b=false;
Pirms mainīgā izmantošanas tam ir jābūt inicializētam
Mainīgā inicializēšana – vērtības iegūšana

Mainīgā vērtību var ievadīt lietotājs, izmantojot
ievades komandu cin



cin >> x;
cin >> x >> y;
Mainīgajam vērtību var piešķirt, izmantojot
piešķiršanas operatoru =





x =
y =
c =
b =
int
17;
5.78;
'A';
true;
x=5, y=8;
Piešķiršanas operators =

Jāatšķir divas lietas



=  piešķiršanas operators
x = 17;  piešķiršanas komanda
Piešķiršanas operatora semantika


kreisās puses mainīgajam tiek piešķirta labās puses vērtība
piešķiršanas komandai tiek piešķirta labās puses vērtība

sekas – piešķiršanas komandu var lietot kā labās puses vērtību citās piešķiršanas
komandās (un arī citur)



x=y=17;

vispirms mainīgajam y un komandai y=17 tiek piešķirta labās puses vērtība: 17

pēc tam tiek izpildīta otra piešķiršana, līdz ar kuru mainīgajam x tiek piešķirta
labās puses (y=17) vērtība: 17
int x=y=z=5;
Lietojot piešķiršanas operatoru, jāievēro tipu saderība



int x=5.5;  kļūda – veselo skaitļu mainīgajam nedrīkst piešķirt daļskaitli
double y=17;  reālo skaitļu mainīgajam atļauts piešķirt veselu skaitli
char c=true;  kļūda – pilnīga tipu nesaderība
Datu ievade un izvade

Ievade


cin >> x >> y;
Izvade



cout << x;
cout << "Sveiki!";
cout <<x<<" kvadrātā ir " <<y<< endl;


endl – pāreja uz jaunu rindu
cout << "Hello, world!\n";

"\n" – pāreja uz jaunu rindu
Aritmētiskie operatori un izteiksmes

Visi aritmētiskie operatori ir bināri – tiem nepieciešami divi operandi


Aritmētisku operatoru lietošanas rezultātā tiek iegūtas aritmētiskas
izteiksmes




+, -, *, /, %
5+7
x*y
(x+5)/7%(y*(y+1))
Svarīgi prast noteikt aritmētiskas izteiksmes datu tipu

ja abi operandi ir veseli skaitļi, rezultāts ir vesels skaitlis


int x=14, y=10;
cout << x/y;  izdrukās 1
ja kaut viens no operandiem ir daļskaitlis (konstante ar komatu vai double
tipa mainīgais), rezultāts ir reāls skaitlis

int x=14;
double y=10;
cout << x/y;  izdrukās 1.4
Tipu konvertēšana

Ko izvada šī programma?


int x,y;
cin >> x >> y;
Ja lietotājs ievada skaitļus
double dal = x/y; 17 un 5, tad izvadīs... skaitli 3
cout << dal;
Kā panākt, lai dalīšana notiktu "pa īstam"?

vajag likt kompilatoram uzskatīt kādu no dalīšanas
operācijas operandiem par reālu skaitli



double dal = (double)x/y;
double dal = x/(double)y;
double dal = (double)x/(double)y;
Saīsinātie piešķiršanas pieraksti

Jebkuram aritmētiskajam operatoram – vērtības izmainīšana par
jebkādu lielumu a
 x=x<op>a;
... jeb...
x<op>=a;




x=x+5;
y=y-1;
z=z*y;
... jeb...
... jeb...
... jeb...
x+=5;
y-=1;
z*=y;
Aritmētiskajiem operatoriem "+" un "-" – vērtības izmanīšana par 1
 x=x<op>1;
... jeb...
x<op><op>;



x=x+1;
y=y-1;
x=x<op>1;


x=x+1;
y=y-1;
... jeb...
... jeb...
x++;
y--;
... jeb...
<op><op>x;
... jeb...
... jeb...
++x;
--y;
"x++" un "++x" atšķirība

Atceroties 8. slaidu...
 piešķiršanas operatora semantika



"x++" un "++x" atšķirība ir darbību secībā
 x++





piešķiršanas komandai tiek piešķirta x vērtība
x vērtība tiek palielināta par 1
++x


kreisās puses mainīgajam tiek piešķirta labās puses vērtība
piešķiršanas komandai tiek piešķirta labās puses vērtība
x vērtība tiek palielināta par 1
piešķiršanas komandai tiek piešķirta x vērtība
Sekas
 x vērtība abos gadījumos tiek palielināta par 1
 izteiksmes (piešķiršanas komandas) iegūst dažādas vērtības
Tas pats attiecas uz saīsinātajiem pierakstiem "x--" un "--x"
"x++" un "++x" piemērs



y=x;
int x=17,y;
x++;
y=x++;
cout << x << " " << y;  18 17
int x=17,y;
++x;
y=x;
y=++x;
cout << x << " " << y;  18 18
int x=5;
cout << x;
++x;
cout << x;
cout << ++x;
cout << x;
cout << x++;
x++;
cout << x;
"x++" un "++x" piemērs



int x=17,y;
y=x++;
cout << x <<
int x=17,y;
y=++x;
cout << x <<
int x=5;
cout << x;
cout << ++x;
cout << x++;
cout << x;
y=x;
x++;
" " << y;
 18 17
++x;
y=x;
" " << y;
//5
//6
//6
//7
 18 18
++x;
cout << x;
cout << x;
x++;
Vienkāršs piemērs


Uzdevums
 Lietotājs ievada veselu skaitli. Izvadīt šī skaitļa kvadrātu.
Risinājums
 #include <iostream>
using namespace std;
int main() {
int x;
cout << "Ievadiet skaitli: ";
cin >> x;
int y=x*x;
cout << "Šī skaitļa kvadrāts ir " << y <<endl;
return 0;
}
Uzdevums 1

Lietotājs ievada 3 veselus skaitļus. Izvadīt šo skaitļu summu.

#include <iostream>
using namespace std;
int main() {
int x,y,z;
cout << "Ievadiet skaitļus: ";
cin >> x >> y >> z;
int sum = x+y+z;
cout << "Šo skaitļu summa ir " << sum <<endl;
return 0;
}
Salīdzināšanas operatori un loģiskās
izteiksmes

Visi salīdzināšanas operatori ir bināri – tiem
nepieciešami divi operandi


Salīdzināšanas operatoru lietošanas rezultātā tiek
iegūtas loģiskas izteiksmes




<, >, ==, !=, <=, >=
x>0
x+y == 0
(x>5) != (y<=z)
Loģiskas izteiksmes datu tips vienmēr ir bool

tātad loģisku izteiksmi varētu lietot zarošanās komandā...
Zarošanās komanda



Jautājums, uz kuru
var atbildēt ar "jā" vai
"nē"
if (<loģiska izteiksme>) {
...
Komandas, kas izpildāmas, ejot pa "+" zaru
(ja atbilde uz jautājumu ir "jā")
}
else
{
...
Komandas, kas izpildāmas, ejot pa "-" zaru
(ja atbilde uz jautājumu ir "nē")
}
“else” zars ir neobligāts
Figūriekavas blokam obligātas gadījumā, ja tas satur
vairāk par vienu komandu
Zarošanās piemērs
Loģiska izteiksme (iegūta, pielietojot
salīdzināšanas operatoru)


if (a<b) {
x=a;
}
else {
Tā kā ir tikai pa vienai komandai katrā no
x=b;
abiem blokiem, tad figūriekavas drīkst nelietot
}
if (a<b) x=a; else x=b;
Uzdevums 2


Lietotājs ievada 2 veselus skaitļus a un b. Izdrukāt dalījumu a/b.
#include <iostream>
using namespace std;
int main() {
int a,b;
cout << "Ievadiet skaitļus: ";
cin >> a >> b;
if (b==0)
cout << "Ar nulli dalīt nedrīkst!\n";
else {
double dal = (double)a/b;
cout << "Dalījums ir " << dal << endl;
}
return 0;
}
Loģiskie operatori

Loģiskie operatori ir divu veidu

bināri operatori



unāri operatori


&& – loģiskais AND
|| – loģiskais OR
! – loģiskais NOT
A
B
A && B
A || B
!A
true
true
true
true
false
true
false
false
true
false
false
true
false
true
true
false
false
false
false
true
Loģisko operatoru lietošanas rezultātā tiek iegūtas
loģiskas izteiksmes




b && b1
(x+y==0) || (z>0)
!b
!(x>5) && (y<=z || b)
Aritmētisko un loģisko izteiksmju saistība



Visur, kur atļautas loģiskas izteiksmes, atļautas arī aritmētiskas
izteiksmes, ievērojot šādu interpretāciju:
 0  false
 pārējie skaitļi  true
Tātad, ja x ir ar tipu int, tad
 if (x)  if (x != 0)
 if (x-5)  if (x-5 != 0)  if (x !=5)
 if (!x)  if (!(x != 0))  if (x == 0)
“if (x=0)” tiek interpretēts šādi
 x=0 (veicam piešķiršanas darbību)


if (x=0)  if (0)  if (false) – vienmēr aiziet pa “else” zaru
if (x==0) ≠ if (x=0) !!!


piešķirt mainīgajam x vērtību 0
piešķirt komandai “x=0” vērtību 0
Uzdevums 3


Lietotājs ievada trīs veselus skaitļus. Noskaidrot, vai eksistē trijstūris ar šādiem malu
garumiem.
#include <iostream>
using namespace std;
int main() {
int a,b,c;
cout << "Ievadiet skaitļus: ";
cin >> a >> b >> c;
if (a+b<=c)
cout << "Trijstūris NEEKSISTĒ!\n";
else
if (a+c<=b)
cout << "Trijstūris NEEKSISTĒ!\n";
else
if (b+c<=a)
cout << "Trijstūris NEEKSISTĒ!\n";
else
cout << "Trijstūris EKSISTĒ!\n";
return 0;
}
Uzdevums 3 – īsāks variants

#include <iostream>
using namespace std;
int main() {
int a,b,c;
cout << "Ievadiet skaitļus: ";
cin >> a >> b >> c;
if (a+b<=c || a+c<=b || b+c<=a)
cout << "Trijstūris NEEKSISTĒ!\n";
else
cout << "Trijstūris EKSISTĒ!\n";
return 0;
}
Uzdevums 3 – cits īsāks variants

#include <iostream>
using namespace std;
int main() {
int a,b,c;
cout << "Ievadiet skaitļus: ";
cin >> a >> b >> c;
if (!(a+b<=c || a+c<=b || b+c<=a))
cout << "Trijstūris EKSISTĒ!\n";
else
cout << "Trijstūris NEEKSISTĒ!\n";
return 0;
}
Uzdevums 3 – vēl cits īsāks variants

#include <iostream>
using namespace std;
int main() {
int a,b,c;
cout << "Ievadiet skaitļus: ";
cin >> a >> b >> c;
if (a+b>c && a+c>b && b+c>a)
cout << "Trijstūris EKSISTĒ!\n";
else
cout << "Trijstūris NEEKSISTĒ!\n";
return 0;
}
Uzdevums 4


Lietotājs ievada 2 naturālus skaitļus. Noskaidrot, vai šo skaitļu summas
pēdējais cipars ir pāra vai nepāra.
#include <iostream>
using namespace std;
int main() {
int a,b;
cout << "Ievadiet skaitļus: ";
cin >> a >> b;
if ((a+b)%2==0)
cout << "PĀRA\n";
else
cout << "NEPĀRA\n";
return 0;
}
Uzdevums 4


Lietotājs ievada 2 naturālus skaitļus. Noskaidrot, vai šo skaitļu summas
pēdējais cipars ir pāra vai nepāra.
#include <iostream>
using namespace std;
int main() {
int a,b;
cout << "Ievadiet skaitļus: ";
cin >> a >> b;
if ((a+b)%2==1)
cout << "NEPĀRA\n";
else
cout << "PĀRA\n";
return 0;
}
Uzdevums 4


Lietotājs ievada 2 naturālus skaitļus. Noskaidrot, vai šo skaitļu summas
pēdējais cipars ir pāra vai nepāra.
#include <iostream>
using namespace std;
int main() {
int a,b;
cout << "Ievadiet skaitļus: ";
cin >> a >> b;
if ((a+b)%2!=0)
cout << "NEPĀRA\n";
else
cout << "PĀRA\n";
return 0;
}
Uzdevums 4


Lietotājs ievada 2 naturālus skaitļus. Noskaidrot, vai šo skaitļu summas
pēdējais cipars ir pāra vai nepāra.
#include <iostream>
using namespace std;
int main() {
int a,b;
cout << "Ievadiet skaitļus: ";
cin >> a >> b;
if ((a+b)%2)
cout << "NEPĀRA\n";
else
cout << "PĀRA\n";
return 0;
}
Uzdevums 4


Lietotājs ievada 2 naturālus skaitļus. Noskaidrot, vai šo skaitļu summas
pēdējais cipars ir pāra vai nepāra.
#include <iostream>
using namespace std;
int main() {
int a,b;
cout << "Ievadiet skaitļus: ";
cin >> a >> b;
if (!((a+b)%2))
cout << "PĀRA\n";
else
cout << "NEPĀRA\n";
return 0;
}
Uzdevums 5

Lietotājs ievada 3 ciparus. Izdrukāt lielāko
skaitli, kādu iespējams sastādīt no šiem
cipariem, izmantojot katru ciparu tieši vienu
reizi.
Uzdevums 5 – risinājums 1

#include <iostream>
using namespace std;
int main() {
int a,b,c;
cout << "Ievadiet ciparus: ";
cin >> a >> b >> c;
if (a>b)
if (b>c)
cout << a << b << c;
else
if (a>c)
cout << a
else
cout << c
else
if (a>c)
cout << b << a << c;
else
if (b>c)
cout << b
else
cout << c
return 0;
}
<< c << b;
<< a << b;
<< c << a;
<< b << a;
Uzdevums 5 – risinājums 2

#include <iostream>
using namespace std;
int main() {
int a,b,c;
cout << "Ievadiet ciparus: ";
cin >> a >> b >> c;
if (a>=b && b>=c) cout << a << b << c;
else
if (a>=c && c>=b) cout << a << c << b;
else
if (b>=a && a>=c) cout << b << a << c;
else
if (b>=c && c>=a) cout << b << c << a;
else
if (c>=a && a>=b) cout << c << a << b;
else cout << c << b << a;
return 0;
}
Uzdevums 5 – risinājums 3

#include <iostream>
using namespace std;
int main() {
int a,b,c,x;
cout << "Ievadiet ciparus: ";
cin >> a >> b >> c;
if (a<b) {
x=a;
a=b;
b=x;
}
if (a<c) {
x=a;
a=c;
c=x;
}
if (b<c) {
x=b;
b=c;
c=x;
}
cout << a << b << c;
return 0;
}