• Non ci sono risultati.

Corsi di laurea in Ingegnera Elettronica e Ingegneria Gestionale Fondamenti di Programmazione / Fondamenti di Informatica I Prova scritta del 30 giugno 2017

N/A
N/A
Protected

Academic year: 2021

Condividi "Corsi di laurea in Ingegnera Elettronica e Ingegneria Gestionale Fondamenti di Programmazione / Fondamenti di Informatica I Prova scritta del 30 giugno 2017"

Copied!
6
0
0

Testo completo

(1)

Corsi di laurea in Ingegnera Elettronica e Ingegneria Gestionale Fondamenti di Programmazione / Fondamenti di Informatica I

Prova scritta del 30 giugno 2017

Esercizio 1 (15 punti)

In un lontano paese da una decina d’anni si svolge una gara ciclistica di tandem su pista. Ogni coppia di concorrenti pedala esattamente per un’ora e vince la coppia che percorre più chilometri. I dati storici dei risultati sono memorizzati in un file il cui formato può essere dedotto dall’esempio riportato nel riquadro a lato.

Si osservi che:

• i nomi dei ciclisti sono sempre scritti in una sola parola in cui gli spazi sono rappresentati da underscore

• il primo numero di ogni riga rappresenta i chilometri percorsi e il secondo l’anno

• i ciclisti possono essere accoppiati in modo diverso in ogni edizione

• il numero massimo di ciclisti presente nel file è 500, il numero di risultati registrati è invece ignoto

Si vuole premiare il ciclista che ha percorso più chilometri in totale, considerando tutte le edizioni registrate nel file.

Si scriva una funzione in linguaggio C che riceva come argomenti il puntatore a un file come sopra descritto (già aperto in lettura) e restituisca in un’apposita struttura il nome del ciclista da premiare e il numero totale di chilometri percorsi. Si assuma che non si verifichino mai casi di parità.

Relativamente all’esempio di cui sopra, il programma dovrà restituire

Ugo_Tiz 179.38

.

Federico_Verdi Mario_Bianchi 57.34 2010 Alberto_Della_Rosa Ugo_Tiz 64.7 2010 Ugo_Tiz Pier_Paolo_Rittel 57.34 2011 Francesco_Di_Qua Luigi_Di_Qui 54.932 2011 Mario_Bianchi Paolo_Gialli 49.3 2011

Pier_Paolo_Rittel Alberto_Della_Rosa 54.932 2012 Mario_Bianchi Luigi_Di_Qui 67.0 2012

Pier_Paolo_Rittel Ugo_Tiz 57.34 2013

(2)

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define MAXDIM 500 struct ciclista {

char nome[32];

double chilometri;

};

struct ciclista cerca_vincitore (FILE *fpin);

void aggiorna_elenco_ciclisti

(struct ciclista ciclisti[], int *p_nciclisti, char nome[], double chilometri);

int cerca_ciclista (struct ciclista ciclisti[], int dim, char nome[]);

int cerca_max_chilometri (struct ciclista ciclisti[], int dim);

int main (int argc, char *argv[]) {

FILE *fpin;

struct ciclista vincitore;

if (argc != 2) {

printf ("USO: cerca_vincitore <file ingresso>\n");

exit (EXIT_FAILURE);

}

if ((fpin = fopen (argv[1], "r")) == NULL) {

printf ("errore apertura file di ingresso\n");

exit (EXIT_FAILURE);

}

vincitore = cerca_vincitore (fpin);

printf ("%s %lg\n", vincitore.nome, vincitore.chilometri);

fclose (fpin);

return EXIT_SUCCESS;

}

struct ciclista cerca_vincitore (FILE *fpin) {

struct ciclista ciclisti[MAXDIM];

int nciclisti = 0, indice, anno;

char riga[128], nome1[64], nome2[64];

double chilometri;

while (fscanf (fpin, "%s %s %lf %d", nome1, nome2, &chilometri, &anno) != EOF) {

aggiorna_elenco_ciclisti (ciclisti, &nciclisti, nome1, chilometri);

aggiorna_elenco_ciclisti (ciclisti, &nciclisti, nome2, chilometri);

}

indice = cerca_max_chilometri (ciclisti, nciclisti);

return ciclisti[indice];

}

(3)

void aggiorna_elenco_ciclisti

