Poner Palabras Reves
1r de DAM – M3 – UF2 – T1
Laboratori: M3 – UF2 – T1 Annex. Exemple de disseny descendent en C.
Programa: ComptarParaulesAcabadesTS.c Descripció: Demana un text i compta les paraules que acaben en “ts”. Objectiu: Exemple de programa en C que ens servirà de codi base per entendre l’ús dels subprogrames (accions i funcions) i el paradigma del disseny descendent.
Materiald’APM
Pàgina 1 de 6
//Afegir llibreries #include #include //Definir constants i/o macros #define MAX_TEXT 25 #define MAX_PAR (MAX_TEXT/2)+1 #define MISSATGE_ENTRADA_TEXT "Introdueix un text (MAX 25 caracters): " #define MISSATGE_NUM_PAR_TS "\nHi ha %d paraules acabades en ts\n" //Definir nous tipus de dades typedef enum{fals,cert} boolea; //Definir variables globals //Declarac accions ifuncions void inicialitzacions(char[], int *, int *); void obtenirText(char []); void escriureMissatge(char []); void escriureMissatgeMesEnter(char[], int); void obtenirPrimer(char [], int *); void tractar(char[], int *, int *); void obtenirSeguent(char[], int *); void obtenirParaula(char [], int *, char []); boolea esParaulaAcabadaTS(char []); boolea finalText(char[], int); //Programar lafunció principal main() int main() { //Declarar variables char text[MAX_TEXT]; int index, comptador; //cos del programa inicialitzacions(text, &index, &comptador); escriureMissatge(MISSATGE_ENTRADA_TEXT); obtenirText(text); obtenirPrimer(text, &index); while(!finalText(text,index)){ tractar(text,&index, &comptador); obtenirSeguent(text,&index); } escriureMissatgeMesEnter(MISSATGE_NUM_PAR_TS,comptador);return 0; } //Definir o implementar accions i/o funcions void inicialitzacions(char text[], int *index, int *comptador){ text[0]='\0'; *index=0; *comptador=0; }
void obtenirText(char text[]){ scanf("%25[^\n]",text);while(getchar()!='\n'); } void escriureMissatge(char miss[]){ printf(miss); } void escriureMissatgeMesEnter(char miss[],int comptador){ printf(miss,comptador); } voidobtenirPrimer(char text[], int *index){ while(text[*index]==' '){ (*index)++; } } boolea finalText(char text[], int index){ boolea esFinal=(text[index]=='\0')?cert:fals; return esFinal; } void tractar(char text[], int *index, int *comptador){ char tmp[MAX_PAR]; obtenirParaula(text,index,tmp); if(esParaulaAcabadaTS(tmp)) (*comptador)++; } void obtenirParaula(char text[],int *index,char tmp[]){ int index2=0;while(text[*index]!=' ' && text[*index]!='\0'){ tmp[index2]= text[*index]; index2++; (*index)++; } tmp[index2]='\0'; } boolea esParaulaAcabadaTS(char par[]){ int index=0; boolea trobat=fals; while(par[index]!='\0') index++; index--; if(index>=1){ if(par[index]=='s' && par[index-1]=='t') trobat=cert; } return trobat; } void obtenirSeguent(char text[], int *index){ obtenirPrimer(text,index); }Institut Almatà
1r de DAM – M3 – UF2 – T1
Anàlisi del codi. El disseny descendent parteix d’una solució abstracta i fent successius refinaments permet arribar a una solució programàtica sense abstracció, escrita directament en el llenguatge de programació, en el nostre cas en llenguatge C. En els successius refinaments s’obtenen solucions amb nivells d’abstracció cada cop menors. Analitzemaquest disseny descendent en el nostre exemple:
inicialitzacions(text, &index, &comptador); escriureMissatge(MISSATGE_ENTRADA_TEXT); obtenirText(text); obtenirPrimer(text, &index); Paràmetres while(!finalText(text,index)){ actuals tractar(text,&index, &comptador); obtenirSeguent(text,&index); } escriureMissatgeMesEnter(MISSATGE_NUM_PAR_TS,comptador);
Primer nivell d’abstracció
voidtractar(char text[], Paràmetres int *index, formals int *comptador){ char tmp[MAX_PAR]; obtenirParaula(text,index,tmp); if(esParaulaAcabadaTS(tmp)) (*comptador)++; }
Segon nivell d’abstracció
Darrer nivell sense abstracció
void obtenirParaula(char text[],int *index,char tmp[]){ int index2=0; while(text[*index]!=' ' && text[*index]!='\0'){ tmp[index2]= text[*index]; index2++; (*index)++; }...
Regístrate para leer el documento completo.