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

Post on 17-Feb-2019

223 views 2 download

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: bloisi@dis.uniroma1.it

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