Sunteți pe pagina 1din 28

MINISTERUL EDUCA IEI I SPORTULUI AL REPUBLICII MOLDOVA UNIVERSITATEA TEHNICA a MOLDOVEI Facultatea Calculatoare Informatica si Microelectronica CATEDRA: AUTOMATICA

SI TEHNOLOGII INFORMATIONALE

LUCRARE DE CURS
la disciplina

Structuri de date si algoritmi"

A elaborat: Stud.gr.TI-073 Pirtu Adrian

A verificat:

Marin tefan

Chisinau 2010

1. Introducere .................................................................................................................................................... 3 1.1 Despre limbajul C................................................................................................................................. 3 1.2 Pointerii ................................................................................................................................................... 3 1.3 Func ii ..................................................................................................................................................... 3 1.4 Despre limbajul C# ............................................................................................................................... 4 1.5 Mediul de dezvoltare Visual C# ............................................................................................................... 4 2. Sarcina lucrarii: ............................................................................................................................................. 5 3. Descrierea aplicatiei: ..................................................................................................................................... 6 3.1 Versiunea in limbajul C ........................................................................................................................... 6 3.1.1 Descrierea algoritmului programului ................................................................................................. 6 3.1.2 Listingul Programului: ..................................................................................................................... 8 3.2 Versiunea in C# ................................................................................................................................. 11 3.2.1 Schema logic ................................................................................................................................. 11 3.2.2 Prezentarea programului................................................................................................................. 16 3.2.3 LISTINGUL PROGRAMULUI: .................................................................................................... 21 4. Rezultatele rul rii aplicatiei ......................................................................................................................... 26 5. Concluzii ..................................................................................................................................................... 28 6. Literatura utilizata: ...................................................................................................................................... 28

1. Introducere
1.1 Despre limbajul C Limbajul C este un limbaj de programare care are o destina ie universal . El este utilizat n rezolvarea problemelor tiin ifice i tehnico-inginere ti, n prelucr ri de date, precum i n scrierea programelor de sistem. Limbajul dat a aparut n anul 1972, autorul principal al limbajului este Dennis Ritchie de la firma BELL LABORATORIES. Limbajul C a ap rut n leg tura cu implementarea sistemului de operare UNIX pe minicalculatoarele firmei DEC, seria PDP-11. Sistemul de operare UNIX, compilatorul C i n esen toate aplica iile sub sistemul UNIX sunt scrise n C ntr-o propor ie mare. Astfel, din cele 13000 linii surs ale sistemului de operare UNIX, numai 800 linii sunt scrise n limbaj de asamblare, restul fiind scrise n C. De asemenea, ns i compilatorul C este scris n C n propor ie de 80%. n felul acesta limbajul C asigur o portabilitate bun pentru programele scrise n el. No iunea de portabilitate nu este nc definit riguros. n mod intuitiv, spunem c un program este portabil daca el poate fi transferat u or de la un tip de calculator la altul. Portabilitatea mare a programelor scrise n C a condus la o raspndire mare a alimbajului C i a sistemului de operare UNIX. n prezent limbajul C este implementat i sub alte sisteme de operare. Practic el este disponibil pe toate calculatoarele, ncepnd cu microcalculatoarele personale i terminnd cu supercalculatoarele. Pe calculatoarele de tip IBM PC este implementat o variant a limbajului C numit TURBO C. Aceast variant dispune de un mediu de programare menit s ajute utilizatorul n scrierea i punerea la punct a programelor. De asemenea, pe acelasi tip de calculatoare este implementat varianta quickC, care dispune i ea de un mediu de programare dezvoltat. Limbajul C con ine structurile proprii program rii structurate. Succesul ei s-a dovedit din plin odat cu apari ia limbajului Pascal. De asemenea, limbajul C dispune i de facilit i oferite de limbajele de asamblare, cum sunt lucrul pe bi i i utilizarea adreselor. El este considerat ca fiind un intermediar ntre limbajele de nivel nalt i cele de asamblare. Compilatorul C ofer programatorului o flexibilitate mai mare n scrierea programelor dect alte limbaje de programare. El realizeaz un num r mai redus de controale la compilarea textului surs aceast din aceasta cauz programarea n limbajul C este mai expus la erori dect programarea n alte limbaje, cum ar fi de exemplu, limbajul Pascal.

1.2 Pointerii Pointerii reprezint un instrument foarte puternic n scrierea programelor i crearea softului. Pointer reprezint o variabil , care con ine adresa unei alte variabile. Cu ajutorul pointerilor avem posibilitetea s acces m datele necesare nu prin intermediul variabilelor, ci prin intermediul adresei acestor date. Aceast adres poate fi adresa unei variabile, a unui tablou, a unei structuri etc. n momentul compil rii, un pointer este un tip de dat complex ce reprezint att adresa de memorie ct i tipul de dat . De exemplu, irurile caracteriale sunt adesea reprezentate printr-un pointer la un vector de caractere. Alocarea dinamic a memoriei este realizat tot cu ajutorul pointerilor.

1.3 Func ii Func iile limbajului C reprezint ni te subprograme, care pot fi apelate fie din subprogramul principal (main), fie din alte subprograme (func ii). Cu ajutorul func iilor devine posibil structurarea programului. Adic ,

