Sunteți pe pagina 1din 64

Programare imperativ-procedural. Introducere n C#.

Programare imperativ-procedural. Introducere n C#


Cuprins
CAPITOLUL I. INTRODUCERE N LIMBAJUL C# 1.1 Ce este .Net Framework? 1.1 Conceptele de baz ale limbajului C# 1.3 Structura unui program C# 1.4 Metodele unui clase 1.5 Comentarii 1.6 Declaraii 1.7 Blocuri de instruciuni 1.8 Identificatori 1.9 Cuvinte cheie 1.10 Tipuri de date 1.11 Variabile 1.12 Constante 1.13 Lucrare de verificare Nr.1 1.14 Expresii 1.15 Operatori aritmetici 1.16 Operatori de atribuire 1.17 Operatori relaionali 1.18 Operatori logici. Operatori logici la nivel de bii 1.19 Operatorul condiional ?: 1.20 Lucrare de verificare Nr.2 1.21 Bibliografie CAPITOLUL II. INSTRUCIUNI 2.1 Instruciunea if-else 2.2 Instruciunea switch 2.3 Instruciunea for 2.4 Instruciunea do-while 2.5 Instruciunea while 2.6 Instruciunea foreach 2.7 Instruciunea break 2.8 Instruciunea continue 2.9 Instruciunea goto 2.10 Instruciunea return 2.11 Lucrare de verificare Nr.1 2.12 Bibliografie CAPITOLUL III. TIPURI DEFINITE DE UTILIZATOR 3.1 Tipul enumerare 3.2 Tipul tablou 3.3 Conversii numerice. 3.4 Lucrare de verificare Nr.4 3.5 Bibliografie 4 4 4 5 8 9 10 10 10 11 11 13 15 15 16 16 17 19 20 20 21 21 22 22 22 23 25 26 26 28 30 30 32 33 33 34 34 36 38 40 41

Programare imperativ-procedural. Introducere n C#. CAPITOLUL IV. CLASE NOIUNI DE BAZ 4.1 Clasele. Noiuni de baz 4.2 Cmpuri 4.3 Metode 4.4 Crearea variabilelor i instanelor unei clase 4.5 Membrii unei instane 4.6 Modificatori de acces 4.7 Accesul privat sau public 4.8 Lucrare de verificare Nr.1 4.9 Bibliografie

42 43 45 58 60 60 61 63 63

Programare imperativ-procedural. Introducere n C#.

Introducere
Cursul de fa cuprinde att noiunile de baz ale limbajului C#, ct i unele elemente de nivel mediu i avansat. Cursul poate fi un instrument util pentru nsuirea i consolidarea cunotinelor pentru oricine dorete s neleag i s fie iniiat ntr-un limbaj de programare. Primele cinci capitole cuprind noiuni de baz ale limbajului C#: tipuri de date i instruciuni elementare, care au rolul de a iniia studentul n limbajul de programare C# aducndu-l la un nivel mediu. Ultimul capitol (PROBLEME REZOLVATE I EXPLICATE) are un rol important n pregtire. n acest capitol sunt prezentate i explicate n detaliu programe de nivel mediu spre complex, cu scopul de a clarifica noiunile fundamentale de programare C#, explicaii menite a forma o gndire algoritmic riguroas. Obiectivele cursului Scopul acestui curs este de a va nva noiunile de baz ale programrii n C#, i de realiza trecerea studentului de la un cunosctor al limbajului C# la un programator C#. Cursul se adreseaz, n primul rnd studenilor din anul I, celor care studiaz un curs elementar sau academic de algoritmi, structuri de date i limbaje de programare.

Durata medie de studiu individual - 2 ore

Programare imperativ-procedural. Introducere n C#. 1. INTRODUCERE N LIMBAJUL C# Obiective: Dup studiul acestui capitol, studentul va avea cunotine suficiente pentru a fi capabil s neleag noiunile de: Structura unui program C#, Metodele unui clase, Clasa Console, Blocuri de instruciuni, Tipuri de date, Variabile i Constante. 1.1 Ce este .Net Framework? .Net este un cadru ( Framework ) pentru dezvoltarea software, care permite distribuirea si rularea aplicatiilor desktop Windows si Web. .Net Framework este o componenta a sistemului de operare Windows si care, firesc, de-a lungul timpului s-a dezvoltat, la ora scrierii acestei cri fiind Net Framework 4. Fiecare versiune a adus cate ceva nou, toate contribuind la complexitatea de astazi a acestui mediu de dezvoltare. Componenta .Net Framework este formata din compilatoare, biblioteci plus multe alte executabile folosite in rularea aplicaiilor .Net C# este un limbaj de programare ce are o legtur deosebit cu mediul su de rulare, arhitectura .NET din dou motive. Primul, C# a fost iniial dezvoltat de Microsoft pentru crearea codului pentru arhitectura .NET. al doilea motiv, bibliotecile utilizate de C# sunt cele definte de arhitectura .NET. In concluzie, chiar dac este posibil s separm limbajul C# de mediul .NET, acestea sunt foarte strns legate. Arhitectura .NET definete un mediu care permite amestecarea diferitelor limbaje de programare i ofer faciliti de securitate i portabilitate a programelor i un mediu de programare comun pentru platformele Windows. 1.2 Conceptele de baz ale limbajului C# C# este un limbaj de programare orientat-obiect conceput de Microsoft la sfritul anilor 90. Acesta fost conceput ca un concurent pentru limbajul Java. C# este un derivat al limbajului de programare C++ i a fost dezvoltat de o echip restrns de ingineri de la Microsoft, echip din care s-a evideniat Anders Hejlsberg (autorul limbajului Turbo Pascal i membru al echipei care a proiectat Borland Delphi). Limbajul C# este simplu, cu circa 80 de cuvinte cheie, i 15 tipuri de date predefinite. El permite programarea structurat, modular i orientat obiect, conform preceptelor moderne ale programrii profesioniste. Limbajul de programare C# a fost proiectat pe baza experienelor acumulate din celelalte limbaje de programare. ntregul limbaj C# se bazeaz pe conceptul de obiecte. n esen, structura unui program scris n C# este gndit pe mai multe niveluri, aa cum se arat n figura urmtoare.

Programare imperativ-procedural. Introducere n C#.

Figura 1. ntr-un program C# vom avea cod de program n care se definesc metode, care sunt incluse n clase, care la rndul lor sunt incluse n spaii de nume.

1.3 Structura unui program C# Un program scris ntr-un limbaj de programare const din instruciuni n limba englez, denumite cod surs. O instruciune a unui limbaj de programare reprezint o comand dat calculatorului. Totalitatea instruciunilor care descriu cum se rezolv o anumit problem se numete program. Structura unui program scris n limbajul C# este descris n figura urmtoare:

Figura 2. Structura unui program scris n limbajul C#

Urmtorul program C# afieaz pe ecran mesajul Hello World !:

Figura 3. Exemplu de program C#

Programare imperativ-procedural. Introducere n C#.

Un program C# este format din una sau mai multe clase, grupate ntr-un spaiu de nume (namespace). Un spaiu de nume este o colecie de clase care au asociat un nume. Acesta poate cuprinde mai multe clase cu nume diferite avnd funcionaliti nrudite. Dou clase pot avea acelai nume cu condiia ca ele s fie definite n nume de spaii diferite. n cadrul aceluiai spaiu de nume poate aprea definiia unui alt spaiu de nume, caz n care avem de-a face cu spaii de nume imbricate. Spaiile de nume ofer o modalitate de a menine un set de nume separat fa de altele. Spaiul de nume utilizat n program este system, care este spaiul rezervat elementelor asociate cu biblioteca de clase a arhitecturii .NET, bibliotec utilizat de ctre C#. Cuvntul cheie using. precizeaz faptul c programul folosete numele din spatiul de nume dat. O clas poate fi identificat prin numele complet (nume precedat de spaiul de nume sau spaiilor de nume din care face parte clasa respectiv, cu separatorul punct). n exemplul nostru, Simple.Program este numele cu specificaie complet a clasei Program. Codul i datele scrise n limbajul C# trebuie incluse ntr-o clas. Nu se pot defini variabile i nu se pot scrie declaraii nafara claselor. O clas este format din date i metode (funcii). Toate clasele deriv din clasa de baz denumit object. Apelarea unei metode n cadrul clasei n care a fost definit aceasta presupune specificarea numelui metodei. Apelul unei metode definite n interiorul unei clase poate fi invocat i din interiorul altei clase, caz n care este necesar specificarea clasei i apoi a metodei separate prin punct. Dac n plus, clasa aparine unui spaiu de nume neinclus n fiierul curent, atunci este necesar precizarea tuturor componentelor numelui: spaiu_de_nume.clas.metod sau spaiu_de_nume.spaiu_de_nume.clas.metod, etc. n programul nostru de mai sus se afl dou spaii de nume: unul definit (Simple) i unul extern inclus prin directiva using System;. Console.WriteLine reprezint apelul metodei WriteLine definit n clasa Console. Cum n spaiul de nume curent este definit doar clasa Program, deducem c definiia clasei Console trebuie s se gseasc n spaiul System. n cazul n care mai muli programatori lucreaz la realizarea unei aplicaii complexe, exist posibilitatea de a segmenta aplicaia n mai multe fiiere numite assemblies. ntr-un assembly se pot implementa mai multe spaii de nume, iar pari ale unui aceeai spaiu de nume se pot regsi n mai multe assembly-uri. Pentru o aplicaie consol, ca i pentru o aplicaie Windows de altfel, este obligatoriu ca una (i numai una) dintre clasele aplicaiei s conin un punct de intrare (entry point), i anume metoda (funcia) Main. S comentm programul de mai sus: linia 1: spune compilatorului c acest program utilizeaz tipuri de date i clase incluse n spaiul de nume System. n cazul nostru se va folosi clasa Console. 6

Programare imperativ-procedural. Introducere n C#. linia 3: se declar un nou spaiu de nume, numit Simple. Noul spaiu de nume ncepe la acolada deschis din linia 4 i extinde pn la acolada nchis din linia 12. Orice tip declarat n aceast seciune este membru al spaiului de nume Simple. linia 5: orice program C# este alctuit din una sau mai multe clase. n aceast linie este declarat un nou tip de clas, denumit Program. Orice membrii declarai ntre acoladele care ncep n linia 6 i se termin n linia 11 sunt membrii care alctuiesc aceast clas. linia 7: n aceast linie este declarat metoda (funcia) Main ca membru al clasei Program. n acest program, metoda (funcia) Main este doar un membru al clasei Program. Main este o funcie special utilizat de compilator ca punctul de intrare n program. linia 9: Conine doar o singur declaraie simpl; aceast linie constituie corpul funciei Main. Aceast declaraie folosete clasa numit Console, amintit mai sus, care aparine spaiului de nume System i este folosit pentru operaiile de intrare/ieire. Aici se apeleaz metoda WriteLine din aceast clas, pentru afiarea mesajului dorit pe ecran. Fr folosirea directivei din linia 1 - using System compilatorul nu are de unde s tie unde se gsete clasa Console.

Exist dou moduri de a edita, compila i rula un program n C#. n primul rnd, putei utiliza compilatorul n linie de comand, csc.exe. A doua posibilitate este s utilizai mediul de dezvoltare integrat (IDE) Visual C++. Pentru a crea i rula programe utiliznd compilatorul C# n linie de comand, trebuie s parcurgei urmtorii trei pai: 1. Introducei textul programului. 2. Compilai programul. 3. Rulai programul. Pentru a compila programul, executa compilatorul C#, csc.exe, preciznd i numele fiierului surs n linia de comand, dup cum observai mai jos: C:\>csc SimpleProgram.cs. Compilatorului csc creeaz un fiier numit SimpleProgram.exe, care con ine versiunea MSIL a programului. Chiar dac formatul MSIL nu reprezint cod executabil, acesta este con inut tot ntr -un fiier cu extensia .exe. Motorul comun de programare invoc automat compilatorul JIT atunci cnd ncercai s executai SimpleProgram.exe. Pentru a rula programul, este suficient s-i tastai numele n linia de comand, dup cum observai i mai jos: c:\> SimpleProgram

