Soluzione 22 Giugno 2011
Giugno22-2011.c
—
C source code,
3 kB (3447 bytes)
Contenuto del file
//compito del 22 giugno 2011
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//record contento nel primo file "film.txt"
typedef struct
{int codice;
char nome_reg[20];
int budget;
}film;
//record contunto nel secondo file "preventivi.txt"
typedef struct
{int codice;
char nome_produttore[20];
int offerta;
}preventivo;
//struttura da inserire nell'albero binario di ricerca
typedef struct
{int codice;
char nome_reg[20];
int budget;
char nome_produttore[20];
int offerta;
}el_type;
//definizione del singolo nodo dell'albero
typedef struct tree_element
{el_type value;
struct tree_element *left;
struct tree_element *right;
}item;
//definizione della struttra dati dinamica albero
typedef item* tree;
//metodi che mi servono per lavorare con l'albero
//inserimento di un nuovo nodo nell' albero
tree cons(el_type e,tree left,tree right)
{tree aux;
aux=(tree)malloc(sizeof(item));
aux->value=e;
aux->left=left;
aux->right=right;
return (aux);
}
//domanda b
//inserimento ordinato di un nuovo elemento nell'albero. Albebro ordinato sul campo "codice"
tree ord_ins(el_type e,tree t)
{if (t==NULL)
{return cons(e,NULL,NULL);}
else { if (e.codice<t->value.codice)
{return cons(t->value,ord_ins(e,t->left),t->right);}
else {return cons(t->value,t->left,ord_ins(e,t->right));}
}
}
//domanda a
//lo dovr� inserire all'interno di un while che scorre gli elementi del primo file
//perch� per ciascuno di essi cerco quello con l'offerta massima nel secondo file
el_type offerta_maggiore(FILE *f_in_1,FILE *f_in_2)
{film movie;
el_type max;
preventivo p;
fscanf(f_in_1,"%d%s%d\n",&movie.codice,&movie.nome_reg,&movie.budget);
fscanf(f_in_2,"%d%s%d\n",&p.codice,&p.nome_produttore,&p.offerta); //suppongo che il massimo sia il primo elemento del secondo file
strcpy(max.nome_produttore,p.nome_produttore);
max.offerta=p.offerta;
while (!feof(f_in_2))
{ fscanf(f_in_2,"%d%s%d\n",&p.codice,&p.nome_produttore,&p.offerta);
if (movie.codice==p.codice)
{if (max.offerta<p.offerta)
strcpy(max.nome_produttore,p.nome_produttore); //aggiorno il massimo ( in particolare solo i campi che variano )
max.offerta=p.offerta;
}
}
max.codice=movie.codice;
strcpy(max.nome_reg,movie.nome_reg);
max.budget=movie.budget;
return (max);
}
//domanda c
//siccome ho creato un albero binario di ricerca ordinato in base al campo "codice"
//mi baster� vistire l'albero in ordine e stampare su file di volta in volta in contenuto della radice
void stampa_albero(FILE *f_out,tree t)
{if (t!=NULL)
{stampa_albero(f_out,t->left);
fprintf(f_out,"%d%s%d%s%d\n",t->value.codice,t->value.nome_reg,t->value.budget,t->value.nome_produttore,t->value.offerta);
stampa_albero(f_out,t->right);
}
}
main()
{FILE *f1,*f2,*f3;
tree T;
el_type EL;
T=NULL; //inizializzo un nuovo albero
f1=fopen("film.txt","rt");
f2=fopen("preventivi.txt","rt");
//scorro tutti gli elementi del primo file
while (!(feof(f1)))
{EL=offerta_maggiore(f1,f2); //trovo il film che ha ricevuto offerta maggiore
T=ord_ins(EL,T); //inserisco l'elemento corrente nell'albero,creando un albero binario di ricerca ordinato sul campo codice
}
fclose(f1);
fclose(f2);
f3=fopen("OUTPUT.txt","wt");
stampa_albero(f3,T);
fclose(f3);
}
// PERFETTO - 20 punti