scrierea unui cod-surs , clar, bine n eles, unde fiecare func ie r spunde pentru ceva concret, adic are rolul s u personal n derularea programului. ntr-un astfel de program este mai u or de depistat gre elile, care apar n timpul derul rii. Func iile pot primi parametri, care pot fi att variabile de diferite tipuri, ct i pointeri, ce pointeaz la variabile sau la tablouri, la fel, de tipuri diferite.

1.4 Despre limbajul C# Limbajul C# fost dezvoltat de o echipa restrinsa de ingineri de la Microsoft, echipa din care s-a evidentiat Anders Hejlsberg (autorul limbajului Turbo Pascal si membru al echipei care a proiectat Borland Delphi). C# este un limbaj simplu, cu circa 80 de cuvinte cheie, si 12 tipuri de date predefinite. El permite programarea structurata, modulara si orientata obiectual, conform perceptelor moderne ale programarii profesioniste. Principiile de baza ale programarii pe obiecte (INCAPSULARE, MOSTENIRE, POLIMORFISM) sunt elemente fundamentale ale programarii C#. In mare parte, limbajul mosteneste sintaxa si principiile de programare din C++. Sunt o serie de tipuri noi de date sau functiuni diferite ale datelor din C++, iar in spiritul realizarii unor secvente de cod sigure (safe), unele functiuni au fost adaugate (de exemplu, interfete si delegari), diversificate (tipul struct), modificate (tipul string) sau chiar eliminate (mostenirea multipla si pointerii catre functii). Unele functiuni (cum ar fi accesul direct la memorie folosind pointeri) au fost pastrate, dar secventele de cod corespunzatoare se considera nesigure. O aplicatie C# este formata din una sau mai multe clase, grupate in spatii de nume (namespaces). Un spatiu de nume cuprinde mai multe clase cu nume diferite avind functionalitati inrudite. Doua clase pot avea acelasi nume cu conditia ca ele sa fie definite in spatii de nume diferite. In cadrul aceluiasi spatiu de nume poate aparea definitia unui alt spatiu de nume, caz in care avem de-a face cu spatii de nume imbri cate. O clasa poate fi identificata prin numele complet (nume precedat de numele spatiului sau spatiilor de nume din care face parte clasa respectiva, cu separatorul punct). In exemplul nostru, HelloWorld.Program este numele cu specificatie complete al clasei Program. O clasa este formata din date si metode (functii). Apelarea unei metode in cadrul clasei in care a fost definita aceasta presupune specificarea numelui metodei. Apelul unei metode definite in interiorul unei clase poate fi invocata si din interiorul altei clase, caz in care este necesara specificarea clasei si apoi a metodei separate prin punct. Daca in plus, clasa apartine unui spatiu de nume neinclus in fisierul curent, atunci este necesara precizarea tuturor componentelor numelui: spatiu.clasa.metoda sau spatiu .spatiu.clasa.metoda etc. Pentru a facilita cooperarea mai multor programatori la realizarea unei aplicatii complexe, exista posibilitatea de a segmenta aplicatia in mai multe fisiere numite assemblies. Intr-un assembly se pot implementa mai multe spatii de nume, iar parti ale unui aceeasi spatiu de nume se pot regasi in mai multe assembly-uri. Pentru o aplicatie consola, ca si pentru o aplicatie Windows de altfel, este obligatoriu ca una (si numai una) dintre clasele aplicatiei sa contina un punct de intrare (entry point), si anume metoda (functia) Main. 1.5 Mediul de dezvoltare Visual C# Mediul de dezvoltare Microsoft Visual C# dispune de instrumente specializate de proiectare, ceea ce permite crearea aplicatiilor in mod interactiv, rapid si usor. Pentru a construi o aplicatie Windows (File New Project) se selecteaza ca template Windows Application. O aplicatie Windows contine cel putin o fereastra (Form) in care se poate crea o interfata cu utilizatorul aplicatiei. Componentele vizuale ale aplicatiei pot fi prelucrate in modul Designer (Shift+F7) pentru a plasa noi obiecte, a le stabili proprietatile etc. Codul din spatele unei component vizuale este accesibil in modul Code (F7). In fereastra Solution Explorer sunt afisate toate fisierele pe care Visual Studio.NET le-a inclus in proiect. Form1.cs este formularul creat implicit de Visual Studio.NET ca parte a proiectului. Fereastra Properties este utilizata pentru a schimba proprietatile obiectelor. Toolbox contine controale standard drag-and-drop si componente utilizate in crearea aplicatiei Windows. Controalele sunt grupate in categoriile logice din imaginea alaturata. Designer, Code, Solution

