Un program C este compus dintr-o ierarhie de functii, orice program trebuind sa contina cel putin functia main, prima care se executa la lansarea programului C. Un program C are, in principiu,
urmatoarea structura:
Intr-o prima
faza, programele C care vor fi concepute vor contine doar
functia main
( care va fi void,
deci nu va returna nici un rezultat si nu va primi parametri, deci si lista
parametrilor va fi void
).Structura acestor programe va fi:
Definitia
unei functii are urmatoarea forma:
Daca functia nu returneaza
nici un rezultat si nu primeste parametri, definitia va fi:
Antetul unei functii urmat de ; se numeste prototipul functiei - reprezinta informatia despre interfata functiei - ce tip de rezultat returneaza si care sunt tipurile datelor primite, ale parametrilor formali. prototip -- antet; Cel mai simplu program C
este urmatorul, in care nu sunt definite tipuri, variabile globale sau
locale si de asemenea in main
nu se face nici o prelucrare:
Iata un alt exemplu de program C, dintre cele mai simple, care contine doar functia main si realizeaza afisarea unor date:
Un tip de date reprezinta o multime de valori pe care sunt definite anumite operatii. Limbajul C defineste urmatoarele tipuri:
Tipul void poate insemna:
Interesant,
nu?, doua notiuni filozofic opuse...
![]() La baza clasificarii tipurilor intregi stau doua criterii:
Tipurile char(signed char)si unsigned char sunt cele pentru care se aloca cel mai mic spatiu de memorie, 1 octet. De cele mai multe ori valorile de aceste tipuri se interpreteaza ca reprezentand coduri de caractere, dar se folosesc si pentru memorarea intregilor de valori mici, pentru economie de spatiu de memorie - daca o variabila trebuie sa retina un numar de apartament, de exemplu, poate fi declarata de tipul char. Constantele intregi
se reprezinta implicit in baza 10 si de tipul
signedcare
pentru reprezentare cere spatiu minim - intre paranteze apare tipul implicit
al fiecarei constante: -10000 ( int),
65000 ( long
).
Constantele caracter au fost prezentate la paragraful referitor la Atomii lexicali, in modulul Elemente de baza. Fiecare constanta caracter ocupa 2 octeti de memorie, primul are toti cei 8 biti de valoare 0, iar al doilea reprezinta codul ASCII al caracterului.
Valorile reale sunt reprezentate in virgula mobila. Trebuie semnalat faptul ca nu toate numerele reale pot fi reprezentate, intrucat memorarea valorilor reale, fiind realizata pe un numar anume de biti, nu poate retine decat o parte dintre cifrele semnificative. Deci numai anumite valori reale au reprezentarea exacta in calculator, restul confundandu-se cu reprezentarea cea mai apropiata. Exista trei tipuri reale:
float,
double,
long
double, cu caracteristici prezentate
in tabelul de mai jos. Valorile minime si maxime sunt date in modul; pentru
fiecare dintre tipurile reale, pot fi reprezentate valori intre [-valmax,
valmax], iar toate valorile intre (-valmin,valmin) se confunda cu zero.
Constantele reale
sunt implicit de tipul double;
sufixul f sau F aplicat unei constante, o face de tipul float, iar l sau
L de tipul long double.
In tabelul de mai jos apar
cateva exemple de constante reale:
Dimensiunea memoriei in octeti
ocupata de un tip de date, variabila, constanta, este data de operatorul
sizeof
( asupra caruia se va reveni la capitolul Operatori
). Iata mai jos un program C foarte simplu, care permite afisarea spatiului
de memorie ocupat de diferite entitati:
Tipul enumerare este un caz particular al tipurilor intregi. Se utilizeaza pentru a realiza o reprezentare comoda si sugestiva a unor obiecte ale caror valori sunt identificate printr-un numar finit de nume simbolice. Tipul enumerare declara constante simbolice, carora li se asociaza coduri numerice de tip intreg, astfel: enum nume_tip { lista_constante_simbolice }; /* nume_tip poate lipsi */ Compilatorul asociaza constantelor enumerate cate un cod intreg din succesiunea incepand cu 0. Exemple: enum zile_lucr { luni,
marti, miercuri, joi, vineri }; /*
luni e asociat cu 0, marti cu 1, ..., vineri cu 4 */
Daca se doreste o alta codificare a constantelor din enumerare decat cea implicita, pot fi folosite in enumerare elemente de forma: nume_constanta=valoare_intreaga; Constantelor simbolice ce urmeaza unei astfel de initializari li se asociaza numerele intregi urmatoare: enum transport { tren, autocar=5, autoturism, avion }; /* tren e asociat cu 0, autocar cu 5, autoturism cu 6, avion cu 7 */
Cuvantul cheie typedefpermite definirea de tipuri utilizator si anume echivalarea unor tipuri ( in general structurate, cu definitii lungi ) cu nume utilizator ( identificatori ): typedef tip_echivalat nume_de_tip; Exemple in care apar definite tipurile caracter, real, Zile_lucr, profesie: typedef char caracter; typedef long double real; typedef enum zile_lucr Zile_lucr;
typedef enum { inginer=1, profesor, avocat } profesie;
Variabila este o entitate folosita pentru memorarea unei valori de tipul asociat variabilei. O variabila se caracterizeaza printr-un nume, un tip, o valoare. Oricarei variabile i se aloca ( rezerva ) un spatiu de memorie care corespunzator tipului variabilei. Definirea variabilelor se poate face inainte de a functiilor, caz in care sunt globale, deci pot fi folosite de functii, sau in corpul functiilor, inainte de prelucrari, caz in care sunt localefunctiei respective ( vezi Structura unui program C ). Numele unei variabile este unic ( nu pot exista mai multe variabile cu acelasi nume ), dar o variabila locala poate avea numele uneia globale, caz in care in interiorul functiei, e valabila noua semnificatie a numelui. Definirea variabilelor se face: tip lista_declaratori;
/*
tip poate fi oricare din tipurile elementare de mai sus sau derivate
*/
apare
doar constante sau variabile initializate */
Exemple:
char c1;
In definirea tip lista_declaratori; tip poate fi precedat sau urmat de cuvantul cheie const, caz in care variabilele astfel definite trebuie sa fie initializate si nu-si pot modifica valoarea: const int coef1=-2, coef2=14;
In limbajul C, nu exista instructiuni de intrare/iesire ( citire/scriere ), tocmai pentru a mari portabilitatea limbajului. Pentru a realiza citiri de la tastatura si scrieri pe ecran, se apeleaza functii de intrare/iesire din biblioteca mediului de programare. Mai jos se vor prezenta functiile de I/E cele mai uzuale, primele avand prototipul in stdio.h, urmatoarele in conio.h; utilizarea lor intr-un program, va presupune deci, includerea respectivelor fisiere header.
De remarcat ca functiile de citire din aceasta categorie, realizeaza o citire cu buffer. Aceasta inseamna faptul ca toate codurile caracterelor tastate pana la Enter ( inclusiv ) sunt introduse intr-un buffer de intrare ( pentru Enter codul 10 corespunzator lui '\n' ), de unde sunt extrase pentru prelucrare de catre functiile de intrare; daca in buffer exista caractere neprelucrate, la apelul unei functii de intrare, acestea vor prelua codurile din buffer, numai dupa epuizarea acestora asteptandu-se o noua tastare.
Functia returneaza codul unui caracter citit de la tastatura sau valoarea EOF ( constanta simbolica definita in stdio.h, avand valoarea -1 ) daca s-a tastat Ctrl/Z.
Functia tipareste pe ecran caracterul transmis ca parametru; returneaza codul caracterului sau EOF in cazul unei erori.
Functia afiseaza pe ecran valorile expresiilor din lista argumentelor, conform formatului specificat; argumentele pot fi constante, variabile, expresii. Formatul este un sir de caractere care trebuie sa includa cate un descriptor de format pentru fiecare din argumente. Caracterele din format care nu fac parte din descriptori se tiparesc pe ecran. Daca nu apare nici un argument, pe ecran se tiparesc doar caracterele din sirul format. Functia returneaza numarul de valori tiparite sau EOF in cazul unei erori. Descriptori de format
Functia citeste informatiilem
tastate pe care le interpreteaza conform specificatorilor din format, memorand
valorile citite la adresele transmise ca parametri. Formatul este un sir
de caractere care trebuie sa includa cate un descriptor de format pentru
fiecare dintre valorile citite. Adresele sunt pointeri sau adresele variabilelor
ale caror valori se citesc; adresa unei variabile
se obtine folosind operatorul de adresare &,
astfel:
Functia tipareste sirul primit ca parametru, apoi un NL, cursorul trecand la inceputul randului urmator. Returneaza codul ultimului caracter din sir.
Functia sterge ecranul, aducand cursorul in coltul din stanga-sus. Se apeleaza de obicei la inceputul unui program.
Citeste un caracter ( asteapta apasarea unei taste, chiar daca in buffer-ul de intrare mai sunt caractere neprelucrate ), returnand codul si afisand caracterul pe ecran. Returneaza EOF la tastarea lui Ctrl/Z, respectiv CR ( '\r', cu codul 13 ) la tastarea lui Enter.
Analog cu functia de mai sus, dar caracterul nu se transmite in ecou ( nu se afiseaza pe ecran ). Se obisnuieste ca programele sa se termine cu un apel getche sau getch, asteptandu-se astfel tastarea unui caracter - pentru a nu "disparea" ecranul utilizator cu afisarile realizate de program; ecranul poate fi revizualizat din mediul TC tastand Alt/F5.
Daca la autotestele de mai jos, alegeti varianta corecta, pasul urmator sunt Exercitiile! Daca nu, revedeti putin notitele de mai sus :-) 1.Cum se defineste corect o variabila suma de tip intreg? 2.Care varianta reprezinta definirea unei constante simbolice TRUE avand valoarea 1? 3.Daca un program contine liniile: int
i; char c;
iar
la rulare se tasteaza
ce valoare va lua variabila c? 4.Care varianta de mai jos scrie pe ecran O zi buna!, cursorul trecand apoi la randul urmator? 5.Care este valoarea expresiei sizeof(long double)?
1.Pentru
cate un intreg citit de la tastatura, sa se afiseze valoarea lui si a opusului
in zecimal, hexazecimal, octal; programul se va modifica astfel incat sa
permita citirea in zecimal, hexazecimal, respectiv octal.
La
executia programului se vor introduce
#include
<stdio.h>
2.Sa se afiseze valorile extreme in zecimal, octal, hexa pentru toate tipurile intregi. #include <stdio.h> void
main(void){
clrscr();
getche();
3 Se citesc triplete de numere reale; sa se tipareasca suma si produsul lor. Se
va observa :
#include <stdio.h> void main(void){ float
r1,r2,r3;
4 La rularea programului de mai jos, faceti observatii referitoare la valorile citite, separarea lor, functionarea lui scanf, getchar, getche: #include <stdio.h> void main(void){ int
i;
5 Ce apare pe ecran la tiparirea ( incercare pe hartie, apoi rulare ):
int i=5;float r=23.789e-4;c='C';
6 Sa se scrie programul care, apeland o singura data printf, tipareste pe ecran ( analog pentru un apel puts ) - aici un mic ajutor, vezi rezovarea: Informatii
100% corecte:
printf("Informatii 100%% corecte:\n\I.Ionescu / 24 ani \\ zis \"a lu' Vasile\"\n");
7. Analog cu 6. pentru ca pe ecran sa apara urmatorul text ( printr-un singur apel printf sau puts ): Caractere
speciale:
8.Rulati programul de mai jos, observand utilizarea tipurilor enum si declararea tipurilor utilizator cu typedef( ce credeti ca se va tipari ca valoare a variabilei amestec ?) : #include
<stdio.h>
void main(void){ enum zile_lucr { luni, marti, miercuri, joi, vineri }; /* luni e asociat cu 0, ...,vineri cu 4 */
enum transport { tren, avion=5, autocar, autoturism }; /*
tren e asociat cu 0, autocar cu 6,
typedef enum zile_lucr Zile_lucr; typedef enum { inginer=1, profesor, avocat } profesie; /* se pot defini variabile de tipurile enum */
enum zile_lucr zi1=marti;
printf("val zi1=%d\n",zi1);
} 9.
Scrieti programul care citeste de la tastatura doua caractere reprezentand
initialele unei persoane si anul nasterii, afisand
Copyright © 2001-2002. Carmen Holotescu All rights reserved. Published by Timsoft |