Download presentation
Presentation is loading. Please wait.
1
Programavimo ir IT pagrindai
9 paskaita Lekt. Tomas G. Lipnevičius
2
Programavimo pagrindai
Programavimas
3
Funkcijos apibrėžimas
Funkcijos apibrėžimas: [atminties klasė] [tipas] funkcijos_pavadinimas ([formaliųjų parametrų sąrašas]) { Funkcijos kūnas } Atminties klase gali būti: extern arba static Tipas: Čia nurodomas funkcijos rezultato tipas. Šiuo tipu gali būti bet kuris iš bazinių tipų, struktūros ar išvardijimas (enum). Jei tipas nenurodomas pagal nutylėjimą yra manoma, kad tai bus int tipas.
4
Funkcijos apibrėžimas
Funkcijos pavadinimas gali būti su simboliu *. Tai reiškia, kad funkcija grąžina rodyklę. Funkcijos negali grąžinti masyvų ar funkcijų, bet gali grąžinti rodyklę į bet kokį tipą įskaitant masyvus ir funkcijas. Funkcijos rezultato tipas būtinai turi atitikti tipą funkcijos apraše (prototipe). Funkcija grąžina rezultatą, jei jos įvykdymas pasibaigia operatoriumi return: return išraiška;
5
Funkcijos Išraiška gali būti skaičiuojama (pvz. return a + b;), konvertuojama (pvz. return (int) a;) jei būtina į funkcijos rezultato tipą aprašyto funkcijos prototipe ar apibrėžime, ir perduodama į funkcijos kvietimo vietą. Jei operatorius return nenurodomas ar neturi jokios išraiškos – funkcija negrąžina rezultato. Šiuo atveju būtina vietoje funkcijos rezultato tipo naudoti void.
6
Funkcijos parametrai Formaliųjų parametrų sąrašas: tai tam tikra tvarka surašyti formaliųjų parametrų aprašai. Iš tikrųjų tai yra kintamieji, kurie įgauna reikšmes, kurios yra perduodamos kviečiant funkciją. Formalieji parametrai yra atskiriami kableliais. Parametrų sąrašas gali baigtis ir daugtaškiu (,...). Tai reiškia, kad funkcijos parametrų sąrašas yra kintamas (pvz. funkcijos printf ir scanf). Bet manoma, kad funkcija gali turėti mažiausiai tiek parametrų, kiek jų yra aprašyta iki paskutinio kablelio. Funkcijai galime perduoti daugiau argumentų nei yra aprašyta parametrų iki paskutinio kablelio. Tokiems argumentams nebus daroma tipų patikrinimo kontrolė. Jei funkcijai parametrai nėra perduodami tada naudojame void. Formaliųjų parametrų tvarka ir tipai turi atitikti vienodi ir funkcijos apibrėžime ir aprašuose. Faktinių argumentų tipai kviečiant funkciją turi atitikti formaliųjų parametrų tipus. Formalusis parametras gali būti bet kokio bazinio tipo, struktūra, sąrašo, išvardinimo, rodykle ar masyvu.
7
Funkcijos kūnas Funkcijos kūnas tai sudėtinis funkcijos operatorius, kurį sudaro operatoriai, nusakantys funkcijos veikimą. Jį gali sudaryti ir reikalingų kintamųjų apibrėžimai, kurie naudojami funkcijos kūne. Visi kintamieji apibrėžti funkcijoje yra lokalieji. Tuo metu kai kviečiama funkcija, lokaliems kintamiesiems yra išskiriama atmintis ir įvykdoma jų inicializacija (jei ji nurodyta). Funkcijoje valdymas yra perduodamas pirmam operatoriui ir prasideda funkcijos vykdymas, kuris tęsiasi tol kol nebus pasiektas operatorius return ar funkcijos kūno pabaiga. Valdymas tada yra perduodamas į tą programos vietą kurioje funkcija buvo kviečiama. Jei funkcija turi grąžinti rezultatą – reikia įvykdyti operatorių return ir nurodyti jam grąžinamą reikšmę.
8
Funkcijos parametrai C kalboje funkcijos parametrai yra perduodami pagal reikšmę ir funkcijoje yra traktuojami kaip lokalieji kintamieji, kuriems yra išskiriama atmintis prieš pradedant vykdyti funkciją, jie yra inicializuojami funkcijai perduodamomis reikšmėmis ir yra prarandami išėjus iš funkcijos kūno. Todėl funkcijoje negalima pakeisti parametro, nes funkcija dirba su argumentų kopijomis. Bet jei vietoje reikšmių funkcijai perduosim rodyklę, funkcijoje pasinaudojus išadresavimo funkcija galima pakeisti parametro reikšmę.
9
Funkcijos Reikšmių keitimo funkcija: //blogas pavyzdys void mainai (int x, int y) { int temp = x; x = y; y = temp; } //geras pavyzdys void mainai (int *ptr_x, int *ptr_y) int temp = *ptr_x; *ptr_x = *ptr_y; *ptr_y = temp;
10
Funkcijos prototipas Jei reikia iškviesti funkciją iki jos panaudojimo viename faile arba funkcijos apibrėžimas yra kitame faile, prieš kviečiant tokią funkciją reikia ją aprašytį, t.y. sukurti jai prototipą. Prototipas leis kompiliatoriui atlikti argumentų ir rezultato patikrinimą. Prototipas aprašomas tokiu būdu: [atminties klasė] [tipas] funkcijos_pavadinimas ([formaliųjų parametrų sąrašas]); Skirtingai nei funkcijos apibrėžimas, prototipas yra užbaigiamas kabliataškiu.
11
Funkcijos_pavadinimas ([išraiškų sąrašas]);
Funkcijos kvietimas Funkcija kviečiama taip: Funkcijos_pavadinimas ([išraiškų sąrašas]); Išraiškų sąrašas tai faktiniai argumentai, kurie yra perduodami funkcijai. Funkcijos kvietimas atrodo sekančiu būdu: Pirmiausią yra atliekami skaičiavimai išraiškų sąraše. Pvz. kviečiame funkciją ir perduodame jai parametrus (a+b, c, d-e). Toliau, jei yra žinomas funkcijos prototipas, rezultato tipas yra lyginamas su formaliuoju rezultato tipu, t.y. žiūrima kokio tipo reikšmė yra return operatoriuje ir koks yra rezultato tipas prototipe. Jei jie neatitinka yra arba bandoma suvienodinti tipus arba yra gaunamas atitinkamas pranešimas (pvz. klaida). Toliau tikrinama ar faktinių parametrų skaičius sutampa su formaliųjų parametrų skaičiumi, išskyrus tą atvejį kai turime kintamą kiekį parametrų. Tokiu atveju kompiliatorius patikrina tiek argumentų kiek tipų yra formaliųjų parametrų sąraše ir esant reikalui bando juos suvienodinti. Jei funkcijos prototipe vietoje formaliųjų parametrų turime void, tai reiškia kad funkcijai nėra perduodami argumentai ir funkcijos prototipe neturi būti parametrų. Jei tai ne taip – duodamas atitinkamas pranešimas. Vykdomas formaliųjų parametrų keitimas faktiniais argumentai. Pirmas formalusis atitinka pirmąjį faktinį argumentą ir t.t. Valdymas perduodamas pirmam funkcijos operatoriui. Operatoriaus return vykdymas funkcijos kūne grąžina valdymą ir galimai rezultatą kviečiančiai funkcijai. Jei operatoriaus return nėra, valdymas bus gražintas įvykdžius paskutinį funkcijos operatorių.
12
Rekursiniai funkcijų kvietimai
Bet kuri funkcija C kalboje gali būti išviesta rekursyviai, t.y. gali kviesti pati save. Kompiliatorius leidžia bet kokį skaičių rekursinių kvietimų, bet tą kiekį gali riboti operacinė sistema. Kiekvieno funkcijos kvietimo metu yra išskiriama nauja atmintis, tokiu būdu reikšmės iš prieš tai neužbaigtų kvietimų nedingsta, bet parametrai iš prieš tai neužbaigtų kvietimų nėra pasiekiami. Rekursijos pavydžiu gali būti faktorialo skaičiavimas: n! = 1, kai n=0 ir n!= n* (n-1)!, kai n>1. long faktorialas (int n) { return (n<=1) ? 1 : n * faktorialas (n-1); }
13
Rekursiniai funkcijų kvietimai
//Faktorialo n!= 1* 2 *...* n skaiciavimas 0!=1, Vn>0, n!=n *(n -1)! #include<stdio.h> long Faktorialas(long); int main() { int n; printf("Iveskite sveika skaciu: "); scanf("%d", &n); printf ("%d! = %d\n", n, Faktorialas(n)); return 0; } long Faktorialas(long skaicius) if ( skaicius <=1 ) return 1; else return (skaicius * Faktorialas(skaicius - 1));
14
ctype.h <ctype.h> - simbolių tikrinimų funkcijos.
int isalnum(int c); grąžina 1 jei tai didžioji raidė, 2 – jei mažoji, 0 – jei skaičius. Analogais gali būti isalpha(c) ar isdigit(c); isalpha(c) or isdigit(c) grąžina 1 jei tai didžioji raidė, 2 – jei mažoji, 0 – jei skaičius. Analogais gali būti isupper(c) ar islower(c); int isalpha(int c); isupper(c) or islower(c) int iscntrl(int c); //is control character. In ASCII, control characters are 0x00 (NUL) to 0x1F (US), and 0x7F (DEL) int isdigit(int c); //is decimal digit
15
ctype.h int isgraph(int c); //is printing character other than space
int islower(int c); //is lower-case letter int isprint(int c); //is printing character (including space). In ASCII, printing characters are 0x20 (' ') to 0x7E ('~') int ispunct(int c); //is printing character other than space, letter, digit int isspace(int c);/ /is space, formfeed, newline, carriage return, tab, vertical tab int isupper(int c); //is upper-case letter int isxdigit(int c); //is hexadecimal digit int tolower(int c); //return lower-case equivalent int toupper(int c);
16
math.h double exp(double x); exponential of x
double log(double x); natural logarithm of x double log10(double x); base-10 logarithm of x double pow(double x, double y); x raised to power y double sqrt(double x); square root of x double ceil(double x); smallest integer not less than x double floor(double x); largest integer not greater than x double fabs(double x); absolute value of x double modf(double x, double* ip); returns fractional part and assigns to *ip integral part of x, both with same sign as x double fmod(double x, double y); if y non-zero, floating-point remainder of x/y, with same sign as x; if y zero, result is implementation-defined
17
math.h double sin(double x); sine of x
double cos(double x); cosine of x double tan(double x); tangent of x double asin(double x); arc-sine of x double acos(double x);arc-cosine of x double atan(double x); arc-tangent of x double atan2(double y, double x); arc-tangent of y/x
18
stdio.h EOF Value used to indicate end-of-stream or to report an error. NULL Null pointer constant. SEEK_CUR Value for origin argument to fseek specifying current file position. SEEK_END Value for origin argument to fseek specifying end of file. SEEK_END Value for origin argument to fseek specifying beginning of file. stdin File pointer for standard input stream. Automatically opened when program execution begins. stdout File pointer for standard output stream. Automatically opened when program execution begins. stderr File pointer for standard error stream. Automatically opened when program execution begins.
19
stdio.h FILE Type of object holding information necessary to control a stream. FILE* fopen(const char* filename, const char* mode); Opens file named filename and returns a stream, or NULL on failure. mode may be one of the following for text files: "r“ text reading "w“ text writing "a“ text append "r+”text update (reading and writing) "w+”text update, discarding previous content (if any) "a+“ text append, reading, and writing at end or one of those strings with b included (after the first character), for binary files. FILE* freopen(const char* filename, const char* mode, FILE* stream); Closes file associated with stream, then opens file filename with specified mode and associates it with stream. Returns stream or NULL on error.
20
stdio.h int fflush(FILE* stream);
Flushes stream stream and returns zero on success or EOF on error. Effect undefined for input stream. fflush(NULL) flushes all output streams. int fclose(FILE* stream); Closes stream stream (after flushing, if output stream). Returns EOF on error, zero otherwise. int remove(const char* filename); Removes specified file. Returns non-zero on failure. int rename(const char* oldname, const char* newname); Changes name of file oldname to newname. Returns non-zero on failure. int fprintf(FILE* stream, const char* format, ...); Converts (according to format format) and writes output to stream stream. Number of characters written, or negative value on error, is returned. Conversion specifications consist int printf(const char* format, ...); printf(f, ...) is equivalent to fprintf(stdout, f, ...) int fscanf(FILE* stream, const char* format, ...); Performs formatted input conversion, reading from stream stream according to format format. The function returns when format is fully processed. Returns number of items converted and assigned, or EOF if end-of-file or error occurs before any conversion. Each of the arguments following format must be a pointer.
21
stdio.h int scanf(const char* format, ...);
scanf(f, ...) is equivalent to fscanf(stdin, f, ...) int fputc(int c, FILE* stream); Writes c, to stream stream. Returns c, or EOF on error. int getc(FILE* stream); Equivalent to fgetc except that it may be a macro. int getchar(void); Equivalent to getc(stdin). char* gets(char* s); Copies characters from stdin into s until newline encountered, end-of-file reached, or error occurs. Does not copy newline. NUL-terminates s. Returns s, or NULL on end-of-file or error. Should not be used because of the potential for buffer overflow. int putc(int c, FILE* stream); Equivalent to fputc except that it may be a macro. int putchar(int c); putchar(c) is equivalent to putc(c, stdout). int puts(const char* s); Writes s (excluding terminating NUL) and a newline to stdout. Returns non-negative on success, EOF on error. int feof(FILE* stream); Returns non-zero if end-of-file indicator is set for stream stream
22
stdlib.h RAND_MAX Maximum value returned by rand(). NULL
Null pointer constant. int abs(int n); long labs(long n); Returns absolute value of n. double atof(const char* s); ir double strtod(const char* s, char** endp); Converts initial characters (ignoring leading white space) of s to type double. If endp non-null, stores pointer to unconverted suffix in *endp. long atol(const char* s); ir long strtol(const char* s, char** endp, int base); Converts initial characters (ignoring leading white space) of s to type long. void* calloc(size_t nobj, size_t size); Returns pointer to zero-initialised newly-allocated space for an array of nobj objects each of size size, or NULL on error.
23
stdlib.h void* malloc(size_t size);
Returns pointer to uninitialised newly-allocated space for an object of size size, or NULL on error. void* realloc(void* p, size_t size); Returns pointer to newly-allocated space for an object of size size, initialised, to minimum of old and new sizes, to existing contents of p (if non-null), or NULL on error. On success, old object deallocated, otherwise unchanged. void free(void* p); If p non-null, deallocates space to which it points. void exit(int status); Terminates program normally. int rand(void); Returns pseudo-random number in range 0 to RAND_MAX
24
string.h NULL Null pointer constant.
char* strcpy(char* s, const char* ct); Copies ct to s including terminating NUL and returns s. char* strcat(char* s, const char* ct); Concatenate ct to s and return s. int strcmp(const char* cs, const char* ct); Compares cs with ct, returning negative value if cs<ct, zero if cs==ct, positive value if cs>ct.
25
time.h struct tm Represents the components of calendar time:
int tm_sec; seconds after the minute int tm_min; minutes after the hour int tm_hour; hours since midnight int tm_mday; day of the month int tm_mon; months since January int tm_year; years since 1900 int tm_wday; days since Sunday int tm_yday; days since January 1 int tm_isdst;
26
limits.h CHAR_BIT number of bits in a char CHAR_MAX
maximum value of type char CHAR_MIN minimum value of type char SCHAR_MAX maximum value of type signed char SCHAR_MIN minimum value of type signed char UCHAR_MAX maximum value of type unsigned char SHRT_MAX maximum value of type short
27
limits.h SHRT_MIN minimum value of type short USHRT_MAX
maximum value of type unsigned short INT_MAX maximum value of type int INT_MIN minimum value of type int UINT_MAX maximum value of type unsigned int LONG_MAX maximum value of type long LONG_MIN minimum value of type long ULONG_MAX maximum value of type unsigned long
28
Masyvai C kalboje perduodant masyvus funkcijoms yra perduodama ne pati duomenų struktūra, o tik rodyklė į ją, t.y. nurodant masyvo pavadinimą iš tikrųjų turime omeny rodyklę į pirmą masyvo elementą. Dėl šios priežasties visi pakeitimai daromi kitose funkcijose su reikalingo masyvo elementais yra “matomi” funkcijose kurioje masyvas buvo apibrėžtas ar kuriai masyvas yra perduodamas. Išvada – masyvo grąžinti iš funkcijos nereikia.
29
Masyvai Perduodant masyvą funkcijai kartu prasminga perduoti ir jo elementų kiekį: int suma (int masyvas[], int kiekis) { int i, suma; for (i=0; i<kiekis; i++) suma+=masyvas[i]; return suma; } int main() int mas[10], kiekis=10; … printf (“Masyvo elementų suma lygi %d”, suma(mas, 10));
30
duomenu_tipas *vardas;
Rodyklės – kas tai? Kintamasis tai objektas turintis vardą ir kintančią reikšmę. Kintamajam išskiriama atmintis, kurios dydis priklauso nuo tipo. Kintamojo reikšme gali būti adresas. Rodyklės tipo kintamasis apinrėžiamas taip: duomenu_tipas *vardas; pvz.: int *ptr; char *eilute; Teoriškai rodyklė galėtų “rodyti” į bet kokią atminties vietą, bet praktiškai rodyklė “rodo” į adresą kuriuo saugomas nurodyto tipo objektas.
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.