Explorer si celelalte se afla grupate in meniul View. La crearea unei noi aplicatii vizuale, Visual Studio.NET genereaza un spatiu de nume ce contine clasa statica Program, cu metoda statica ce constituie punctul de intrare (de lansare) a aplicatiei: static void Main() { ... Application.Run(new Form1()); } Clasa Application este responsabila cu administrarea unei aplicatii Windows, punind la dispozitie proprietati pentru a obtine informatii despre aplicatie, metode de lucru cu aplicatia si altele. Toate metodele si proprietatile clasei Application sunt statice. Metoda Run invocata mai sus creeaza un formular implicit, aplicatia raspunzind la mesajele utilizatorului pina cind formularul va fi inchis. Compilarea modulelor aplicatiei si asamblarea lor intr-un singur fisier executabil se realizeaza cu ajutorul optiunilor din meniul Build, uzuala fiind Build Solution (F6). Odata implementata, aplicatia poate fi lansata, cu asistenta de depanare sau nu (optiunile Start din meniul Debug). Alte facilitati de depanare pot fi folosite prin umarirea pas cu pas, urmarirea pina la puncte de intrerupere etc. (celelalte optiuni ale meniului Debug). Ferestre auxiliare de urmarire sunt vizualizate automat in timpul procesului de depanare, sau pot fi activate din submeniul Windows al meniului Debug.

2. Sarcina lucrarii:
Aplica ia Creare unui translator din limbaj romn (uman) in sintaxa limbajului C/C++. Ex: A. Limbaj uman - Afisheaza aria unui dreptunghi de lungimea 5cm si inaltime 7cm. Limbaj C #include <conio.h> int aria(int lungime, int inaltime){ return lungime*inaltime; }void main (){ printf("Aria dreptunghi = %d", arie(5, 7)); } B. Limbaj uman - Afiseaza "Azi e zi frumoasa" "cu soare" Limbaj C #include <conio.h> void main (){ printf("Azi e zi frumoasa\n"); printf("Cu soare"); // sau printf("Azi e zi frumoasa\ncu soare"); } Nota: Aplicatia trebuie sa fie capabila a transla propozitii mai complicate, chiar si fraze. Aplicatia trebuie sa posede posibilitatea de a deschide fisierul de translat oriunde el ar fi (similar optiunii Open file din orice aplicatie), si dupa translare sa salveze fisierul in directoriul care il dorim si cu numele dorit (similar Save din orice aplicatie) Frazele de translat si rezultatul translarii sa fie pastrat in fisiere diferite. Este preferabil de implementat compartimentul cu indirectare multipl n C. Frazele cu limbajul uman sa fie in limba romana.

3. Descrierea aplicatiei:
3.1 Versiunea in limbajul C

3.1.1 Descrierea algoritmului programului

Programul consta din 3 functii principale:


a) void file() { FILE *fp; char *s,*fil; printf("Introduceti numele fishierului:"); gets(fil); if((fp=fopen(fil,"w"))==NULL) { puts("eroare in crearea fishierului"); return; } printf("Textul:"); gets(s); fprintf(fp,"%s",s); fclose(fp); }

b) int main() { char ch; while(1) { clrscr(); puts("1-----------introducerea textului"); puts("2-----------conditia"); puts("ESC---------ieshirea"); ch=getch(); if(ch=='1') { file(); }

if(ch=='2')condit(); if(ch==27)return 0; } getch(); return 0; }

Aceasta functie creaza fisierul introdus de catre utilizator, apoi cere de la user sa introduca textul care va fi inscris in fisier. Tastam butonul 1 primim urmatorul rezultat:

c) void condit() { char *fil="",ch; puts("Introduceti nume fish. care trebuie deschis:"); gets(fil); int handle; clrscr(); handle = open(fil, O_CREAT | O_RDWR, S_IREAD | S_IWRITE); lseek(handle, 0L, SEEK_SET); do { read(handle, &ch, 1); printf("%c", ch); } while (!eof(handle)); close(handle); getch(); return ; }

Cu ajutorul acestei functii putem deschide fisierul care afost creat de noi anterior, si apoi citi textul scris. Tastam butonul 2 primim urmatorul rezultat:

Introducem denumirea fisierului creat de noi exemplu.txt , si primim rezultatul:

Pentru iesire tastam ESC

3.1.2 Listingul Programului:


#include <stdlib.h> #include <stdio.h> #include <conio.h> #include <stat.h> #include <string.h> #include <fcntl.h> #include <io.h>

void file() { FILE *fp; char *s,*fil; printf("Introduceti numele fishierului:"); gets(fil); if((fp=fopen(fil,"w"))==NULL) { puts("eroare in crearea fishierului"); return; } printf("Textul:"); gets(s); fprintf(fp,"%s",s); fclose(fp); } void condit()

{ char *fil="",ch; puts("Introduceti nume fish. care tre. deschis:"); gets(fil); int handle; clrscr(); /* create a file */ handle = open(fil, O_CREAT | O_RDWR, S_IREAD | S_IWRITE); lseek(handle, 0L, SEEK_SET); do { read(handle, &ch, 1); printf("%c", ch); } while (!eof(handle)); close(handle); getch(); return ; }

int main() { char ch; while(1) { clrscr(); puts("1-----------introducerea textului"); puts("2-----------conditia"); puts("ESC---------ieshirea"); ch=getch(); if(ch=='1') { file(); } if(ch=='2')condit(); if(ch==27)return 0; } getch(); return 0; }

Pentru realizarea sarcinei complete, de creare aplicatiei translator din limbaj romn (uman) in sintaxa limbajului C/C++., trebuie sa folosim prelucrarea cu ajutorul sirurilor de caractere. Cele mai des ntlnite utiliz ri ale tablourilor unidimensionale n limbajul C sunt irurile de caractere, din cauz c n C nu exist prev zut tipul de date ir de caractere. Pentru memorarea irurilor se utilizeaz tablouri cu tipul de baz char, care au pe ultima pozi ie, ca marc de sfr it a irului, caracterul \0. Neexistnd tipul ir de caractere, n C nu sunt prezen i nici operatorii pentru iruri. n schimb, biblioteca standard con ine numeroase func ii pentru prelucrarea irurilor de caractere. O parte a func iilor pentru citirea/scrierea irurilor, declarate n fi ierul antet stdio.h.

