Microsoft Word - c6.doc

Documente similare
Microsoft Word - CarteC.doc

Limbaje de programare Pointeri. Alocare dinamică (continuare) 26 noiembrie 2012

Limbaje de Programare Curs 6 – Functii de intrare-iesire

Limbaje de Programare Curs 5 – Siruri de caractere

SUBPROGRAME

Microsoft Word - PCLP2_Curs_4_2019.doc

Limbaje de Programare Curs 8 – Fisiere

E_d_Informatica_sp_MI_2015_bar_02_LRO

L7

Laborator 2: Instrucţiuni Java şi lucru cu şiruri de caractere Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 18 octombrie 2011

Rezolvare model de subiect practic P2 Programarea Calculatoarelor sesiunea iunie 2017

Microsoft Word _POO_Lab_1_Modificari_v01.htm

1. Operatii cu matrici 1 Cerinte: Sa se realizeze functii pentru operatii cu matrici patratice (de dimensiune maxima 10x10). Operatiile cerute sunt: A

Programarea calculatoarelor. Note de curs Marius Minea 1 Introducere în programarea în C 1.1 Funcţii în limbajul C Calcule şi funcţii La origine, rolu

PPSD

Programarea şi utilizarea calculatoarelor

LUCRAREA NR

Microsoft PowerPoint - Curs_SDA_4_RO_2019_v2.pptx

Paradigme de programare

Procesarea Imaginilor - Laborator 1: Introducere în utilizarea bibliotecii OpenCV 1 1. Introducere în utilizarea bibliotecii OpenCV 1.1. Introducere S

Laborator 2 Incompatibilităţi/Diferenţe între C şi C++ Completări C++ Supraîncărcarea (redefinirea) numelui de funcţii În C nu este permisă existenţa

Laborator 2 - Încapsularea Programare Orientată pe Obiecte Tema 2.1 Să se analizeze programul EX2.C Indicatii 2.1 A nu se uita de fisierul EX2.H Tema

Slide 1

Microsoft Word - CarteC.doc

PROGRAMARE ORIENTATA PE OBIECTE

Microsoft PowerPoint - ImplementareLimbaj [Read-Only] [Compatibility Mode]

Interfețe și Protocoale de Comunicații Arduino-Port Paralel Arduino. Laborator 1- Portul Paralel 1 Caracteristici generale Arduino UNO este o placă de

Subiectul 1

Microsoft PowerPoint - Curs_SDA_9_RO_2019_v2.pptx

Top

Microsoft Word - CarteC.doc

Tipuri de date abstracte 30 noiembrie 2005 Programarea calculatoarelor 2. Curs 9 Marius Minea

Microsoft Word - O problema cu bits.doc

Lucrarea 10

Paradigme de Programare

tehnologii web

Operatorii in C Expresii Operatori aritmetici Operatori de asignare Operatori de incrementare si decrementare Operatori relationali Operatori logici O

Propunator: Morar Florin Colegiul National Silvania Zalau Discipina: Informatica Nivel liceal, cls. XII 1.Să se scrie în limbajul C/C++ definiţia comp

Metode de programare Proiectarea algoritmilor

E_d_Informatica_sp_SN_2014_bar_10_LRO

ALGORITMII ŞI REPREZENTAREA LOR Noţiunea de algoritm Noţiunea de algoritm este foarte veche. Ea a fost introdusă în secolele VIII-IX de către Abu Ja f

Fişiere 11 ianuarie 2004 Utilizarea şi programarea calculatoarelor. Curs 13 Marius Minea

Programarea şi utilizarea calculatoarelor

PCLPII-C16(9)

Microsoft Word - Software pentru ordonarea multirang a componentelor unei colectivitati.doc

Declararea variabilelor

Laborator 4: Continuare Programare Orientată pe Obiecte Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 29 octombrie 2011

Microsoft PowerPoint - Curs_SDA_10_RO_2019_v1.pptx

Declaraţii. Instrucţiuni 19 octombrie 2005 Programarea calculatoarelor 2. Curs 3b Marius Minea

Slide 1

Modul Modbus ASCII SISTEME DE COMUNICATIE CURS 5 - Constantinescu Catalin Atunci cand se foloseste modul MODBUS ASCII fiecare octet din mesaj

Gestionarea I/E

Logică și structuri discrete Limbaje regulate și automate Marius Minea marius/curs/lsd/ 24 noiembrie 2014

