I-OJI PASKAITA: Pradinės pastabos
C programavimo kalbos ypatybės
. &nbs 525j91f p; &nbs 525j91f p; Gerai isvystyta auksto lygio programavimo kalba.
. &nbs 525j91f p; &nbs 525j91f p; Dauguma (vos ne visos) komercinės programos parasytos būtent C arba C++ kalba. De facto tai pramoninių programų rasymo standartas
. &nbs 525j91f p; &nbs 525j91f p; Kada atsirado C kalba? 1969 metais isleista C kalbos pirma versija. Sukurta kaip sudėtinė UNIX operacinės sistemos dalis. Vėlesnės UNIX versijos parasytos C kalba
. &nbs 525j91f p; &nbs 525j91f p; Kodėl pavadinta C? Buvo dvi ankstesnės versijos - A ir B, bet jos buvo nevykusios. Is trečio karto pasisekė sukurti pasisekusią programavimo kalbą. Todėl ir pavadinimas C.
. &nbs 525j91f p; &nbs 525j91f p; C - tai nepriklausoma nuo masinos tipo procedūrinė programavimo kalba
. &nbs 525j91f p; &nbs 525j91f p; Koks skirtumas tarp C ir C++? C++ - tai objektinis procedūrinės programavimo kalbos C poaibis
. &nbs 525j91f p; &nbs 525j91f p; Kokias programas galima parasyti naudojant C/C++?
1.2. Programavimo kalbų klasifikacija
. &nbs 525j91f p; &nbs 525j91f p; Kas yra kalba ? Ar pvz. matematika kalba ?
. &nbs 525j91f p; &nbs 525j91f p; Kokios kalbos yra natūralios ir kokios dirbtinės ?
. &nbs 525j91f p; &nbs 525j91f p; Kodėl programos nerasomos natūralia kalba ? Kas nulėmė tokią programavimo kalbų struktūrą kokia yra dabar ?
. &nbs 525j91f p; &nbs 525j91f p; Zemo lygio programavimo kalbos:
. &nbs 525j91f p; &nbs 525j91f p; masininiai kodai
. &nbs 525j91f p; &nbs 525j91f p; - asembleriai (ypatybės ?)
. &nbs 525j91f p; &nbs 525j91f p; Auksto lygio programavimo kalbos:
. &nbs 525j91f p; &nbs 525j91f p; -procedūrinės: Fortran, Pascal, C
. &nbs 525j91f p; &nbs 525j91f p; -interpretatoriai: Basic
. &nbs 525j91f p; &nbs 525j91f p; objektinės: C++, Java, Delphi (ypatybės ?)
Programavimo priemonių rinkinys
. &nbs 525j91f p; &nbs 525j91f p; Ką reikia turėti norint parasyti veikiančią programą ?
Trys pagrindiniai komponentai:
Ø &nbs 525j91f p; Redaktorius - tam, kad parasyti programos iseities kodą. Tinka bet koks redaktorius (pvz. Microsoft Word), bet dazniausiai naudojami specializuoti
Ø &nbs 525j91f p; Kompiliatorius - tam, kad parasytą programos kodą paversti į masininius kodus, taip vadinamą objektinį modulį
Ø &nbs 525j91f p; Linkeris - kad prie objektinio modulio prijungti kitus objektinius modulius, bibliotekose surinktą kodą ir gauti vykdomąją programą.
. &nbs 525j91f p; &nbs 525j91f p; Siuolaikinėse sistemose dazniausiai naudojamos integruotos sistemos, apjungiančios visus tris komponentus
. &nbs 525j91f p; &nbs 525j91f p; Vis dazniau naudojamas vizualinis programavimas. Tačiau sunkiausią dalį programuotojas vis tiek turi padaryti pats
1.4. C kalbos programavimo priemonės
Yra sukurta daug programavimo priemonių rasyti programas C kalba:
Ø &nbs 525j91f p; Nemokamos: gcc kompiliatorius, Mars C, lcc ir t.t.
Ø &nbs 525j91f p; Komercinės: Microsoft C, Borland C, Symantec C ir t.t.
Ø &nbs 525j91f p; Įprastinės: Turbo C, Borland C, Symantec C
Ø &nbs 525j91f p; Vizualinio programavimo: Microsoft Visual C, Borland C Builder
. &nbs 525j91f p; &nbs 525j91f p; Kurios geriausios ? Tos, prie kurių labiausiai esi pripratęs ir gali greičiausiai pasiekti reikiamą tikslą.
1.5. Programos leksika ir sintaksė
. &nbs 525j91f p; &nbs 525j91f p; Programą, parasytą C kalba, sudaro vienas arba keli failai
. &nbs 525j91f p; &nbs 525j91f p; Kiekvieną failą sudaro funkcijų ir kintamųjų bei veiksmų su jais aprasymas
. &nbs 525j91f p; &nbs 525j91f p; Leksiskai programa susideda is bazinių arba raktinių zodzių (angl. keywords) specialių zenklų, identifikatorių, konstantų ir komentarų
. &nbs 525j91f p; &nbs 525j91f p; C kalboje naudojamos tiek didziosios, tiek mazosios raidės, tačiau yra priimta eilė neoficialių susitarimų, kurių pravartu laikytis
1.6. Kintamieji ir konstantos
. &nbs 525j91f p; &nbs 525j91f p; Duomenys, kuriuos apdoroja kompiuteris - tai konstantos ir kintamieji
. &nbs 525j91f p; &nbs 525j91f p; C kalboje visi kintamieji turi būti aiskiai aprasyti
. &nbs 525j91f p; &nbs 525j91f p; Kintamojo aprasymas - tai jo tipo specifikavimas, kintamojo vardo uzdavimas, eilė neprivalomų modifikatorių, kurie apibrėzia vidines kintamojo vaizdavimo ypatybes arba jo saugojimo klasę.
. &nbs 525j91f p; &nbs 525j91f p; Aprasant kintamąjį galima nurodyti jo pradinę reiksmę
. &nbs 525j91f p; &nbs 525j91f p; Identifikatorius - tai seka raidzių arba skaičių, kurie prasideda raide arba pabraukimo zenklu _
. &nbs 525j91f p; &nbs 525j91f p; Kintamojo vardas - tai identifikatorius . Vardas gali būti bet kokio ilgio, bet tik pirmi 32 simboliai bus reiksminiai
1.7. Kintamųjų tipai
. &nbs 525j91f p; &nbs 525j91f p; Tipas - bet kuriai programavimo kalbai fundamentali sąvoka
. &nbs 525j91f p; &nbs 525j91f p; C kalboje skiriami 4 kategorijų tipai
. &nbs 525j91f p; &nbs 525j91f p; Tusčias tipas (void)
. &nbs 525j91f p; &nbs 525j91f p; Skaliarinis tipas:
- &nbs 525j91f p; &nbs 525j91f p; &nbs 525j91f p; &nbs 525j91f p; aritmetiniai tipai
- &nbs 525j91f p; &nbs 525j91f p; &nbs 525j91f p; &nbs 525j91f p; isvardijimai (enumerations)
- &nbs 525j91f p; &nbs 525j91f p; &nbs 525j91f p; &nbs 525j91f p; rodikliai (pointers)
- &nbs 525j91f p; &nbs 525j91f p; &nbs 525j91f p; &nbs 525j91f p; nuorodos (references)
. &nbs 525j91f p; &nbs 525j91f p; Tipas funkcija
. &nbs 525j91f p; &nbs 525j91f p; Agreguotas tipas:
- &nbs 525j91f p; &nbs 525j91f p; &nbs 525j91f p; &nbs 525j91f p; masyvai (arrays)
- &nbs 525j91f p; &nbs 525j91f p; &nbs 525j91f p; &nbs 525j91f p; struktūros ir sąjungos
- &nbs 525j91f p; &nbs 525j91f p; &nbs 525j91f p; &nbs 525j91f p; klasės (tik C++ poaibyje)
. &nbs 525j91f p; &nbs 525j91f p; Kitaip kintamieji gali būti skirstomi į :
- &nbs 525j91f p; &nbs 525j91f p; pagrindinius
- &nbs 525j91f p; &nbs 525j91f p; isvestinius
. &nbs 525j91f p; &nbs 525j91f p; Pagrindiniai tipai C kalboje yra:
void char int float double
ir jų variantai su raktiniais zodziais
short long signed unsigned
. &nbs 525j91f p; &nbs 525j91f p; Isvestiniai tipai:
- &nbs 525j91f p; &nbs 525j91f p; rodikliai ir nuorodos į kitus duomenų tipus
- &nbs 525j91f p; &nbs 525j91f p; funkcijos
- &nbs 525j91f p; &nbs 525j91f p; struktūros ir sąjungos
- &nbs 525j91f p; &nbs 525j91f p; klasės
Duomenų tipas int
. &nbs 525j91f p; &nbs 525j91f p; C kalboje duomenų tipas int (integer, integral ?) savyje apjungia duomenų tipus char, short, long
. &nbs 525j91f p; &nbs 525j91f p; Pats duomenų tipas int yra bazinis ir priklauso nuo operacinės sistemos skiltiskumo: jo dydis lygus operacinės sistemos adresavimo skiltiskumui (16 bitų Win16, 32 bitai Win32, ateityje 64 bitai ?)
. &nbs 525j91f p; &nbs 525j91f p;
bitai |
min |
max |
|
char | |||
unsigned char | |||
short int | |||
int | |||
unsigned int | |||
long | |||
unsigned long |
Sveiko tipo konstantos
. &nbs 525j91f p; &nbs 525j91f p; Sveiko tipo (int) konstantos gali būti uzrasomos desimtaine, astuntaine arba sesioliktaine sistema:
. &nbs 525j91f p; &nbs 525j91f p; &nbs 525j91f p; &nbs 525j91f p;
. &nbs 525j91f p; &nbs 525j91f p; &nbs 525j91f p; &nbs 525j91f p;
. &nbs 525j91f p; &nbs 525j91f p; &nbs 525j91f p; &nbs 525j91f p; 0x15,0x5,0x65,0x156,0x25af
. &nbs 525j91f p; &nbs 525j91f p; Desimtainės konstantos paprastoje formoje suprantamos kaip short int kintamieji.
. &nbs 525j91f p; &nbs 525j91f p; Jeigu reikia uzrasyti didesnius kintamuosius, reikia naudoti tipo modifikatorius U(u) - unsigned arba L(l) - long
. &nbs 525j91f p; &nbs 525j91f p; Pvz.: negalima rasyti 40156 , 1256789, -35674 ir t.t.
. &nbs 525j91f p; &nbs 525j91f p; Reikia rasyti 40156u, 1256789l, -35674l ir t.t.
. &nbs 525j91f p; &nbs 525j91f p; Galima naudoti tiek U ir L, tiek u ir l
1.10. Slankaus kablelio konstantos
. &nbs 525j91f p; &nbs 525j91f p; Sveikais tipais negalima aprasyti trupmeninių skaičių: reikia naudoti slankaus kablelio tipus
. &nbs 525j91f p; &nbs 525j91f p; C kalboje naudojami trys slankaus kablelio duomenų tipai: float, double, long double
bitai |
min |
max |
tikslumas |
|
float | ||||
double | ||||
long double |
1.11. Kintamųjų aprasymo pavyzdziai
Keli kintamųjų aprasymo pavyzdziai:
. &nbs 525j91f p; &nbs 525j91f p; int i;
. &nbs 525j91f p; &nbs 525j91f p; signed short a; unsigned short k;
. &nbs 525j91f p; &nbs 525j91f p; short a, b , abcd=0xabcd;
. &nbs 525j91f p; &nbs 525j91f p; unsigned char b1=156;
. &nbs 525j91f p; &nbs 525j91f p; float bb, c=0.0,z=1.e-5;
. &nbs 525j91f p; &nbs 525j91f p; double pi=3.1415928;
. &nbs 525j91f p; &nbs 525j91f p; long double c1; double _z1erw=123.4561;
1.12. Pri jimo modifikatoriai const ir volatile
. &nbs 525j91f p; &nbs 525j91f p; Neprivalomi modifikatoriai padeda apibrėzti kintamuosius, kurie programos vykdymo metu gali arba negali pakeisti savo reiksmes
. &nbs 525j91f p; &nbs 525j91f p; const - negali
. &nbs 525j91f p; &nbs 525j91f p; volatile - gali (naudojamas pagal nutylėjimą)
. &nbs 525j91f p; &nbs 525j91f p;
. &nbs 525j91f p; Pvz: const int max_const
. &nbs 525j91f p; &nbs 525j91f p; Naudojama, kuomet norima apsidrausti, kad programos vykdymo metu netyčia nebūtų pakeista reikalinga kintamojo reiksmė
1.13. Komentarai
. &nbs 525j91f p; &nbs 525j91f p; C/ C++ kalboje komentarus galima įterpti dviem būdais:
1) /* ..... */ - komentarai rasomi tarp sleso ir zvaigzdės ir zvaigzdės ir sleso. Komentarų kiekis neribojamas
2) &nbs 525j91f p; po dviejų slesų visa eilutė iki galo traktuojama kaip komentarai
Pvz. /* as čia dabar rasau komentarus
kiek noriu tiek rasau. ir čia komentaras int a/c;
dabar baigiu */
int a; // o dabar komentarai , int a - čia irgi komentaras
1.14. Gero stiliaus reikalavimai
Naudoti prasmingus pavadinimus globaliniams kintamiesiems ir trumpus pavadinimus - lokaliniams
Patartina globalinių kintamųjų aprasymus paydėti trumpu komentaru
. &nbs 525j91f p; Pvz: int npending=0; // ivedimo srauto einamas ilgis
. &nbs 525j91f p; Pvz: numberOfPoints - globalinis kintamasis
. &nbs 525j91f p; nPoints - tiek globalinis, tiek lokalinis
. &nbs 525j91f p; n -lokalinis kintamasis
Egzistuoja daug susitarimų ir vietinių tradicijų kaip reikėtų parinkti pavadinimus kintamiesiems įvairiose sistemose ir uzdaviniuose
1.15. Operacijos ir israiskos
Israiska - tai seka operandų, operacijų ir skiriamųjų zenklų.
Skiriamieji simboliai: [ ] , ; : ... * = #
Israiskas kompiliatorius interpretuoja grieztai besilaikydamas vyresniskumo taisyklių
Vyresniskumo taisyklės kaip matematikoje priimtos
1.16. Pagrindinės operacijos: aritmetinės operacijos
Tipinės operacijos:
. &nbs 525j91f p; Sumavimo operacija +
. &nbs 525j91f p; Atėmimo operacija -
. &nbs 525j91f p; Daugybos operacija *
. &nbs 525j91f p; Dalybos operacija /
C kalbos specifinės operacijos:
. &nbs 525j91f p; Liekanos nustatymo operacija
. &nbs 525j91f p; Inkremento operacija ++
. &nbs 525j91f p; Dekremento operacija --
1.17. Pagrindin s operacijos: poskiltinės loginės operacijos
. &nbs 525j91f p; Vadinamos poskiltinėmis todėl, kad loginiai veiksmai atliekami su kiekviena kintamojo arba konstantos skiltimi atskirai
. &nbs 525j91f p; Yra keturios:
. &nbs 525j91f p; & - loginis IR (AND operacija)
. &nbs 525j91f p; - poskiltinis sumavimas moduliu 2 (XOR operacija)
. &nbs 525j91f p; - loginis ARBA (OR operacija)
. &nbs 525j91f p; poskiltinė inversija
1 operandas |
2 operandas |
AND |
OR |
XOR |
1.18. Pagrindinės operacijos: postūmio operacijos
. &nbs 525j91f p; Poskiltinio postūmio operacijos:
>> - postūmis desinėn
<< - postūmis kairėn
Pvz: half = addr>>1;
double = addr<<1;
Pvz: 5 - > 101 <<1 -> 1010 -> 10
12 -> 1100>>1 -> 110 -> 6
3 -> 11 <<3 -> 11000 -> 24
Priskyrimo operacija =. Pvz. a=b;
Pagrindinės operacijos: loginės operacijos ir santykio operacijos
Santykio operacijos:
. &nbs 525j91f p; > - daugiau
. &nbs 525j91f p; < - maziau
. &nbs 525j91f p; - tapačiai lygu
. &nbs 525j91f p; >= - daugiau arba lygu
. &nbs 525j91f p; <= - maziau arba lygu
. &nbs 525j91f p; - nelygu
. &nbs 525j91f p; Teisinga, jei operandas is kairės tenkina sąlygą
Loginės operacijos:
. &nbs 525j91f p; && - loginis IR
. &nbs 525j91f p; - loginis ARBA
. &nbs 525j91f p; - loginis NE
. &nbs 525j91f p; Sios operacijos naudojamos sudarant logines israiskas, turinčias tik dvi reiksmes: 1, jei israiska teisinga ir 0, jei israiska neteisinga
1.20. Sąlygos operacija ? :
. &nbs 525j91f p; &nbs 525j91f p; Sąlygos operacija ? : apibrėziama kaip:
cond ? TRUE_statement : FALSE_statement
. &nbs 525j91f p; &nbs 525j91f p; Pvz:
int a=4, b=3;
int i;
i=a>b ? a: b;
1.21. Duomenų tipų nurodymo operacija (kastingavimas)
. &nbs 525j91f p; &nbs 525j91f p; C kalboje duomenų tipus (operandų tipus) galima nurodyti aiskiai
. &nbs 525j91f p; &nbs 525j91f p; Toje operacijoje kintamasis bus traktuojamas kaip nurodyta privedimo operacijoje
. &nbs 525j91f p; &nbs 525j91f p; C++ operuojant su skirtingo tipo operandais duomenų tipus būtina kastinguoti
. &nbs 525j91f p; &nbs 525j91f p; Kintamasis įgis nurodytą tipą tik duotoje operacijoje;
pvz.: int a=8,b=5;
float var1,var2;
var1=a/b; // var1=1.0;
var2=(float)a/b; // var2=1.6;
var2=(float)a/(float)b; // var2=1.6;
Mnimali programa C kalba
. &nbs 525j91f p; int main()
. &nbs 525j91f p; int main()
. &nbs 525j91f p; int main(
Pastabos: failo pavadinimas baigiasi plėtiniu .c arba .cpp
Tarpus kompiliatorius ignoruoja
Orientuotas į leksemas, o ne pozicijas faile
1.23. Pirmos programos pavyzdys
#include <stdio.h>
int main()
Rezultatas: Hello world !!! count=1
2. II-OJI PASKAITA
Bazinio įvedimo/ isvedimo metodai
. &nbs 525j91f p; &nbs 525j91f p; Skirtingi metodai naudojami konsoliniame įvedime/isvedime ir programose su langais
. &nbs 525j91f p; &nbs 525j91f p; Čia kalbame apie konsolinį I/O
. &nbs 525j91f p; &nbs 525j91f p; C++ turi savus operatorius, C specialių operatorių neturi
. &nbs 525j91f p; &nbs 525j91f p; Naudojamos bibliotekinės funkcijos
. &nbs 525j91f p; &nbs 525j91f p; Kas yra biblioteka, kas yra funkcija ?
. &nbs 525j91f p; &nbs 525j91f p; Standartinė įvedimo / isvedimo biblioteka:
. &nbs 525j91f p; &nbs 525j91f p; #include <stdio.h>
. &nbs 525j91f p; &nbs 525j91f p; Konsolinio įvedimo / isvedimo biblioteka
. &nbs 525j91f p; &nbs 525j91f p; # include <conio.h>
2.2. Formatuotas isvedimas
. &nbs 525j91f p; Pavadinimas printf()
. &nbs 525j91f p; Sinopsė
. &nbs 525j91f p; #include <stdio.h>
. &nbs 525j91f p; int printf(const format[,arg].)
. &nbs 525j91f p; Aprasymas: į standartinį isvedimo įrenginį (koks įrenginys yra standartinis ?) isveda nurodytą duomenų srautą, sutinkamai su nurodytu formatu format: tai gali būti literaliniai simboliai ir transformavimo specifikatoriai:
. &nbs 525j91f p; %d - desimtainis sveikas skaičius
. &nbs 525j91f p; %f - slankaus kablelio skaičius
. &nbs 525j91f p; %o - astuntainis skaičius be zenklo
. &nbs 525j91f p; %x - sesioliktainis skaičius be zenklo
Formatuotas isvedimas
. &nbs 525j91f p; Pavadinimas printf()
. &nbs 525j91f p; Sinopsė
. &nbs 525j91f p; #include <stdio.h>
. &nbs 525j91f p; int printf(const format[,arg].)
. &nbs 525j91f p; Aprasymas: į standartinį isvedimo įrenginį (koks įrenginys yra standartinis ?) isveda nurodytą duomenų srautą, sutinkamai su nurodytu formatu format: tai gali būti literaliniai simboliai ir transformavimo specifikatoriai:
%d - desimtainis sveikas skaičius
%f - slankaus kablelio skaičius
%o - astuntainis skaičius be zenklo
%x - sesioliktainis skaičius be zenklo
Pavyzdziai:
. &nbs 525j91f p; printf("iveskite varda:");
. &nbs 525j91f p; printf("turimas akciju skaicius %d\n",num);
. &nbs 525j91f p; printf("\n sio menesio %2d diena nupirkta %3d akciju\n",diena, num);
. &nbs 525j91f p; printf("vieneto kaina %f", kaina);
. &nbs 525j91f p; printf("vieneto kaina %4.2f bendra kaina %6.2f\n",kaina, total);
. &nbs 525j91f p; printf("vienetu skaicius %d vieneto kaina %4.2d bendra kaina %6.2f\n",kiekis, kaina, total);
. &nbs 525j91f p; printf(" | vienetu skaicius %d vieneto kaina %4.2d bendra kaina %6.2f | \n",kiekis, kaina, total);
2.4. Konsolinis įvedimas
. &nbs 525j91f p; Pavadinimas scanf()
. &nbs 525j91f p; Sinopsė
. &nbs 525j91f p; #include <stdio.h>
. &nbs 525j91f p; int scanf(const format[,arg].)
. &nbs 525j91f p; Aprasymas: is standartinio įvedimo įrenginio (koks įrenginys yra standartinis ?) nuskaito nurodytą duomenų srautą, sutinkamai su nurodytu formatu format:
. &nbs 525j91f p; %d - desimtainis sveikas skaičius
. &nbs 525j91f p; %f - slankaus kablelio skaičius
. &nbs 525j91f p; %o - astuntainis skaičius be zenklo
. &nbs 525j91f p; %x - sesioliktainis skaičius be zenklo
. &nbs 525j91f p; %c - simbolis
. &nbs 525j91f p; scanf(" d", &num
. &nbs 525j91f p; scanf %f",&price);
. &nbs 525j91f p; scanf("%d %d",&diena, &num);
. &nbs 525j91f p; scanf("%4.2f %6.2f",&kaina, &total);
. &nbs 525j91f p; scanf("%d %f %f",&kiekis, &kaina, &total);
. &nbs 525j91f p; scanf("%c",&raide);
. &nbs 525j91f p; scanf("%d",a[i]);
. &nbs 525j91f p; scanf("%s" pavadin);
2.5. Simbolinis įvedimas/ isvedimas
. &nbs 525j91f p; Pavadinimas: getchar įvedimo funkcija
. &nbs 525j91f p; Sinopsė:
. &nbs 525j91f p; include <stdio.h>
. &nbs 525j91f p; int getchar(void)
Aprasymas: nuskaito ir grazina eilinį simbolį is standartinio nuskaitymo įrenginio
Diagnostika: grazina EOF simbolį, jeigu pasiektas failo galas arba klaidos simbolį, įvykus įvedimo klaidai. Visais kitais atvejais grazina nuskaitytą simbolį
. &nbs 525j91f p; Pavadinimas: putchar isvedimo funkcija
. &nbs 525j91f p; Sinopsė:
. &nbs 525j91f p; include <stdio.h>
. &nbs 525j91f p; int putchar(int c)
Aprasymas: isveda eilinį simbolį į standartinį isvedimo įrenginį
Diagnostika: grazina isvestą simbolį, jeigu isvedimas atliktas sėkmingai, priesingu atveju grazina EOF simbolį.
. &nbs 525j91f p; Pavyzdziai
#include <stdio.h>
int main()
Skaičiavimo proceso valdymo operatoriai
. &nbs 525j91f p; Skaičiavimo procesas - tai programos operatorių vykdymo seka
. &nbs 525j91f p; Paprastai programos operatoriai vykdomi elės tvarka: is virsaus į apačią, is kairės į desinę
. &nbs 525j91f p; Kartais normalią veiksmų vykdymo seką reikia pakeisti
. &nbs 525j91f p; Kam reikia pakeisti valdymo seką ? Uzdavinio sprendimas reikalauja
. &nbs 525j91f p; Naudojami specialūs operatoriai - skaičiavimo proceso valdymo operatoriai
. &nbs 525j91f p; Sakojimosi operatoriai, sąlygos operatoriai, ciklo operatoriai
. &nbs 525j91f p; if, if-else, while, do while, switch - case - break, for, break, continue, goto, return
2.7. Operatorius if
. &nbs 525j91f p; Sakojimosi operatoriai isrenka programoje galimą proceso tąsą is eilės alternatyvų
. &nbs 525j91f p; C kalboje yra du sakojimosi operatoriai - if ir switch
. &nbs 525j91f p; if - paprasčiausias sąlygos operatorius
. &nbs 525j91f p; if operatoriaus apibrėzimas:
if(cond_expression) TRUE_statement;
. &nbs 525j91f p; cond_expession - sąlygos israiska
. &nbs 525j91f p; TRUE_statement - israiska, kuri vykdoma jei sąlyga teisinga
. &nbs 525j91f p; Pavyzdziai:
. &nbs 525j91f p; if(x>largest) largest x;
. &nbs 525j91f p; if( val<min || val>max)
. &nbs 525j91f p; if(num<0) num=-num;
. &nbs 525j91f p; c=getchar();
if(c=='\n') lines+=1;
. &nbs 525j91f p; ekvivalentinis if((c=getchar()) =='\n') lines+=1;
. &nbs 525j91f p; neekvivaletinis if(c=getchar()=='\n') lines+=1;
2.8. Operatorius if-else
if ir else - raktiniai zodziai
. &nbs 525j91f p; &nbs 525j91f p; Jeigu israiska teisinga - vykdoma pirmoji israiska, jeigu israiska neteisinga - pirmoji israiska praleidziama ir vykdoma antroji israiska
. &nbs 525j91f p; &nbs 525j91f p; Tiek pirmoji, tiek antroji israiskos gali būti paprastos arba blokinės
. &nbs 525j91f p; &nbs 525j91f p; Apibrėzimas:
. &nbs 525j91f p; &nbs 525j91f p; if(cond_expression) True_statement;
else False_statement;
. &nbs 525j91f p; &nbs 525j91f p; cond_expession - sąlygos israiska
. &nbs 525j91f p; &nbs 525j91f p; TRUE_statement - israiska, kuri vykdoma jei sąlyga teisinga
. &nbs 525j91f p; &nbs 525j91f p; FALSE_statement - israiska, kuri vykdoma, jei sąlyga neteisinga
Pavyzdziai
. &nbs 525j91f p; &nbs 525j91f p; if(kiekis<100) printf("atsargu kiekis mazas");
else printf("atsargu kiekis pakankamas");
. &nbs 525j91f p; &nbs 525j91f p; if(x
y=y/x;
else
. &nbs 525j91f p; &nbs 525j91f p; if(hour>=3 && hour<17)
rate*=1.02;
else if(hour>=17 && hour<23)
rate*=1.01;
else rate*=0.99;
Pastaba operatoriai if-else yra inkliuzyviniai: į vieną if-else operatorių galima įstatyti kitą.
Inkliuzyvų kiekis neribojamas
2.9. Else atskyrimo problemos: klaidų saltinis
. &nbs 525j91f p; if(c>' ')
if(c>='0' && c<='9')
digits+=1;
else
count+=1;
. &nbs 525j91f p; Kuriam if priskiriamas else ?
. &nbs 525j91f p; if(c>' ')
else
count+=1;
2.10. Operatoriai switch-case- break
. &nbs 525j91f p; Daznai pasitaikantis programavimo uzdavinys: isrinkti vieną alternatyvą is daugelio galimų variantų
. &nbs 525j91f p; Tai patogu atlikti naudojant switch-case operatorių
. &nbs 525j91f p; Operatoriaus sintaksė:
switch(switch_expression)
. &nbs 525j91f p; &nbs 525j91f p; Iliustracija
. &nbs 525j91f p; &nbs 525j91f p; input=getchar();
switch(input)
2.11. Ciklo operatoriai
. &nbs 525j91f p; Ciklas - tai tų pačių veiksmų pakartojimas nurodytą skaičių kartų
. &nbs 525j91f p; C kalba turi tris ciklo uzrasymo formas:
. &nbs 525j91f p; &nbs 525j91f p; while(cond_expression) operators;
. &nbs 525j91f p; &nbs 525j91f p; do operators while(cond_expression);
. &nbs 525j91f p; &nbs 525j91f p; for(init_expr; cond_expr; incr_expr) operators;
. &nbs 525j91f p; Kuri uzrasymo forma geriausia ? Priklauso nuo konkrečių sąlygų
. &nbs 525j91f p; Visomis uzrasymo formomis galima uzrasyti bet kurį ciklą
Besąlyginio perėjimo operatoriai
. &nbs 525j91f p; &nbs 525j91f p; Yra keturi besąlyginio perėjimo operatoriai C kalboje: break, continue, goto, return
. &nbs 525j91f p; &nbs 525j91f p; Besąlyginio perėjimo operatoriai - sutikus tokį operatorių programos valdymas automatiskai perduodamas į apibrėztą vietą
. &nbs 525j91f p; &nbs 525j91f p; break - iseina is duoto bloko ir tęsia vykdymą is karto nuo sekančio operatoriaus uz bloko
. &nbs 525j91f p; &nbs 525j91f p; continue - naudojamas cikle, automatiskai pereina prie sekančios ciklo iteracijos
. &nbs 525j91f p; &nbs 525j91f p; return - grįzta is funkcijos. valdymas perduodamas į funkcijos iskvietimo taską
. &nbs 525j91f p; &nbs 525j91f p; goto label - valdymas automatiskai perduodamas į programos taską, kurį zymi markeris label
2.13. Gero stiliaus reikalavimai
1) Formatuokite kodą taip, kad pabrėzti jo struktūrą
. &nbs 525j91f p; Blogas formatavimas:
for(n++;n<100;n++) field[n++]='\0';
*i='\0'; return('\n');
. &nbs 525j91f p; Geras formatavimas:
for(n++;n<100;n++)
field[n++]='\0';
*i='\0';
return '\n';
rasykite israiskas natūralia forma: rasykite taip, kaip skaitytumėte
if(!(block_id<actblk) || !(block_id>=unblock))
if((block_id>=actblk) || (block_id<unblock))
3) &nbs 525j91f p; Naudokite skliaustelius, kad panaikinti neaISKUMUS
. &nbs 525j91f p; Pavyzdys su kelintiniais metais
. &nbs 525j91f p; leap_year= y%4==0 && y%100!=0 ||y%400==0;
. &nbs 525j91f p; leap_year= ((y%4==0) && (y%100!=0)) ||(y%400==0);
4) Skaidykite sudėtingas israiskas:
. &nbs 525j91f p; Blogai: x+=(xp=(2*k<(n-m) ? c[k+1] : d[k--]));
. &nbs 525j91f p; Gerai: if(2*k<n-m)
xp=c[k+1];
else
xp=d[k--];
x+=xp;
5) Būkite paprastesni: nereikia persistengti rasant labai įmantrias israiskas:
. &nbs 525j91f p; Blogai: subkey=subkey>>(bitoff>>3)<<3));
. &nbs 525j91f p; Gerai: subkey=subkey>>(bitoff&0x7));
subkey>>=bitoff&0x7;
Absoliučiai mįslinga konstrukcija:
child=(!LC&&!RC)?0:!(LC?RC:LC);
Paprastai: if(LC==0 && RC==0)
child=0;
else if(LC==0)
child=RC;
else
child=LC;
6) Būkite atsargūs u pasaliniais efektais: ++ tipo operacijos turi pasalinius efektus: jos ne tik grazina reiksmę, bet ir pakeičia operando reiksmę
. &nbs 525j91f p; Blogai: str[i++]=str[i++]='A';
blogai, nes nėra apibrėzta ++ operacijos vykdymo tvarka)
. &nbs 525j91f p; Gerai: str[i++]='A';
. &nbs 525j91f p; str[i++]='A';
3. III-IOJI PASKAITA: Rodikliai. Nuorodos. Masyvai.
3.1. Rodiklio sąvoka
. &nbs 525j91f p; Idėja panaudoti adresus - labai sena.
. &nbs 525j91f p; Programose rasomose masininiais kodais arba asembleriu daznai sutinkamas uzdavinys - perkelti duomenis is vieno adreso į kitą
. &nbs 525j91f p; Tokiose programose tai atliekama paprastai
. &nbs 525j91f p; Auksto lygio programavimo kalbose daznai apie adresus negalvojama, o kai kuriose ir nėra jokių priemonių operuoti su adresais
. &nbs 525j91f p; C kalboje yra abiejų būdų komponentų: tiek darbui su adresais, tiek ir ne tiesioginio adresavimo galimybių
. &nbs 525j91f p; Kas yra rodiklis? Kintamasis, kuriame saugomas adresas
. &nbs 525j91f p; Apibrėzimas: kntamasis-rodiklis (arba tiesiog vadinama rodikliu) - ta kintamasis, skirtas adreso saugojimui atmintyje
. &nbs 525j91f p; Kam naudojami rodikliai?
§ &nbs 525j91f p; Kad efektyviai prieiti prie duomenų
§ &nbs 525j91f p; Lanksčios programos parasymui
§ &nbs 525j91f p; Kintamųjų, perduodamų į funkciją, reiksmių pakeitimui
§ &nbs 525j91f p; Darbui su dinamiskai paskirstoma atmintimi
§ &nbs 525j91f p; Priėjimui prie aparatinių kompiuterio resursų arba papildomų įrenginių
3.2. Rodikliai ir nuorodos C kalboje
. &nbs 525j91f p; C kalboje apibrėztos dvi specialios operacijos kintamųjų adresavimui per rodiklius
o &nbs 525j91f p; operacija & - nuorodos (reference) operacija
o &nbs 525j91f p; operacija - rodiklio (pointer) operacija
Operacijos & rezultatas - tai objekto, kuriam taikoma i operacija, adresas
Operacija * - tai kreipinys į atminties ląstelę, kurios adresas saugomas tame objekte
3.3. Rodiklių aprasymas, inicializavimas ir naudojimas
. &nbs 525j91f p; &nbs 525j91f p; Kintamasis p aprasomas kaip rodiklis į sveiko tipo kintamąjį. Tai reiskia kad jame bus saugomas sveiko tipo kintamojo adresas
. &nbs 525j91f p; &nbs 525j91f p; int num1=3, num2=6, *p;
. &nbs 525j91f p; &nbs 525j91f p; Visi rodikliai turi būti inicializuoti
. &nbs 525j91f p; &nbs 525j91f p; p=&num1;
. &nbs 525j91f p; &nbs 525j91f p; Rodiklis p dabar "rodys" į kintamąjį num1
. &nbs 525j91f p; &nbs 525j91f p; Dabar kintamąjį num1 bus galima adresuoti tiesiogiai, naudojant priskyrimo operaciją = , arba kaip rodiklį, naudojant operatorių *
9.11. Klasifikavimo sablonai
![]() |
9.12. Mechanizmų klasifikacija
. &nbs 525j91f p; Mechanizmas - tai suderinta objektų klasių sąveika, tenkinanti tam tikrus isorinius reikalavimus
. &nbs 525j91f p; Specifinės sudėtingų, painių objektų savybės isreiskiamos per priklausomybę nuo projektinių sprendimų
. &nbs 525j91f p; Mechanizmų klasifikacija atliekama per:
- &nbs 525j91f p; &nbs 525j91f p; Esminių mechanizmų identifikaciją
- &nbs 525j91f p; &nbs 525j91f p; Naujų mechanizmų isradimą
9.13. Konstruktoriai ir destruktoriai
. &nbs 525j91f p; &nbs 525j91f p; Daznai sukuriant objektą, reikia atlikti pradinę objekto inicializavimą, pvz. isskirti atminties sritis masyvams, priskirti kintamiesiems pradines reiksmes.
. &nbs 525j91f p; &nbs 525j91f p; Objektą sunaikinant atminties sritis reikia atlaisvinti
. &nbs 525j91f p; &nbs 525j91f p; C++ tuo tikslu yra sukurt specialūs metodai, vadinami konstruktoriais ir destruktoriais
. &nbs 525j91f p; &nbs 525j91f p; Funkcija-konstruktorius visada turi ta patį pavadinimą, kaip ir klasė. Ji leidzia atlikti objekto inicializavimą jo sukūrimo metu
. &nbs 525j91f p; &nbs 525j91f p; Funkcija-destruktorius taip pat turi tą patį pavadinimą kaip ir klasė, bet pries pavadinimą visada dedamas tildės ~ zenklas. Ji atlieka objekto sunaikinimą.
![]() |
9.14. Bendri klasės objektų nariai
. &nbs 525j91f p; Kai kada yra patogu, kad visi duotos klasės objektai turėtų bendrus duomenų elementus, kurie ir yra naudojami bendrai.
. &nbs 525j91f p; Bendri klasės duomenų elementai apibrėziami naudojant raktinį zodį static
. &nbs 525j91f p; Pvz: class CWindow
char CWindow::title[80]="lango pavadinimas";
Kiekvienas klasės CWindow objektas turės unikalias lango koordinates ir tą patį lango pavadinimą
Draugiskos klasės ir draugiskos funkcijos
. &nbs 525j91f p; C++ galima uzduoti draugiską klase funkciją, naudojant raktinį zodį friend.
. &nbs 525j91f p; Aprasant klasę nurodomas tiktai funkcijos pavadinimas.
. &nbs 525j91f p; Draugiska funkcija nėra klasės elementas, bet ji gali prieiti prie visų klasės elementų, įskaitant ir private bei protected elementus
class point ;
void Clear(point *ptr)
. &nbs 525j91f p; Analogiskai galima uzduoti ir draugiskas klases:
class point ;
class line
9.16. Paveldėjimas
. &nbs 525j91f p; &nbs 525j91f p; Prisiminkime tris bazinius objektinio programavimo principus: inkapsuliaciją, paveldėjimą ir polimorfizmą
. &nbs 525j91f p; &nbs 525j91f p; Paveldėjimas - antrasis is sių bazinių principų
. &nbs 525j91f p; &nbs 525j91f p; Is kur kilo idėja panaudoti paveldėjimą ? Be abejo is gamtos
. &nbs 525j91f p; &nbs 525j91f p; Ką gamtoje reiskia paveldėjimas ?
. &nbs 525j91f p; &nbs 525j91f p; Objektiniame programavime paveldėjimas reiskia beveik tą patį, ką ir gamtoje
. &nbs 525j91f p; &nbs 525j91f p; Motininės klasės perduoda savo savybes dukterinėms klasėms
. &nbs 525j91f p; &nbs 525j91f p; Dazniausiai naudojami pavadinimai: bazinė klasė ir isvestinė klasė; kartais naudojamos sąvokos - motininė klasė ir dukterinė klasė
. &nbs 525j91f p; &nbs 525j91f p; Is anksčiau isvestų klasių galima isvedinėti ir naujas isvestines klases
. &nbs 525j91f p; &nbs 525j91f p; Isvestinė klasė apima savyje visus bazinės klasės elementus ir metodus, bei gali juos papildyti nuosavais elementais ir metodais
. &nbs 525j91f p; &nbs 525j91f p; Isvestinė klasė pati gali tapti bazine klase kitoms isvestinėms klasėms. Tokiu atveju isvestinė klasė paveldės visų bazinių klasių elementus ir metodus
9.17. Vienetinis paveldėjimas
. &nbs 525j91f p; &nbs 525j91f p; Vienetinio paveldėjimo atveju isvestinė klasė paveldi elementus tik is vienos bazinės klasės
. &nbs 525j91f p; &nbs 525j91f p; Paveldėjimas apibrėziamas taip:
class [<tag>] [: <base> ] ] [<declarators>]
Angliskoje literatūroje paveldėjimas vadinamas inheritance
Sukurtoje klasėje galima apibrėzti elementus, kurių vadai sutampa su bazinės lasės elementų vardais
. &nbs 525j91f p; Vienetinio paveldėjimo pavyzdys:
class Base ;
classs DerivedFirst: Base ;
class DerivedSecond : Base ;
9.20. Daugybinis paveldėjimas
. &nbs 525j91f p; &nbs 525j91f p; Daugybinis paveldėjimas atliekamas paveldėjimas. Isvestinė klasė siuo atveju gali turėti keletą bazinių klasių panasiai kaip vienetinis
. &nbs 525j91f p; &nbs 525j91f p; Vietoj vienos bazinės klasės pavadinimo, nurodomas bazinių klasių pavadinimų sąrasas
. &nbs 525j91f p; &nbs 525j91f p; Apibrėzimas:
. &nbs 525j91f p; &nbs 525j91f p; class [<tag> [: [<base_list]] [<declarators>]
. &nbs 525j91f p; &nbs 525j91f p; Daugybinio paveldėjimo parasymo pavyzdys:
class BaseFirst ;
class BaseSecond
class Derived: BaseFirst, BaseSecond
9.21. Priėjimo prie bazinės klasės elementų apribojimas
. &nbs 525j91f p; Priėjimą prie klasės elementų galima valdyti naudojant priėjimo modifikatorius
. &nbs 525j91f p; Kuomet paveldima bazinė klasė, priėjimą galima valdyti prie bazinės klasės elementų
. &nbs 525j91f p; Tokiu atveju yra svarbu su kokiais specifikatoriais yra aprasyti bazinės klasės elementai
Bazinės klasės elemento specifikatorius |
Bazinės klasės priėjimo specifikatorius |
||
public |
protected |
private |
|
public |
public |
protected |
private |
protected |
protected |
protected |
private |
private |
9.22. Bazinės klasės metodų perdefinavimas
. &nbs 525j91f p; &nbs 525j91f p; Isvestinėje klasėje galima apibrėzti metodus ir duomenų elementus tais pačiais vardais, kurie jau buvo panaudoti bazinėje klasėje
. &nbs 525j91f p; &nbs 525j91f p; Tokiu atveju tie bazinės klasės elementai tampa paslėptais
. &nbs 525j91f p; &nbs 525j91f p; Norint operuoti su paslėptais elementais, reikia naudoti pilną vardą:
bazinės_klasės_vardas:: elemento_vardas
Pvz:
class C: A,B
Daugybinio paveld jimopavyzdys
9.24. Rodikliai į klases
. &nbs 525j91f p; &nbs 525j91f p; C++ leidziama apibrėzti rodiklius į klases.
. &nbs 525j91f p; &nbs 525j91f p; Apibrėzta klasės tampa veikiančiu duomenų tipu
. &nbs 525j91f p; &nbs 525j91f p; Apibrėzti rodiklį į klasę paprasčiausiai reikia panaudoti klasės pavadinimą ir rodiklio zenklą
. &nbs 525j91f p; &nbs 525j91f p; CRectangle * prect; is a pointer to an object of class
. &nbs 525j91f p; &nbs 525j91f p; // CRectangle
Kaip ir su kitais agreguotais duomenų tipais, norint prieiti prie rodiklių į klases elementų, reikia naudoti zenklą ->
![]() |
10. X-OJI PASKAITA
Paveldėjimas. Operatorių perkrovimas.
10.1. Isvestinės klasės
. &nbs 525j91f p; &nbs 525j91f p; Sudaro prielaidas sukūrimui naujos klasės, kuri yra anksčiau sukurtos klasės variacija
. &nbs 525j91f p; &nbs 525j91f p; Isvestinė klasė gali prieiti prie bazinės klasės atvirų ir uzdarų narių
. &nbs 525j91f p; &nbs 525j91f p; Isvestinėje klasėje nustatomi private, protected ir public bazinės klasės narių apribojimai
. &nbs 525j91f p; &nbs 525j91f p; Pagal nutylėjimą nustatomi private apribojimai
. &nbs 525j91f p; &nbs 525j91f p; Pilnai atitinka įprastinės klasės apribojimus, bet papildomai turi bazinės klasės elementus su nuosavais priėjimo apribojimais
10.2. Isvestinių ir bazinių klasių elementai
. &nbs 525j91f p; Grafiskai elementų apribojimai gali būti pavaizduoti taip:
. &nbs 525j91f p; Private Base Derived
protected ---- private
public -------- private
. &nbs 525j91f p; Protected
private ------- private
protected ---- protected
public -------- protected
. &nbs 525j91f p; Public
private -------- private
protected ----- protected
public ---------- public
10.3. Isvestinės klasės funkcijos- nariai
. &nbs 525j91f p; &nbs 525j91f p; Isvestinėse klasėse gali pasitaikyti funkcijos-nariai, turinčios tuos pačius pavadinimus kaip ir bazinės klasės nariai
. &nbs 525j91f p; &nbs 525j91f p; Argumentų kiekis ir jų tipai, o taip pat grazinamos reiksmės tipas gali skirtis nuo bazinės klasės metodo argumentų skaičiaus, tipai ir grazinamos reiksmės tipas
. &nbs 525j91f p; &nbs 525j91f p; class PayPhone: public Phone ;
Phone home(516,555,8858);
PayPhone booth(708,555,5444);
home.GiveDialTone();
// Phone::GiveDialTone();
booth.GiveDialTone();
// payPhone::GiveDialTone();
. &nbs 525j91f p; Isvestinės klasės funkcijos-nariai gali kreiptis į bazinės klasės funkcijas-narius.
. &nbs 525j91f p; Galima kreiptis net į tas funkcijas - narius, kurių pavadinimai sutampa
. &nbs 525j91f p; Pvz:
void PayPhone::GiveDialTone()
10.4. Priėjimo valdymas
![]() |
. &nbs 525j91f p; &nbs 525j91f p; Pilnai virtuali funkcija - narys - tai virtuali funkcija-narys, kuriai yra deklaruotas interfeisas, o jo realizacija parasyta isvestinėje klasėje
. &nbs 525j91f p; &nbs 525j91f p; Tam reikia metodo apibrėzimą prilyginti nuliui
. &nbs 525j91f p; &nbs 525j91f p; Abstrakčios klasės destruktorius visada privalo būti virtualus
. &nbs 525j91f p; &nbs 525j91f p; Anstyvosios C++ versijos nepalaikė abstrakčių bazinių klasių
. &nbs 525j91f p; &nbs 525j91f p; Negalima apibrėzti abstrakčios klasės objekto. Galima apibrėzti tik isvestinės klasės objektą
. &nbs 525j91f p; &nbs 525j91f p; Pilnai virtuali funkcija niekada negali aiskiai arba netiesiogiai iskviesta is konstruktoriaus
. &nbs 525j91f p; &nbs 525j91f p; Is konstruktoriaus gali būt iskviesta tik per ne virtualią klasės funkciją-narę. Tačiau bus iskviesta duotoje klasėje apibrėzta funkcija
10.6. Pilnai virtualios funkcijos - nariai
![]() |
Virtualios klasės ir kostruktoriai
![]() |
10.8. Bazinių klasių konstruktoriai
. &nbs 525j91f p; &nbs 525j91f p; Iskviečiami pries isvestinių klasių konstruktorių iskvietimą
. &nbs 525j91f p; &nbs 525j91f p; Turi būti aiskiai nurodyti kiekviename isvestinės klasės apibrėzime, jeigu bazinėje klasėje nėra konstruktoriaus pagal nutylėjimą
. &nbs 525j91f p; &nbs 525j91f p; Bazinės klasės konstruktoriaus pavadinimas ir jo argumentai atskiriami nuo isvestinės klasės konstruktoriaus pavadinimo dvitaskiu
. &nbs 525j91f p; &nbs 525j91f p; Daugybinių bazinių klasių konstruktoriai atskiriami vienas nuo kito dvitaskiais
. &nbs 525j91f p; &nbs 525j91f p; Niekada tiesiogiai arba netiesiogiai iskviesti virtualios bazinės klasės metodus
![]() |
10.9. Bazinių klasių destruktoriai
. &nbs 525j91f p; Iskviečiami po isvestinių klasių destruktorių
. &nbs 525j91f p; Gali būti virtualiais. Abstrakčios klasės destruktorius gali būti virtualiu
. &nbs 525j91f p; Gali per ne virtualias funkcijas- narius tiesiogiai arba netiesiogiai iskviesti virtualius metodus
. &nbs 525j91f p; Tačiau siuo atveju iskviečiama funkcijos versija duotai klasei arba bazinei klasei, jeigu tokia egzistuoja, ir niekuomet isvestinei klasei
10.10. Daugybinės bazinės klasės
. &nbs 525j91f p; &nbs 525j91f p; Leidzia isvesti naują klasę daugiau negu is vienos bazinės klasės
. &nbs 525j91f p; &nbs 525j91f p; Bazinių klasių isvardijimo tvarka sąrase neturi įtakos.
. &nbs 525j91f p; &nbs 525j91f p; Priėjimas prie bazinių klasių elementų, turinčių vienodus pavadinimus, turi būti atliekamas per bazinių klasių pavadinimus
class A ;
class B ;
class C: public A, public B ;
C c;
c.f(); // klaida: kur f ?
c. A:f(); // teisingai
. &nbs 525j91f p; &nbs 525j91f p; Patogiausia dviprasmybes spręsti abiejų funkcijų perdengimu isvestinėje klasėje
class C: public A, public B
C c;
c.f(); // dabar teisingai
. &nbs 525j91f p; Klasėms, kurios yra isvestos is klasių su bendra baze, pagal nutylėjimą egzistuoja du bendros bazės objekto egzemplioriai
. &nbs 525j91f p; Į bendros bazinės klasės elementus galima kreiptis per bet kurios is isvestinių klasių pavadinimą
10.11. Virtualios bazinės klasės
. &nbs 525j91f p; &nbs 525j91f p; Klasėms, kurios yra isvestos is isvestinių klasių su bendra virtualia bazine klase, egzistuoja tiktai vienas bendros bazinės klasės elementas
. &nbs 525j91f p; &nbs 525j91f p; Apibrėziami raktinio zodzio virtual panaudojimu bazinės klasės priėjimo lygio specifikatoriuje
. &nbs 525j91f p; &nbs 525j91f p; Prieinant prie bazinės klasės elementų nebereikia nieko nurodyti papildomai
. &nbs 525j91f p; &nbs 525j91f p; Jų konstruktoriai iskviečiami pagal paskutinės isvestinės klasės grandinėlę
. &nbs 525j91f p; &nbs 525j91f p; Apibrėziant klasę galima sumaisyti su ne virtualiomis bazinėmis klasėmis
10.12. Sablonai
. &nbs 525j91f p; &nbs 525j91f p; Kas yra sablonas ?
. &nbs 525j91f p; &nbs 525j91f p; Sablonai naudojami ir objektiniame programavime
. &nbs 525j91f p; &nbs 525j91f p; Jie isplečia klasės ir funkcijos supratimą
. &nbs 525j91f p; &nbs 525j91f p; Suteikia galimybes parametrizuoti funkcijas ir klases
. &nbs 525j91f p; &nbs 525j91f p; Faktiskai įgalina apibrėzti funkcijas ir klases kaip "bet kurio tipo" elementus
. &nbs 525j91f p; &nbs 525j91f p; Sąvotiskai leidzia atsisakyti tipų
10.13. Funkcijų sablonai
. &nbs 525j91f p; &nbs 525j91f p; Tai funkcijos kaip sablono specifikacijos paskelbimas. Sablono specifikaciją sudaro raktinis zodis template, paskui kurį seka parametrų, įtrauktų į < > skliaustelius, sąrasas
. &nbs 525j91f p; &nbs 525j91f p; Turi tipo parametrus kurie zymimi raktiniu zodziu class, po kurio seka identifikatorius. Identifikatorius naudojamas tipo pavadinimo pakeitimui
. &nbs 525j91f p; &nbs 525j91f p; Automatiskai kompiliatorius isplečia iki pilno funkcijos aprasymo
. &nbs 525j91f p; &nbs 525j91f p; Gali būti perkrautos kitomis funkcijomis - sablonais
![]() |
10.14. Klasių sablonai
. &nbs 525j91f p; Tai klasių apibrėzimai, naudojant specifikaciją template
. &nbs 525j91f p; Automatiskai juos kompiliatorius isplečia iki pilno klasių apibrėzimo, kaip reikalauja taisyklės
. &nbs 525j91f p; Negali būti įstatyti į kitas klases (skirtingai nuo įprastų klasių)
. &nbs 525j91f p; Gali keisti netipizuotus parametrus. Reiksmės, nurodytos siems parametrams, privalo būti konstantos
. &nbs 525j91f p; Gali būti isvesti is kaip is ne sabloninių klasių, taip ir is klasių sablonų
. &nbs 525j91f p; Is jų gali būti isvestos kaip ne sabloninės klasės, taip ir klasės sablonai
. &nbs 525j91f p; &nbs 525j91f p; Kai kuriems tipams gali būti perdengti tam, kad atlikt (arba neatlikti) kokius nors veiksmus, kuriuos klasių sablonai neatlieka
. &nbs 525j91f p; &nbs 525j91f p; Taip pat gali būti klasėmis-struktūromis arba klasėmis-apjungimais
class Stack <char *> ;
Statiniai duomenys- nariai
. &nbs 525j91f p; &nbs 525j91f p; Yra bendri duomenys visiems tam tikros klasės-sablono egzemplioriaus klasės objektams.
. &nbs 525j91f p; &nbs 525j91f p; Apibrėziami failo matomumo srityje, kuomet pries apibrėzimą naudojamas template
template <class T> class C ;
template <class T> int C <T>::i; // apibrėziame matomumo srityje
template <class T> int C <T>::t;
C <char> c;
C <float> f;
10.16. Funkcijų-narių sablonai
. &nbs 525j91f p; Apibrėziami uz klasių, kurioms priklauso, apibrėzimų ribų naudojant specifikatorių template
. &nbs 525j91f p; Apibrėztiems tipams gali būti perdengti, kad atlikti tam tikrus veiksmus, kuriuos metodų sablonai neatlieka
template <class T> void
Stack <T>::Push(const T& element)
Draugiskos funkcijos
. &nbs 525j91f p; &nbs 525j91f p; Kiekvienam T tipui gali būt visų T tipo klasių draugais. Tai įprastos draugiskos klasės
. &nbs 525j91f p; &nbs 525j91f p; T tipui gali būt T tipo klasės draugais
. &nbs 525j91f p; &nbs 525j91f p; Pries juos gali eiti specifikatorius template
. &nbs 525j91f p; &nbs 525j91f p; Gali būti kitos klasės funkcijomis- nariais
. &nbs 525j91f p; &nbs 525j91f p; Gali būti apibrėzti visai klasei
. &nbs 525j91f p; &nbs 525j91f p; Gali būti ne sabloninių klasių draugais
10.18. Operacijų perkrovimas
. &nbs 525j91f p; &nbs 525j91f p; Gali isplėsti iki klasės tipo bet kurių operacijų reiksmes, įskaitant :: , sizeof, ? :, ., *
. &nbs 525j91f p; &nbs 525j91f p; Atliekama deklaruojant funkciją, susidedančią is raktinio zodzio operator, po kurios seka viena is vidinių operacijų
. &nbs 525j91f p; &nbs 525j91f p; Nedaro jokių prielaidų apie tokias operacijas. Pvz: jeigu i yra int tipo, tai ++i yra tas pats, kas i=+1 ir i=i+1. Perkrautiems operatoriams tokios prielaidos nebegalioja tol, kol pats programuotojas jų atitinkamai neapibrėzia
. &nbs 525j91f p; &nbs 525j91f p; Negali naudoti argumentų pagal nutylėjimą
10.19. Unariniai operatoriai
. &nbs 525j91f p; &nbs 525j91f p; Gali būti apibrėzti kaip nestatinės funkcijos-nariai, neturintys argumentų. Tai yra x interpretuojama kaip x.operator bet kuriam operatoriui
. &nbs 525j91f p; &nbs 525j91f p; Gali būti apibrėzti kaip funkcijos, nesančios kokios nors klasės nariais, ir turinčios vieną argumentą
. &nbs 525j91f p; &nbs 525j91f p; Sis argumentas yra tos klasės kintamasis arba nuoroda į tokį kintamąjį
. &nbs 525j91f p; &nbs 525j91f p; Siuo atveju @x interpretuojama kaip operator@(x) bet kuriam operatoriui
11. XI-OJI PASKAITA
Operatorių perkrovimas. Polimorfizmas.
Unariniai operatoriai
Class X ;
class Y ;
Binarinės operacijos
. &nbs 525j91f p; &nbs 525j91f p; Gali būti deklaruotos kaip nestatinės funkcijos, kurios turi vieną argumentą. Tai yra uzrasas x@y interpretuojamas kaip x.operator@(y) bet kuriam operatoriui @.
. &nbs 525j91f p; &nbs 525j91f p; Gali b ti deklaruotos kaip funkcijos, nepriklausančios konkrečiai klasei ir turinčios vieną argumentą.
. &nbs 525j91f p; &nbs 525j91f p; Sis argumentas turi būti arba duotos klasės kintamuoju, arba nuoroda į tokį kintamąjį. Ta yra bet kuriai operacijai Įskaitant ir operaciją =, x@y interpretuojama kaip operator@(x,y)
. &nbs 525j91f p; &nbs 525j91f p; Pvz:
class X ;
class Y ;
Operatorių perkrovimas
![]() |
11.4. Funkcijos iskvietimo operacija
. &nbs 525j91f p; Turi būt paskelbta, kaip nestatinė klasės funkcija narys
. &nbs 525j91f p; Leidzia vartotojui nustatyti operandų kiekį
Class X ;
X Xample(1,2,3); // iskviečiamas konstruktorius
Xamople(4,5,6); // iskviečiama operacija ()
11.5. Priskyrimo operacija
. &nbs 525j91f p; &nbs 525j91f p; Naudojama vieno duotos klasės objekto reiksmės priskyrimui kitam objektui
. &nbs 525j91f p; &nbs 525j91f p; Jeigu vartotojas jos neapibrėzė, tai atlieka vieno klasės objekto laukų priskyrimą kitam objektui
. &nbs 525j91f p; &nbs 525j91f p; Turi būti apibrėzta, jeigu klasėje yra laukai, kurie yra rodikliai į dinamiskai isskirtas atminties sritis
. &nbs 525j91f p; &nbs 525j91f p; Tai tik operacijos funkcija, kuri nėra paveldima
. &nbs 525j91f p; &nbs 525j91f p; Turi būti apibrėzta, kaip nestatinė klasės funkcija - narys
11.6. Indeksavimo operacija
. &nbs 525j91f p; &nbs 525j91f p; Turi būti apibrėzta kaip nestatinė klasės funkcija- narys
. &nbs 525j91f p; &nbs 525j91f p; Dazniausiai grazina nuorodą, todėl ją galima naudoti priskyrimo operacijoje is abiejų operando pusių
class String
String ball=mitten";
ball[0]='k';
Priėjimo prie nario operacija
. &nbs 525j91f p; &nbs 525j91f p; X->m interpretuojama kaip (x.operator->())->m.
. &nbs 525j91f p; &nbs 525j91f p; Pastebima, kad tai unarinė operacija ir kad x - tai klasės objektas, o ne rodiklis į jį.
. &nbs 525j91f p; &nbs 525j91f p; Turi grazinti rodiklį į klasės objektą, arba patį klasės objektą, arba nuorodą į klasės objektą, kuriam si operacija yra priskirta, kadangi originali operacijos -> prasmė nėra prarandama, o tik uzlaikoma
. &nbs 525j91f p; &nbs 525j91f p; Turi būti apibrėzta, kaip nestatinė klasės funkcija - narys
11.8. Polimorfizmas
. &nbs 525j91f p; &nbs 525j91f p; Polimorfizmas isvertus is graikų kalbos reiskia daugiaformiskumas
. &nbs 525j91f p; &nbs 525j91f p; Tai paskutinė bazinė objektinio programavimo koncepcija
. &nbs 525j91f p; &nbs 525j91f p; Polimorfizmas objektiniame programavime suprantamas kaip objekto sugebėjimas sureaguoti į tam tikrą uzklausą priklausomai nuo savo tipo, netgi ir tuo atveju, kuomet kompiliacijos metu objekto, kuriam nukreipta uzklausa, tipas dar nėra zinomas.
. &nbs 525j91f p; &nbs 525j91f p; C++ kalboje polimorfizmo koncepcija realizuota naudojant virtualių funkcijų-narių mechanzmą
11.9. Virtualios funkcijos-nariai
. &nbs 525j91f p; &nbs 525j91f p; Jeigu kurioje nors klasėje yra funkcija, aprasyta kaip virtual, tai į tokią klasę kompiliatorius patalpina paslėptą narį - rodiklį į virtualių funkcijų lentelę.
. &nbs 525j91f p; &nbs 525j91f p; Taip pat sugeneruojamas specialus kodas, leidziantis parinkti virtualią funkciją, tinkančią duoto tipo objektui, programos vykdymo metu.
. &nbs 525j91f p; &nbs 525j91f p; Sis procesas įgijo vėlyvo surisimo pavadinimą (angl. late binding).
. &nbs 525j91f p; &nbs 525j91f p; Kita vertus virtualių funkcijų naudojimas lėtina programos veikimą ir didina klasės objektų dydį
. &nbs 525j91f p; &nbs 525j91f p; Jeigu kokia nors funkcija bazinėje klasėje apibrėzta kaip virtuali, tai funkcija tokiu pačiu pavadinimu, su tuo pačiu argumentų sąrasu ir tokio paties tipo grazinama reiksme, apibrėzta bazinėje klasėje, automatiskai tampa virtualia
. &nbs 525j91f p; &nbs 525j91f p; Negalima apibrėzti isvestinėje klasėje funkcijos, besiskiriančios tiktai grazinamos reiksmės tipu
. &nbs 525j91f p; &nbs 525j91f p; Virtuali funkcija savaime suprantama turi būti kokios nors klasės metodu, tačiau ji negali būti statiniu kokios nors klasės metodu.
. &nbs 525j91f p; &nbs 525j91f p; Isvestinėje klasėje galima apibrėzti funkciją su kitu besiskiriančiu argumentų sąrasu ir ji bus paprasta (nevirtuali) funkcija
class Base
Programavimas Windows aplinkai
. &nbs 525j91f p; &nbs 525j91f p; Palyginus su Dos aplinkai parasytomis programomis, Wiindows programos pasizymi neįprastu veikimo principu
. &nbs 525j91f p; &nbs 525j91f p; Funkcija WinMain gauna darbo pradzioje valdymą ir atlieka tam tikrus veiksmus, inicializuojančius programos langą
. &nbs 525j91f p; &nbs 525j91f p; Po to si funkcija pereina į pranesimų apdorojimo rezimą (ciklą)
. &nbs 525j91f p; &nbs 525j91f p; Isėjus is pranesimų apdorojimo ciklo programos darbas baigiamas
. &nbs 525j91f p; &nbs 525j91f p; Funkcijos WndProc neiskviečia nė viena kita programos funkcija, nors būtent si funkcija atlieka visą naudingą vartotojo poziūriu darbą
#define STRICT
#include <windows.h>
//lango klases pavadinimas
char const szClassName[]="MyWindowsAppClass";
//lango pavadinimas
char const szWindowsTitle[]="MyWindowApplication";
Int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpszCmdLine, int nCmdShow)
return msg.wParam; }
LRESULT WINAPI WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
case W_RBUTTONDOWN:
case WM_DESTROY:
}
return DefWindowProc(hwnd, msg, wParam, lParam);
11.11. Darbas su Windows sistemos meniu
. &nbs 525j91f p; &nbs 525j91f p; Beveik kiekviena Windows aplinkai parasyta programa turi meniu.
. &nbs 525j91f p; &nbs 525j91f p; Dazniausiai meniu kuriamas naudojant programos resursų failą ir resursų kompiliatorių
. &nbs 525j91f p; &nbs 525j91f p; Resursų failas turi plėtinį .rc
. &nbs 525j91f p; &nbs 525j91f p; Resursu faile gali buti ir kai kurie kiti programai reikalingi duomenys (pavyzdziui akseleratoriai, ikonėlės ir t.t.)
|
nameID MENU
BEGIN
POPUP "&File"
BEGIN
MENUITEM "&New", CM_NEW
MENUITEM "&Open", CM_OPEN
MENUITEM "&Save", CM_SAVE
END
POPUP "&Edit"
BEGIN
MENUITEM "&Undo", CM_UNDO
MENUITEM "&Cut", CM_CUT
MENUITEM "&Paste", CM_PASTE
MENUITEM "&Copy", CM_COPY
END
END
MENUITEM SEPARATOR
|