Premi qui per scaricare il PDF
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;
}
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à:
- 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<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;
}