1 Lucrarea nr. 8 - Structuri de date de tip liste sortate O listă sortată reprezintă un aranjament al înregistrărilor din cadrul listei în funcţie de

Diapositive 1

Microsoft Word - Laboratorul 3.doc

Microsoft Word - Curs_08.doc

Lab6LCD

Microsoft Word - Curs_09.doc

LUCRAREA 8 PROGRAMAREA NELINIARĂ ÎN REZOLVAREA PROBLEMELOR DIN ENERGETICĂ. METODE DE ORDINUL Aspecte generale Programarea neliniară are o foart

Preprocesorul C Funcţii cu numǎr variabil de argumente 6 decembrie 2005 Programarea calculatoarelor 2. Curs 10 Marius Minea

Laborator 3

Fâciu N. Maria-Ema CASA CORPULUI DIDACTIC BRĂILA PROGRAM DE FORMARE INFORMATICĂ ȘI TIC PENTRU GIMNAZIU CLASA A V-A SERIA 1 GRUPA 2 CURSANT: Fâciu N. M

Curs 10

7. Alinierea robustă a densităţilor de puncte 3D Măsurarea distanţei dintre diferite forme geometrice 3D Estimarea rotaţiei şi a translaţiei optime în

PHP (II)

Object Oriented Programming

Laborator 9: Fire de execuţie Întocmit de: Adina Neculai Îndrumător: Asist. Drd. Gabriel Danciu 20 noiembrie 2011

PROGRAMARE OBIECT-ORIENTATA LABORATOR 1 INTRODUCERE IN CLASE SI OBIECTE Introducere teoretica Prin intermediul unei Clase ne dorim sa construim tipuri

Tablouri unidimensionale Problema 1 Să se determine mulţimea cifrelor unui număr natural n > 0, dat. Exemplu: n= Cifre = {1,2,3,7} Se cere să s

ALGORITHMICS

Raportarea serviciilor de dializă la nivel CNAS

O NOUA PROBLEMA DE CONCURS OLIMPIADA MUNICIPALA DE INFORMATICA, IASI 2019 V-am promis într-un articol mai vechi ca vom prezenta pe acest blog câteva p

