Esercitazione 11 – 10-12-2020

Premi qui per scaricare il PDF

[adinserter block="7"]

Esercizio 1

Si scriva una funzione in C in grado di creare e restituire una stringa data dalla concatenazione di due stringhe di lunghezza massima di 100 caratteri e ricevute come parametri. La stringa generata va allocata dinamicamente. Scrivere quindi un programma in C che legge da un file (in.txt) due stringhe e genera un nuovo file (out.txt) con la stringa concatenata risultante.

#include <stdio.h>
#include <string.h>
#include <malloc.h>

#define MAXLEN 100
#define IN_NAME "input.txt"
#define OUT_NAME "output.txt"

char* concatenazione(char*, char*);

int main() 
{
  char s1[MAXLEN+1], s2[MAXLEN+1];
  char *s3;
  FILE *in, *out;

  in = fopen(IN_NAME, "r");
  if (in == NULL)
    printf("Impossibile aprire il file\\n");
  else
  {
    fscanf(in, "%s", s1);
    fscanf(in, "%s", s2);

    if (fclose(in) == EOF)
      printf("Errore chiusura del file\\n");
    
    s3 = concatenazione(s1, s2);

    out = fopen(OUT_NAME, "w");
    if (out == NULL)
      printf("Impossibile aprire il file\\n");
    else
      fprintf(out, "%s", s3);

    if (fclose(out) == EOF)
      printf("Errore chiusura del file\\n");
  }
  return 0;
}

char* concatenazione(char* z0, char* z1)
{
  char *str3;

  str3 = (char *)malloc((strlen(z0) + strlen(z1)+1) * sizeof(char));

  strcopy (str3, z0);
  strcat(str3, z1);

  return str3;
}
[adinserter block="7"]

Esercizio 2

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à:

  1. Inserire una nuova scuderia selezionando l’opzione 1. L’utente può inserire un massimo di 10 scuderie. Una scuderia è caratterizzata dalle seguenti informazioni:
    1. Nome, stringa di massimo 50 caratteri;
    2. Pilota 1 e Pilota 2, ognuno caratterizzato dalle seguenti informazioni:
      1. Nome, stringa di massimo 40 caratteri;
      2. 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.

  1. 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.
  1. 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
  1. 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.

  2. 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<scuderieInserite;i++){ if(!strcmp(nomePilota,scuderie[i].p1.nome)){ printf("\n\tPunteggio tot = %d", puntiPilota(scuderie[i].p1)); flag=1; }else{ if(!strcmp(nomePilota,scuderie[i].p2.nome)){ printf("\n\tPunteggio tot = %d", puntiPilota(scuderie[i].p2)); flag=1; } } if(flag) break; } } break; case 4: if(scuderieInserite > 0) stampa(scuderie, scuderieInserite);
				break;
			
			default:
				printf("\n\n\tha inserito un valore fuori dal range 0-4\n");
				break;
		}
	}
	
	return 0;
}
[adinserter block="7"]

Premi qui per scaricare il PDF