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;
}