PDA

Visualizza la versione completa : [c] aiuto programma in c ricorsione


razzoman
18-12-2013, 19:32
ciao a tutti, mi han dato come esercizio un programma in cui gestisco una pasticceria e da un file estrapolo gli ingredienti che ho nel mio laboratorio e nell'altro le varie ricette delle torte con gli ingredienti necessari (č strutturato cosė il secondo file "nomericetta prezzo n.ingredienti" e poi gli n righe(che coincide a n.igredienti) che elenca gli ingredienti necessari per la preparazione. Il programma dice di trovare la combinazione di torte(es 3 torte al cioccolato 1 e 1 alla crema) che mi offre maggior guadagno dagli ingredienti che ho a disposizione. Ora io sono riuscito solamente a trovare tutte le soluzioni possibili che posso produrre dagli ingredienti che ho a disposizione,ma non riesco a printare la solo la soluzione migliore.Vi posto il codice
#include <stdio.h>#include <stdlib.h>
#include <string.h>
#define MAX 100


typedef struct
{
char ingredient[21];
int disp;
} warehouse;
typedef struct
{
int ind;
int gr;
} cakeingredients;
typedef struct
{
char cake[21];
int prize;
int numberingredients;
cakeingredients *p;
} recipe;
void buddy(warehouse *bakery,recipe *recipes,int pos,int numberrecipe,int k[numberrecipe],int numberbakeryitem,int temp1[numberrecipe],int moneymax);
int main(int argc,char *argv[])
{
warehouse *bakery;
recipe *recipes;
int i=0,j=0,z;
int numberbakeryitem;
int numberrecipe;
FILE *f,*f2;
f=fopen(argv[1],"r");
fscanf(f,"%d",&numberbakeryitem);
bakery=malloc(numberbakeryitem*(sizeof(recipe)));
while(!feof(f))
{
fscanf(f,"%s %d",bakery[i].ingredient,&bakery[i].disp);
i++;
}
i=0;
fclose(f);
f2=fopen(argv[2],"r");
fscanf(f2,"%d",&numberrecipe);
recipes=malloc(numberrecipe*sizeof(recipe));
j=0;
char temp[31];
while(!feof(f2))
{
fscanf(f2,"%s %d %d",recipes[j].cake,&recipes[j].prize,&recipes[j].numberingredients);
recipes[j].p=malloc(recipes[j].numberingredients*sizeof(cakeingredients));
for(i=0; i<recipes[j].numberingredients; i++)
{
fscanf(f2,"%s %d",temp,&recipes[j].p[i].gr);


for(z=0;z<numberbakeryitem;z++)
{
if(strcmp(temp,bakery[z].ingredient)==0)
{
recipes[j].p[i].ind=z;
}
}
}
j++;
}


int k[numberrecipe];
for(i=0;i<numberrecipe;i++)
{
k[i]=0;
}
int temp1[numberrecipe];
for(i=0;i<numberrecipe;i++)
{
temp1[i]=0;
}int moneymax=0;
buddy(bakery,recipes,0, numberrecipe, k, numberbakeryitem,temp1,moneymax);
return 0;
}
void buddy(warehouse *bakery,recipe *recipes,int pos,int numberrecipe,int k[numberrecipe],int numberbakeryitem,int temp1[numberrecipe],int moneymax)
{
int i,j;
int money=0;
int INDEX;
for(i=pos;i<numberrecipe;i++)
{


int cando = 1;
for(j=0;j<recipes[i].numberingredients;j++)
{
INDEX=recipes[i].p[j].ind;
if( bakery[INDEX].disp - recipes[i].p[j].gr<0)
{


cando=0;
break;
}
}
if (cando)
{




for(j=0;j<recipes[i].numberingredients;j++)
{
INDEX=recipes[i].p[j].ind;
bakery[INDEX].disp-=recipes[i].p[j].gr;


} k[i]++;
buddy(bakery,recipes,i, numberrecipe, k, numberbakeryitem,temp1,moneymax);
k[i]--;


for(j=0;j<recipes[i].numberingredients;j++)
{
INDEX=recipes[i].p[j].ind;
bakery[INDEX].disp+=recipes[i].p[j].gr;


}






}




}
for(j=0;j<numberrecipe;j++)
{
printf(" %d %s ",k[j],recipes[j].cake);
}printf("\n");


}

razzoman
18-12-2013, 20:07
ragazzi ho risolto!!:D

Loading