Salta ai contenuti. | Salta alla navigazione

Strumenti personali

Soluzione 22 Giugno 2011

C source code icon 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