Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi...
-
Upload
nguyenthien -
Category
Documents
-
view
223 -
download
2
Transcript of Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi...
Corso di Laboratorio di Informatica
Ingegneria Clinica – BCLR
Esercizi di esame
Domenico Daniele Bloisi
Docente
Ing. Domenico Daniele Bloisi, PhD
Ricercatore
Dipartimento di Ingegneria Informatica, Automatica
e Gestionale “Antonio Ruberti”
Via Ariosto 25
(adiacente Piazza Dante,
Manzoni
Tram 3 fermata via Labicana)
email: [email protected]
home page:
Laboratorio di Informatica
2014/2015
Esercizi di esame Pagina 2
http://www.dis.uniroma1.it/~bloisi
Ricevimento
In aula, subito dopo le lezioni
Su appuntamento (tramite invio di una email)
presso:
Dipartimento di Ingegneria Informatica,
Automatica e Gestionale “Antonio Ruberti”,
via Ariosto 25 - II piano, stanza A209
Si invitano gli studenti a controllare regolarmente la
bacheca degli avvisi
http://www.dis.uniroma1.it/~bloisi/didattica/labinf1415.html#Avvisi
Pagina 3Laboratorio di Informatica
2014/2015
Esercizi di esame
Orari
Lunedì 12.00 – 13.30
Aula 4, via del Castro Laurenziano 7A
Martedì 14.00 – 17.15
Aula 15, Laboratorio Didattico via Tiburtina 205
Mercoledì 12.00 – 13.30
Aula 4, via via del Castro Laurenziano 7A
Pagina 4Laboratorio di Informatica
2014/2015
Esercizi di esame
Uso dei File in C
1. Dichiarare il descrittore del fileFILE *<descrittore>;
2. Il file si apre con la funzione fopen
<descrittore> = fopen(<nome_file>,
<modo_apertura);
• <nome_file> è il nome fisico del file su disco,
es. "dati.txt"
• <modo_apertura>:
es. "w" se il file è aperto in scrittura
es. "r" se il file è aperto in lettura
Esempio:FILE* fd;
Esempio: fd = fopen("C:\\code\\dati.txt", "w");
Pagina 5
se si usa windows
Laboratorio di Informatica
2014/2015
Esercizi di esame
Uso dei File in C
3. Controllo della corretta apertura
4. Esecuzione delle operazioni di lettura o
scrittura utilizzando il descrittore del file
5. Il file viene chiusofclose(<descrittore>);
if(fd != NULL) {
fprintf(fd, "dato");
}
fclose(fd);
Pagina 6
Esempio
Laboratorio di Informatica
2014/2015
Esercizi di esame
Esempio stampa su file
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp;
int x = 1;
if ((fp = fopen("file.txt","w")) != NULL)
{
fprintf(fp, "stampa n. %d su file\n", x);
}
fclose(fp);
}
modalità
scrittura
Pagina 7Laboratorio di Informatica
2014/2015
Esercizi di esame
Esecuzione
Se il file denominato “file.txt” non esiste nella
directory contenente l’eseguibile che traduce il
codice, allora “file.txt” viene creato.
Se “file.txt” esiste già, il suo contenuto viene
cancellato.
Successivamente, il file “file.txt” viene riempito con la stringa argomento della fprintf.
Pagina 8Laboratorio di Informatica
2014/2015
Esercizi di esame
Esecuzione
Pagina 9Laboratorio di Informatica
2014/2015
Esercizi di esame
Attenzione
Evitare di non richiudere uno stream (dopo averlo
aperto) al termine del suo utilizzo.
L’istruzione da utilizzare è laint fclose(FILE *file_pointer)
che chiude un FILE* passato come argomento
Pagina 10Laboratorio di Informatica
2014/2015
Esercizi di esame
Valore di ritorno per fclose
fclose returns '0' if successful
(including when file_pointer is 'NULL' or not
an open file);
otherwise, it returns 'EOF'.
http://www.cplusplus.com/reference/clibrary/cstdio/fclose/
Pagina 11Laboratorio di Informatica
2014/2015
Esercizi di esame
Esercizio
Scrivere un programma che chieda all’utente di
inserire da tastiera:
il nome per un file;
una stringa che sarà scritta in esso.
Il programma deve creare il file e scrivere in esso
la stringa digitata dall’utente.
Un messaggio di errore deve essere stampato a
video in caso di insuccesso.
Pagina 12Laboratorio di Informatica
2014/2015
Esercizi di esame
Soluzione#include <stdlib.h>
#include <stdio.h>
int main() {
char nomefile[80], parola[80];
printf("digita il nome del file da creare:\n");
scanf("%s", nomefile);
printf("digita una parola da scrivere sul file:\n");
scanf("%s", parola);
FILE *fp;
if ((fp = fopen(nomefile,"w")) != NULL)
fprintf(fp, "%s", parola);
else {
fprintf(stderr, "ERRORE\n");
return EXIT_FAILURE;
}
fclose(fp);
return EXIT_SUCCESS;
}Pagina 13Laboratorio di Informatica
2014/2015
Esercizi di esame
Esempio di esecuzione
digita il nome del file da creare:
prova.txt
digita una parola da scrivere sul file:
parole parole parole
Che cosa provoca
l’esecuzione del programma
con questi input?
Pagina 14Laboratorio di Informatica
2014/2015
Esercizi di esame
Trasformare caratteri in interi
La funzione atoi converte una stringa in un
intero.
atoi è utile quando sia necessario fare dei
calcoli numerici interi con parametri passati da riga
di comando. Infatti, i calcoli richiederanno dei tipi numerici interi (tipo int) e non delle stringhe (tipo
char *).
Pagina 15Laboratorio di Informatica
2014/2015
Esercizi di esame
La funzione atoi
NAME:
atoi - convert a string to an integer.
SYNOPSIS:
#include <stdlib.h>
int atoi(const char *nptr);
DESCRIPTION:
The atoi() function converts the initial portion of the
string pointed to by nptr to int.
RETURN VALUE:
The converted value.
Pagina 16Laboratorio di Informatica
2014/2015
Esercizi di esame
Esercizio
Realizzare un programma esempioatoi che
prenda tre parametri in ingresso:
<A> primo addendo;
<B> secondo addendo;
<C> nome di un file.
Il programma deve sommare A e B, creare un file
denominato con il nome C e stampare il risultato
nel file.
Pagina 17Laboratorio di Informatica
2014/2015
Esercizi di esame
Esempio
>esempioatoi -1 15 result.txt
Pagina 18Laboratorio di Informatica
2014/2015
Esercizi di esame
Esecuzione
Pagina 19Laboratorio di Informatica
2014/2015
Esercizi di esame
Funzioni di conversione
Convertono stringhe che contengono interi o
reali in numeri interi o reali.
Permettono di trattare stringhe (testi) composte da
caratteri qualsiasi e di estrarre da essi le parti
numeriche
Si trovano nella libreria <stdlib.h>
Pagina 20Laboratorio di Informatica
2014/2015
Esercizi di esame
Esercizio di esame 1
Pagina 21
Scrivere una funzione trasp che, dati in ingresso una matrice
(rappresentata tramite puntatore a puntatore), la dimensione
delle righe e la dimensione delle colonne,
restituisca una nuova matrice (rappresentata tramite
puntatore a puntatore) che sia la trasposta della matrice
in ingresso.
Esempio
1 2 3 1 2
2 3 1 2 3
3 1
Inoltre, scrivere ...
Laboratorio di Informatica
2014/2015
Esercizi di esame
Esercizio di esame 1
Pagina 22
Inoltre, scrivere una funzione main che verifichi il
comportamento della funzione trasp
La matrice di cui si vuole calcolare la trasposta deve
essere recuperata da file.
Il formato del file in ingresso sarà:
<R> <C>
<dato(0,0)> <dato(0,1)> … <dato(0,C-1)>
…
<dato(R-1,0)> <dato(R-1,1)> … <dato(R-1,C-1)>
2 3
3 3 5
4 62 71
Esempio
Laboratorio di Informatica
2014/2015
Esercizi di esame
Soluzione Esercizio di esame 1
Pagina 23
//dichiarazione della funzione trasp
int** trasp(int**, int, int);
Laboratorio di Informatica
2014/2015
Esercizi di esame
Soluzione Esercizio di esame 1
Pagina 24
int** trasp(int** mat, int r, int c){
int i;
int j;
int** t = malloc(c * sizeof(int*));
if(t == NULL)
return NULL;
for(i = 0; i < c; i++) {
t[i] = malloc(r * sizeof(int));
if(t[i] == NULL)
return NULL;
}
for(i = 0; i < r; i++) {
for(j = 0; j < c; j++) {
t[j][i] = mat[i][j];
}
}
return t;
}
Definizione
della funzionetrasp
Laboratorio di Informatica
2014/2015
Esercizi di esame
Soluzione Esercizio di esame 1
Pagina 25
#include <stdlib.h>
#include <stdio.h>
int main() {
FILE* fd = fopen("dati.txt","r");
//FILE* fd = fopen("C:\\code\\dati.txt","r");
if(fd == NULL) {
fprintf(stderr, "Errore apertura file\n");
return EXIT_FAILURE;
}
else {
fprintf(stdout, "File aperto\n");
}
path assoluto
path relativo
Laboratorio di Informatica
2014/2015
Esercizi di esame
Soluzione Esercizio di esame 1
Pagina 26
int r, c; //numero di righe e colonne
fscanf(fd, "%d", &r);
fscanf(fd, "%d", &c);
//creazione struttura dati per memorizzare i
//dati letti da file
int** M = malloc(r * sizeof(int*));
if(M == NULL) {
fprintf(stderr, "Errore M\n");
return EXIT_FAILURE;
}
int i, j;
for(i = 0; i < r; i++) {
M[i] = malloc(c * sizeof(int));
if(M[i] == NULL) {
fprintf(stderr, "Errore M[%d]\n", i);
return EXIT_FAILURE;
}
}Laboratorio di Informatica
2014/2015
Esercizi di esame
Soluzione Esercizio di esame 1
Pagina 27
//memorizzazione dati
for(i = 0; i < r; i++) {
for(j = 0; j < c; j++) {
fscanf(fd, "%d", &M[i][j]);
}
}
//DEBUG
printf("M\n");
for(i = 0; i < r; i++) {//righe
for(j = 0; j < c; j++) {//colonne
printf("%d ", M[i][j]);
}
printf("\n");
}
printf("\n");
Laboratorio di Informatica
2014/2015
Esercizi di esame
Soluzione Esercizio di esame 1
Pagina 28
//calcolo trasposta
int** T = trasp(M, r, c);
if(T == NULL) {
fprintf(stderr, "Errore funzione trasp\n");
return EXIT_FAILURE;
}
printf("Trasposta\n");
for(i = 0; i < c; i++) {//righe
for(j = 0; j < r; j++) {//colonne
printf("%d ", T[i][j]);
}
printf("\n");
}
Laboratorio di Informatica
2014/2015
Esercizi di esame
Soluzione Esercizio di esame 1
Pagina 29
for(j = 0; j < r; j++)
free(M[j]);
free(M);
for(j = 0; j < c; j++)
free(T[j]);
free(T);
}
Laboratorio di Informatica
2014/2015
Esercizi di esame
Esercizio di esame 2
Pagina 30
Scrivere una funzione in linguaggio C denominata get_row
che, presi in ingresso una tavola di caratteri T (sottoforma di
doppio puntatore a char), il numero r delle sue righe (intero),
il numero c delle sue colonne (intero) e un indice i (intero),
restituisca una stringa formata da tutti gli elementi di T
presenti nella riga di indice i.
Scrivere, inoltre, ...
Laboratorio di Informatica
2014/2015
Esercizi di esame
Esercizio di esame 2
Pagina 31
Scrivere, inoltre, una funzione main che:
1. Legga la tavola T da un file “tavola.txt” con il seguente
formato
<r> <c>
<e(0,0)> <e(0,1)> … <e(0,c-1)>
… … …
<e(r-1,0)> <e(r-1,1)> … <e(r-1,c-1)>
2. Stampi a video il valore restituito dall’invocazione di get_row(T, 2, 3, 1) Esempio: “ek7”
Nota: supporre che gli elementi della tavola siano di tipo char e
corretti, r e c di tipo intero e che sempre la matrice T in ingresso
sia diversa da NULL
Esempio:
2 3
atc
ek7
Laboratorio di Informatica
2014/2015
Esercizi di esame
Soluzione Esercizio di esame 2
Pagina 32
//prototipo per get_row
char* get_row( char** T,
int r,
int c,
int i);
Laboratorio di Informatica
2014/2015
Esercizi di esame
Soluzione Esercizio di esame 2
Pagina 33
//funzione get_row
char* get_row(char** T, int r, int c, int i) {
if(i < 0 || i >= r)
return NULL;
char* riga = (char *)malloc((c+1)*sizeof(char));
if(riga == NULL)
return NULL;
int j;
for(j = 0; j < c; j++) {
riga[j] = T[i][j];
}
riga[c] = '\0';
return riga;
}
Laboratorio di Informatica
2014/2015
Esercizi di esame
Soluzione Esercizio di esame 2
Pagina 34
//funzione principale
int main () {
//apertura file tavola.txt
FILE *fd = fopen("tavola.txt", "r");
if(fd == NULL) {
printf("impossibile aprire tavola.txt\n");
return EXIT_FAILURE;
}
//recupero numero righe e colonne
int r, c;
fscanf(fd, "%d", &r);
fscanf(fd, "%d", &c);
Laboratorio di Informatica
2014/2015
Esercizi di esame
Soluzione Esercizio di esame 2
Pagina 35
//allocazione tavola T
char **T = malloc(r*sizeof(char*));
if(T == NULL) {
printf("impossibile allocare T\n");
return EXIT_FAILURE;
}
int i, j;
for(i = 0; i < r; i++) {
T[i] = malloc(c*sizeof(char));
if(T[i] == NULL) {
printf("impossibile allocare "
"T[%d]\n", i);
return EXIT_FAILURE;
}
}Laboratorio di Informatica
2014/2015
Esercizi di esame
Soluzione Esercizio di esame 2
Pagina 36
//memorizzazione elementi di T
char line[c+1];
for(i = 0; i < r; i++) {
fscanf(fd, "%s", line);
for(j = 0; j < c; j++) {
T[i][j] = line[j];
}
}
//chiusura descrittore file
fclose(fd);
Laboratorio di Informatica
2014/2015
Esercizi di esame
Soluzione Esercizio di esame 2
Pagina 37
//stampa di verifica per T (facoltativa)
printf("T (%d, %d)\n", r, c);
for(i = 0; i < r; i++) {
for(j = 0; j < c; j++) {
printf("%c", T[i][j]);
}
printf("\n");
}
printf("\n");
Laboratorio di Informatica
2014/2015
Esercizi di esame
Soluzione Esercizio di esame 2
Pagina 38
//invocazione get_row
int indice = 1;
char* riga = get_row(T, r, c, indice);
if(riga == NULL) {
printf("errore funzione get_row\n");
return EXIT_FAILURE;
}
//stampa di verifica valore di ritorno get_row
printf("riga %d di T: %s\n", indice, riga);
Laboratorio di Informatica
2014/2015
Esercizi di esame
Soluzione Esercizio di esame 2
Pagina 39
//la memoria viene liberata
free(riga);
for(i = 0; i < r; i++) {
free(T[i]);
}
free(T);
//terminazione corretta
return EXIT_SUCCESS;
}
Laboratorio di Informatica
2014/2015
Esercizi di esame
Esercizio di esame 3
Pagina 40
Scrivere una funzione in linguaggio C denominata getRiga2 che, prese in ingresso una matrice M (sotto forma
di doppio puntatore a double), restituisca un array
(sotto forma di puntatore a double) costituito dagli elementi
della seconda riga di M.
Scrivere, inoltre, ...
Laboratorio di Informatica
2014/2015
Esercizi di esame
Esercizio di esame 3
Pagina 41
Scrivere, inoltre, una funzione main che:
1. Legga la matrice M da un file “mat.txt” con il seguente
formato
<r> <c>
<e(0,0)> … <e(0,c-1)>
… … …
<e(r-1,0)> … <e(r-1,c-1)>
2. Stampi a video il valore restituito dall’invocazione di getRiga2(M, r, c)
Esempio:
2 3
1.7 0.4 -3.5
0.0 2.2 3.5
Esempio:
1.7 0.4
0.0 2.2
Supporre che tutti i dati siano reali e corretti
e che sempre la matrice M in ingresso abbia almeno
2 righe.
Laboratorio di Informatica
2014/2015
Esercizi di esame
Soluzione Esercizio di esame 3
Pagina 42
//prototipo per getRiga2
double* getRiga2(double ** M,
int r, int c);
Laboratorio di Informatica
2014/2015
Esercizi di esame
Soluzione Esercizio di esame 3
Pagina 43
//definizione funzione getRiga2
double* getRiga2(double * const * const M,
int r, int c) {
if(r < 2)
return NULL;
double* riga2 = (double*)malloc(c*sizeof(double));
if(riga2 == NULL) {
return NULL;
}
int i;
for(i = 0; i < c; i++) {
riga2[i] = M[1][i];
}
return riga2;
}
Laboratorio di Informatica
2014/2015
Esercizi di esame
Soluzione Esercizio di esame 3
Pagina 44
//funzione principale
int main () {
//apertura file mat.txt
FILE *fd = fopen("mat.txt", "r");
if(fd == NULL) {
printf("impossibile aprire mat.txt\n");
return EXIT_FAILURE;
}
Laboratorio di Informatica
2014/2015
Esercizi di esame
Soluzione Esercizio di esame 3
Pagina 45
//recupero numero righe e colonne
int r, c;
fscanf(fd, "%d", &r);
fscanf(fd, "%d", &c);
Laboratorio di Informatica
2014/2015
Esercizi di esame
Soluzione Esercizio di esame 3
Pagina 46
//allocazione matrice M
double **M = (double **)malloc(r*sizeof(double*));
if(M == NULL) {
printf("impossibile creare M\n");
return EXIT_FAILURE;
}
int i, j;
for(i = 0; i < r; i++) {
M[i] = (double *)malloc(c * sizeof(double));
if(M[i] == NULL) {
printf("impossibile creare M[%d]\n", i);
return EXIT_FAILURE;
}
}
Laboratorio di Informatica
2014/2015
Esercizi di esame
Soluzione Esercizio di esame 3
Pagina 47
//memorizzazione elementi di M
for(i = 0; i < r; i++) {
for(j = 0; j < c; j++) {
fscanf(fd, "%lf", &M[i][j]);
}
}
Laboratorio di Informatica
2014/2015
Esercizi di esame
Soluzione Esercizio di esame 3
Pagina 48
//chiusura del file
fclose(fd);
Laboratorio di Informatica
2014/2015
Esercizi di esame
Soluzione Esercizio di esame 3
Pagina 49
//stampa di verifica per M (facoltativa)
printf("M\n");
for(i = 0; i < r; i++) {
for(j = 0; j < c; j++) {
printf("%f ", M[i][j]);
}
printf("\n");
}
printf("\n");
Laboratorio di Informatica
2014/2015
Esercizi di esame
Soluzione Esercizio 2
Pagina 50
//invocazione getRiga2
double* riga = getRiga2(M, r, c);
if(riga == NULL) {
printf("ERRORE getRiga2\n");
return EXIT_FAILURE;
}
//stampa di verifica per getRiga2
printf("seconda riga di M\n");
for(i = 0; i < c; i++) {
printf("%.3f ", riga[i]);
}
printf("\n");
Laboratorio di Informatica
2014/2015
Esercizi di esame
Soluzione Esercizio di esame 3
Pagina 51
//la memoria viene liberata
for(i = 0; i < r; i++) {
free(M[i]);
}
free(M);
free(riga);
//terminazione corretta
return EXIT_SUCCESS;
}
Laboratorio di Informatica
2014/2015
Esercizi di esame