Exemple:
int strcmp(char *s1, char *s2);

Efect: compar irurile s1 i s2 i returneaz o valoare negativ , dac irul s1 este mai mic dect irul s2, 0 dac s1 este egal cu s2, i o valoare pozitiv dac s1 este mai mare dect s2.
int strncmp(char *s1, char *s2, int n);

Efect: identic cu strcmp, dar se compar


char *strcpy(char *d, char *s);

irurile s1 i s2 pentru cel mult n caractere.

Efect: copiaz irul surs s n irul destina e d i returneaz adresa irului destina ie. Copierea se termin dup ce a fost copiat caracterul \0
char *strncpy(char *d, char *s, int n);

Efect: copiaz maxim n caractere de la sursa s la destina ia d i returneaz adresa irului destina ie.
int strlen(char *s);

Efect: returneaz lungimea irului f r a num ra caracterul terminator (\0).


char *strcat(char *d, char *s);

Efect: concateneaz cele dou


char *strncat(char *d, char *s, int n);

iruri i returneaz adresa irului rezultat.

Efect: concateneaz cel mult n caractere din irul surs s la irul destina ie d i returneaz adresa irului rezultat.

3.2 Versiunea in C# 3.2.1 Schema logic Functia private


void cuvinte()

Functia private

void prelucrare()

3.2.2 Prezentarea programului In continuare voi prezenta aplicatia Creare unui translator din limbaj romn (uman) in sintaxa limbajului C# Programul dat consta din citeva func ii care sunt responsabile pentru functionarea corecta a aplicatiei.
a) private void cuvinte() { string text = textBox1.Text; string a = text[0].ToString(); int j = 0; for (int i = 1; i < text.Length; i++) { if (text[i].ToString() == " " || text[i].ToString() == ".") { cuvint[num_cuvinte] = a; a = ""; num_cuvinte++; } else { a = a + text[i]; } } }

