/*
* File: sol-m7u4es9.c
*
* Data: 04/10/2016
*
* Descrizione: Scrivi un programma che permette di inserire un certo numero di
* offerte di fornitori e che contenga i seguenti dati:
* - codice fornitore (numero intero);
* - ragione sociale e/o nome fornitore (stringa);
* - indirizzo completo;
* - partita IVA e/o codice fiscale;
* - importo offerta in Euro (numero float);
* - data offerta e validita'
*
* Quando l'utente inserisce 0 come codice fornitore, l'inserimento
* ha termine. Il programma cerca e visualizza l'offerta migliore
* (la piu' economica).
*/
#include <stdio.h>
#define MAX_RAG_SOCIALE 15
#define MAX_INDIRIZZO 20
#define MAX_P_IVA 15
#define MAX_TABELLA 10
struct data {
int giorno;
int mese;
int anno;
};
struct offerta {
int cod_forn;
char rag_sociale[MAX_RAG_SOCIALE + 1];
char indirizzo[MAX_INDIRIZZO + 1];
char p_iva[MAX_P_IVA + 1];
float importo;
struct data data_offerta;
int validita; // Espressa in giorni
};
int inserisci_offerta(struct offerta vett[], int dim) {
// Inserimento da tastiera di una nuova offerta in coda alla tabella.
//
// Restituisce la nuova dimensione di tabella nel caso di inserimento
// effettuato con successo.
// Restituisce -1 se nessun inserimento e' stato effettuato (per esempio,
// perche' l'utente ha digitato un codice fornitore pari a 0 oppure
// perche' la tabella e' piena).
int cod;
if (dim == MAX_TABELLA)
// Nessun inserimento poiche' la tabella e' piena (la dimensione logica
// della tabella e' pari a quella fisica). Si restituisce -1
return -1;
do {
printf("\nCodice fornitore (0 per terminare): ");
scanf("%d", &cod);
if (cod < 0) printf("Codice errato.\n");
} while (cod < 0);
if (cod == 0)
// Nessun inserimento, si restituisce -1.
return -1;
// Inserimento dei dettagli dell'offerta (validazioni omesse per semplicita').
vett[dim].cod_forn = cod;
fflush(stdin);
printf("Ragione sociale e/o nome fornitore: ");
gets(vett[dim].rag_sociale);
fflush(stdin);
printf("Indirizzo: ");
gets(vett[dim].indirizzo);
fflush(stdin);
printf("Partita IVA e/o codice fiscale: ");
gets(vett[dim].p_iva);
fflush(stdin);
printf("Importo [EUR]: ");
scanf("%f", &vett[dim].importo);
printf("Data dell'offerta (gg mm aaaa): ");
scanf("%d%d%d",
&vett[dim].data_offerta.giorno,
&vett[dim].data_offerta.mese,
&vett[dim].data_offerta.anno
);
printf("Validita' dell'offerta (in giorni): ");
scanf("%d", &vett[dim].validita);
return dim + 1;
}
int ricerca_offerta_min(struct offerta vett[], int dim) {
// Restituisce l'indice dell'offerta di importo minimo, oppure
// il valore -1 nel caso in cui non sia possibile determinare il valore
// minimo (tabella vuota).
int i_min = -1;
for (int i = 0; i < dim; i++)
if (i_min == -1 || vett[i].importo < vett[i_min].importo)
i_min = i;
return i_min;
}
void stampa_offerta(struct offerta vett[], int i_offerta) {
// Stampa i dettagli della sola offerta di posizione "i_offerta"
if (i_offerta < 0) {
printf("Offerta inesistente.\n");
return;
}
printf(" Cod. fornitore: %d\n", vett[i_offerta].cod_forn);
printf("Ragione sociale: %s\n", vett[i_offerta].rag_sociale);
printf(" Indirizzo: %s\n", vett[i_offerta].indirizzo);
printf(" Partita IVA: %s\n", vett[i_offerta].p_iva);
printf(" Importo: %.2f EUR\n", vett[i_offerta].importo);
printf(" Data offerta: %02d/%02d/%04d\n",
vett[i_offerta].data_offerta.giorno,
vett[i_offerta].data_offerta.mese,
vett[i_offerta].data_offerta.anno);
printf(" Validita': %d giorni\n", vett[i_offerta].validita);
}
int main( void ) {
struct offerta tabella[MAX_TABELLA];
int dim_tabella = 0; // Tabella inizialmente vuota (dim. logica = 0)
int nuova_dim;
int indice_min;
do {
nuova_dim = inserisci_offerta(tabella, dim_tabella);
if (nuova_dim != -1)
dim_tabella = nuova_dim;
}
while (nuova_dim != -1);
indice_min = ricerca_offerta_min(tabella, dim_tabella);
printf("\n\nOfferta piu' vantaggiosa:\n\n");
stampa_offerta(tabella, indice_min);
return 0;
}