Programavimo ir IT pagrindai 9 paskaita Lekt Tomas

  • Slides: 18
Download presentation
Programavimo ir IT pagrindai 9 paskaita Lekt. Tomas G. Lipnevičius

Programavimo ir IT pagrindai 9 paskaita Lekt. Tomas G. Lipnevičius

Programavimo pagrindai Programavimas

Programavimo pagrindai Programavimas

Tipizavimas n C kalboje turime galimybę visus naudojamus tipus aprašyti savaip. Tam naudojame typedef

Tipizavimas n C kalboje turime galimybę visus naudojamus tipus aprašyti savaip. Tam naudojame typedef operatorių: typedef tipo_vardas sinonimas; n Typedef operatorius tik aprašo (nemaišyti su apibrėžimu) tipą neišskirdamas jam atminties. Visi vardai kuriuos aprašome naudodami typedef netampa naujais duomenų tipais. Juos veikiau galima vadinti sinonimais. typedef float balance; balance past_due;

Struktūros n Struktūra tai agregatai, kurių elementai yra (tiksliau, gali būti) skirtingų tipų (t.

Struktūros n Struktūra tai agregatai, kurių elementai yra (tiksliau, gali būti) skirtingų tipų (t. y. struktūros – tai heterogeniniai agregatai). n Struktūrų elementai dar vadinami nariais (angl. members). n C struktūros didžiąja dalimi yra analogiškos Paskalio įrašams (angl. records). n Struktūros yra labai naudingos dirbant su sudėtingais duomenimis, ypatingai dažnai naudojamos didelėse programose.

Struktūros Supaprastintą sintaksę galima pateikti taip: struct struktūrinio_tipo_vardas { nario_1_tipas narys_1; . . .

Struktūros Supaprastintą sintaksę galima pateikti taip: struct struktūrinio_tipo_vardas { nario_1_tipas narys_1; . . . nario_N_tipas narys_N; }; struct struktūrinio_tipo_vardas struktūrinio_tipo_kintamasis; Pvz. : struct Studentas { int kursas; char pavarde[20]; }; struct Studentas studentas; Svarbu suprasti (dažna pradedančiųjų klaida), kad Studentas vardo apibrėžimas yra tipo, kaip kintamųjų šablono, aprašas (būtent aprašas, nes atmintis nėra išskiriama), tuo tarpu studentas vardo apibrėžimas yra “tikras” kintamojo apibrėžimas, nes yra išskiriama atmintis, kuri pažymima (įvardinama) šiuo vardu.

Struktūros Bendresnę sintaksę galima pateikti taip: struct struktūrinio_tipo_vardas opt { nario_1_tipas narys_1 , kiti_nariai_1

Struktūros Bendresnę sintaksę galima pateikti taip: struct struktūrinio_tipo_vardas opt { nario_1_tipas narys_1 , kiti_nariai_1 opt; . . . nario_N_tipas narys_N , kiti_nariai_Nopt; } struktūrinio_tipo_kintamieji opt; Matome, kad struktūras (kintamuosius) galima apibrėžti iš karto po tipo aprašo, pvz. : struct Studentas { int kursas, nr; char* vardas; char pavarde[20]; } studentas, studente, studentai[10]; C kalboje “ilgam” struktūrinių tipų vardui “sutrumpinti” (o kartu ir pasiekti C++ efektą) dažnai apibrėžiamas bendravardis sinonimas (žr. typedef ir enum), pvz. typedef struct Complex {double re, im; } Complex;

Struktūros (struktūriniai kintamieji) inicijuojamos, kaip ir masyvai, panariui pvz. : struct Studentas { int

Struktūros (struktūriniai kintamieji) inicijuojamos, kaip ir masyvai, panariui pvz. : struct Studentas { int metai, nr; int kursas; char pavarde[20]; char* vardas; } fuksas = {2000, 1, 1, ”Pavarde”, ”Vardas”};

Struktūros n Struktūrų narius galima pasiekti naudojant 2 priėjimo operacijas: Jei turime įprastą struktūrinio

Struktūros n Struktūrų narius galima pasiekti naudojant 2 priėjimo operacijas: Jei turime įprastą struktūrinio tipo kintamąjį (trumpiau, struktūrą) naudojame “. ” (taškas) operaciją. Pvz. : struct Studentas nebefuksas = fuksas; nebefuksas. kursas = 2; nebefuksas. pavarde[5] = ‘g’; n Jei turime rodyklės į struktūrinį tipą kintamąjį (trumpiau, struktūros rodyklę) naudojame “->” operaciją. Pvz. : n struct Studentas *pstudentas = &fuksas; pstudentas->kursas = 2; kas naudojant “. ” operaciją yra ekvivalentu (tačiau painu) (*pstudentas). kursas = 2;

Struktūros n Skirtingai nei su masyvais, su struktūromis galima manipuliuoti kaip su agregatais. n

Struktūros n Skirtingai nei su masyvais, su struktūromis galima manipuliuoti kaip su agregatais. n To paties tipo struktūras galima priskirti vieną kitai (arba vieną inicijuoti kita), pvz. : struct Studentas fuksas, fukse, studentas; studentas = fuksas; n Struktūrų negalima palyginti (nes neįmanoma nusakyti pirmumo-viršumo kriterijų) if (fukse == fuksas) /* klaida */

Struktūros n Struktūras galima perduoti į funkcijas ir struktūras galima grąžinti iš funkcijų. Kai

Struktūros n Struktūras galima perduoti į funkcijas ir struktūras galima grąžinti iš funkcijų. Kai struktūra yra perduodama į funkciją kaip argumentas, ji yra perduodama pagal reikšmę, t. y. funkcijoje yra sukuriama lokali struktūra (struktūraparametras), kuri yra panariui inicijuojama struktūra‑argumentu. Iš funkcijos struktūra grąžinama taip pat panariui. Pvz. : struct Studentas perkelti(struct Studentas s) { s. kursas++; return s; }. . . studentas = perkelti(studentas);

Struktūros n Struktūrų (kaip agregatų) apdorojimas funkcijose nors ir yra žingsnis į priekį lyginant

Struktūros n Struktūrų (kaip agregatų) apdorojimas funkcijose nors ir yra žingsnis į priekį lyginant su masyvais, tačiau tuo pačiu yra ir neefektyvus, nes struktūros gali būti labai dideli agregatai. Todėl į funkcijas rekomenduojama perduoti jų adresus. Pvz. : void perkelti(struct Studentas* ps) { ps->kursas++; }. . . perkelti(&studentas);

Struktūrų panaudojimas n Struktūros gali būti naudojamos: n Masyvuose n Struktūrose n Perduodamos ar

Struktūrų panaudojimas n Struktūros gali būti naudojamos: n Masyvuose n Struktūrose n Perduodamos ar grąžinamos iš funkcijos n Apibrėžiant rodykles į struktūrą

Duomenų tipo pakeitimas (type cast) C kalboje visi kintamieji ir funkcijos yra tipizuoti. n

Duomenų tipo pakeitimas (type cast) C kalboje visi kintamieji ir funkcijos yra tipizuoti. n Duomenų tipo keitimo sintaksė: (duomenu_tipas) kintamasis #include <stdlib. h> #include <stdio. h>. . . int main(int argc, char *argv[]) { div_t res; double d 1=15, d 2=4; res = div((long)d 1, (long)d 2); printf("div(%f, %f) = %d and %d/%dn", d 1, d 2, res. quot, res. rem, (long)d 2); printf("n"); return(0); } n

Duomenų tipo pakeitimas (type cast) n Duomenu tipo pakeitimas atliekamas prieš kintamajį lenktiniuose skliausteliuose

Duomenų tipo pakeitimas (type cast) n Duomenu tipo pakeitimas atliekamas prieš kintamajį lenktiniuose skliausteliuose parašant reikiamo tipo vardą. n C kalboje mažesnio tipo skaičiai yra keičiami į didesnio tipo skaicius nenaudojant tipo keitimo (pvz. char -> short int -> long). n Yra tikimybė pamesti ženklą keičiant mažesnio tipo skaičių su ženklu į didesnį tipą be ženklo.

Junginiai n Junginiai savo sintakse yra labai panašus į struktūras. Pagrindinis skirtumas yra tas,

Junginiai n Junginiai savo sintakse yra labai panašus į struktūras. Pagrindinis skirtumas yra tas, kad tuo pačiu momentu gali būti „aktyvus“ tik vienas junginio dalyvis. union modelis { duomenu-tipas 1 elementas 1; duomenu-tipas 2 elementas 2; . . duomenu-tipas. N elementas. N; } objekto_vardas; n Išskiriamos atminties kiekis priklauso nuo didžiausio duomenų tipo junginyje.

Junginiai union myunion { int i; double d; char ch; } mu, *muptr =

Junginiai union myunion { int i; double d; char ch; } mu, *muptr = μ

Junginiai #include <stdio. h> #include <stdlib. h> typedef union myunion { int I; double

Junginiai #include <stdio. h> #include <stdlib. h> typedef union myunion { int I; double d; char ch; }; int main () { myunion mu, *muptr = μ mu. ch = 'X'; printf("mu. ch = 'X'; n"); printf("tmu. ch = %c n", mu. ch); // mu. ch = X printf("tmu. i = %d n", mu. i); // neteisingas rezultatas printf("tmu. d = %f n", mu. d); // neteisingas rezultatas

Junginiai muptr->i = 1234567; printf("muptr->i = 1234567; n"); printf("tmuptr->ch = %c n", muptr->ch); //

Junginiai muptr->i = 1234567; printf("muptr->i = 1234567; n"); printf("tmuptr->ch = %c n", muptr->ch); // neteisingas rezultatas printf("tmuptr->i = %d n", muptr->i); // mu. i = 1234567 printf("tmuptr->d = %f n", muptr->d); // neteisingas rezultatas mu. d = 1. 41421356; printf("mu. d = 1. 41421356; n"); printf("tmu. ch = %c n", mu. ch); // neteisingas rezultatas printf("tmu. i = %d n", mu. i); // neteisingas rezultatas printf("tmu. d = %f n", mu. d); // mu. d = 1. 41421356 printf("n"); return (0); }