Newsgroup: it.comp.lang.c
Titolo: Aiuto. Guardate questo programma e ditemi cosa posso fare x farlo girare.

Salve a tutti. ho 1 problema nella creazione di 1 programma.
qua c'è la traccia dell'esercizio e al fondo c'è l'implementazione fatta da 
me.
X piacere dateci 1 occhiata e vedete se riuscite a fare quel che io son 
riuscito: a fare girare con successo questo programma e completarlo. grazie 
in anticipo.
c'è 1 ditta farmaceutica che produce dei farmaci, ognuno dei quali contiene
vari principi attivi (il numero dei  farmaci è noto, ma quello dei principi
attivi non è noto a priori).
Dato il numero e la composizione di diversi farmaci, trovare il farmaco che
risponde meglio alle richieste della cura.
Vengono dati 2 file:
F.DAT
3
15 20
0 0
10 23
234 5
9875 21
0 0
10 24
234 3
00
e il file C.DAT
10 22
234 5
0 0
la prima riga del file F.DAT indica il numero di farmaci presenti nel file.
I farmaci son separati dai caratteri 0 0
i 2 numeri che ci son x ogni riga rappresentano rispettivamente il  codice
del principio attivo e la sua quantita.
nella cura ci son dei codici di principi attivi e la loro quantita.
Il compito del problema è trovare il farmaco che rispetta le specifiche
della cura.
Se si trovano + farmaci che hanno almeno la quantita minima indicata dalla
cura, si prende quello che ha minor quantita (totale) di principi diversi di
quelli richiesti dalla cura.
Io ho pensato che potevo crearmi 1 vettore di strutture farmaco (ad esempio
lo chiamavo farmacia).
questa struttura era composta cosi:
struct farmaco{
         int numero_farmaco;
         struct principio *listaPrincipio;
};
le strutture principio erano cosi:
struct principio{
         int numero_principio;
         int quantita;
         struct principio *nextPtr;
}
quindi volevo creare delle liste di principi da legare ad ogni singolo campo
del vettore di farmaci.
in modo che ogni farmaco avesse 1 lista di principi legata a se stesso e io
potessi vedere facilmente quali principi contiene 1 farmaco.
C'è qualcuno che riesce a implementarmi 1 programma funzionante con queste
caratteristiche?
Io ci ho provato in tutti i modi ma non ci son riuscito.
Mi blocco sempre dove devo passare da 1 lista di principi all'altra (visto
che fanno parte di 2 farmaci diversi).
E l'altro problema principale è riuscire a creare i vettore di struct
farmaco a meta programma (visto che io non so a priori quanti farmaci ho...)
Vi prego aiutatemi. Mi serve 1 risposta prima che potete.
Io ho provato a fare questo programma, ma la funzione crea_farmacia non so 
come farla e non so come passare da 1 lista di principi all'altra e 
collegarli alle strutture Farmaco presenti nel vettore di strutture 
farmacia. ora allego qua il listato del programma.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
struct principio{
  int numero_principio;
  int quantita;
  struct principio *nextPtr;
};
struct farmaco{
  int numero_farmaco;
  struct principio *listaPrincipio;
};
struct cura { int numero_principio;
    int quantita;
    struct cura *nextPtr;
};
typedef struct principio PRINCIPIO;
typedef PRINCIPIO *PRINCIPIOPTR;
typedef struct cura CURA;
typedef CURA *CURAPTR;
typedef struct farmaco FARMACO;
typedef FARMACO *FARMACOPTR;
void inserisci_principio(PRINCIPIOPTR *, int, int, int);
void inserisci_cura(CURAPTR *, int, int);
void crea_farmacia(FARMACO, int);
main() {
int max_farmaci, numero_farmaco1, numero_principio1, quantita1, 
numero_principio2, quantita2;
FARMACO farmacia;
PRINCIPIOPTR startPtr=NULL;
CURAPTR startPtr2=NULL;
FILE  *FARMACIPTR, *OUTPTR,*PRINC_CURAPTR;
if ((FARMACIPTR=fopen("F.DAT", "r"))==NULL)
printf("file non trovato\n");
else {
fscanf(FARMACIPTR, "%d", &max_farmaci);
/* qua devo andare a inserire una funzione che mi faccia le seguenti cose:
mi crei il vettore di farmaci che abbia le dimensioni di max_farmaci.
Poi devo cercare di creare le liste dei principi e cercare in qualche modo 
astruso di collegarle al vettore di farmaci.
A questo punto devo creare la funzione clou del programma:
deve andare a scorrermi il vettore farmaci, x ogni farmaco deve richiamarmi 
la funzione scorri_principi e cercare se rispettano le condizioni.
Se le rispettano mi creo 1 vettore di 2 dimensioni Mi segno il numero del 
farmaco e il risultato della somma delle quantita dei principi diversi da 
quelli richiesti dalla cura. Questi vettori li creo solo x i farmaci che 
hanno entrambi i principi attivi. X quelli che non li hanno creo 1 vettore 
delle stesse dimensioni di quelli sopra ma con tutti zero dentro.
Poi basta semplicemente controllare questi vettori e vedere quale di questi 
ha il minor valore dell'elemento 3 del vettore e quindi stampare a video il 
valore dell'elemento 1 di quel vettore*/
crea_farmacia(farmacia,max_farmaci);
fscanf(FARMACIPTR, "%d %d", &numero_principio1, &quantita1);
inserisci_principio(&startPtr, numero_farmaco1, numero_principio1, 
quantita1);
do {
fscanf(FARMACIPTR, "%d %d", &numero_principio1, &quantita1);
if ((numero_principio1==0) && (quantita1==0))
numero_farmaco1++;
inserisci_principio(&startPtr, numero_farmaco1, numero_principio1, 
quantita1);
}
while (numero_farmaco1<max_farmaci);
}
fclose(FARMACIPTR);
if ((PRINC_CURAPTR=fopen("C.DAT","r"))==NULL)
printf("file non trovato\n");
else {
fscanf(PRINC_CURAPTR, "%d %d", &numero_principio2, &quantita2);
while ((numero_principio2 !=0) && (quantita2 != 0)) {
inserisci_cura(&startPtr2, numero_principio2, quantita2);
fscanf(PRINC_CURAPTR, "%d %d", &numero_principio2, &quantita2);
}
}
fclose(PRINC_CURAPTR);
/*qua devo inserire la chiamata della funzione che trova la cura*/
return (0);
}
/* funzioni usate */
void inserisci_principio(PRINCIPIOPTR *sPtr, int numero_principio1, int 
quantita1, int numero_farmaco1)
{PRINCIPIOPTR newPtr;
farmacia[numero_farmaco1]->listaPrincipio=*sPtr;
newPtr=(PRINCIPIOPTR *)malloc(sizeof(PRINCIPIO));
if (newPtr !=NULL)
{newPtr->numero_principio=numero_principio1;
newPtr->quantita=quantita1;
newPtr->nextPtr=*sPtr;
*sPtr=newPtr;}
else printf("principio non inserito\n");}
void inserisci_cura(CURAPTR * sPtr, int numero_principio2, int quantita2)
{CURAPTR newPtr;
newPtr=(CURAPTR *)malloc(sizeof(PRINCIPIO));
if (newPtr !=NULL)
{newPtr->numero_principio=numero_principio2;
newPtr->quantita=quantita2;
newPtr->nextPtr=*sPtr;
*sPtr=newPtr;}
else printf("principio non inserito\n");}
/* creo il vettore di farmaci*/
void crea_farmacia(FARMACO farmacia, int max_farmaci1)
{FARMACO farmacia[max_farmaci1];
} 

 }
Luca
-- 
Home: 
http://kronoz.cjb.net
"La donna è coinvolta sessualmente in tutti gli affari della vita. A
 volte perfino nell'amore." -- K. Kraus