Structuri de date pentru partiţii de mulţimi O partiţie finită a unei mulţimi nevide S este o mulţime finită de submulţimi ale lui S: {S 1, S 2,..., S

Lecţia 2 Structura liniară, alternativă şi repetitivă Clasa a V-a Structuri de bază(liniară, alternativă şi repetitivă) Programarea structurată este o

Microsoft PowerPoint - Curs_TPI_22_v01.ppt

4. Detectarea cantelor Calculul gradientului într-o imagine Detectorul de cante Canny Transformata Hough În această lucrare vor fi studiate metode de

Microsoft Word - Programarea Portului Paralel - IBM-PC. .doc

Propunator: Morar Florin Colegiul National Silvania Zalau Discipina: Informatica Nivel liceal, cls. XI 1.Fişierul text bac.in conţine cel mult 1000 de

Gestiunea serviciilor de recuperare a sănătăţii în sanatorii şi preventorii

Microsoft Word - 2 ES RO.doc

Laborator 1-Teoria probabilitatilor si statistica matematica Sef lucrari dr.mat. Daniel N.Pop Departamentul de calculatoare si inginerie electrica 1 P

Nr. 932 din Avizat ISJ Vâlcea, Inspector școlar informatică, Ciochină Luisa EXAMEN DE ATESTARE A COMPETENȚELOR PROFESIONALE A ABSOLVENȚILOR

Capitole Speciale de Informatică Curs 2: Determinarea vocabularului de termeni şi a listelor de postări 4 octombrie 2018 Reamintim că listele de indec

Laborator 1 suport teoretic Mediul de dezvoltare Eclipse GLOSAR - Aplicaţie: program obţinut în urma aplicării operației BUILD asupra unui proiect (ve

Microsoft Word - lab1_2007.doc

PowerPoint-Präsentation

Ingineria Sistemelor de Programare

Utilizare Internet

Testare manuala: situatia in care o persoana initiaza fiecare test, interactioneaza cu el si interpreteaza, analizeaza si raporteaza rezultatele. Test

Curs 3 Permutari cu repetitie. Combinari. Algoritmi de ordonare si generare

Introducere în limbajul JavaScript

Metode de sortare - pregătire admitere - Conf.dr. Alexandru Popa Lect. dr. Andrei Pătraşcu Universitatea din Bucureşti 1

Programarea şi utilizarea calculatoarelor

Microsoft PowerPoint - Curs_SDA_3_RO_2019_v2.pptx

Lucrarea nr. 2 Aplicaţii de tip client Mihai IVANOVICI 6 martie 2006 Scopul acestei lucrări este de a vă familiariza cu modulul Python socket şi cu mo

Textul si imaginile din acest document sunt licentiate Attribution-NonCommercial-NoDerivs CC BY-NC-ND Codul sursa din acest document este licentiat Pu

SECURITATE ȘI CRIPTOGRAFIE

Microsoft Word - Algoritmi genetici.docx

Transcriere:

Proiectarea structurata top-down a programelor complexe Aplicatie Sa se scrie un program care citeste un fisier continand un text format din cuvinte si determina si afiseaza grupe de cuvinte, grupate in functie de un criteriu care se selecteaza. Criteriile de grupare pot fi: apartin unei grupe cuvintele care au acelasi numar de litere cuvintele care au aceleasi numere de aparitii de vocale cuvintele care sunt anagrame. Precizari: 1. La cuvinte nu se face deosebire intre litera mica si litera mare. 2. Doua cuvinte se numesc anagrame daca ele sunt formate din exact aceleasi caractere in alta ordine. Exemplu de grupa de anagrame: mar ram arm 3. Doua cuvinte au aceleasi numere de aparitii de vocale, daca fiecare din vocale apare de exat acelasi numar de ori in ambele cuvinte. Exemplu: aflu si sufla 4. Cuvintele pot contine doar caractere litere si pot fi separate prin spatii sau linie noua. Intre doua cuvinte pot exista oricate spatii. Programul va primi 2 parametrii in linia de comanda: numele fisierului de prelucrat si modul de prelucrare (specificat prin "anagrame", nrvoc sau "lungimi"). Se vor afisa grupele de cuvinte conform criteriului specificat. Grupele de cuvinte pot fi afisate utilizand doar caractere litere mici. De exemplu, daca programul se numeste grupe, pentru a determina grupele de cuvinte din fisierul fis.txt care sunt anagrame se va tasta in linia de comanda > grupe fis.txt anagrame Pentru a afisa grupele de cuvinte care au aceeasi lungime se da comanda > grupe fis.txt lungimi De la specificarea problemei de rezolvat la program Intre specificarea problemei si scrierea programului de rezolvare nu e o trecere directa, ci exista mai multe etape. In primul rand, e necesara o etapa de analiza si abstractizare a problemei, de identificare a subproblemelor in care se poate descompune problema initiala, 1

subprobleme care, la randul lor, se pot descompune in alte subprobleme. Pentru fiecare subproblema se identifica obiectelor din domeniul problemei implicate in rezolvare si actiunile de transformare corespunzatoare acestora. Urmeaza apoi etapele gasirii unor metode de rezolvare pentru fiecare subproblema, elaborarii algoritmilor de rezolvare si in final codificarea algoritmilor si reprezentarii obiectelor din universul problemei ca si tipuri de date (abstracte) folosind facilitatile oferite de limbajul de programare. Un program C este format din ansamblul fisierelor de program care grupeaza toate functiile necesare rezolvarii problemei. Un fisier de program e numit modul program. Gruparea functiilor unui program in module se face in general grupand intr-un modul functiile referitoare la rezolvarea unei subprobleme sau functiile care realizeaza transformarile caracteristice unui tip de obiect reprezentat ca si tip de date abstract. Nu exista o unica solutie pentru problema cum se grupeaza functiile unui program pe module, sau cum se modularizeaza programul. Un program structurat este constituit din unitati functionale bine definite module, ierarhizate conform naturii intrinseci a problemei. Analiza problemei Identificarea datelor de intrare: datele de intrare sunt numele fisierului text din care se citeste, si criteriul de grupare. Posibile date de intrare eronate: daca numele fisierului e un fisier inexistent sau acel fisier nu poate fi deschis pentru citire, sau daca criteriul de grupare introdus nu e unul din cele 3 permise. Specificarea functionala: in primul rand, trebuie identificate toate cuvintele din fisier. Deoarece se mentioneaza faptul ca nu se face deosebire intre litere mici si litere mari, se poate face o conversie a tuturor cuvintelor in scriere cu litere mici. Pentru fiecare cuvant, trebuie gasita grupa de care apartine. Aici intervine criteriul de grupare dat ca si parametru. Pentru fiecare cuvant, se cauta daca poate fi inclus, conform criteriului de grupare, in una din grupele deja existente. Daca nu poate fi adaugat la o grupa existenta, se infiinteaza o noua grupa cu acest cuvant. Datele de iesire: grupele de cuvinte, se afiseaza. 2

Citire parametrii intrare: numele fisierului text daca fisierul nu exista sau nu se poate deschide pentru citire -> eroare, stop criteriul de grupare: daca nu e unul din modurile permise anagrame, nrvoc, lungime -> eroare, stop Impartirea textului in cuvinte: Se identifica cuvintele din fisier Se transforma in litere mici Formarea grupelor: Pentru fiecare cuvant se gaseste grupa de care apartine. Aici intervine criteriul de grupare Afisarea grupelor Figure 1 Proiectarea solutiei Proiectarea solutiei incepe cu identificarea subproblemelor si stabilirea modulelor programului. Modulul principal (grupe) contine functia main, care realizeaza interpretarea parametrilor si selecteaza un anumit criteriu de grupare. Criteriul de grupare va fi realizat sub forma unei functii cu 2 parametrii (2 cuvinte) si care returneaza daca cele 2 cuvinte trebuie sa apartina aceleiasi grupe sau nu. Pentru descrierea criteriului de grupare, se defineste un tip functie typedef int (*functie_test)( char * cuv1, char* cuv2); Criteriul de grupare trebuie sa fie cunoscut si de catre gestionarul listei de grupe, deci va fi pus intr-un fisier header separat, tip_fct. 3

Fiecare criteriu de grupare poate fi implementat ca si un modul separat. Modulul anagrame si modulul nrvoc, fiecare dintre acestea exporta cate o functie de tipul functiei criteriu de grupare functie_test, int anagrame (char * cuv1, char * cuv2); int nrvoc(char * cuv1, char * cuv2); Criteriul de comparare a doua cuvinte pe baza lungimii lor e mai simplu, poate fi implementat printr-o functie simpla in cadrul modulului principal. Un modul separat prel_fis realizeaza prelucrarea fisierului,in sensul separarii cuvintelor din text. Functia exportata de acest modul este void determina_grupe(file *, functie_test); si este apelata de catre programul principal. Functia are 2 parametri, fisierul deschis pentru citire si functia criteriu de grupare. Modulul de prelucrare a fisierului utilizeaza facilitatile implementate de alt modul, gestionarul de grupe. Gestiunea listei de grupe este facuta intr-un modul separat, lista_g. Cele 2 operatii realizate de acest modul sunt: void adauga_grupat(char * cuvant, functie_test criteriu); Aceasta functie adauga cuvantuldat ca si parametru in functie de criteriul dat in una din grupe. Daca cuvantul poate fi adaugat la o grupa existenta, il adauga, daca nu creaza o noua grupa cu el. void afiseaza_grupe(); Aceasta functie tipareste toate grupele existente. Modul de implementare a listei de grupe este un detaliu intern al modulului lista_g. Gestionarea grupelor se poate face utilizand diverse structuri de date, atat dinamice cat si statice. Se va opta pentru o structura de date dinamica, de tip multilista. grupa_cuv mar arm ram lac alb bla Fiecare modul este realizat sub forma unui fisier independent, interfata cu celelalte module e asigurata prinfisierele antet asociate. 4

grupe main(int argc, char **argv) /* analizeaza parametrii liniei de cmd.si selecteaza functia de grupare; apeleaza determina_grupe(file *, tip_fct) */ anagrame int anagrame (char * cuv1, char * cuv2) tip_fct nrvoc int nrvoc (char * cuv1, char * cuv2) typedef int (*functie_test)( char * cuv1, char* cuv2); prel_fis determina_grupe(file *, tip_fct) /* citeste fisierul, separa cuvintele; pentru fiecare cuvant apeleaza functia adauga_grupat(cuvant, fct_prel); apeleaza afiseaza_grupe() */ lista_g adauga_grupat(cuvant, fct_prel); afiseaza_grupe() Figure 2 5

Codificarea modulelor /* grupe.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include "tip_fct.h" #include "prel_fis.h" #include "anagram.h" #include "nrvoc.h" int lungimi(char * cuv1, char* cuv2) { return strlen(cuv1)==strlen(cuv2); void main(int argc, char * argv[]) { char *nume_fis, *mod; FILE * fp; if (argc!=3) printf("utilizarea programului: grupe fisier mod"); else { nume_fis=argv[1]; mod=argv[2]; if ((fp=fopen(nume_fis, "r"))==null) { printf("nu pot deschide fisierul %s \n", nume_fis); exit(1); if (strcmp(mod, "anagrame")==0) determina_grupe(fp, anagrame); else if (strcmp(mod,"lungimi")==0) determina_grupe(fp, lungimi); else if (strcmp(mod,"nrvoc")==0) determina_grupe(fp, nrvoc); else { printf("mod de prelucrare necunoscut \n"); exit(1); /* tip_fct.h */ typedef int (*functie_test)(char * cuv1, char* cuv2); /* prel_fis.h */ #include <stdio.h> #include "tip_fct.h" void determina_grupe( FILE * fp, functie_test functie); 6

/* prel_fis.c */ #include <stdio.h> #include "tip_fct.h" #include "lista_g.h" #define ESPATIU(c) (c==' ' c=='\n') #define INCUVANT(c) ((c>='a' && c<='z') (c>='a' && c<='z')) #define LITMICA(c) (c>='a' && c<='z')? (c): (c+'a'-'a'); void determina_grupe( FILE * fp, functie_test functie) { int c, i; char buf[100]; c=getc(fp); while (c!=eof) { while (ESPATIU(c)) c=getc(fp); if (c==eof) break; i=0; while (INCUVANT(c)) { buf[i++]=litmica(c); c=getc(fp); buf[i]='\0'; // printf(" Cuvantul %s \n", buf); adauga_grupat(buf, functie); afiseaza_grupe(); /* lista_g.h */ #include "tip_fct.h" void adauga_grupat(char * cuv, functie_test functie) ; void afiseaza_grupe(void); /* lista_g.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> #include "lista_g.h" typedef struct cv{ char * cuv; struct cv * urm; cuvant; typedef struct gc{ char * cuv; cuvant * grupa; struct gc *urm; grupa_cuv; 7

static grupa_cuv * lista=null; void adauga_grupat(char * cuv, functie_test functie) { grupa_cuv * l, *noug; cuvant *nouc; l=lista; while ((l!=null)&&(!functie(l->cuv, cuv))) l=l->urm; if (l==null) { noug=(grupa_cuv *)malloc(sizeof(grupa_cuv)); noug->cuv=(char *)malloc(strlen(cuv)+1); strcpy(noug->cuv, cuv); noug->urm=lista; noug->grupa=null; lista=noug; else { nouc=(cuvant *)malloc(sizeof(cuvant)); nouc->cuv=(char *)malloc(strlen(cuv)+1); strcpy(nouc->cuv, cuv); nouc->urm=l->grupa; l->grupa=nouc; void afiseaza_grupe(void) { grupa_cuv * l=lista; cuvant * cv; printf("\n GRUPELE: \n"); while (l!=null) { printf("%s ", l->cuv); cv=l->grupa; while (cv!=null) { printf("%s ", cv->cuv); cv=cv->urm; printf("\n"); l=l->urm; /*anagram.h */ int anagrame(char * cuv1, char* cuv2); /* anagram.c*/ #include <string.h> static void contoare(char * cuv, int c[]) { int i; for (i=0; i<27; i++) c[i]=0; for (i=0; i<strlen(cuv); i++) c[cuv[i]-'a']++; 8

static int egal (int c1[], int c2[]) { int i; for (i=0; i<27; i++) if( c1[i]!=c2[i]) return 0; return 1; int anagrame(char * cuv1, char* cuv2) { int c1[27]; int c2[27]; contoare(cuv1, c1); contoare(cuv2, c2); return egal(c1, c2); /* nrvoc.h */ int nrvoc(char * cuv1, char* cuv2); /* nrvoc.c */ #include <string.h> #define NRLIT 5 static void contoare(char * cuv, int c[]) { int i; for (i=0; i<nrlit; i++) c[i]=0; for (i=0; i<strlen(cuv); i++) switch (c[i]) { case 'a': c[0]++; break; case 'e': c[1]++; break; case 'i': c[2]++; break; case 'o': c[3]++; break; case 'u': c[4]++; break; static int egal (int c1[], int c2[]) { int i; for (i=0; i<nrlit; i++) if( c1[i]!=c2[i]) return 0; return 1; int nrvoc(char * cuv1, char* cuv2) { int c1[nrlit]; int c2[nrlit]; contoare(cuv1, c1); contoare(cuv2, c2); return egal(c1, c2); 9