Cu ajutorul acestei functii, noi parcurgem tot sirul de caractere care se contine in TextBox1.Text, pentru a analiza prin interendiul instructiunii IF, totalitatea cuvintelor ce se contin in fisierul deshis de aplicatie.Formind o matricie de tip string, adaugind in ea toate cuvintele gasite.
b) private void prelucrare() { string functia = ""; string figura = ""; string fel_figura = ""; string marimea_lung = ""; string marimea_lat = ""; string marimea_laturii = ""; string temp = ""; string[] marimea_laturilor = new string[6]; int num_lat = 0; for (int i = 0; i < num_cuvinte; i++) { if (cuvint[i] == "Calculati" || cuvint[i] == "Aflati" || cuvint[i] == "Afisati" || cuvint[i] == "Determinati" || cuvint[i] == "calculati" || cuvint[i] == "aflati" || cuvint[i] == "afisati" || cuvint[i] == "determinati") { functia = cuvint[i + 1]; if (cuvint[i + 1] == "aria" || cuvint[i + 1] == "aria." || cuvint[i + 1] == "aria,") { functia = "aria"; } if (cuvint[i + 1] == "perimetru" || cuvint[i + 1] == "perimetrul" || cuvint[i + 1] == "perimetrul." || cuvint[i + 1] == "perimetrul,") { functia = "perimetru"; } }

if (cuvint[i] == "dreptunghi" || cuvint[i] == "dreptunghiului" || cuvint[i] == "dreptunghiului," || cuvint[i] == "dreptunghiului.") { figura = "dreptunghi"; } if (cuvint[i] == "patrat" || cuvint[i] == "patratului") { figura = "patrat"; } if (cuvint[i] == "triunghiului" || cuvint[i] == "triunghi" || cuvint[i] == "triunghiul" || cuvint[i] == "triunghiului," || cuvint[i] == "triunghiului.") { figura = "triunghi"; if (cuvint[i + 1] == "este") fel_figura = cuvint[i + 2]; else fel_figura = cuvint[i + 1]; } } for (int i = 2; i < num_cuvinte; i++) { if (figura == "dreptunghi") { if ((cuvint[i] == "de" & cuvint[i - 1] == "latimea") || ((cuvint[i] == "cu" & (cuvint[i - 1] == "egal" || cuvint[i - 1] == "egala")) & cuvint[i - 2] == "latimea")) { marimea_lat = cuvint[i + 1]; } if ((cuvint[i] == "de" & cuvint[i - 1] == "lungimea") || ((cuvint[i] == "cu" & (cuvint[i - 1] == "egal" || cuvint[i - 1] == "egala")) & cuvint[i - 2] == "lungimea")) { marimea_lung = cuvint[i + 1]; } } if (figura == "patrat") { if ((cuvint[i] == "de" & cuvint[i - 1] == "latura") || (cuvint[i] == "cu" & cuvint[i - 1] == "egala" & cuvint[i - 2] == "latura")) { marimea_laturii = cuvint[i + 1]; } } if (figura == "triunghi") { if (cuvint[i] == "unitati" || cuvint[i] == "cm" || cuvint[i] == "cm," || cuvint[i] == "cm." || cuvint[i] == "m" || cuvint[i] == "m," || cuvint[i] == "m." || cuvint[i] == "mm" || cuvint[i] == "mm," || cuvint[i] == "mm.") { marimea_laturilor[num_lat] = cuvint[i - 1]; num_lat++; } if (cuvint[i] == "baza") { temp = "baza"; } if (cuvint[i] == "inaltimea") { temp = "inaltimea"; } } } if (functia == "aria" & figura == "dreptunghi") {

textBox2.Text += "float " + functia + "(int lungime, int latime) {"; textBox2.Text += "return (lungime*latime);}"; textBox2.Text += "void main() {"; textBox2.Text += "printf('" + functia + "=%f'," + functia + "(" + marimea_lung + "," + marimea_lat + "));}"; } if (functia == "aria" & figura == "patrat") { textBox2.Text += "float " + functia + "(int latura) {"; textBox2.Text += "return (pow(latura,2));}"; textBox2.Text += "void main() {"; textBox2.Text += "printf('" + functia + "=%f'," + functia + "(" + marimea_laturii + "));}"; } if (functia == "perimetru" & figura == "dreptunghi") { textBox2.Text += "float " + functia + "(int lungime, int latime) {"; textBox2.Text += "return (2*lungime+2*latime);}"; textBox2.Text += "void main() {"; textBox2.Text += "printf('" + functia + "=%f'," + functia + "(" + marimea_lung + "," + marimea_lat + "));}"; } if (functia == "perimetru" & figura == "patrat") { textBox2.Text += "float " + functia + "(int latura) {"; textBox2.Text += "return (4*latura);}"; textBox2.Text += "void main() {"; textBox2.Text += "printf('" + functia + "=%f'," + functia + "(" + marimea_laturii + "));}"; } if (functia == "aria" & figura == "triunghi" & num_lat == 3) { textBox2.Text += "float " + functia + "(int latura1, int latura2, int latura3) {"; textBox2.Text += "float p=(latura1+latura2+latura3)/2;"; textBox2.Text += "return (sqrt(p*(p-latura1)*(p-latura2)*(p-latura3)));}"; textBox2.Text += "void main() {"; textBox2.Text += "printf('" + functia + "=%f'," + functia + "(" + marimea_laturilor[0] + "," + marimea_laturilor[1] + "," + marimea_laturilor[2] + "));}"; } if (functia == "aria" & figura == "triunghi" & (fel_figura == "isoscel" || fel_figura == "isoscel." || fel_figura == "isoscel,")) { textBox2.Text += "float " + functia + "(int baza, int inaltimea) {"; textBox2.Text += "return ((baza*inaltimea)/2);}"; textBox2.Text += "void main() {"; textBox2.Text += "printf('" + functia + "=%f'," + functia + "(" + marimea_laturilor[0] + "," + marimea_laturilor[1] + "));}"; } if (functia == "aria" & figura == "triunghi" & fel_figura == "echilateral") { textBox2.Text += "float " + functia + "(int latura) {"; textBox2.Text += "return ((pow(latura,2)*sqrt(3))/4);}"; textBox2.Text += "void main() {"; textBox2.Text += "printf('" + functia + "=%f'," + functia + "(" + marimea_laturilor[0] + "));}"; } if (functia == "perimetru" & figura == "triunghi" & (fel_figura == "isoscel" || fel_figura == "isoscel." || fel_figura == "isoscel,")) { textBox2.Text += "float " + functia + "(int baza, int inaltimea) {"; textBox2.Text += "float jumb=baza/2;"; textBox2.Text += "float l=sqrt(pow(jumb,2)+pow(inaltimea,2));"; textBox2.Text += "return (2*l+baza);}"; textBox2.Text += "void main() {"; textBox2.Text += "printf('" + functia + "=%f'," + functia + "("; if (temp == "baza") { textBox2.Text += marimea_laturilor[1] + "," + marimea_laturilor[0] + "));}"; }

else { textBox2.Text += marimea_laturilor[0] + "," + marimea_laturilor[1] + "));}"; } } }

Functia Prelucrare analizeaza matricia de cuvinte formata anetrior.Incepind un ciclu For de la primul cuvint pin la ultimul, el preia fiecare civint din matricie si il trece prin toate conditiile, astfel gasind cuvintele care satisfac conditita, se atribuie cuvintul translat deja in limbaj de programare C#. In dependenta de toate cuvintele gasite in acest flux , se realizeaza translarea.

c) private void ExpresiiRegulate() { string temp = Regex.Replace(textBox2.Text, @"#include\s*(?'header'<[^>]+>)", delegate(Match match) { return "#include " + match.Groups["header"] + Environment.NewLine; }); temp = Regex.Replace(temp, @"\{", Environment.NewLine + "{" + Environment.NewLine); temp = Regex.Replace(temp, @"\}", "}" + Environment.NewLine); temp = Regex.Replace(temp, @"\;", ";" + Environment.NewLine); temp = Regex.Replace(temp, @"(?'type'\w+\s)?\s*(?'function'\w+)\s*(?'parameters'\([^\)]*\)(\))?)\s*?{", delegate(Match match) { return Environment.NewLine + match.Groups["type"] + match.Groups["function"] + match.Groups["parameters"] + Environment.NewLine + "{"; }); temp = Regex.Replace(temp, @"\s(?'row'[^\n\;]+\;)", delegate(Match match) { return Environment.NewLine + " " + match.Groups["row"]; }, RegexOptions.Multiline); textBox2.Text = temp; }

