svolcbis2000-07-10.c

Generated by com.bluecraft.htmlize HTML-ization Utility Classes.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define N 50

/* dichiarazioni dei tipi */

typedef struct  {
     char  autore[16];
     char  opera[11];
     char  tipo_opera;
     double  prezzo;
}  singolaopera;

typedef  singolaopera  galleria[N];

typedef  struct  autore {
     char  nome[16];
     double  prezzo;
}  tipoautore;

/*  prototipi  */

FILE  *ApriFile(char  *nome, char  *modo);
void  CostruisciFile(FILE  *f);
void  CaricaArray(singolaopera  s, galleria  X, int  *q);
void  CercaMassimi(galleria  X, int  k, galleria  S, int  *a);
void  CostruisciArray(char  *nomefile, galleria  a1, int  *n1, galleria  a2, int  *n2);
void  CercaMassimo(char  *nomefile, double  *max);
void  StampaArray(galleria  Y, int  n);
int  main(void);



FILE  *ApriFile(char  *nome, char  *modo)
{
	 FILE  *f;

	 f=fopen(nome, modo);
	 if(f==NULL)   {
	    fprintf(f, "Impossibile aprire \"%s\" in modalitą \"%s\".\n", nome, modo);
	    exit(1);
	 }
	 return f;
}


void  CostruisciFile(FILE  *f)
{
	 galleria  A;
	 int  i=0, q;

	 do   {
	 printf("Inserire il nome dell'autore dell'opera\n"
		"(max 15 caratteri)(premi INVIO per terminare)    : ");
	 gets(A[i].autore);
	 if(A[i].autore[0]==0)
	    break;
	 printf("Inserire il nome dell'opera(max 10 caratteri)    : ");
	 gets(A[i].opera);
	 printf("Inserire il tipo dell'opera\n"
		"(un carattere: 'Q' per quadro e 'S' per scultura): ");
	 scanf("%c", &A[i].tipo_opera);
	 getchar();
	 printf("Inserire il prezzo dell'opera (in euro)          : ");
	 scanf("%lf", &A[i].prezzo);
	 getchar();
	 printf("\n");
	 i++;
	 }  while(1);

	 q=i;
	 for(i=0; i<q; i++)
	    fprintf(f, "%s %s %c %.1E\n", A[i].autore, A[i].opera, A[i].tipo_opera, A[i].prezzo);

	 return;
}


void  CaricaArray(singolaopera  s, galleria  X, int  *q)
{

	 X[*q]=s;
	 (*q)++;

	 return;
}


void  CercaMassimi(galleria  X, int  k, galleria  S, int  *a)
{

	 int  i;
	 double  max=0;

	 for(i=0; i<k; i++)
	    if(X[i].prezzo>max)
	       max=X[i].prezzo;

	 for(i=0; i<k; i++)
	    if(X[i].prezzo==max)
	       CaricaArray(X[i], S, a);

	 return;
}


/* FUNZIONE RICHIESTA AL PUNTO 1.2 */
void  CostruisciArray(char  *nomefile, galleria  a1, int  *n1, galleria  a2, int  *n2)
{                          /*  *n1  dimensioni array  a1
			       *n2  dimensioni array  a2
			       (parametri d'output della funzione)  */

	 FILE  *f;
	 galleria  Q, S;
	 singolaopera  b;
	 int  h=0, k=0;
	 char  q='Q';
	 (*n1)=0;
	 (*n2)=0;

	 f=ApriFile(nomefile, "r");

	 while(fscanf(f, "%s%s %c%lf", b.autore, b.opera, &b.tipo_opera, &b.prezzo)==4)
	    if(b.tipo_opera==q)
	       CaricaArray(b, Q, &h);
	    else
	       CaricaArray(b, S, &k);

	 /*  cerco i pió costosi */

	 CercaMassimi(Q, h, a1, n1);
	 CercaMassimi(S, k, a2, n2);

	 fclose(f);
	 return;
}


/* FUNZIONE RICHIESTA AL PUNTO 1.3 */
void  CercaMassimo(char  *nomefile, double  *max)
{

	 FILE  *f;
	 tipoautore  A[N];
	 int  k, q, i=0, conta=0;
	 char  t, nomeopera[11];
	 (*max)=0;                    /*  inizializzazione della variabile
							   tipo puntatore  */
	 f=ApriFile(nomefile, "r");

	 while(fscanf(f, "%s%s %c%lf", A[i].nome, nomeopera, &t, &A[i].prezzo)==4)
	    i++;

	 q=i;

	 for(i=0; i<q; i++)
	    if(A[i].nome[0]!=0)
	       for(k=i+1; k<q; k++)
		 if(strcmp(A[i].nome, A[k].nome)==0)   {
		      A[i].prezzo+=A[k].prezzo;
		      A[k].nome[0]=0;
		      conta++;
		 }

	 /*  cerco il massimo  */

	 for(i=0; i<(q-conta); i++)
	    if(A[i].prezzo>(*max))
		(*max)=A[i].prezzo;

	 fclose(f);
	 return;
}


void  StampaArray(galleria  Y, int  n)
{

	 if(n>0)   {
	     printf("%s %s %c %.1E\n", Y[0].autore, Y[0].opera, Y[0].tipo_opera, Y[0].prezzo);
	     StampaArray(Y+1, n-1);
	 }
	 return;
}


int  main(void)
{

	 FILE  *fin;
	 char  nome[21];
	 galleria  A, B;
	 int  a, b;
	 double  massimo;

	 printf("Inserisci il nome del file di testo\n"
		"dove memorizare i dati di tutte le opere: ");
	 gets(nome);
	 printf("\n");

	 fin=ApriFile(nome, "w");

	 CostruisciFile(fin);

	 rewind(fin);

	 CostruisciArray(nome, A, &a, B, &b);

	 printf("\n");
	 printf("Dati relativi ai quadri pił cari:\n");
	 StampaArray(A, a);
	 printf("\n");
	 printf("Dati relativi alle sculture pił care:\n");
	 StampaArray(B, b);
	 printf("\n");

	 CercaMassimo(nome, &massimo);

	 printf("Il valore massimo delle opere associato ad ogni autore č:\n");
	 printf("%g\n", massimo);

	 return 0;
}