(struct ciclista ciclisti[], int *p_nciclisti, char nome[], double chilometri) {

int indice;

indice = cerca_ciclista (ciclisti, *p_nciclisti, nome);

if (indice == -1) {

/* inserisci il nuovo ciclista */

strcpy (ciclisti[*p_nciclisti].nome, nome);

ciclisti[*p_nciclisti].chilometri = chilometri;

(*p_nciclisti)++;

} else {

/* inserisci aggiorna i chilomatri */

ciclisti[indice].chilometri += chilometri;

} return;

}

int cerca_ciclista (struct ciclista ciclisti[], int dim, char nome[]) {

int i = 0;

while (i < dim) {

if (strcmp (ciclisti[i].nome, nome) == 0) return i;

i++;

}

return -1;

}

int cerca_max_chilometri (struct ciclista ciclisti[], int dim) {

int i, imax;

/* assumiamo che il vettore non sia vuoto */

imax = 0;

for (i = 1; i < dim; i++) {

if (ciclisti[i].chilometri > ciclisti[imax].chilometri) imax = i;

}

return imax;

}

(4)

Esercizio 2 (15 punti)

Un file di testo contiene i dati di una matrice bidimensionale che rappresenta una zona rettangolare di un territorio. Ogni elemento della matrice descrive una porzione quadrata di superficie (pari ad un numero di metri quadrati scritto nell’intestazione del file) mediante due numeri interi: la quota e un codice che indica il tipo di terreno (es. lago, roccia, bosco, mare, ecc.). Il formato del file può essere

dedotto dall’esempio a lato dove, nella parte matriciale, ogni coppia di numeri rappresenta rispettivamente la quota in metri s.l.m. e il codice del tipo di terreno di una porzione quadrata di superficie. Le informazioni di intestazione compaiono sempre tutte e nello stesso ordine. Le coordinate sono sempre

espresse in gradi Nord ed Est. La risoluzione è sempre espressa in metri quadrati (numero intero). Le dimensioni della matrice sono sempre riportate come numero di righe seguito dal numero di colonne (nell’esempio: 4 righe da 7 colonne). La dimensione massima della matrice è 20x20.

Un secondo file contiene le corrispondenze codice – tipo di terreno. Un esempio è riportato nel riquadro più sotto. Si osservi che i tipi di terreno sono sempre espressi con una sola parola. Tutti i codici presenti nella matrice sono presenti anche nel file dei codici (cioè non possono esserci codici sconosciuti). Il numero massimo di codici è 100.

Si scriva un programma in linguaggio C che riceva sulla linea di comando i nomi di due file come sopra descritti e per ogni tipo di terreno generi un file di testo con le seguenti caratteristiche:

• nome: il tipo di terreno

• estensione:

.dat

• contenuto: analogo al file di ingresso che descrive il territorio, ma contenente soltanto la quota nei punti in cui è presente il tipo di terreno a cui si riferisce il file e un trattino (

'-'

) negli altri punti

Per esempio, relativamente agli esempi sopra riportati, il programma dovrà generare sette file, dei quali

abitato.dat

,

bosco.dat

e

mare.dat

sono riportati nei riquadri sottostanti.

Suggerimento: si memorizzino i dati letti dal primo file in una matrice di struct e si scandiscano le righe del secondo file una alla volta per generare i file di uscita (senza memorizzare tali righe in una tabella).

102 bosco 201 roccia 101 prato 301 lago 302 fiume 303 mare 901 abitato coordinate_GPS: 46.0711 N 13.2346 E

risoluzione: 5 dimensioni: 4 7

90/102 90/102 95/101 95/101 95/101 97/101 100/101 93/102 91/102 92/102 95/101 97/901 99/901 102/101 99/102 91/102 92/102 95/101 97/901 99/901 102/101 103/901 102/901 100/901 98/901 97/901 96/901 95/901

coordinate_GPS: 46.0711 N 13.2346 E risoluzione: 5

dimensioni: 4 7

- - - - - - - - 97 99 - - - - - 97 99 - 103 102 100 98 97 96 95

file abitato.dat

coordinate_GPS: 46.0711 N 13.2346 E risoluzione: 5

dimensioni: 4 7

90 90 - - - - - 93 91 92 - - - - 99 91 92 - - - - - - - -

file bosco.dat

coordinate_GPS: 46.0711 N 13.2346 E risoluzione: 5

dimensioni: 4 7

- - - - - - - - - - - - - - - -

file fiume.dat

(5)

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define MAXRIGHE 20

#define MAXCOLONNE 20

#define ESTENSIONE ".dat"