Expresiile regulate ofer o modalitate flexibil , puternic i eficient de a procesa textul.In cazul dat am apelat la ele pentru a oferi o forma compacta si bine determinate rezultatului translat in limbaj C#.
d) private void button1_Click(object sender, EventArgs e) { cuvinte(); textBox2.Text = "#include <stdio.h>#include<math.h>"; prelucrare(); ExpresiiRegulate(); }

In urma tastarii butonului Transleaza in fereastra TextBox2.Text, apare rezultatul translarii, care se datoreaza apelarii fuctiei Prelucrare si Expresii regulate, introducind implicit bibliotecile limbajului C "#include <stdio.h>#include<math.h>";
e) private void openToolStripMenuItem_Click(object sender, EventArgs e) { textBox2.Clear(); Stream myStream = null;

OpenFileDialog openFileDialog1 = new OpenFileDialog(); openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"; openFileDialog1.FilterIndex = 2; openFileDialog1.RestoreDirectory = true; if (openFileDialog1.ShowDialog() == DialogResult.OK) { try { if ((myStream = openFileDialog1.OpenFile()) != null) { using (myStream) { StreamReader sr = new StreamReader(myStream, System.Text.Encoding.GetEncoding(1251)); textBox1.Text = ""; while (!sr.EndOfStream) { textBox1.Text += sr.ReadLine() + " "; } sr.Close(); button1.Enabled = true; } } } catch (Exception ex) { MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message); } } }

Functia de deschidere a fisierelor read.txt, in care se contin problemele geometrice ce necesita a fi translate.
f) private void saveToolStripMenuItem_Click(object sender, EventArgs e) { Stream myStream; SaveFileDialog saveFileDialog1 = new SaveFileDialog(); saveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"; saveFileDialog1.FilterIndex = 2; saveFileDialog1.RestoreDirectory = true; if (saveFileDialog1.ShowDialog() == DialogResult.OK) { if ((myStream = saveFileDialog1.OpenFile()) != null) { StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding(1251)); // Code to write the stream goes here. sw.Write(textBox2.Text); sw.Close(); myStream.Close(); } } }

Functia de salvare a rezultatului translat in TextBox2.Text , in fisier .txt in orice loc dorit, sau directorie.
g) private void exitToolStripMenuItem_Click(object sender, EventArgs e) { this.Close(); }

Functia de iesire sau inchidere a aplicatiei.

3.2.3 LISTINGUL PROGRAMULUI:


using using using using using using using using System; System.Collections.Generic; System.ComponentModel; System.Data; System.Drawing; System.Text.RegularExpressions; System.Windows.Forms; System.IO;

