Esercizi - Dipartimento di ingegneria elettrica ed elettronica
Transcript
Esercizi - Dipartimento di ingegneria elettrica ed elettronica
Università degli Studi di Cagliari Corso di Laurea in Ingegneria Biomedica (Industriale), Chimica, Meccanica, Elettrica Esercizio n.1 FONDAMENTI DI INFORMATICA 1 http://www.diee.unica.it/~marcialis/FI1 A.A. 2010/2011 Docente: Gian Luca Marcialis Scrivere una funzione C scriviVettore, che, ricevendo in ingresso una stringa NomeFile e un vettore di N interi v, scriva il contenuto su un file di nome indicato da NomeFile, andando a capo per ogni valore scritto La funzione deve restituire il valore 1 se l’operazione è andata a buon fine, 0 altrimenti LINGUAGGIO C Funzioni e gestione file: esercitazione Soluzione int scriviVettore(char* NomeFile, int* vettore, int N) { FILE *fp; int i; fp=fopen(NomeFile,”w”); if (fp==NULL) return 0; for (i=0; i<N; i++) fprintf(fp,”%d\n”,v[i]); fclose(fp); return 1; } Esercizio n.2 Scrivere una funzione C che, ricevendo in ingresso un file, legga da esso una stringa (max 100 caratteri) e la restituisca in uscita Scrivere una funzione C che, ricevendo in ingresso una stringa, restituisca un vettore intero occorrenze_vocali di cinque componenti ognuna delle quali contenente il numero di occorrenze delle vocali ‘a’, ‘e’, ‘i’, ‘o’, ‘u’ nella stringa occorrenze_vocali[0] è il numero di occorrenze di ‘a’, occorrenze_vocali[1] è il numero di occorrenze di ‘e’, etc… Esercizio n.3 Problema principale Sia data la seguente struttura dati Scrivere un programma C che, leggendo da file “rettangoli.txt” formattato come nell’esempio: typedef struct { float lato1, lato2, area; /*due lati*/ int rettangolo; /*0==rettangolo puro, 1==quadrato*/ } tipo_rettangolo; 3 /* numero di rettangoli */ 4.0 5.1 /*lunghezza dei lati del rettangolo*/ 2.5 3.2 1.0 1.0 Esempi IN/OUT Esempio file di ingresso “rettangoli.txt” 3 /* numero di rettangoli */ 4.0 5.1 /*lunghezza dei lati del rettangolo*/ 2.5 3.2 1.0 1.0 Esempio file di uscita “output_rettangoli.txt”: 20.4 rettangolo 8.0 rettangolo 1.0 quadrato scriva, su file “output_rettangoli.txt” l’area di ciascun rettangolo letto, aggiungendo a fianco la stringa “rettangolo” o “quadrato” a seconda dei casi. Algoritmo in pseudo-codice Apro il file “rettangoli.txt” Se file inesistente, fine programma Leggo da file N numero rettangoli i=0 Ripeti Leggo coppia di float dal file aperto Li memorizzo dentro una variabile di tipo tipo_rettangolo (slot lato1, lato2) Memorizzo dentro slot rettangolo se si tratta di rettangolo o quadrato Memorizzo dentro slot area l’area del rettangolo Apro il file “output_rettangoli.txt” Scrivo nel file l’area e stampo a fianco “rettangolo” o “quadrato” Chiudo il file “output_rettangoli.txt” i=i+1; Finché i<N Impalcatura C #include <stdio.h> Parte dichiarativa /*qui scrivo il tipo fornito dal problema*/ int main() { /*PARTE DICHIARATIVA*/ /*ALGORITMO IN PSEUDO-CODICE*/ Apro il file “rettangoli.txt” Se file inesistente, fine programma Leggo da file N numero rettangoli i=0 Ripeti Leggo coppia di float dal file aperto Li memorizzo dentro una variabile di tipo tipo_rettangolo (slot lato1, lato2) Memorizzo dentro slot rettangolo se si tratta di rettangolo o quadrato Memorizzo dentro slot area l’area del rettangolo Apro il file “output_rettangoli.txt” Scrivo nel file l’area e stampo a fianco “rettangolo” o “quadrato” Chiudo il file “output_rettangoli.txt” i=i+1; Finché i<N Chiudo il file “rettangoli.txt” Fine programma Dalla lettura dello pseudo-codice, ci servono: Una variabile intera N per il numero di rettangoli Un descrittore di tipo FILE*, che chiamo fin per il file “rettangoli.txt” Un intero i per scorrere la lista dei rettangoli nel file Una variabile di tipo rettangolo Un descrittore di tipo FILE*, che chiamo fout per il file “output_rettangoli.txt” } Parte dichiarativa in C int i, N; FILE *fin, *fout; tipo_rettangolo rettangolo; Traduzione dello pseudo-codice 1 Apro il file “rettangoli.txt” Se file inesistente, fine programma Leggo da file N numero rettangoli i=0 fin=fopen(“rettangoli.txt”, “r”); if(fin==NULL) return 0; fscanf(fin,”%d”,&N); i=0; Traduzione dello pseudo-codice 2 Leggo coppia di float dal file aperto Li memorizzo dentro una variabile di tipo tipo_rettangolo (slot lato1, lato2) Memorizzo dentro slot rettangolo se si tratta di rettangolo o quadrato Memorizzo dentro slot area l’area del rettangolo In altre parole… tipo_rettangolo leggi_rettangolo(FILE* f) { Leggo coppia di float dal file aperto Li memorizzo dentro una variabile di tipo tipo_rettangolo (slot lato1, lato2) Memorizzo dentro slot rettangolo se si tratta di rettangolo o quadrato Memorizzo dentro slot area l’area del rettangolo Return /*variabile di tipo tipo_rettangolo coi dati di cui sopra*/ Proviamo a realizzare i passaggi di cui sopra tutti all’interno di un’unica funzione “leggi_rettangolo” caratterizzata dall’interfaccia: } tipo_rettangolo leggi_rettangolo(FILE* f) Implementazione della funzione tipo_rettangolo leggi_rettangolo(FILE* f) { tipo_rettangolo r; float x,y; fscanf(f,”%f %f”,&x, &y); r.lato1=x; r.lato2=y; if(x==y) r.rettangolo=1; else r.rettangolo=0; /*equivalente all’istruzione: r.rettangolo = (x==y); r.area=x*y; return r; } Traduzione dello pseudo-codice 3 Apro il file “output_rettangoli.txt” fout=fopen(“output_rettangoli.txt”,”a”); Scrivo nel file l’area e stampo a fianco “rettangolo” o “quadrato” Chiudo il file “output_rettangoli.txt” fclose(fout); Anche qui proviamo a realizzare l’espressione in grassetto con una funzione con interfaccia: void scrivi_rettangolo(FILE* f, tipo_rettangolo r); Ritorno al main Implementazione void scrivi_rettangolo(FILE *f, tipo_rettangolo r) { fprintf(f,“%f ”,r.area); if(r.rettangolo==1) fprintf(f,”quadrato\n”); else fprintf(f,”rettangolo\n”); return; } #include <stdio.h> /*definizione del tipo tipo_rettangolo e delle funzioni precedenti*/ int main() { int i, N; FILE *fin, *fout; tipo_rettangolo rettangolo; fin=fopen(“rettangoli.txt”, “r”); if(fin==NULL) return 0; fscanf(fin,”%d”,&N); i=0; while(i<N) { rettangolo=leggi_rettangolo(f); fout=fopen(“output_rettangoli.txt”,”a”); scrivi_rettangolo(fout,rettangolo); fclose(fout); i=i+1; } fclose(fin); return 0; } Alcune funzioni utili di <string.h> char* strcpy(s,ct) Copia la stringa ct nella stringa s, incluso ‘\0’; restituisce s char* strcat(s,ct) Concatena la stringa ct alla fine della stringa s; restituisce s int strcmp(cs,ct) Confronta la stringa cs con la stringa ct; restituisce <0 se cs<ct, 0 se cs==ct, >0 se cs>ct size_t strlen(cs) Restituisce la lunghezza di cs Esercizio Scrivere una funzione C, chiamata «operazioni», che, ricevendo in ingresso due interi x e y ed un carattere c, restituisca in uscita x+y, se il carattere vale ‘s’ x*y, se il carattere vale ‘p’ x-y, se il carattere vale ‘d’ x/y, se il carattere vale ‘q’ x%y, se il carattere vale ‘r’ 0 altrimenti Soluzione int operazioni(int x,int y,char c) { int soluzione; switch(c) { case ‘s’: soluzione=x+y; case ‘p’: soluzione=x*y; case ‘d’: soluzione=x-y; case ‘q’: soluzione=x/y; case ‘r’: soluzione=x%y; default : soluzione=0; } return soluzione; } Esercizio Scrivere una programma che, ricevendo in ingresso due interi x e y ed un carattere c da tastiera, stampi a video break; break; break; break; break; #include <stdio.h> int operazioni(int x,int y,char c); int main() { int a,b,s; char ch,; scanf(«%d %d», &a, &b); scanf(«%c»,&ch); s=operazioni(a,b,ch); printf(«La funzione richiesta dà come soluzione: %d»,s); return 0; } x+y, se il carattere vale ‘s’ x*y, se il carattere vale ‘p’ x-y, se il carattere vale ‘d’ x/y, se il carattere vale ‘q’ x%y, se il carattere vale ‘r’ 0 altrimenti Nello scrivere la soluzione, si utilizzi la funzione operazioni progettata in precedenza. Esercizio Definire un tipo di dato strutturato tipo_soluzioni costituito da due slot in virgola mobile chiamati s1 e s2. Scrivere una funzione C che, ricevendo in ingresso tre valori in virgola mobile a, b, c, scriva su una variabile del tipo tipo_soluzioni, le soluzioni dell’equazione ax2+bx+c. Scrivere un programma C, che, leggendo tre valori in virgola mobile a,b,c da tastiera, stampi a video la soluzione dell’equazione ax2+bx+c. Si utilizzi la funzione progettata sopra per implementare la soluzione. typedef struct{ float s1, s2; } tipo_soluzioni; tipo_soluzioni equazione(float a, float b, float c) { float delta; tipo_soluzioni sol; sol.s1=0.0; sol.s2=0.0; delta=b*b-4*a*c; if(delta<0) return sol; if(a==0) if(b!=0) { sol.s1=-c/b; sol.s2=sol.s1; } else return sol; sol.s1=(-b+sqrt(delta))/(2*a); sol.s2=(-b-sqrt(delta))/(2*a); return sol; }