struct porzione_quadrata {

int quota;

int codice;

};

struct coordinate {

double nord;

double est;

};

struct territorio {

struct coordinate c;

int risoluzione;

int nrighe;

int ncolonne;

struct porzione_quadrata porzione[MAXRIGHE][MAXCOLONNE];

};

void carica_territorio (struct territorio *p_t, FILE *fp);

void crea_file_territorio (FILE *fpt, FILE *fpc);

void crea_file_singolo_terreno (struct territorio t, int codice, FILE *fp);

int main (int argc, char *argv[]) {

FILE *fpt, *fpc;

if (argc != 3) {

printf ("USO: territorio <file territorio> <file codici>\n");

exit (EXIT_FAILURE);

}

if ((fpt = fopen (argv[1], "r")) == NULL) {

printf ("errore apertura file territorio\n");

exit (EXIT_FAILURE);

}

if ((fpc = fopen (argv[2], "r")) == NULL) {

printf ("errore apertura file codici\n");

exit (EXIT_FAILURE);

}

crea_file_territorio (fpt, fpc);

fclose (fpt);

fclose (fpc);

return EXIT_SUCCESS;

}

(6)

void crea_file_territorio (FILE *fpt, FILE *fpc) {

int codice;

char tipo_terreno[32], nome_file[32];

FILE *fp;

struct territorio t;

carica_territorio (&t, fpt);

while (fscanf (fpc, "%d %s", &codice, tipo_terreno) != EOF) {

strcpy (nome_file, tipo_terreno);

strcat (nome_file, ESTENSIONE);

if ((fp = fopen (nome_file, "w")) == NULL) {

printf ("errore apertura file %s\n", nome_file);

exit (EXIT_FAILURE);

}

crea_file_singolo_terreno (t, codice, fp);

fclose (fp);

} return;

}

void crea_file_singolo_terreno (struct territorio t, int codice, FILE *fp) {

int i, j;

fprintf (fp, "coordinate_GPS: %lg N %lg E\n", t.c.nord, t.c.est);

fprintf (fp, "risoluzione: %d\n", t.risoluzione);

fprintf (fp, "dimensioni: %d %d\n", t.nrighe, t.ncolonne);

for (i = 0; i < t.nrighe; i++) {

for (j = 0; j < t.ncolonne; j++) {

if (t.porzione[i][j].codice == codice)

fprintf (fp, "%5d", t.porzione[i][j].quota);

else

fprintf (fp, " -");

}

fprintf (fp, "\n");

} return;

}

void carica_territorio (struct territorio *p_t, FILE *fp) {

int i, j;

fscanf (fp, "%*s %lf %*s %lf %*s", &(*p_t).c.nord, &(*p_t).c.est);

fscanf (fp, "%*s %d\n", &(*p_t).risoluzione);

fscanf (fp, "%*s %d %d\n", &(*p_t).nrighe, &(*p_t).ncolonne);

for (i = 0; i < (*p_t).nrighe; i++) for (j = 0; j < (*p_t).ncolonne; j++)

fscanf (fp, "%d%*c%d", &(*p_t).porzione[i][j].quota, &(*p_t).porzione[i][j].codice);

return;

}

Riferimenti

Documenti correlati

Si scriva un programma in linguaggio C che riceva sulla riga di comando il nome di un file nel formato sopra descritto e stampi sul monitor il nome e l’elenco dei concorrenti

Si scriva una funzione in linguaggio C che riceva come argomenti un vettore di stringhe, contenenti ciascuna il nome di un file del tipo sopra descritto, e un

Si scriva una funzione in linguaggio C che riceva come argomenti il puntatore a un file di testo nel formato sopra descritto (il file è quindi già stato aperto dalla funzione

Si scriva un programma in linguaggio C che riceva sulla riga di comando il nome di un file di dizionario nel formato dell’esempio sopra riportato e il nome di un file

Al termine dell’esecuzione delle operazioni specificate nel file di ingresso il programma dovrà stampare i valori contenuti in tutte e sole le celle di memoria che

Si scriva un programma in linguaggio C che riceva sulla riga di comando il nome di due file come quelli sopra descritti e stampi il numero delle repliche

Poiché gli identificatori (numeri) delle tessere sono univoci e nella griglia è presente una sola posizione vuota, ogni mossa può semplicemente essere indicata

Per fare questo, si scriva un programma in linguaggio C che riceva sulla riga di comando il nome di un file come sopra descritto e stampi l’elenco dei