namespace SDA { public partial class Form1 : Form { string[] cuvint = new string[50]; public Form1() { InitializeComponent(); } int num_cuvinte = 0; private void cuvinte() { string text = textBox1.Text; string a = text[0].ToString(); int j = 0; for (int i = 1; i < text.Length; i++) { if (text[i].ToString() == " " || text[i].ToString() == ".") { cuvint[num_cuvinte] = a; a = ""; num_cuvinte++; } else { a = a + text[i]; } } } private void prelucrare() { string functia = ""; string figura = ""; string fel_figura = ""; string marimea_lung = ""; string marimea_lat = ""; string marimea_laturii = ""; string temp = ""; string[] marimea_laturilor = new string[6]; int num_lat = 0; for (int i = 0; i < num_cuvinte; i++) { if (cuvint[i] == "Calculati" || cuvint[i] == "Aflati" || cuvint[i] == "Afisati" || cuvint[i] == "Determinati" || cuvint[i] == "calculati" || cuvint[i] == "aflati" || cuvint[i] == "afisati" || cuvint[i] == "determinati") { functia = cuvint[i + 1]; if (cuvint[i + 1] == "aria" || cuvint[i + 1] == "aria." || cuvint[i + 1] == "aria,") { functia = "aria"; } if (cuvint[i + 1] == "perimetru" || cuvint[i + 1] == "perimetrul" || cuvint[i + 1] == "perimetrul." || cuvint[i + 1] == "perimetrul,")

{ functia = "perimetru"; } } if (cuvint[i] == "dreptunghi" || cuvint[i] == "dreptunghiului" || cuvint[i] == "dreptunghiului," || cuvint[i] == "dreptunghiului.") { figura = "dreptunghi"; } if (cuvint[i] == "patrat" || cuvint[i] == "patratului") { figura = "patrat"; } if (cuvint[i] == "triunghiului" || cuvint[i] == "triunghi" || cuvint[i] == "triunghiul" || cuvint[i] == "triunghiului," || cuvint[i] == "triunghiului.") { figura = "triunghi"; if (cuvint[i + 1] == "este") fel_figura = cuvint[i + 2]; else fel_figura = cuvint[i + 1]; } } for (int i = 2; i < num_cuvinte; i++) { if (figura == "dreptunghi") { if ((cuvint[i] == "de" & cuvint[i - 1] == "latimea") || ((cuvint[i] == "cu" & (cuvint[i - 1] == "egal" || cuvint[i - 1] == "egala")) & cuvint[i - 2] == "latimea")) { marimea_lat = cuvint[i + 1]; } if ((cuvint[i] == "de" & cuvint[i - 1] == "lungimea") || ((cuvint[i] == "cu" & (cuvint[i - 1] == "egal" || cuvint[i - 1] == "egala")) & cuvint[i - 2] == "lungimea")) { marimea_lung = cuvint[i + 1]; } } if (figura == "patrat") { if ((cuvint[i] == "de" & cuvint[i - 1] == "latura") || (cuvint[i] == "cu" & cuvint[i - 1] == "egala" & cuvint[i - 2] == "latura")) { marimea_laturii = cuvint[i + 1]; } } if (figura == "triunghi") { if (cuvint[i] == "unitati" || cuvint[i] == "cm" || cuvint[i] == "cm," || cuvint[i] == "cm." || cuvint[i] == "m" || cuvint[i] == "m," || cuvint[i] == "m." || cuvint[i] == "mm" || cuvint[i] == "mm," || cuvint[i] == "mm.") { marimea_laturilor[num_lat] = cuvint[i - 1]; num_lat++; } if (cuvint[i] == "baza") { temp = "baza"; } if (cuvint[i] == "inaltimea") { temp = "inaltimea"; } }

} if (functia == "aria" & figura == "dreptunghi") { textBox2.Text += "float " + functia + "(int lungime, int latime) {"; textBox2.Text += "return (lungime*latime);}"; textBox2.Text += "void main() {"; textBox2.Text += "printf('" + functia + "=%f'," + functia + "(" + marimea_lung + "," + marimea_lat + "));}"; } if (functia == "aria" & figura == "patrat") { textBox2.Text += "float " + functia + "(int latura) {"; textBox2.Text += "return (pow(latura,2));}"; textBox2.Text += "void main() {"; textBox2.Text += "printf('" + functia + "=%f'," + functia + "(" + marimea_laturii + "));}"; } if (functia == "perimetru" & figura == "dreptunghi") { textBox2.Text += "float " + functia + "(int lungime, int latime) {"; textBox2.Text += "return (2*lungime+2*latime);}"; textBox2.Text += "void main() {"; textBox2.Text += "printf('" + functia + "=%f'," + functia + "(" + marimea_lung + "," + marimea_lat + "));}"; } if (functia == "perimetru" & figura == "patrat") { textBox2.Text += "float " + functia + "(int latura) {"; textBox2.Text += "return (4*latura);}"; textBox2.Text += "void main() {"; textBox2.Text += "printf('" + functia + "=%f'," + functia + "(" + marimea_laturii + "));}"; } if (functia == "aria" & figura == "triunghi" & num_lat == 3) { textBox2.Text += "float " + functia + "(int latura1, int latura2, int latura3) {"; textBox2.Text += "float p=(latura1+latura2+latura3)/2;"; textBox2.Text += "return (sqrt(p*(p-latura1)*(p-latura2)*(p-latura3)));}"; textBox2.Text += "void main() {"; textBox2.Text += "printf('" + functia + "=%f'," + functia + "(" + marimea_laturilor[0] + "," + marimea_laturilor[1] + "," + marimea_laturilor[2] + "));}"; } if (functia == "aria" & figura == "triunghi" & (fel_figura == "isoscel" || fel_figura == "isoscel." || fel_figura == "isoscel,")) { textBox2.Text += "float " + functia + "(int baza, int inaltimea) {"; textBox2.Text += "return ((baza*inaltimea)/2);}"; textBox2.Text += "void main() {"; textBox2.Text += "printf('" + functia + "=%f'," + functia + "(" + marimea_laturilor[0] + "," + marimea_laturilor[1] + "));}"; } if (functia == "aria" & figura == "triunghi" & fel_figura == "echilateral") { textBox2.Text += "float " + functia + "(int latura) {"; textBox2.Text += "return ((pow(latura,2)*sqrt(3))/4);}"; textBox2.Text += "void main() {"; textBox2.Text += "printf('" + functia + "=%f'," + functia + "(" + marimea_laturilor[0] + "));}"; } if (functia == "perimetru" & figura == "triunghi" & (fel_figura == "isoscel" || fel_figura == "isoscel." || fel_figura == "isoscel,")) { textBox2.Text += "float " + functia + "(int baza, int inaltimea) {"; textBox2.Text += "float jumb=baza/2;"; textBox2.Text += "float l=sqrt(pow(jumb,2)+pow(inaltimea,2));"; textBox2.Text += "return (2*l+baza);}"; textBox2.Text += "void main() {";

textBox2.Text += "printf('" + functia + "=%f'," + functia + "("; if (temp == "baza") { textBox2.Text += marimea_laturilor[1] + "," + marimea_laturilor[0] + "));}"; } else { textBox2.Text += marimea_laturilor[0] + "," + marimea_laturilor[1] + "));}"; } } } private void ExpresiiRegulate() { string temp = Regex.Replace(textBox2.Text, @"#include\s*(?'header'<[^>]+>)", delegate(Match match) { return "#include " + match.Groups["header"] + Environment.NewLine; }); temp = Regex.Replace(temp, @"\{", Environment.NewLine + "{" + Environment.NewLine); temp = Regex.Replace(temp, @"\}", "}" + Environment.NewLine); temp = Regex.Replace(temp, @"\;", ";" + Environment.NewLine); temp = Regex.Replace(temp, @"(?'type'\w+\s)?\s*(?'function'\w+)\s*(?'parameters'\([^\)]*\)(\))?)\s*?{", delegate (Match match) { return Environment.NewLine + match.Groups["type"] + match.Groups["function"] + match.Groups["parameters"] + Environment.NewLine + "{"; }); temp = Regex.Replace(temp, @"\s(?'row'[^\n\;]+\;)", delegate(Match match) { return Environment.NewLine + " " + match.Groups["row"]; }, RegexOptions.Multiline); textBox2.Text = temp; } private void button1_Click(object sender, EventArgs e) { cuvinte(); textBox2.Text = "#include <stdio.h>#include<math.h>"; prelucrare(); ExpresiiRegulate(); } private void openToolStripMenuItem_Click(object sender, EventArgs e) { textBox2.Clear(); Stream myStream = null; OpenFileDialog openFileDialog1 = new OpenFileDialog(); //openFileDialog1.InitialDirectory = "c:\\"; openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"; openFileDialog1.FilterIndex = 2; openFileDialog1.RestoreDirectory = true; if (openFileDialog1.ShowDialog() == DialogResult.OK) { try { if ((myStream = openFileDialog1.OpenFile()) != null) { using (myStream) { StreamReader sr = new StreamReader(myStream, System.Text.Encoding.GetEncoding(1251)); textBox1.Text = ""; while (!sr.EndOfStream)

{ textBox1.Text += sr.ReadLine() + " "; } sr.Close(); button1.Enabled = true; } } } catch (Exception ex) { MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message); } } }

