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