Premi qui per scaricare il PDF
Esercizio 1
Scrivere un programma che legge da file un numero a priori indefinito di numeri interi. Il programma deve richiedere all’utente il nome del file (stringa di massimo 50 caratteri) da cui caricare i dati e se il file non esistesse lo richiede fino a che non viene immesso il nome corretto oppure viene immessa la stringa “fine” che fa terminare il programma. Il programma deve procedere al conteggio delle occorrenze dei numeri presenti nel file, considerando solo quelli compresi tra 0 e 9, estremi compresi, e trascurando i numeri non compresi nell’intervallo. Infine deve stampare l’istogramma di tali occorrenze, per i numeri con almeno una occorrenza.
#include < stdio.h>
#include < string.h>
#define MAXLEN 50
#define END_PROGRAM "fine"
#define MAXDIM 10
int main()
{
FILE *in;
char fileName[MAXLEN+1];
int fine, num, occorrenze[MAXDIM];
int i,j;
printf("Inserisci il nome del file che vuoi aprire - (fine per terminare):\\n");
gets(fileName);
fine = 0;
if (strcmp(fileName, END_PROGRAM) == 0) //!strcmp(fileName, END_PROGRAM)
{
printf("Hai terminato il programma\\n");
fine = 1;
}
while (!fine) //fine == 0
{
in = fopen(fileName, "r");
if (in == NULL) //Ci sono stati problemi nell'aprire il file
{
printf("Errore, file non trovato\\n");
printf("Inserisci il nome del file che vuoi aprire - (fine per terminare):\\n");
gets(fileName);
if (strcmp(fileName, END_PROGRAM) == 0) //!strcmp(fileName, END_PROGRAM)
{
printf("Hai terminato il programma\\n");
fine = 1;
}
}
else
{
for (i = 0; i < MAXDIM; i++)
occorrenze[i] = 0;
while (!feof(in)&& i < MAXDIM) //feof == 0 { fscanf(in, "%d", &num); if (num >= 0 && num <=9)
occorrenze[num]++;
}
}
fclose(in);
for(i = 0; i < MAXDIM; i++) if (occorrenze[i] > 0)
{
printf("\\n:%d", i);
for(j = 0; j < occorrenze[i]; j++)
printf("*");
}
fine = 1; //Programma terminato
}
return 0;
}
Esercizio 2
Si scriva un programma che esegue la copia di un file di testo. Il programma legge carattere per carattere il contenuto del file “in.txt” e lo ricopia nel file “out.txt“.
#include <stdio.h>
int main()
{
FILE *in, *out;
char car;
int letti, scritti;
in = fopen("in.txt", "r");
out = fopen("out.txt", "w");
if (in == NULL || out == NULL)
{
if (in == NULL)
printf("Impossibile aprire il file di input\\n");
else
fclose(in);
if (out == NULL)
printf("Impossibile aprire il file di output\\n");
else
fclose(out);
}
else
{
letti = fscanf(in, "%c", &car);
while (letti > 0 && scritti > 0) //Letti non è vuoto
{
scritti = fprintf(out, "%c", car);
letti = fscanf(in, "%c", &car);
}
if (ferror(in))
printf("Errore nel file di input\\n");
if (ferror(out))
printf("Errore nel file di output\\n");
if (fclose(in) == EOF)
printf("Errore di chiusura del file di input");
if (fclose(out) == EOF)
printf("Errore di chiusura del file di output");
}
return 0;
}
Esercizio 3
Scrivere un programma in C per l’acquisizione dei dati e il calcolo dei punteggi per il campionato di Formula 1. Il programma dovrà mostrare all’utente un menu di scelta attraverso il quale potrà:
- Inserire una nuova scuderia selezionando l’opzione 1. L’utente può inserire un massimo di 10 scuderie. Una scuderia è caratterizzata dalle seguenti informazioni:
- Nome, stringa di massimo 50 caratteri;
- Pilota 1 e Pilota 2, ognuno caratterizzato dalle seguenti informazioni:
- Nome, stringa di massimo 40 caratteri;
- Cognome, stringa di massimo 40 caratteri;
- Elenco delle posizioni di arrivo per i 22 gran premi.
Per acquisire i dati utilizzare una procedura insDatiScuderia che accetta come parametro la struttura nella quale memorizzare i valori inseriti dall’utente e acquisice il nome della scuderia ed i nomi dei piloti.
- Inserire le posizioni relative ad un gran premio selezionando l’opzione 2. Il programma chiede all’utente il numero del gran premio per il quale si vogliono inserire le posizioni e richiede, per ogni pilota definito, la sua posizione di arrivo. Per acquisire i dati utilizzare una procedura insDatiGranPremio che accetta come parametro il vettore di strutture nel quale memorizzare i valori inseriti dall’utente.
- Stampare a video i punti effettuati da un pilota. Definire a questo scopo una funzione puntiPilota che, ricevuti in ingresso il cognome di un pilota e la struttura che contiene tutti i dati, ritorna i punti effettuai dal pilota secondo la seguente tabella
Stampare tutte le informazioni attraverso una procedura denominata stampa. La procedura riceve in ingresso tutte le informazioni necessarie e stampa a video tutti i dati.
Terminare il programma selezionando l’opzione 0.
#include < stdio.h>
#include < string.h>
#define SC 10 // numero max scuderie partecipanti
#define NS 40 // dim max nome scuderia
#define NC 40 // dim max nome e cognome pilota
#define GP 22 // numero max granpremi
typedef struct{
char nome[NC], cognome[NC];
int posizioni[GP];
}pilota;
typedef struct{
char nome[NS];
pilota p1, p2;
}scuderia;
void insDatiScuderia (scuderia s[], int dim){
int flag, i;
printf("\n--------------------------------------------\n");
printf("INSERISCI INFORMAZIONI SCUDERIA!!\n");
do{
flag=0;
printf("nome scuderia: "); gets(s[dim].nome); fflush(stdin);
for(i=0; i < dim; i++){
//printf("%s e %s", s[dim].nome, s[i].nome);
if(!strcmp(s[dim].nome,s[i].nome)){
flag=1;
printf("\n\n\t[scuderia immessa gia' esisitente]\n\n");
}
}
}while(flag);
printf("\nnome pilota 1: "); gets(s[dim].p1.nome); fflush(stdin);
printf("cognome pilota 1: "); gets(s[dim].p1.cognome); fflush(stdin);
printf("\nnome pilota 2: "); gets(s[dim].p2.nome); fflush(stdin);
printf("cognome pilota 2: "); gets(s[dim].p2.cognome); fflush(stdin);
printf("\n--------------------------------------------\n");
}
void insDatiGranPremio (scuderia s[], int giorno, int numScuderie){
int i, j;
int controllo[2*numScuderie];
int flag;
printf("\n--------------------------------------------\n");
printf("INSERISCI DATI GRAN PREMIO!!\n");
for(i=0; i < numScuderie; i++){
printf("\nSCUDERIA %d nel giorno %d) ", i, giorno+1);
/////////////////////////////////////////////////////////////////////////////////////////////////////////
do{
flag = 0;
printf("\n\tPOSIZIONE PILOTA 1: "); scanf("%d", &s[i].p1.posizioni[giorno]); fflush(stdin);
controllo[2*i]= s[i].p1.posizioni[giorno];
for(j=0; j < 2*i; j++){
if(controllo[j] == s[i].p1.posizioni[giorno]){ //PILOTA 1
printf("\np1: un altro pilota ha questa posizione\n");
flag = 1;
}
}
}while( (s[i].p1.posizioni[giorno] <= 0) || (s[i].p1.posizioni[giorno] > 2*numScuderie) || (flag) );
/////////////////////////////////////////////////////////////////////////////////////////////////////////
do{
flag = 0;
printf("\tPOSIZIONE PILOTA 2: "); scanf("%d", &s[i].p2.posizioni[giorno]); fflush(stdin);
controllo[2*i+1]= s[i].p2.posizioni[giorno];
for(j=0; j < (2*i+1); j++){
if(controllo[j] == s[i].p2.posizioni[giorno]){ //PILOTA 2
printf("\np2: un altro pilota ha questa posizione\n");
flag = 1;
}
}
}while( (s[i].p1.posizioni[giorno] <= 0) || (s[i].p1.posizioni[giorno] > 2*numScuderie) || (flag) );
/////////////////////////////////////////////////////////////////////////////////////////////////////////
}
printf("\n--------------------------------------------\n");
}
void stampa(scuderia s[], int numScuderie){
int i=0;
printf("\n--------------------------------------------\n");
printf("\n\nSTAMPA DI TUTTE LE SCUDERIE\n");
for(i=0;i < numScuderie;i++){
printf("\n\n\nNOME SCUDERIA: %s\n", s[i].nome);
printf("\n\tNOME e COGNOME p1: %s %s\n\n", s[i].p1.nome, s[i].p1.nome);
printf("\tposizioni granpremio PILOTA 1");
printVett(s[i].p1.posizioni, GP);
printf("\n\tNOME e COGNOME p2: %s %s\n\n", s[i].p2.nome, s[i].p2.nome);
printf("\tposizioni granpremio PILOTA 2");
printVett(s[i].p2.posizioni, GP);
}
printf("\n--------------------------------------------\n");
}
void printVett(int v[], int dim){
int i;
for(i=0; i < dim; i++){
printf("\n\tv[%d] = %d", i, v[i]);
}
}
int puntiPilota (pilota p){
int i;
int punti=0;
for(i=0; i < GP; i++){
switch(p.posizioni[i]){
case 1:
punti+=10;
break;
case 2:
punti+=6;
break;
case 3:
punti+=4;
break;
case 4:
punti+=3;
break;
case 5:
punti+=2;
break;
case 6:
punti+=1;
break;
}
}
return punti;
}
int mostraMenu(){
int scelta;
printf("\nMENU DI SCELTA <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n");
printf("1: inserisci una nuova scuderia\n");
printf("2: inserisci valori di una giornata del gran premio\n");
printf("3: stampa punti di un pilota\n");
printf("4: stampa di tutte le informazioni\n");
printf("0: termina programma\n");
printf("\nINSERISCI: ");
scanf("%d", &scelta);
getchar();
printf("<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n");
return scelta;
}
int main(int argc, char *argv[]) {
scuderia scuderie[SC];
int scuderieInserite=0, scelta=1, giorno, i, j, flag;
char nomePilota[NC];
for (i = 0; i < SC; i++){
for (j = 0; j < GP ; j++){
scuderie[i].p1.posizioni[j]=0;
scuderie[i].p2.posizioni[j]=0;
}
}
while(scelta){
scelta = mostraMenu();
switch(scelta){
case 0:
scelta = 0;
break;
case 1:
insDatiScuderia(scuderie, scuderieInserite);
scuderieInserite++;
break;
case 2:
do{
printf("\nDi quale gran Premio vuoi inserire TUTTE le posizioni? (da 1-22): ");
scanf("%d", &giorno); fflush(stdin);
}while((giorno < 1)||(giorno > 22));
insDatiGranPremio(scuderie, giorno-1, scuderieInserite);
break;
case 3:
if(scuderieInserite>0){
printf("\nDi quale Pilota vuoi sapere il punteggio tot?");
gets(nomePilota); fflush(stdin);
flag=0;
for(i=0;i 0) stampa(scuderie, scuderieInserite);
break;
default:
printf("\n\n\tha inserito un valore fuori dal range 0-4\n");
break;
}
}
return 0;
}