private void saveToolStripMenuItem_Click(object sender, EventArgs e) { Stream myStream; SaveFileDialog saveFileDialog1 = new SaveFileDialog(); saveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"; saveFileDialog1.FilterIndex = 2; saveFileDialog1.RestoreDirectory = true; if (saveFileDialog1.ShowDialog() == DialogResult.OK) { if ((myStream = saveFileDialog1.OpenFile()) != null) { StreamWriter sw = new StreamWriter(myStream, System.Text.Encoding.GetEncoding(1251)); // Code to write the stream goes here. sw.Write(textBox2.Text); sw.Close(); myStream.Close(); } } } private void exitToolStripMenuItem_Click(object sender, EventArgs e) { this.Close(); } private void button2_Click(object sender, EventArgs e) { textBox1.Clear(); textBox2.Clear(); button1.Enabled = false; } private void textBox1_TextChanged(object sender, EventArgs e) { if (textBox1.Text == "") button1.Enabled = false; else button1.Enabled = true; } } }

4. Rezultatele rul rii aplicatiei


Aplicatia este capabila de a transla propozitii cu continut de probleme geometrice, scrise in limbaj uman, in limbaj de programare C. 4.1 Pentru inceput rulam aplicatia din directoriile 06.12.2010\lucrare de curs SDA(VISUAL STUDIO 2008)\SDA\SDA\bin\Debug.

4.2 Pentru a deschide fisierele de tip txt cu exemple de probleme ce pot fi translate de program, aplicam functia FILE -> OPEN, si din mapa exemple alegem una din variantele posibile

4.3 Pentru a primi rezultatul translat in limbaj C#, facem clic pe butonul Transleaza.

4.3 In continuare putem salva rezultatul primit in alt fisier, sub denumirea dorita apelind functia SAVE as

4.4 Pentru a inchide aplicatia, folosim functia EXIT.

5. Concluzii
Efectund acest lucrare de an mi-am nt rit cuno tin ele n domeniul programarii si am c p tat noi aptitudini n lucrul cu structuri de date, fisiere, expresii regulate. Programarea unei astfel de aplica ii mi-a adus mult experien : att n ceea ce prive te programarea n mediul Turbo C, ct i n implementarea unor algoritmi concre i. De asemenea am depistat modul de lucru cu diferite func ii ale programului i ne-am convins c acest limbaj are o mare eficacitate de programare. Dupa elaborarea acestei lucrari de an am obtinut deprinderi practice la rezolvarea problemelor in limajul C la tema Creare unui translator din limbaj romn (uman) in sintaxa limbajului C/C++.,. Pot mentiona ca am capatat deprinderi de lucru cu meniul afisarea acestuia, alegerea unui punct din meniu si prelucrarea datelor in conformitate cu punctul ales. Ca sfirsit pot spune c elabornd aceasta lucrare de an am c p tat aptitudini ce mi vor fi de folos pe viitor si am indeplinit cerintele in conformitate cu sarcina lucrarii date.

6. Literatura utilizata
-Initializare n limbajele C si C++ (de Sergiu G. Istrati) -Totul despre C si C++ (de Kris Jamsa si Lars Klander, editura TEORA) -Programarea.Reprezentarea algoritmilor si limbajul C++ (Gh. si Valeria Slabu) - Introducere in .Net Framework - Suport de curs (Sanda Foamete)