Programare imperativ-procedural. Introducere n C#. 1.4 Metodele unui clase O metod este un bloc de cod format dintr-o serie de instruciuni care conduc la realizarea unei aciuni. O metod este asemntoare cu funciile, procedurile sau subrutinele din limbajul C, C++ sau Pascal cu anumite excepii. O metod este o funcie coninut nuntrul unei clase. Metoda Main() Orice aplicaie scris n limbajul C# trebuie s conin o metod numit Main(), care reprezint punctul de intrare n aplicaie. n acest exemplu metoda Main() nu preia nici un argument din linia de comand i nu returneaz explicit un indicator de stare a terminrii programului. Toate liniile de cod care formeaz corpul metodei Main() vor fi executate automat atunci cnd programul este rulat. Clasa Console
Clasa Console aparine de spaiul de nume System. Cele dou metode (funcii de afiare pe ecran) Write i WriteLine afieaz pe consol (ecran) argumentele din parantez. n cazul metodei WriteLine, dup afiare se trece la linie nou. Urmtoarea linie de cod este un exemplu al utilizrii metodei Write:
Console.Write("Acesta este un text."); Output string

Codul scris mai sus produce urmtoarea ieire pe ecran: Acesta este un text. Un alt exemplu este urmtorul cod, care afieaz pe ecran trei iruri de caractere:
System.Console.Write ("This is text1."); System.Console.Write ("This is text2."); System.Console.Write ("This is text3.");

Acest cod produce urmtoarea ieire:


This is text1. This is text2. This is text3.

Sintaxa metodei Write i WriteLine este urmtoarea:


Console.WriteLine( FormatString, SubVal0, SubVal1, SubVal2, ... );

Dac exist mai muli parametrii, acetia sunt separai prin virgul. Primul parametru trebuie s fie ntotdeauna un ir de caractere i este denumit ir de formatare (format string). irul de formatare poate conine marcatori de substituie (substitution markers). Un marcator de substituie marcheaz poziia n formatul irului unde o valoare se substituie atunci cnd irul este afiat pe ecran. Un marcator este un numr natural cuprins ntre acolade, i care reprezint poziia numeric a valorii care urmeaz a fi substituit i care ncepe de la 0. Parametrii care urmeaz dup irul de formatare se numesc valori de substituie (substitution values). Urmtorul cod conine doi marcatori de substituie, numrul 0 i 1, i dou valori de care urmeaz a fi substituite, 3 i 6. 8

Programare imperativ-procedural. Introducere n C#.


Substitution markers Console.WriteLine("Two sample integers are {0} and {1}.", 3, 6); Format string Substitution values

Acest cod produce pe ecran: Two sample integers are 3 and 6. Un marcator nu trebuie s refere o valoare de la o poziie mai lung dect lista valorilor ce trebuie substituite, n caz contrar se produce o eroare. Urmtorul exemplu reflect aceast situaie:
Poziia 0 Poziia 1 Console.WriteLine("Two integers are {0} and {2}.",3, 6); // Error! Nu exist poziia 2.

1.5 Comentarii Comentariile sunt buci de text care sunt excluse de la compilarea programului i care servesc la introducerea n program a unor explicaii referitoare la pri ale acestuia. comentariu pe un rnd prin folosirea // Tot ce urmeaz dup caracterele // sunt considerate, din acel loc, pn la sfritul rndului drept comentariu:
// Acesta este un comentariu pe un singur rnd

comentariu pe mai multe rnduri prin folosirea /* i */ Orice text cuprins ntre simbolurile menionate mai sus se consider a fi comentariu. Simbolurile /* reprezint nceputul comentariului, iar */ sfritul respectivului comentariu:
/* Acesta este un comentariu care se ntinde pe mai multe rnduri */

Tem de reflecie Pe msur ce naintai n coninutul cursului, facei la nivel sintactic o comparaie cu limbajele C, C++ i Java.

Test de autoevaluare No. 1 1. Unde ncepe execuia unui program C#? 2. Ce face instruciunea Console.WriteLine)? 3. Cum se numete compilatorul n linie de comand pentru C#?

Programare imperativ-procedural. Introducere n C#. 1.6 Declaraii O declaraie simpl este o instruciune n cod surs care descrie un tip de date sau care i spune programului s execute o aciune. O instruciune simpl se termin cu caracterul punct i virgul ;. Urmtorul exemplu de cod cuprinde dou instruciuni simple. Prima instruciune definete variabila cu numele var1 i o iniializeaz cu valoarea 5. A doua instruciune afieaz valoarea variabilei var1 pe ecran.
int var1 = 5; System.Console.WriteLine("The value of var1 is {0}", var1);

1.7 Blocuri de instruciuni


Un bloc de instruciuni cuprinde 0 sau mai multe instruciuni cuprinse ntre acolade {}. Exemplu:
{ int var1 = 5; System.Console.WriteLine("The value of var1 is {0}", var1); }

Un bloc este folosit de obicei acolo unde mai multe instruciuni definesc o aciune. Un bloc de instruciuni nu se termin cu punct i virgul ;.
Terminating ; Terminating ; {int var2 = 5; System.Console.WriteLine("The value of var1 is {0}", var1); } No terminating ;

1.8 Identificatori Prin nume dat unei variabile, clase, metode etc. nelegem o succesiune de caractere care ndeplinete urmtoarele reguli: numele trebuie s nceap cu o liter sau cu unul dintre caracterele _ i @; primul caracter poate fi urmat numai de litere, cifre sau un caracter de subliniere; numele care reprezint cuvinte cheie nu pot fi folosite n alt scop dect acela pentru care au fost definite; cuvintele cheie pot fi folosite n alt scop numai dac sunt precedate de @; dou nume sunt distincte dac difer prin cel puin un caracter (fie el i liter mic ce difer de aceeai liter majuscul);

10

Programare imperativ-procedural. Introducere n C#. Convenii pentru nume: n cazul numelor claselor, metodelor, a proprietilor, enumerrilor, interfeelor, spaiilor de nume, fiecare cuvnt care compune numele ncepe cu majuscul; n cazul numelor variabilelor dac numele este compus din mai multe cuvinte, primul ncepe cu minuscul, celelalte cu majuscul. Simbolurile lexicale reprezentnd constante, regulile de formare a expresiilor, separatorii de liste, delimitatorii de instruciuni, de blocuri de instruciuni, de iruri de caractere etc. sunt n mare aceiai ca i n cazul limbajului C++. 1.9 Cuvinte cheie Acestea sunt cuvinte speciale care au o semnificaie bine definit i care nu pot fi folosite dect n scopul pentru care au fost create.

Figura 4. Cuvintele cheie din C#

1.10 Tipuri de date n limbajul de programare C# exist dou tipuri de date: tipuri valoare i tipuri referin. Tipurile valoare includ tipurile simple (char, int, float, etc), tipurile enumerare i structur acestea coninnd direct datele referite i sunt alocate pe stiv sau inline ntrun struct. Tipurile referin includ tipurile clas, interfa, delegat i tablou, toate avnd proprietatea c variabilele de acest tip stocheaz referine ctre obiecte. Toate tipurile de date sunt derivate (direct sau nu) din tipul System.Object.

11

Programare imperativ-procedural. Introducere n C#. Tipuri predefinite Limbajul C# conine un set de 15 tipuri predefinite, pentru care nu este necesar includerea vreunui spaiu de nume via directiva using: string, object, tipurile ntregi cu semn i fr semn, tipuri numerice n virgul mobil, tipurile bool i decimal. Tipul string este folosit pentru manipularea irurilor de caractere codificate Unicode; coninutul obiectelor de tip string nu se poate modifica. Clasa object este rdcina ierarhiei de clase din .NET, la care orice tip (inclusiv un tip valoare) poate fi convertit. Tipul bool este folosit pentru a reprezenta valorile logice true i false. Tipul char este folosit pentru a reprezenta caractere Unicode, reprezentate pe 16 bii. Tipul decimal este folosit pentru calcule n care erorile determinate de reprezentarea n virgul mobil sunt inacceptabile, el punnd la dispoziie 28 de cifre zecimale semnificative.
Denumire Explicaie Valori reprezentate

Figura 5. Tipuri predefinite n C#

Fiecare tip de date din C# i are corespondentul n tipul .Net (tipurile din spaiul de nume System).

Tipuri definite de utilizator


Tipurile care pot fi definite de utilizatori sunt de 6 feluri. O parte dintre acestea vor fi discutate n paginile urmtoare.

class; struct; 12

Programare imperativ-procedural. Introducere n C#.

array; enum; delegate; interface.

1.11 Variabile Un limbaj de programare trebuie s permit programului s stocheze i s manipuleze date. n timpul execuiei unui program, datele sunt temporal stocate n memorie. O variabil este un nume dat unei locaii de memorie folosit de un tip particular de date n timpul execuiei programului. Astfel, fiecrei variabile i se asociaz un tip de dat i o valoare. C# prevede patru categorii de variabile, fiecare dintre acestea vor fi discutate n detaliu: Variabile locale; Cmpuri; Parametrii; Elemente de tablou.
Declararea variabilelor. n C# variabilele sunt declarate astfel:
<nume_tip_dat> <nume_variabil>;

Exemplu:
Tip

int var2;

Nume variabil

Codul de program de mai sus rezerv o arie de 4 bytes(octei) n memoria RAM, pentru stocarea valorii unei valori de tip ntreg, care va fi referit n program cu ajutorul identificatorului i. Variabilele pot fi iniializate la declarare sau mai trziu:
bool isReady = true; float percentage = 87.88, average = 43.9; char digit = '7';

Dup declararea tipului unei variabile, aceasta poate fi iniializat cu o valoare. Iniializarea unei variabile se face cu ajutorul semnului egal (=) plasat ntre numele variabilei i valoarea acesteia, aa cum se arat n continuare:
iniializare
int var2 = 17;

13

Programare imperativ-procedural. Introducere n C#. Variabilele locale neiniializate au valori nedefinite i prin urmare nu pot fi folosite pn cnd nu au atribuit o valoare. ncercarea de a utiliza o variabil neiniializat va produce o eroare la compilare. Declararea mai multor variabile de acelai tip. Se pot declara mai multe variabile ntr-o declaraie. Toate variabilele dintr-o declaraie de variabile, trebuie s fie de acelai tip. Numele variabilelor trebuie separate prin virgul iniializarea acestora se poate face cu ajutorul semnului =. n urmtorul cod de program se declar se declar, mai multe variabile de tip ntreg i respectiv real:
// Declaraii de variabile cu iniializare i fr int var3 = 7, var4, var5 = 3; double var6, var7 = 6.52;

Tip

Tip diferit

int var8, float var9;//Error!

Ultima declaraie este invalid deoarece sunt declarate dou variabile de tipuri diferite, n aceeai instruciune. Utilizarea valorii unei variabile. Numele unei variabile reprezint valoarea stocat de variabil. Se poate utiliza valoarea prin folosirea numelui variabilei. De exemplu, valoarea variabilei var este luat din memorie i plasat n poziia numelui variabilei, astfel:
Console.WriteLine("{0}", var);

