Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi...

51
Corso di Laboratorio di Informatica Ingegneria Clinica BCLR Esercizi di esame Domenico Daniele Bloisi

Transcript of Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi...

Page 1: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

Corso di Laboratorio di Informatica

Ingegneria Clinica – BCLR

Esercizi di esame

Domenico Daniele Bloisi

Page 2: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 3: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 4: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 5: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 6: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 7: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 8: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 9: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

Esecuzione

Pagina 9Laboratorio di Informatica

2014/2015

Esercizi di esame

Page 10: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 11: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 12: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 13: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 14: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 15: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 16: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 17: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 18: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

Esempio

>esempioatoi -1 15 result.txt

Pagina 18Laboratorio di Informatica

2014/2015

Esercizi di esame

Page 19: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

Esecuzione

Pagina 19Laboratorio di Informatica

2014/2015

Esercizi di esame

Page 20: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 21: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 22: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 23: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

Soluzione Esercizio di esame 1

Pagina 23

//dichiarazione della funzione trasp

int** trasp(int**, int, int);

Laboratorio di Informatica

2014/2015

Esercizi di esame

Page 24: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 25: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 26: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 27: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 28: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 29: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 30: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 31: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 32: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 33: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 34: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 35: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 36: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 37: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 38: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 39: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 40: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 41: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 42: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 43: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 44: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 45: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 46: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 47: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 48: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

Soluzione Esercizio di esame 3

Pagina 48

//chiusura del file

fclose(fd);

Laboratorio di Informatica

2014/2015

Esercizi di esame

Page 49: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 50: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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

Page 51: Esercizi di esamebloisi/didattica/ingegneriaClinica...Laboratorio di Informatica 2014/2015 Esercizi di esame Pagina 2 bloisi Ricevimento In aula, subito dopo le lezioni Su appuntamento

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