n C# (la fel ca i n celelalte limbaje de programare moderne), variabilele trebuie declarate naintea folosirii acestora. Urmtorul cod de program va da eroare la compilare, deoarece variabila numr nu este iniializat:
1 2 3 4 5 6 static void Main() { int numr; // age = 18; Console.WriteLine(numr); // error }

n cazul n care se vor terge cele dou // care preced comentariul din linia 4, liniile de cod pot fi compilate fr eroare. O variabil de un tip valoare conine efectiv o valoare. Cnd se declar o variabil de un tip valoare, compilatorul aloc n stiv numrul de octei corespunztori tipului, iar programatorul lucreaz direct cu aceast zon de memorie. O variabil de tip referin este o referin care, atunci cnd nu este null, refer un obiect de tipul specificat, alocat n memoria heap.

14

Programare imperativ-procedural. Introducere n C#. 1.12 Constante.


Constantele sunt variabile a cror valoare, odat definit, nu poate fi schimbat de ctre program. Constantele sunt declarate astfel: const double PI = 3.142;

1.13

Lucrare de verificare Nr.1


1. 2. 3. 4. 5. 6. Ce cuvnt cheie exist n C# pentru tipul ntreg de date? Ce este double? Este using system o parte necesar ntr-un program C#? Blocuri de instruciuni La ce se folosesc marcatorii ? Ce este o variabil ? Dar o constant ?

15

Programare imperativ-procedural. Introducere n C#. 1.14 Expresii Expresiile reprezint niruiri de operatori i operanzi. Operanzii pot fi: literali, constante, variabile, apeluri de metode, elemente de tablou, etc. Operatori 1.15 Operatori aritmetici Operand Descriere + Adunare Scdere * nmulire / mprire % Restul sau modulo ++ Adunare cu 1 -Scdere cu 1 Notaii prefixate sau postfixate Se d urmtoarea linie de cod: int num1 = 10; Urmtoarele instruciuni sunt echivalente:
num1++; num1 = num1 + 1; num1 += 1;

Ambii operatori ++ i pot fi utilizai n form prefixat sau postfixat. n forma prefixat,
num1 = 3; num2 = ++num1; // num1 = 4, num2 = 4

compilatorul va incrementa prima dat variabila num1 cu 1 i apoi va atribuii aceast valoare variabilei num2. n forma postfixat,
num2 = num1++; // num1 = 4, num2 = 3

compilatorul prima dat va atribuii valoarea variabilei num1 la variabila num2 i apoi incrementeaz variabila num1 cu 1. 1.16 Operatori de atribuire Operand
= += -= *= /= %=

Descriere
Atribuire simpl Atribuire aditiv Atribuire substractiv Atribuire multiplicativ Atribuire cu mprire Atribuire cu modulo

16

Programare imperativ-procedural. Introducere n C#. O atribuire compus are forma: <var> op= <expr> i este echivalent cu: <var> = <var> op <expr>, iar op poate fi unul din operatorii: *, /, %, +, -, <<, >>, &, |, ^ Exemplu:
int i=0; i += 15; echivalent cu i = i + 15;

Exemplu
using System; class FormattingNumbers { static void Main() { int valoare = 10; valoare += 10; Console.WriteLine("valoare valoare); // valoare = 20 valoare -= 5; Console.WriteLine("valoare valoare); // valoare = 15 valoare *= 10; Console.WriteLine("valoare valoare); // valoare = 150 valoare /= 3; Console.WriteLine("valoare valoare); // valoare = 50 valoare %= 8; Console.WriteLine("valoare valoare); // valoare = 2 Console.ReadLine(); } }

+=10 este {0}", -=5 este {0}", *=10 este {0}", /=3 este {0}", %=8 este {0}",

Citirea datelor de la tastatur i scrierea datelor la consol Citirea unui ir de caractere de la tastatur se face cu metodele Console.Read() sau Console.ReadLine(). Afiarea datelor pe ecran se face cu metodele Console.Write() sau Console.WriteLine(). Diferena dintre cele dou const n trecerea la linie nou n cazul metodelor care se termin cu line. Exemplu:
using System; namespace ConsoleApplication { class Program { public static void Main() { float a, b; string sir; Console.Write("Introduceti valoarea pentru variabila a="); sir = Console.ReadLine(); a = float.Parse(sir); Console.Write("Introduceti valoarea pentru variabila b="); sir = Console.ReadLine(); b = float.Parse(sir);

17

Programare imperativ-procedural. Introducere n C#.


Console.Write("Suma dintre a={0} i b={1} este {2}", a, b, a+b); Console.ReadLine(); } } }

Exemplul de mai sus se poate scrie i astfel:


using System; namespace ConsoleApplication { class Program { public static void Main() { float a, b; Console.Write("Introduceti valoarea pentru variabila a="); a = float.Parse(Console.ReadLine()); Console.Write("Introduceti valoarea pentru variabila b="); b = float.Parse(Console.ReadLine()); Console.Write("Suma dintre a={0} i b={1} este {2}", a, b, a+b); Console.ReadLine(); } } }

Pentru tipurile numerice, metoda ToString produce o reprezentare ir de caractere a unui numr. Ea poate fi folosit i cu civa parametrii, care permit diverse formatri ale afirii valorii numerice ca i ir de caractere. Complementara metodei ToString este metoda Parse. Metoda Parse se folosete astfel:
variabil = tipul_variabilei.Parse(input_string);

unde tipul_variabilei poate fi oricare tip de date predefinit n C#. Exemplu:


int k = int.Parse("12345"); double dd = double.Parse(" -1,234.5678 "); Console.WriteLine("k={0} dd={1}", k, dd);

Exemplu:
using System; class Program { static void Main() { int a = 55000; int b = 676; double c = 555.4; double d = 50870.1155;

18

Programare imperativ-procedural. Introducere n C#.


string a1 = a.ToString(); string a2 = a.ToString(); Console.WriteLine(a1 + " " string b1 = b.ToString(); string b2 = b.ToString(); Console.WriteLine(b1 + " " string c1 = c.ToString(); string c2 = c.ToString(); Console.WriteLine(c1 + " " string d1 = d.ToString(); string d2 = d.ToString(); Console.WriteLine(d1 + " " 50870.1155 Console.ReadLine(); } }

+ a2);

// 55000 55000

+ b2);

// 676 676

+ c2);

// 555.4 555.4

+ d2);

// 50870.1155

1.17

Operatori relaionali Operand


==

!= > < >= <= Exemplu:

Descriere Testarea egalitii Testarea inegalitii Strict mai mare Strict mai mic Mai mare sau egal Mai mic sau egal

using System; class OperatoriRelationali { static void Main() { int var1 = 5, var2 = 6; Console.WriteLine("{0} == {1} este {2}", var1, var2, var1 == var2); // false Console.WriteLine("{0} != {1} este {2}", var1, var2, var1 != var2); // true Console.WriteLine("{0} > {1} este {2}", var1, var2, var1 > var2); // false Console.WriteLine("{0} < {1} este {2}", var1, var2, var1 < var2); // true Console.WriteLine("{0} <= {1} este {2}", var1, var2, var1 <= var2); // true Console.WriteLine("{0} >= {1} este {2}", var1, var2, var1 >= var2); // false Console.ReadLine(); } }

19

Programare imperativ-procedural. Introducere n C#. 1.18 Operatori logici. Operatori logici la nivel de bii Operand
&

| ^ ~ ! && || Exemplu:

Descriere AND ntre bii OR ntre bii XOR ntre bii NOT pe bii NOT logic AND logic OR logic

using System; class OperatoriLogici { static void Main() { int i = 6, j = 12; bool firstVar = i > 3 && j < 10; Console.WriteLine("{0} > 3 && {1} < 10 este {2}", i, j, firstVar); // firstVar va avea valoarea false bool secondVar = i > 3 || j < 10; Console.WriteLine("{0} > 3 || {1} < 10 este {0}", i, j, secondVar); // secondVar va avea valoarea true Console.ReadLine(); } }

Operatorul condiional ?: Acesta este un operator care necesit trei operanzi (operator teriar). Forma general a acestuia este: condiie ? expresie1 : expresie2 Rolul acestui operator este de a evalua o condiie i n funcie de valoarea de adevr a acesteia s execute (dac este adevrat) expresie1 sau expresie2 (dac este fals). 1.19 Exemplu:
int i, x=3, y=4; i = x<y ? 10 : 20 ;

Efect: Dac x<y atunci i va lua valoarea 10, altfel va lua valoarea 20. 1.20 Lucrare de verificare Nr.2

20

Programare imperativ-procedural. Introducere n C#. 1. La ce se folosesc metodele ToString i respectiv Parse. 2. La ce se folosete operatorul condiional ?: 3. S se fac un program care face operaiile aritmetice elementare +, -, *, /.

1.21

Bibliografie

1. Jeff Ferguson, Brian Patterson, Jason Beres, Pierre Boutquin, and Meeta Gupta - C# Bible, 2002 by Wiley Publishing. 1. Daniel Solis- Illustrated C# 2008, Apress, 2008. 2. Faraz Rasheed - Programmers Heaven: C# School, Synchron Data, 2006. 3. Charles Petzold - Programming Microsoft Windows with C# (Microsoft), 2002.

21

Programare imperativ-procedural. Introducere n C#.

2. INSTRUCIUNI
Obiective: Dup studiul acestui capitol, studentul va avea cunotine suficiente pentru a fi capabil s neleag instruciunile: ifelse, switch, do-while, while, foreach i nstruciunile de salt. Instruciuni condiionale 2.1 Instruciunea if-else Instruciunea if execut o instruciune n funcie de valoarea de adevr a unei expresii logice. Structura instruciunii ifelse este urmtoarea:
if (expresie_boolean) instruciune sau bloc de instruciuni 1; [else instruciune sau bloc de instruciuni 2;]

Clauza else este opional. Exemplu:

int a=10; if (a<0) Console.Write (Negativ); else Console.Write (Pozitiv);

2.2 Instruciunea switch n cazul unei instruciuni switch, expresia care se evalueaz trebuie s fie de tipul (sau convertibil implicit la tipul) sbyte, byte, short, ushort, long, ulong, char, string sau o enumerare bazat pe unul dintre aceste tipuri. Dac valoarea expresiei se regsete printre valorile specificate la clauzele case, atunci instruciunea corespunztoare va fi executat; dac nu, atunci instruciunea de la clauza default va fi executat (dac ea exist).
switch (expresie) case eticheta1: instruciune sau bloc de instruciuni; instruciunea break sau goto; . . . case etichetaN: instruciune sau bloc de instruciuni; instruciunea break sau goto; [default] instruciune sau bloc de instruciuni; instruciunea break sau goto;

22

Programare imperativ-procedural. Introducere n C#. O etichet reprezint o expresie constant. n faza de proiectare a limbajului C#, Microsoft a decis s mpiedice trecerea automat la urmtoarea ramur case n lipsa instruciunii break (o facilitate uzual n C i C++); din acest motiv, lipsa instruciunii break pe o ramur case va genera eroare la compilare (exceptnd cazul cnd ramura case nu conine instruciuni). Trecerea de la o ramur case la alta poate fi ns simulat cu instruciunea goto: ... O instruciune poate s i lipseasc i n acest caz se va executa instruciunea de la caseul urmtor, sau de la default. Seciunea default poate s lipseasc. Dac o instruciune este nevid, atunci obligatoriu va avea la sfrit o instruciune break sau goto case expresieConstanta sau goto default. Spre deosebire de C i C++, e interzis s se foloseasc trecerea automat de la o etichet la alta, continuarea se face folosind explicit instruciunea goto. Exemplu:
using System; class TestSwitch { static void Main() { int nota=8; switch (nota) { case 4: Console.Write (Nepromovat); break; case 8: Console.Write (Mediu); break; case 10: Console.Write (Foarte bine); break; } Console.ReadLine(); } }

Test de autoevaluare No. 2 1. Specificai diferenele sintax C/C# pentru instruciunile If i Switch. Instruciuni de ciclare 2.3 Instruciunea for Formatul instruciunii este:
for(expresie_de_iniializare; condiie; incrementare / decrementare) instruciune sau bloc de instruciuni;

Exemplu:
for(int i=1; i<=10; i++) { Console.WriteLine("In acest ciclu valoarea lui i este {0}.", i); }

23

Programare imperativ-procedural. Introducere n C#. Toate cele trei argumente ale instruciunii for (expresie_de_iniializare; condiie; incrementare / decrementare)

sunt opionale. Exemple:

for(; ;) for( ; i<10; i++) for(int i=3; ; i--) for( ; i>5; )

Dac se declar o variabil n expresia_de_iniializare, atunci ciclul ei de via este doar n corpul instruciunii for. Exemplu:
using System; namespace exemplu_for { class ExempluFor { static void Main() { for (int i = 1; i <= 10; i++) Console.WriteLine("Valoarea lui i in acest ciclu este: {0}.", i); Console.ReadLine(); i++; // eroare !! } } }

Se pot utiliza instruciunile break i continue n orice instruciune de ciclare. Acestea schimb execuia normal a ciclului. Instruciunea break termin ciclul i transfer execuia n afara ciclului. Exemplu:
for(int i=1; i<=10; i++) { if(i>5) { break; } Console.WriteLine("Valoarea lui i in acest ciclu este:{0}.", i); }

Dac dup instruciunea break mai exist cel puin o instruciune, atunci compilatorul va genera o avertizare. Exemplu:
for(int i=3; i<10; i++) {

24

Programare imperativ-procedural. Introducere n C#.


break; // warning, Console.WriteLine (i); is unreachable code Console.WriteLine(i); }

Instruciunea continue ignor partea de instruciuni rmas din iteraia curent i trece la urmtoarea iteraie. Exemplu:
for(int i=1; i<=4; i++) { if(i==2) { continue; } Console.WriteLine("Valoarea lui i in acest ciclu este:{0}.", i); }

Rezultatul:
Valoarea lui i in acest ciclu este:1. Valoarea lui i in acest ciclu este:3. Valoarea lui i in acest ciclu este:4.

2.4 Instruciunea do-while Structura acestei instruciuni este:


do instruciune sau bloc de instruciuni while(condiie);

Se vor executa instruciunile de dup do, dup care se verific condiia. Instruciunea de ciclare continu atta timp ct condiia este adevrat (true). Urmtorul program afieaz ntregii de la 1 la 10 pe ecran:
using System; namespace exemplu_Do { class DoExample { static void Main() { int i = 1; do { Console.WriteLine("In the loop, value of i is {0}.", i); i++; } while (i <= 10); Console.ReadLine(); }

25

Programare imperativ-procedural. Introducere n C#.


} }

n cazul instruciunii do-while, instruciunile din corpul acesteia se execut cel puin odat. 2.5 Instruciunea while Instruciunea while este similar cu instruciunea do-while, cu excepia c verificarea condiiei se face naintea execuiei codului din corpul instruciunii. Forma general a instruciunii este:
while(condiie) instruciune sau bloc de instruciuni

Exemplu:
using System; namespace exemplu_While { class WhileExample { static void Main() { int i = 1; while (i <= 10) { Console.WriteLine("In the loop, value of i is {0}.", i); i++; } Console.ReadLine(); } } }

2.6 Instruciunea foreach Instruciunea foreach este un alt tip de instruciune de ciclare, care enumer elementele dintr-o colecie sau matrice (array), executnd o instruciune pentru fiecare element. Elementul care se extrage este de tip read-only, neputnd fi transmis ca parametru i nici aplicat un operator care sa-i schimbe valoarea. Structura de baz a instruciunii foreach este:
foreach(<tip_colecie> <nume_variabil> in <array sau colecie>) < instruciune sau bloc de instruciuni >

Exemplu:
int[] t = {1, 2, 3}; foreach (int x in t) {

26

Programare imperativ-procedural. Introducere n C#.


Console.WriteLine(x); }

Exemplu:
string[] fructe={Mar, Ciresa, Portocala}; foreach (string fruct in fructe) { Console.Write({0} , copil); }

Exemplu:
static void Main() { // declararea i iniializarea unui ir de ntregi int [] integers = {3, 7, 2, 14, 65}; // iterarea elementelor din ir i tiprirea lor pe ecran foreach(int i in integers) { Console.WriteLine(i); } }

n instruciunea foreach(int i in integers), se specific tipul elementelor din colecie (int n acest caz). Se declar variabila i care va conine, la fiecare iteraie, valoarea fiecrui element al coleciei. Observaii: Variabila utilizat pentru a memora, la fiecare iteraie, valoarea unui element al coleciei, (i n cazul de mai sus este de tip read only. Nu se pot schimba valorile elementelor coleciei prin intermediul ei. Acest fapt nseamn c instruciunea foreach nu permite schimbarea valori elementelor coleciei sau tabloului, ci doar parcurgerea acesteia/acestuia. Colecia poate s fie orice instan a unei clase care implementeaz interfaa System.Collections.IEnumerable. clasa string este, de asemenea, o colecie de caractere.
static void Main() { string name = "Alexandru Cel Mare"; foreach(char ch in name) { Console.WriteLine(ch); } }

Test de autoevaluare No. 3 Ce face instruciunea for ? Ce face instruciunea do-while ? 27

Programare imperativ-procedural. Introducere n C#. Ce face instruciunea while ? Ce face instruciunea foreach ?

Instruciuni de salt 2.7 Instruciunea break


Instruciunea break permite ieirea forat dintr-un ciclu de tip switch, while, dowhile, for sau foreach.

Exemplu de folosire a instruciunii break ntr-un ciclu for:


using System; class InstrBreak { static void Main() { for (int i = 1; i <= 100; i++) { if (i == 5) { break; } Console.WriteLine(i); } Console.ReadLine(); } }

Exemplu de folosire a instruciunii break ntr-un ciclu switch.


using System; class Switch { static void Main() { Console.Write("Alegeti un numar (1, string s = Console.ReadLine(); int n = Int32.Parse(s); switch (n) { case 1: Console.WriteLine("Valoarea break; case 2: Console.WriteLine("Valoarea break; case 3: Console.WriteLine("Valoarea break; default: Console.WriteLine("Selectie break;

2, or 3): ");

este {0}", 1);

este {0}", 2);

este {0}", 3);

gresita.");

28

Programare imperativ-procedural. Introducere n C#.


} Console.ReadLine(); } }

Exemplu de folosire a instruciunii break ntr-un ciclu for.


using System; class MainClass { public static void Main() { // use break to exit this loop for (int i = -10; i <= 10; i++) { if (i > 0) break; // terminate loop when i is positive Console.Write(i + " "); } Console.WriteLine("Done"); Console.ReadLine(); } }

Exemplu de folosire a instruciunii break ntr-un ciclu do-while.


using System; class MainClass { public static void Main() { int i; i = -10; do { if (i > 0) break; Console.Write(i + " "); i++; } while (i <= 10); Console.WriteLine("Done"); Console.ReadLine(); } }

Exemplu de folosire a instruciunii break ntr-un ciclu foreach.


using System; class MainClass { public static void Main() { int sum = 0; int[] numere = new int[10]; for (int i = 0; i < 10; i++)

29

Programare imperativ-procedural. Introducere n C#.


numere[i] = i; foreach (int x in numere) { Console.WriteLine("Valoarea este: " + x); sum += x; if (x == 4) break; // cand x=4 se iese din ciclu } Console.WriteLine("Suma primelor 5 elemente: " + sum); Console.ReadLine(); } }

2.8 Instruciunea continue Instruciunea continue ignor partea rmas din iteraia curent i pornete urmtoarea iteraie, ntr-o instruciune de ciclare de tip switch, while, do-while, for sau foreach. Exemplu de folosire a instruciunii continue, pentru afiarea numerelor pare dintre 0 i 100.
using System; class MainClass { public static void Main() { // print even numbers between 0 and 100 for (int i = 0; i <= 100; i++) { if ((i % 2) != 0) continue; // iterate Console.WriteLine(i); } Console.ReadLine(); } }

2.9 Instruciunea goto


Aceast instruciune permite saltul la o anumit instruciune. Are 3 forme:
goto eticheta; goto case expresieconstanta; goto default;

Cerina este ca eticheta la care se face saltul s fie definit n cadrul funciei curente i saltul s nu se fac n interiorul unor blocuri de instruciuni, deoarece nu se poate reface ntotdeauna contextul acelui bloc. Se recomand evitarea utilizrii intense a acestei instruciuni, n caz contrar se poate ajunge la fenomenul de spagetti code. (a se vedea articolul clasic al lui EdsgerW. Dijkstra, Go To Statement Considered Harmful: http://www.acm.org/classics/oct95/). 30

Programare imperativ-procedural. Introducere n C#. Exemplu de folosire a instruciunii goto, n cazul instruciunii switch.
using System; class SwitchGoto { public static void Main() { for (int i = 1; i < 5; i++) { switch (i) { case 1: Console.WriteLine("In goto case 3; case 2: Console.WriteLine("In goto case 1; case 3: Console.WriteLine("In goto default; default: Console.WriteLine("In break; } Console.WriteLine(); Console.ReadLine(); } } }

case 1");

case 2");

case 3");

default");

Exemplu de folosire a instruciunii goto, n cazul instruciunii for.


using System; class MainClass { public static void Main() { for (int i = 0; i < 10; i++) { Console.WriteLine("i" + i); if (i == 3) goto stop; } stop: Console.WriteLine("Stopped!"); Console.ReadLine(); } }

Exemplu de folosire a instruciunii goto, n cazul instruciunii while.


using System; class MainClass { static void Main() { int a = 0; while (a < 10) { if (a == 5)

31

Programare imperativ-procedural. Introducere n C#.


goto cleanup; a++; } cleanup: Console.WriteLine(a); Console.ReadLine(); } }

Exemplu de folosire a instruciunii goto, n cazul instruciunii if.


using System; class MainClass { public static void Main() { int total = 0; int counter = 0; myLabel: counter++; total += counter; if (counter < 5) { System.Console.WriteLine(counter); goto myLabel; } Console.ReadLine(); } }

2.10

Instruciunea return

Instruciunea return termin execuia metodei n care aceasta apare, i returneaz controlul metodei apelante. Instruciunea return poate returna, opional, o valoare. Dac metoda care conine instruciunea return este de tip void, atunci instruciunea return poate fi omis. Forma general a instruciunii este:
return [expression];

unde expression este valoarea returnat de metod. Nu este utilizat cu metode de tip void. n exemplul urmtor, metoda A() returneaz variabila Area ca valoare de tip
Double: using System; class ReturnTest { static double CalculateArea(int r) { double area;

32

Programare imperativ-procedural. Introducere n C#.


area = r * r * Math.PI; return area; } public static void Main() { int radius = 5; Console.WriteLine("The area is {0:0.00}", CalculateArea(radius)); Console.ReadLine(); } }

2.11 1. 2. 3. 4. 5.

Lucrare de verificare Nr. 3

Ce face instruciunea break ? Ce face instruciunea return? Ce face instruciunea continue ? Ce face instruciunea goto ? Realizai un program care afieaz primele 10 numere pare.

2.12

Bibliografie

1. Jeff Ferguson, Brian Patterson, Jason Beres, Pierre Boutquin, and Meeta Gupta - C# Bible, 2002 by Wiley Publishing. 4. Daniel Solis- Illustrated C# 2008, Apress, 2008. 5. Faraz Rasheed - Programmers Heaven: C# School, Synchron Data, 2006. 6. Charles Petzold - Programming Microsoft Windows with C# (Microsoft), 2002.

33

Programare imperativ-procedural. Introducere n C#.

3. TIPURI DEFINITE DE UTILIZATOR


Obiective: Dup studiul acestui capitol, studentul va avea cunotine suficiente pentru a fi capabil s neleag: tipul enumerare, tipul tablou i conversiile numerice. 3.1 Tipul enumerare Tipul enumerare este un tip definit de utilizator. Tipul enumerare este un tip valoare, construit pentru a permite declararea constantelor nrudite, ntr-o manier clar i sigur din punct de vedere al tipului. Un exemplu este: n iniializate suprascriind valorile implicite, astfel:
enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri}; aceast enumerare Sat este 0, Sun este 1, Elementele enumerrii enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

pot fi

n acest caz, secvena de elemente este forat s porneasc de la 1 n loc de 0. Fiecare tip enumerare care este folosit are un tip_dat pentru elementele sale. Dac nu se specific nici un tip_dat, atunci se presupune implicit tipul int. Specificarea unui tip_dat (care poate fi orice tip exceptnd tipul char, se face prin enunarea tipului_dat dup numele enumerrii. Declararea unui tip enumerare este de forma:
enum [Nume_tip] [: Tip_dat] { [identificator1][=valoare], ... [identificatorn][=valoare]}

Exemplu:
enum MyEnum : byte { triunghi, cerc }

Valoarea fiecrei variabile poate fi specificat explicit:


enum { a = b = c = } Values 45, 23, a + b

Exemplu:
using System; namespace tipulEnum { class Program {

34

Programare imperativ-procedural. Introducere n C#.


enum lunileAnului { Ianuarie = 1, Februarie, Martie, Aprilie, Mai, Iunie, Iulie, August, Septembrie, Octombrie, Noiembrie, Decembrie } static void Main() { Console.WriteLine("Luna Mai este a {0}", (int)lunileAnului.Mai + "-a luna din an."); Console.WriteLine("Luna August este a {0}", (int)lunileAnului.August + "-a luna din an."); Valoarea lui i in acest ciclu este:Console.ReadLine(); } } }

De observat c un element din lista de enumerri poate fi accesat astfel:


NumeEnum.NumeElement

Tipurile enumerare pot fi convertite ctre tipul lor de baz i napoi, folosind o conversie explicit (cast):
enum Values { a = 1, b = 5, c= 3 } class Test { public static void Main() { Values v = (Values)3; int ival = (int)v; } }

Exemplu
using System; public class EnumTest { enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri}; static void Main() { int x = (int)Days.Sun; int y = (int)Days.Fri; Console.WriteLine("Sun = {0}", x); Console.WriteLine("Fri = {0}", y); Console.ReadLine(); } }

35

Programare imperativ-procedural. Introducere n C#. 3.2 Tipul tablou Tipul tablou (Array) reprezint o colecie de valori de acelai tip. Tipul Array este un tip referin, fiecare array este un obiect motenit din clasa de baz System.Array. Tipul Array se declar astfel: Prin aceast declaraie nu se aloc spaiu pentru memorare. Pentru a putea reine date n structura de tip tablou, este necesar o operaie de instaniere: Se reamintete c instanierea este procesul de creare a unui obiect i iniializarea sa cu date specifice. Declararea, instanierea i chiar iniializarea tabloului se pot face n aceeai instruciune. Exemplu:
int[] v = new int[] {1,2,3}; sau int[] v = {1,2,3}; //new este implicit nume = new tip_dat[NumarElemente]; <tip_dat>[] <nume_variabil>;

Dimensiunea unui tablou trebuie fixat i definit naintea utilizrii acestuia:


int size = 10; int[] integers = new int[size];

Opional, un tablou se poate declara i iniializa n pai separai:


int[] integers; integers = new int[10];

Exemplu de declarare i iniializare a unui vector cu cinci elemente:


int [] integers = {1, 2, 3, 4, 5};

Accesarea valorilor stocate ntr-un tablou. Pentru a accesa elementele unui tablou, se folosete operatorul de indexare [int index]. Vom folosi acest index pentru a indica elementul din tablou pe care vrem sa-l accesm. Este important de reinut ca valoarea indexului n C# pornete de la 0. Urmtorul cod de program demonstreaz cum poate fi accesat al treilea element al unui tablou:
int [] intArray = {5, 10, 15, 20}; int j = intArray[2];

Urmtorul cod de program prezint declararea, iniializarea i parcurgerea unui tablou:


using System; namespace UtilizareTablou

36

Programare imperativ-procedural. Introducere n C#.


{ class DemoArray { // demonstreaz utilizarea arrays n C# static void Main() { // declararea i iniializarea unui array de ntregi int[] integers = { 3, 7, 2, 14, 65 }; // parcurgerea tabloului i afiarea fiecrui element pe ecran for (int i = 0; i < 5; i++) Console.WriteLine(integers[i]); Console.ReadLine(); } } }

n cazul tablourilor cu mai multe dimensiuni se face distincie ntre tablouri regulate i tablouri neregulate (tablouri de tablouri). Declararea n cazul tablourilor regulate bidimensionale se face astfel: Tip_dat[,]
nume;

Instanierea: nume = new Tip_dat[Linii,Coloane]; Acces: nume[indice1,indice2] Exemple:


int[,] mat = new int[,] {{1,2,3},{4,5,6},{7,8,9}}; sau int[,] mat = {{1,2,3},{4,5,6},{7,8,9}};

Declarare n cazul tablourilor neregulate bidimensionale: Tip[][] nume; Intaniere:


nume = new Tip[NrLinii],[]; nume[0]=new Tip[NrColoane1] ... nume[NrLinii-1]=new Tip[NrColoaneLinii-1]

Acces: nume[indice1][indice2] Exemple:


int[][] mat = new int[][] { new int[3] {1,2,3}, new int[2] {4,5}, new int[4] {7,8,9,1} };

sau
int[][] mat={new int[3] {1,2,3},new int[2] {4,5},new int[4] {7,8,9,1}};

Test de autoevaluare No. 4 37

Programare imperativ-procedural. Introducere n C#.

1. Modelai cu ajutorul tipului tablou, tabla de ah. 2. Cum pot fi tipurile enumerare convertite ctre tipul lor de baz i napoi ? Exemplificai. 3.3 Conversii numerice. n C# exist dou tipuri de conversii numerice: Implicite Explicite. Conversia implicit se efectueaz (automat) doar dac nu este afectat valoarea convertit. Exemplu:
using System; namespace Conversii { class Program { static void Main() { byte a = 13; // byte ntreg fr semn pe 8 bii byte b = 20; long c; //ntreg cu semn pe 64 bii c = a + b; // conversie Console.WriteLine(c); Console.ReadLine(); } } }

Regulile de conversie implicit sunt descrise de tabelul urmtor: Din n sbyte short, int, long, float, double, decimal byte short, ushort, int, uint, long, ulong, float, double, decimal short int, long, float, double, decimal ushort int, uint, long, ulong, float, double, decimal int long, float, double, decimal uint long, ulong, float, double, decimal long float, double, decimal char ushort, int, uint, long, ulong, float, double, decimal float double ulong float, double, decimal Conversia explicit se realizeaz prin intermediul unei expresii cast, atunci cnd nu exist posibilitatea unei conversii implicite. n urma rulrii programului:
using System; namespace Conversii1

38

Programare imperativ-procedural. Introducere n C#.


{ class Program { static void Main(string[] args) { int a = 5; int b = 2; float c; c = (float)a / b; //operatorul cast Console.WriteLine("{0}/{1}={2}", a, b, c); Console.ReadLine(); } } }

se obine:
5/2 = 2.5

n cazul n care nu s-ar fi folosit operatorul cast rezultatul, evident eronat, ar fi fost: 5/2=2. Regulile de conversie explicit sunt descrise de tabelul urmtor: Din n sbyte byte, ushort, uint, ulong, char byte sbyte, char short sbyte, byte, ushort, uint, ulong, char ushort sbyte, byte, short, char int sbyte, byte, short, ushort, uint, ulong, char uint sbyte,byte, short, ushort, int, char long sbyte, byte, short, ushort, int, uint, ulong, char ulong sbyte, byte, short, ushort, int, uint, long, char char sbyte, byte, short float sbyte, byte, short, ushort, int, uint, long, ulong, char, decimal double sbyte, byte, short, ushort, int, uint, long, ulong, char, float, decimal decimal sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double Conversii ntre numere iruri de caractere. n limbajul C# exist posibilitatea efecturii de conversii ntre numere iruri de caractere. Sintaxa pentru conversia unui numr n ir de caractere: b + numr. Pentru conversia invers, adic din ir de caractere n numr, sintaxa este:
ir int int.Parse(ir) sau Int32.Parse(ir) ir long long.Parse(ir) sau Int64.Parse(ir)

ir double double.Parse(ir) sau Double.Parse(ir) ir float float.Parse(ir) sau Float.Parse(ir)

Observaie: n cazul n care irul de caractere nu reprezint un numr valid, conversia din ir n numr va eua. Exemplu: 39

Programare imperativ-procedural. Introducere n C#.


using System; namespace Conversii { class Program { static void Main() { string s; const int a = 13; const long b = 100000; const float c = 2.15F; double d = 3.1415; Console.WriteLine("CONVERSII\n"); Console.WriteLine("TIP\tVAL. \tSTRING"); Console.WriteLine(""); s = "" + a; Console.WriteLine("int\t{0} \t{1}",a,s); s = "" + b; Console.WriteLine("long\t{0} \t{1}",b,s); s = "" + c; Console.WriteLine("float\t{0} \t{1}",c,s); s = "" + d; Console.WriteLine("double\t{0} \t{1}",d,s); Console.WriteLine("\nSTRING\tVAL \tTIP"); Console.WriteLine(""); int a1; a1 = int.Parse("13"); Console.WriteLine("{0}\t{1}\tint","13",a1); long b2; b2 = long.Parse("1000"); Console.WriteLine("{0}\t{1}\tlong","1000",b2); float c2; c2 = float.Parse("2,15"); Console.WriteLine("{0}\t{1}\tfloat","2,15",c2); double d2; d2 = double.Parse("3.1415"); Console.WriteLine("{0}\t{1}\tdouble","3.1415",d2); Console.ReadLine(); } } }

3.4

Lucrare de verificare Nr.4

1. Enumerai tipurile definite de utilizator n C#. 2. Realizai un program care contorizeaz numerele pare i impare dintr-un ir de numere introdus de la tastatur. 3. Realizai un program care nmulete dou matrici. 4. Realizai un program care calculeaz o matrice la puterea n.

40

Programare imperativ-procedural. Introducere n C#. 3.5 Bibliografie

1. Jeff Ferguson, Brian Patterson, Jason Beres, Pierre Boutquin, and Meeta Gupta - C# Bible, 2002 by Wiley Publishing. 7. Daniel Solis- Illustrated C# 2008, Apress, 2008. 8. Faraz Rasheed - Programmers Heaven: C# School, Synchron Data, 2006. 9. Charles Petzold - Programming Microsoft Windows with C# (Microsoft), 2002.

41

Programare imperativ-procedural. Introducere n C#. 4. CLASE NOIUNI DE BAZ Obiective: Dup studiul acestui capitol, studentul va avea cunotine suficiente pentru a fi capabil s neleag noiunea de clas i modul n care este utilizat n programe. 4.1 Clasele. Noiuni de baz Tipul clas (class) este cel mai important dintre tipurile definite de utilizator, n C#. Clasele sunt tipuri referin definite de utilizator i reprezint o mulime ncapsulat de date i funcii dependente logic, care n general modeleaz obiecte din lumea real sau conceptual. Clasa grupeaz datele i metodele (funciile) de prelucrare a acestora ntr-un modul, unindu-le astfel ntr-o entitate mult mai natural. Dei tehnica se numete "Programare Orientat Obiect", conceptul de baza al ei este clasa. Clasa, pe lng faptul c abstractizeaz foarte mult analiza/sinteza problemei, are proprietatea de generalitate, ea desemnnd o mulime de obiecte care mpart o serie de proprieti. Clasa "floare", de exemplu, desemneaz toate plantele care au flori, precum clasa "Fruct" desemneaz toate obiectele pe care noi le identificam ca fiind fructe. Bineneles, n implementarea efectiv a programului nu se lucreaz cu entiti abstracte, precum clasele ci se lucreaz cu obiecte, care sunt "instanieri" ale claselor. Altfel spus, plecnd de la exemplul de mai sus, dac se construiete un program care s lucreze cu clasa fructe, el nu va prelucra entitatea "fruct" ci va lucra cu entiti concrete ale clasei "fruct", adic "afin", "cirea", "zmeur", etc. Instanierea (trecerea de la clas la obiect) nseamn atribuirea unor proprieti specifice clasei, astfel nct aceasta s indice un obiect anume, care se difereniaz de toate celelalte obiecte din clas printr-o serie de atribute. Dac clasa fruct conine caracteristicile: zon, gust, i culoare, atunci vom considera fructul "zmeur" se gsete n zonele mpdurite, de culoare roz i gust dulceacrior. Fructul zmeur individualizeaz clasa fruct, astfel c ajungem la un caz concret, care este obiectul. O instan a unui tip de date abstract este o concretizare a tipului respectiv, format din valori efective ale datelor. O instan a unui tip obiectual poart numele de obiect. Membrii unei clase sunt mprii n urmtoarele categorii: constante cmpuri metode 42

Programare imperativ-procedural. Introducere n C#. proprieti evenimente indexatori operatori constructori (de instan) destructor constructor static tipuri O clas este o structur de date care poate stoca date i executa cod de program. n continuare sunt descrii: Membrii de tip dat (Data members), care stocheaz date asociate clasei sau instane ale clasei. Membrii de tip dat, modeleaz, n general, atributele lumii reale, pe care clasa vrea s o reprezinte. Membrii de tip funcie (Function members), care execut cod de program. Membrii de tip funcie modeleaz, n general, funcii i aciuni ale obiectelor din lumea real, pe care clasa vrea s le reprezinte. Un program care ruleaz este o mulime de obiecte care interacioneaz unul cu cellalt. Declararea claselor. Declararea unei clase definete caracteristicile i metodele unei noi clase. Aceasta nu creeaz o instan a clasei, dar creeaz un ablon pe baza cruia se vor crea instanele clasei. Urmtorul exemplu folosete sintaxa minim pentru crearea unei clase:
Cuvnt cheie Numele clasei
class ExerciiuClas { DeclaraiiDeMembrii }

ntre cele dou acolade sunt declarai membrii clasei care formeaz, n acelai timp, corpul clasei. Membrii unei clase pot fi declarai n orice ordine n interiorul corpului clasei. 4.2 Cmpuri Cmpurile(fields) i metodele(methods) fac parte din tipurile cele mai importante de membrii ai unei clase. Un cmp este o variabil care aparine unei clase. Acesta poate fi de orice tip: predefinit sau definit de utilizator. Asemenea variabilelor, cmpurile stocheaz date, i au urmtoarele caracteristici: Sintaxa minimal pentru declararea unui cmp este: 43

Programare imperativ-procedural. Introducere n C#.


tip

Type Identifier;

Nume cmp

De exemplu, urmtoarea clas conine declaraia cmpului CmpulMeu, care poate stoca o valoare ntreag:
class MyClass {

tip

int CmpulMeu;

Nume tip

Iniializarea explicit i implicit a cmpurilor ntruct un cmp este un tip de variabil, sintaxa pentru iniializarea unui cmp este aceeai cu cea de la variabile.
class MyClass { int F1 = 17; }

Iniializarea cmpului

Pentru fiecare cmp declarat se va asigna o valoare implicit astfel: numeric: 0 bool: false char: \0 enum: 0 referin: null Exemplu:
class MyClass { int F1; // Iniializat cu 0 tip valoare string F2; // Iniializat cu null tip referin int F3 = 25; // Iniializat cu 25 string F4 = "abcd"; // Iniializat cu "abcd" }

Acelai exemplu poate fi scris i:


class MyClass { int F1, F3 = 25; string F2, F4 = "abcd"; }

Un astfel de cmp se poate folosi fie prin specificarea numelui su, fie printro calificare bazat pe numele clasei sau al unui obiect. 44

Programare imperativ-procedural. Introducere n C#. Exemplu:


using System; class Access { //Variabile declarate nafara funciei Main. int x = 100; int y = 200; public static void Main() { //crearea obiectului Access a = new Access(); //apelul variabilelor instaniate Console.WriteLine(a.x); Console.WriteLine(a.y); Console.ReadLine(); } }

Test de autoevaluare No. 5 1. Ce sunt membrii de tip dat (Data members) ? 2. Ce sunt membrii de tip funcie (Function members)? 3. Ce reprezint o instan a unei clase ? 4.3 Metode O metod este un nume de bloc de cod executabil care poate fi executat din diferite pri ale unui program, chiar i din alte programe. Atunci cnd o metod este apelat (invocat), aceasta execut codul din corpul su, dup care red controlul mai departe programului din care a fost apelat. Unele metode returneaz o valoare n poziia n care au fost apelate. Metodele corespund funciilor membre din C++. Sintaxa minim necesar declaraiei unei metode include urmtoarele componente: Tipul returnat (Return type): tipul valorii returnate de metod. n cazul n care metoda nu returneaz o valoare, tipul returnat este void; Numele (name): reprezint numele metodei; Lista parametrilor (Parameter list): aceasta const din cel puin un set de paranteze deschise (). Dac exist parametrii acetia sunt prezentai ntre paranteze; Corpul metodei (Method body): conine cod executabil inclus ntre dou acolade {}. Exemplu:
class SimpleClass { Tipul returnat Lista de parametrii void PrintNums ( ) {

45

Programare imperativ-procedural. Introducere n C#.


Console.WriteLine("1"); Console.WriteLine("2"); } }

Structura unei metode n esen o metod este un bloc de cod care are un nume i care poate fi apelat prin acesta. Se pot transmite date ntr-o metod i se pot prelua date de la o metod. O metod este un membru de tip funcie al clasei n care este definit. Orice metod este compus din dou pri: antetul metodei n care se specific caracteristicile metodei cum sunt: o dac metoda returneaz o valoare iar n caz afirmativ care este tipul acesteia, o numele metodei, o ce tip de date sunt transmise metodei. corpul metodei care conine secvene de instruciuni (cod executabil). Execuia instruciunilor pornete de la prima i se continu secvenial prin corpul metodei.

Figura 6. Structura unei metode

Structura antetului unei metode este:


int MyMethod ( int intpar1, string strpar1 )

Tipul Numele returnat metodei

Lista de parametrii

Tem de reflecie Comparai metoda i structura sa cu procedurile i funciile din alte limbaje cunoscute.

46

Programare imperativ-procedural. Introducere n C#. Variabile locale Asemenea cmpurilor, variabilele locale pot stoca date. n timp ce cmpurile unui obiect stocheaz, de obicei, starea unui obiect, variabilele locale sunt folosite pentru calcule locale sau tranzitorii. Urmtoarele linii de cod reprezint sintaxa declaraiei unei variabile locale:
Numele variabilei

Type Identifier = Value;

Iniializarea opional

existena unei variabile locale este limitat la blocul n care a fost declarat, i la blocurile coninute n acesta. variabil local poate fi declarat n orice poziie n corpul unei metode.

Urmtorul exemplu ilustreaz declararea i utilizarea a dou variabile locale. Prima este de tip ntreg iar a doua de tip clas SomeClass:
static void Main( ) { int myInt = 15; SomeClass sc = new SomeClass(); ... }

Urmtorul tabel face o comparaie ntre variabilele locale i instana cmpurilor. Instana unui cmp Variabila local Exist n momentul crerii Exist din momentul n care instanei. nceteaz s mai este declarat. nceteaz n existe atunci cnd nu mai este momentul n care ntregul bloc a accesat fost executat. Este iniializat cu valoarea Nu sunt iniializate implicit. implicit a tipului Toate cmpurile unei clase Tipul valoare este stocat n sunt stocate n memoria de tip memoria stack iar tipul referin heap, indiferent de tipul este stocat n stack i datele n acestora heap.

Timpul de via Iniializare implicit Zona de stocare

Cuvntul cheie var ncepnd cu versiunea C# 3.0 se poate utiliza cuvntul cheie var n locul declaraiei tipului unei variabile locale, aa cum se vede n exemplul urmtor:
static void Main( ) {

47

Programare imperativ-procedural. Introducere n C#.


int total = 15; MyExcellentClass mec = new MyExcellentClass(); ... }

este echivalent cu
static void Main( ) {Keyword var total = 15; var mec = new MyExcellentClass(); ... }

Cteva condiii importante n utilizarea cuvntului cheie var sunt: poate fi folosit doar la declararea variabilelor locale nu poate fi folosit la declararea cmpurilor unei clase; poate fi folosit numai atunci cnd declararea variabilelor locale include i iniializarea acestora; odat ce compilatorul a determinat tipul variabilelor, acesta nu mai poate fi schimbat. Vizibilitatea variabilelor locale n interiorul blocurilor imbricate Corpul metodelor poate conine mai multe blocuri imbricate. Variabilele locale pot fi declarate n interiorul blocurilor imbricate, i asemenea tuturor variabilelor locale, timpul acestora de via este limitat la blocul n care au fost definite i la blocurile coninute n acesta. Constantele locale Ciclul de via al constantelor locale este asigurat de aceleai reguli ca la variabilele locale. Sintaxa declaraiei constantelor locale este:
Cuvnt cheie
const Type Identifier = Value;

iniializarea este obligatorie

Apelul unei metode Se pot apela alte metode din corpul unei metode. O metod se poate apela utiliznd numele acesteia mpreun cu lista de parametrii. n urmtorul exemplu n clasa MyClass este declarat metoda PrintDateAndTime care este apelat n interiorul metodei Main. 48

Programare imperativ-procedural. Introducere n C#.

class MyClass { void PrintDateAndTime( ) { DateTime dt = DateTime.Now; curente. Console.WriteLine("{0}", dt); } static void Main() { MyClass mc = new MyClass(); mc.PrintDateAndTime( ); } }

// Declararea metodei. // Determinarea datei i a orei // Afiarea acesteia. // Declararea metodei principale.

// Apelarea metodei.

numele metodei

lista vid de parametrii

Valoarea returnat de o metod O metod poate returna o valoare atunci cnd este apelat. Valoarea returnat este inserat n codul apelant n instruciunea n care este apelat metoda. Pentru a putea returna o valoare, trebuie declarat tipul acesteia naintea numelui metodei (la declararea metodei); Dac o metod nu returneaz o valoare, ea trebuie declarat de tip void (vid)

Urmtorul cod declar dou metode. Prima returneaz o valoare ntreag iar cea de-a doua o valoare vid. Tipul returnat
int GetHour() { ... } void DisplayHour() { ... }

Nu este returnat nici o valoare.

O metod care are returneaz o valoare nevid trebuie s conin urmtoarea form a instruciunii return:
return Expression; // Returnarea unei valori.

Cuvnt cheie

Exemplu:
Tip returnat
int GetHour( ) { int a=1;

49

Programare imperativ-procedural. Introducere n C#.


int b=2; return a+b; }

Instruciunea return

O metod poate returna un obiect definit de programator. De exemplu, urmtorul cod returneaz un obiect de tip MyClass.
Tipul returnat -- MyClass
MyClass method3( ) { MyClass mc = new MyClass(); ... return mc; // returneaz un obiect de tip MyClass. }

Instruciunea return folosit la metodele ce returneaz tipul void. Dintr-o metod ce returneaz tipul vid, se poate iei simplu prin utilizarea instruciunii return fr parametrii: return; Aceast form a instruciunii return poate fi folosit numai cu metodele declarate void. Execuia instruciunilor din corpul unei metode declarate void, se oprete atunci cnd este ntlnit instruciunea return.
Exemplu: Tipul returnat
void SomeMethod() { ... if ( Prima_condiie ) // Dac ... return; // controlul programului este returnat codului apelant. ... if ( A_doua_condiie ) // Dac ... return; // controlul programului este returnat codului apelant. ... } // controlul programului este returnat codului apelant.

Urmtorul cod este un alt exemplu de utilizare a instruciunii return ntro metod declarat void:
class MyClass {

Returneaz tipul void


void TimeUpdate() { DateTime dt = DateTime.Now; // Obinerea datei i orei curente. if (dt.Hour < 12) // Dac ora este mai mic dect 12, return; // atunci return.

50

Programare imperativ-procedural. Introducere n C#.


Return la metoda apelant.
Console.WriteLine("It's afternoon!"); // Altfel, afieaz mesaj. } static void Main() { MyClass mc = new MyClass(); // Creaz o instan a clasei. mc.TimeUpdate(); // Apelez metoda. } }

Parametrii unei metode Parametrii formali sunt variabile locale declarate in lista de parametrii a metodei. Urmtoarea declaraie de metod ilustreaz sintaxa declaraiei de parametrii:
public void PrintSum( int x, float y ) { ... } Declararea parametrilor formali

Deoarece parametrii formali sunt variabile locale, acetia au un tip i un nume. Parametrii formali sunt definii nafara corpului metodei i iniializai naintea execuiei corpului metodei, excepie fcnd un anumit tip de parametrii care vor fi discutai n capitolele urmtoare. Numrul parametrilor formali poate fi orict, declaraiile acestora fiind desprite prin virgul. Parametrii formali sunt folosii n corpul metodei, la fel ca i variabilele locale. n exemplul urmtor, declaraia metodei PrintSum folosete doi parametrii formali, x, z i variabila local Sum, toate de tip int.

public void PrintSum( int x, int y ) { int Sum = x + y; Console.WriteLine("Newsflash: {0} + {1} is {2}", x, y, Sum); }

Parametrii actuali Atunci cnd programul apeleaz o metod, valorile parametrilor formali trebuie iniializai naintea execuiei codului metodei. Expresiile sau variabilele (cmpurile) folosite la iniializarea parametrilor formali se numesc parametrii actuali. Parametrii actuali sunt plasai n lista de parametrii ai metodei invocate.

51

Programare imperativ-procedural. Introducere n C#. Exemplul urmtor ilustreaz invocarea metodei PrintSum, care are doi parametrii actuali de tip int:
PrintSum( 5, SomeInt );

Expresie Variabil de tip int

Atunci cnd o metod este apelat, valoarea fiecrui parametru actual este utilizat pentru iniializarea parametrului formal corespunztor. Figura urmtoare explic relaia dintre parametrii actuali i cei formali.

Figura 7. Relaia dintre parametrii actuali i cei formali

Atunci cnd este apelat o metod, trebuie ndeplinite urmtoarele condiii: Numrul parametrilor actuali trebuie s fie exact cu numrul parametrilor formali, cu o singur excepie care va fi discutat n capitolele urmtoare. Fiecare parametru actual trebuie s aib acelai tip cu parametrul formal corespunztor. Exemple:
class MyClass parametrii formali { public int Sum(int x, int y) // Declararea metodei. { return x + y; // Returneaz suma. } parametrii formali public float Avg(float Input1, float Input2) // Declararea metodei. { return (Input1 + Input2) / 2.0F; // Returneaz media. } } class Class1 { static void Main() { MyClass MyT = new MyClass();

52

Programare imperativ-procedural. Introducere n C#.


int SomeInt = 6; Console.WriteLine("Newsflash: Sum: {0} and {1} is {2}",5, SomeInt, MyT.Sum( 5,SomeInt )); // Invocarea metodei. parametrii actuali Console.WriteLine("Newsflash: Avg: {0} and {1} is {2}",5, SomeInt, MyT.Avg( 5, SomeInt )); // Invocarea metodei. } } parametrii actuali

Codul de mai nainte produce urmtoarea ieire:


Newsflash: Sum: 5 and 6 is 11 Newsflash: Avg: 5 and 6 is 5.5

Parametrii de tip valoare Acesta este un tip implicit de parametri numii i parametrii valoare. Atunci cnd se folosesc parametrii valoare, datele sunt transmise metodei prin copierea valorilor parametrilor actuali n parametrii formali. Atunci cnd o metod este apelat, sistemul parcurge paii urmtori: Aloc spaiu n stiv (stack) pentru parametrii formali Copiaz parametrii actuali n parametrii formali Un parametru actual al unui parametru valoare poate fi, pe lng variabil local, o expresie a crui tip se potrivete cu tipul parametrului valoare. Exemplu:
float func1( float Val ) // Declararea metodei. { ... }

dat de tip float

{ float j = 2.6F; float k = 5.1F;

variabil de tip float


float fValue1 = func1( k ); // Apelul metodei float fValue2 = func1( (k + j) / 3 ); // Apelul metodei ...

Expresie care evalueaz un tip real

Urmtorul cod de program prezint o metod denumit MyMethod, care are doi parametrii: o variabil de tip MyClass i o variabil de tip int:
class MyClass { public int Val = 20; } // Iniializeaz cmpul cu 20. class Program

parametrii formali
{ static void MyMethod( MyClass f1, int f2 )

53

Programare imperativ-procedural. Introducere n C#.


{ f1.Val = f1.Val + 5; // Adun 5 la cmpul parametrului f1. f2 = f2 + 5; // Adun 5 la al doilea parametru. } static void Main( ) { MyClass A1 = new MyClass(); int A2 = 10; MyMethod( A1, A2 ); // Apelul metodei. } }

parametrii actuali

Parametrii referin

Al doilea tip de parametrii folosii n lista de parametrii ai unei metode sunt parametrii referin. Atunci cnd se utilizeaz un parametru referin, trebuie folosit modificatorul ref att n declaraia metodei ct i n invocarea acesteia. Parametrii actuali trebuie s fie variabile (nu sunt admise valori sau expresii valorice) care trebuie s fie iniializate nainte s fie folosite ca parametrii actuali. Dac parametrii actuali sunt variabile de tip referin, atunci acestora trebuie s li se atribuie, fiecreia, o referin sau referina nul (null). Exemplul urmtor ilustreaz sintaxa declarrii i a invocrii unei metode cu parametrii referin.
Include modificatorul ref
void MyMethod( ref int val ) // Declararea metodei { ... } int y = 1; // Variabila pentru parametrul actual MyMethod ( ref y ); // Apelul metodei

Include modificatorul ref MyMethod ( ref 3+5 ); // Error! Trebuie utilizat o variabil

Aa cum am vzut, n cazul parametrilor valoare sistemul aloc memorie n stiv (stack) pentru parametrii formali. Pentru parametrii referin exist urmtoarele caracteristici: Nu se aloc memorie n stiv pentru parametrii formali. n schimb, numele parametrilor formali acioneaz ca un alias pentru variabilele considerate parametrii actuali, referind aceeai locaie de memorie. ntruct numele parametrilor formali i numele parametrilor actuali refer aceeai locaie de memorie, este evident c orice schimbare fcut parametrilor

54

Programare imperativ-procedural. Introducere n C#. formali, n timpul execuiei codului metodei respective, va avea efect dup execuia metodei, asupra variabilelor desemnate ca parametrii actuali. Exemplu:
class MyClass { public int Val = 20; } // Iniializarea cmpului cu valoarea 20. class Program {

modificatorul ref

modificatorul ref

} }

static void MyMethod(ref MyClass f1, ref int f2) { f1.Val = f1.Val + 5; // Adun 5 la cmpul parametrului f1. f2 = f2 + 5; // Adun 5 la al doilea parametru. } static void Main() { MyClass A1 = new MyClass(); int A2 = 10; MyMethod(ref A1, ref A2); // Apelul metodei.

modificatori ref

Parametrii de ieire Parametrii de ieire sunt folosii pentru a transmite date dinuntrul unui metode, n codul apelant. Parametrii de ieire sunt asemntori cu parametrii referin, i au urmtoarele caracteristici: Atunci cnd se utilizeaz un parametru de ieire, trebuie folosit modificatorul out att n declaraia metodei ct i n invocarea acesteia. Parametrii actuali trebuie s fie variabile (nu sunt admise valori sau expresii valorice). n exemplul urmtor este declarat metoda parametru de ieire:
Modificatorul out
MyMethod,

care are un singur

void MyMethod( out int val ) // Declaraia metodei { ... } ... int y = 1; // variabila utilizat ca parametru actual MyMethod ( out y ); // Apelul metodei Modificatorul out

Asemenea parametrilor referin, parametrii formali ai parametrilor de ieire acioneaz ca aliasuri pentru parametrii actuali. Numele parametrilor formali i numele parametrilor actuali refer, fiecare n parte, aceeai locaie de memorie. Este evident faptul c orice aciune asupra parametrilor formali fcut n interiorul 55

Programare imperativ-procedural. Introducere n C#. corpului metodei, va avea acelai efect asupra parametrilor actuali. Spre deosebire de parametrii referin, parametrii de ieire au urmtoarele caracteristici: Unui parametru de ieire trebuie s i se atribuie o valoare, n corpul metodei, nainte ca acesta s fie folosit. Aceasta nseamn c valoarea iniial a parametrilor actuali este irelevant i, din aceast cauz, nu trebuie atribuite valori parametrilor actuali naintea apelului metodei. Fiecare parametru de ieire trebuie iniializat. Deoarece parametrii de ieire trebuie iniializai n corpul metodei, este inutil s fie transmise date (prin parametrii actuali) n corpul metodei. Utilizarea unui parametru de ieire naintea iniializrii acestuia produce eroare. Exemplu:
public void Add2( out int outValue ) { int var1 = outValue + 2; // Error! Utilizarea unui parametru de ieire naintea iniializrii acestuia produce eroare. }

Exemplu:
class MyClass { public int Val = 20; } // Iniializarea cmpului cu valoarea 20. class Program { static void MyMethod(out MyClass f1, out int f2, out int f3) { f1 = new MyClass(); // Crearea unui obiect al clasei. f1.Val = 25; // Atribuirea unui valori cmpului clasei. // f2 = f2 + 5; // Eroare !! f2 = 15; // eroare ! parametrul f3 nu este initializat } static void Main() { MyClass A1 = null; int A2, A3; MyMethod(out A1, out A2, out A3); // Apelul metodei. } }

Parametrii de tip vector Caracteristicile importante ale parametrilor de tip vector sunt: Poate exista numai un parametru de tip vector n lista de parametrii. Dac exist unul, acesta trebuie s fie ultimul parametru din list. Pentru a declara un parametru de tip vector trebuie: Utilizat modificatorul params naintea tipului de date. Trebuie plasat un set de paranteze drepte goale dup tipul de date. 56

Programare imperativ-procedural. Introducere n C#.

Antetul metodei prezentate n continuare prezint sintaxa pentru declararea unui parametru de tip vector de ntregi.
Vector de ntregi
void ListInts( params int[] inVals ) { ...

Modificator
}

Numele parametrului

Apelul unei metode ce conine parametrii de tip vector. Un parametru actual de tip vector poate fi transmis unei metode n dou moduri: 1. Printr-o list de elemente de tipul specificat n declararea metodei, separate prin virgul ListInts( 10, 20, 30 ); Aceast form se mai numete i forma expandat. 2. Printr-o variabil de tip vector:
int[] intArray = {1, 2, 3}; ListInts( intArray );

Aa cum se observ din exemplele date, la apelul metodei nu se utilizeaz modificatorul params. n exemplul urmtor se observ c apelul metodei ListInts poate fi fcut cu un numr variabil de elemente.
void ListInts( params int[] inVals ) { ... } // Declararea metodei ... ListInts( ); // 0 parametrii actuali ListInts( 1, 2, 3 ); // 3 parametrii actuali ListInts( 4, 5, 6, 7 ); // 4 parametrii actuali ListInts( 8, 9, 10, 11, 12 ); // 5 parametrii actuali

Atunci cnd se apeleaz o metod cu parametru vector n forma expandat, compilatorul face urmtoarele lucruri: Ia lista parametrilor actuali i o utilizeaz la crearea i iniializarea unui vector n memoria heap. Memoreaz referina ctre vector, n stiv n locaia parametrului formal. Dac nu exist nu exist parametrii actuali n poziia corespunztoare parametrului formal de tip vector, compilatorul creeaz un vector cu zero elemente. Exemplu:
class MyClass parametrii de tip vector { public void ListInts( params int[] inVals ) { if ( (inVals != null) && (inVals.Length != 0)) for (int i = 0; i < inVals.Length; i++)

57

Programare imperativ-procedural. Introducere n C#.


{ inVals[i] = inVals[i] * 10; Console.WriteLine("{0} ", inVals[i]); } } } class Program { static void Main() { int first = 5, second = 6, third = 7; MyClass mc = new MyClass(); mc.ListInts( first, second, third );

Parametrii actuali
Console.WriteLine("{0}, {1}, {2}", first, second, third); } }

Tabel cu sumarul tipurilor de parametrii


Tipul parametrului Valoare Referin De ieire Modificator Utilizat la declarare Utilizat la invocare Implementare Compilatorul copiaz parametrii actuali in parametrii formali Parametrii formali devin alias ai parametrilor actuali Parametrii formali devin alias ai parametrilor actuali Este permis transmiterea ctre metod a unui numr variabil de parametrii actuali.

Nu

ref out

Da Da

Da Da

De tip vector

params

Da

Nu

Test de autoevaluare No. 6 1. Care este structura unei metode ? 2. Facei o comparaie ntre variabilele locale i instana cmpurilor. 3. Enumerai tipurile de parametrii acceptai de o metod. 4.4 Crearea variabilelor i instanelor unei clase Declararea unei clase este un ablon din care instanele clasei sunt create. Clasele sunt tipuri referin, i prin urmare necesit memorie att pentru referina la date ct i pentru datele actuale.

58

Programare imperativ-procedural. Introducere n C#. Referina la date este stocat ntr-o variabil de tip class. Astfel, pentru a crea o instan a clasei, trebuie, pentru nceput, declarat o variabil de tip clas. Dac variabila nu este iniializat, valoarea sa este nedefinit.

Alocarea memoriei pentru date Declararea unei variabile de tip clas aloc memorie pentru stocarea referinei, nu i pentru datele actuale ale obiectului instaniat din clas. Pentru a aloca memorie datelor actuale, trebuie utilizat operatorul de instaniere new. Operatorul new aloc i iniializeaz memorie pentru o instan a unui tip specificat. Acest operator aloc memorie din memoria de tip stack i memoria de tip heap, n funcie de tipul variabilei. Utilizarea operatorului de instaniere new pentru crearea unui obiect const din: Numele variabilei de tip clas; Semnul =; Cuvntul cheie new; Numele tipului de instan pentru care se aloc memorie; Parantezele deschise care pot sau nu s conin parametrii.

Cuvnt cheie

paranteze deschise

Nume_variabil = new TypeName( )

numele tipului

Dac alocarea memoriei este pentru un tip referin, expresia de creare a unui obiect returneaz o referin ctre locaia de memorie de tip heap, unde este alocat i iniializat instana.
Dealer theDealer; // Declararea variabilei pentru referin. theDealer = new Dealer(); // Alocarea momoriei pentru clasa obiect.

Expresia de creare a unui obiect

Declararea unei variabile de tip clas i iniializarea ei se pot face ntr-o singur declaraie:
Declararea variabilei
.

Dealer theDealer = new Dealer(); // Declarare i iniializare (instanierea).

Iniializare (instaniere) cu sintaxa de creare a unui obiect

59

Programare imperativ-procedural. Introducere n C#. 4.5 Membrii unei instane Declararea unei clase produce un ablon din care se vor putea crea instane ale clasei respective. Membrii instanei (Instance members): Fiecare instan a unei clase este o entitate separat care are propriul set de date membre, distincte fa de alt instan a aceleai clase. Acestea (datele membre) sunt denumite membrii instanei (instance members), deoarece sunt asociai instanei unei clase. Urmtorul exemplu ilustreaz un program cu trei instane ale clasei Player.
class Dealer { ... } //declararea clasei Dealer class Player { //declararea clasei Player string Name; // cmp ... } class Program { static void Main() { Dealer theDealer = new Dealer(); Player player1 = new Player(); Player player2 = new Player(); Player player3 = new Player(); ... } }

4.6 Modificatori de acces Din interiorul unei clase, orice funcie membru poate accesa oricare alt membru al clasei, simplu prin numele membrului. Modificatorul de acces (access modifier) este o parte opional din declaraia unui membru, care specific care pri din program au acces la membru. Modificatorul de acces este plasat naintea declaraiei unui membru. Urmtoarele sintaxe sunt folosite pentru cmpuri i metode: Fields:
AccessModifier Type Identifier;

Methods:
AccessModifier ReturnType MethodName () { ... }

Acestor membri li se pot ataa urmtorii cinci modificatorii de acces: private public protected internal 60

Programare imperativ-procedural. Introducere n C#.

protected internal

4.7 Accesul privat sau public Membrii care au specificatorul de acces private sunt accesibili doar n clasa n care au fost declarai alte clase nu au acces la ei. Accesul de tip private este specificatorul implicit. Astfel, dac un membru este declarat fr un modificator de acces, acesta este un membru privat. De exemplu, urmtoarele dou declaraii specific membrii privai de tip ntreg:
int MyInt1; // Declarare implicit private int MyInt2; // Declarare explicit

Modificator de acces

Membrii care au specificatorul de acces public sunt accesibili tuturor obiectelor din program.
Modificator de acces

public int MyInt;

Exemplu de accesare a membrilor unei clase:


class C1 { int F1; // Cmp implicit privat private int F2; // Cmp declarat explicit privat public int F3; // Cmp declarat public void DoCalc() // Metod implicit privat { ... } public int GetVal() // Metod declarat public { ... } }

Exemplu:
using System; class Access { //Variabile declarate nafara funciei Main. int x = 100; int y = 200; } class program { public static void Main() { //Crearea unui obiect Access a = new Access(); //Apelul instantei variabilelor

61

Programare imperativ-procedural. Introducere n C#.


Console.WriteLine(a.x); // Eroare, x nu este declarat Console.WriteLine(a.y); // Eroare, y nu este declarat Console.ReadLine(); } }

public public

Accesarea membrilor din interiorul unei clase Membrii unei clase pot fi accesai din interiorul acesteia utiliznd numele lor. n urmtorul exemplu metodele unei clase acceseaz cmpuri i alte metode ale aceleiai clase.
class DaysTemp { // Cmpuri private int High = 75; private int Low = 45; // Metode private int GetHigh() { return High; // Access private field } private int GetLow() { return Low; // Access private field } public float Average () { return (GetHigh() + GetLow()) / 2; // Accesarea metodelor private } }

Accesarea metodelor private

Accesarea membrilor unei clase din afara acesteia Pentru a accesa din afara unei clase membrii publici ai acesteia, acetia trebuie apelai cu numele variabilei de tip clas separat cu punct de numele membrului.
DaysTemp myDt = new DaysTemp(); // Crearea unui obiect al clasei. float fValue = myDt.Average(); // Accesul din afara clasei.

numele variabilei

numele membrului

Urmtorul cod declar dou clase: DaysTemp i Program. Dou cmpuri ale clasei DaysTemp sunt declarate public, prin urmare acestea vor putea fi accesate din afara clasei. n corpul metodei Main sunt create o variabil i un obiect al clasei DaysTemp, dup care sunt atribuite valori cmpurilor obiectului.
using System; class DaysTemp // declararea clasei DaysTemp { public int High = 75; public int Low = 45; }

62

Programare imperativ-procedural. Introducere n C#.

class Program // declararea clasei Program. { static void Main() { DaysTemp temp = new DaysTemp(); // crearea unui obiect. temp.High = 85; // atribuire de valori cmpurilor. temp.Low = 60; Console.WriteLine("High: {0}", temp.High ); // citirea valorii unui cmp. Console.WriteLine("Low: {0}", temp.Low ); Console.ReadLine(); } }

Urmtorul cod creeaz dou instane i stocheaz referina acestora n variabilele cu numele t1 i t2.
using System; class DaysTemp // declararea unei clase. { public int High, Low; // declararea cmpurilor. public int Average() // declararea unei metode. { return (High + Low) / 2; } } class Program { static void Main() { // crearea a dou instane (obiecte) DaysTemp. DaysTemp t1 = new DaysTemp(); DaysTemp t2 = new DaysTemp(); // scriere de valori n cmpurile fiecrei instane. t1.High = 76; t1.Low = 57; t2.High = 75; t2.Low = 53; // citirea valorilor cmpurilor fiecrei instane Console.WriteLine("t1: {0}, {1}, {2}", t1.High, t1.Low, t1.Average() ); Console.WriteLine("t2: {0}, {1}, {2}", t2.High, t2.Low, t2.Average() ); Console.ReadLine(); } }

4.8 Lucrare de verificare Nr.4 1. 2. 3. 4. 5. n ce const procesul de instaniere al unei clase ? Care este legtura dintre o clas i un obiect al clasei respective ? Ce sunt membrii unei instane ? Descriei modificatori de acces. Cum se face accesarea membrilor unei clase din afara acesteia?

4.9 Bibliografie 1. Jeff Ferguson, Brian Patterson, Jason Beres, Pierre Boutquin, and Meeta Gupta - C# Bible, 2002 by Wiley Publishing. 63

Programare imperativ-procedural. Introducere n C#. 10. Daniel Solis- Illustrated C# 2005, Apress, 2006. 11. Faraz Rasheed - Programmers Heaven: C# School, Synchron Data, 2006. 12. Charles Petzold - Programming Microsoft Windows with C# (Microsoft), 2002. 13. Andy Harris - Microsoft C# Programming for the Absolute Beginner, Course Technology , 2002. 14. Michael Mcmillan - Data Structures And Algorithms Using C#, Cambridge University Press, 2007. 15. Jack Purdum Beginning - C# 3.0, Wiley Publishing, Inc., 2007. 16. Carmen Fifor Introducere n programare. Limbajul C teorie i probleme rezolvate, Ed. Univ. Aurel Vlaicu Arad, 2007 POO 1. Grady Booch, Robert A. Maksimchuk, Michael W. Engle, Bobbi J. Young, Ph.D. Jim Conallen, Kelli A. Houston - Object-Oriented Analysis and Design with Applications, Third Edition, Pearson Education, Inc., 2007. Software Visual Studio 2008 Express Editions - http://www.microsoft.com/Express/ Visual Studio Professional - http://msdn.microsoft.com/enus/vstudio/products/aa700831.aspx

64