#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#define maxn 10 /* Numero maxim de sectors */
#define numn 3  /* Numero de sectors */
int n=numn,t1,t2,t3,t4,t5; double a[maxn][maxn],k2[maxn],
    ED=-.5,EO=.3;
char fitxer[13];
FILE *pf;
int main()
{double k1[maxn],p[maxn],q[maxn],k[maxn],pp[maxn],gm,exp,OfI[maxn],
        Of[maxn],DemI[maxn],pI[maxn],Dem[maxn],m[maxn],ingressos,
        despeses,d,sa[maxn],k1I[maxn],kSt,kSe,aI[maxn][maxn],raI;
 int i,j,t,sortir=0,llavor,dades=0;
 printf("\nEVOLUCIO DELS PREUS I LA GANANCIA MITJANA\n");
 printf("1. Introduccio aleatoria de dades inicials.\n");
 printf("2. Introduccio per un fitxer de dades inicials.\n");
 do
    {scanf("%d",&dades);
    } while(dades!=1 && dades!=2);
 if(dades==2)
    {sprintf(fitxer,"coeficie.txt");
     if((pf=fopen(fitxer,"r"))==NULL)
         {printf("NO PUC OBRIR FITXER D'ENTRADA"); system("PAUSE");
          exit(1);
         }
     fscanf(pf,"%d",&n);
    }
 printf("\nllavor="); scanf("%d",&llavor); srand(llavor);
 for(i=0;i<n;i++)
    {(dades==1)?sa[0]=rand()/32768.:fscanf(pf,"%lf",&a[i][0]);
     for(j=1;j<n-1;j++)
        {if(dades==2) fscanf(pf,"%lf",&a[i][j]);
         else {sa[j]=rand()*sa[j-1]/32768;
              }
        }
     if(dades==1)
        {a[i][n-1]=sa[n-1]=0;
         for(j=n-2;j>=0;j--) a[i][j]=sa[j]-sa[j+1];
        }
     else fscanf(pf,"%lf",&a[i][n-1]);
    }
 for(i=0;i<n;i++) for(j=0;j<n;j++) aI[i][j]=a[i][j];
 for(i=0;i<n;i++)
    {if(dades==2) {fscanf(pf,"%lf",&k2[i]); fscanf(pf,"%lf",&k1[i]);}
     else {k2[i]=rand(); k1[i]=rand();}
    }
 if(dades==2) close(pf);
 printf("\nNumero de sectors=%d\n",n);
 for(i=0;i<n;i++)
  {for(j=0;j<n;j++) printf("%lf  ",a[i][j]);
   printf("\n");
  }
 for(i=0;i<n;i++) printf("\n%lf  %lf",k2[i],k1[i]);
 printf("\n");
 /* printf("\nED="); scanf("%lf",&ED);
 printf("EO="); scanf("%lf",&EO); exp=1/(EO-ED); */
 printf("Introduir els temps d'adaptacio (0 per a infinit):\n");
 printf("temps d'adaptacio de l'oferta i la demanda=");
 scanf("%d",&t1);
 t2=t1;
 printf("temps d'adaptacio intersectorial          =");
 scanf("%d",&t3);
 printf("temps d'adaptacio a la demanda solvente   =");
 scanf("%d",&t4);
 printf("temps d'adaptacio als canvis tecnologics  =");
 scanf("%d",&t5);
 for(i=0;i<n;i++)
        {p[i]=rand(); Of[i]=rand();
        }
 t=0;
 sortir=0;
 for(i=0;i<n;i++) printf("%7d %4d %12.4lg %12.4lg\n",t,i,Of[i],p[i]);
 do
   {d=0;
    for(i=0;i<n;i++)
      {/* 1 */ OfI[i]=k1[i]*pow(p[i],EO);
       /* 2 */ if(t1!=0) Of[i]+=(OfI[i]-Of[i])/t1;
       /* 3 */ DemI[i]=Of[i];
       /* 4 */ pI[i]=pow(DemI[i]/k2[i],1/ED);
       /* 5 */ if(t2!=0) p[i]+=(pI[i]-p[i])/t2;
       /* 6 */ Dem[i]=k2[i]*pow(p[i],ED);
       /* 8 */ m[i]=(Of[i]<Dem[i])?Of[i]:Dem[i];
      }
    /* 7 Calcul dels costos unitaris */
    for(i=0;i<n;i++)
       {k[i]=0;
        for(j=0;j<n;j++) k[i]+=a[i][j]*p[j];
       }
    /* 9 Calcul de la ganancia mitjana */
    ingressos=0; despeses=0;
    for(i=0;i<n;i++)
       {ingressos+=p[i]*m[i];
        despeses+=k[i]*Of[i];
       }
    gm=ingressos/despeses - 1;
    for(i=0;i<n;i++)
       {/* 10 */ pp[i]=(1+gm)*k[i];
        if(fabs(p[i]/pp[i]-1)>d) d=fabs(p[i]/pp[i]-1);
        /* 11 */ k1I[i]=k2[i]*pow(pp[i],ED-EO);
        /* 12 */ if(t3!=0) k1[i]+=(k1I[i]-k1[i])/t3;
       }
    if(d<1)
      {/* Adaptació del consum no directament productiu
          a la demanda solvent */
       /* 13 */ kSt=0; for(i=1;i<n;i++) kSt+=Of[i]*a[i][n-2];
                kSt/=pow(p[n-2],ED);
       /* 14 */ if(t4!=0) k2[n-2]+=(kSt-k2[n-2])/t4;
       /* 15 */ kSe=(ingressos-despeses)/pow(p[n-1],ED+1);
       /* 16 */ if(t4!=0) k2[n-1]+=(kSe-k2[n-1])/t4;
      }
    /* 17 CANVI TECNOLOGIC */
    for(i=0;i<n;i++) for(j=0;j<n;j++)
        {raI=rand()/32768.;
         if(raI<aI[i][j])
           {aI[i][j]=raI;
            printf("nou valor de aI(%d,%d)=%lf\n",i,j,aI[i][j]);
           }
         if(t5!=0) a[i][j]+=(aI[i][j]-a[i][j])/t5;
        }
    t++;
    if(t/20==t/20.) for(i=0;i<n;i++)
       printf("%7d %4d %12.4lg %12.4lg %12.4lg %12.4lg %12.4lg\n",
             t,i,Of[i],p[i],pI[i],pp[i],gm);
    if(t/100==t/100.) system("PAUSE");
    if(d<.001) sortir=1;
   } while(sortir!=1);
 printf("EQUILIBRI EN:\n");
 for(i=0;i<n;i++)
     printf("%7d %4d %12.4lg %12.4lg %12.4lg %12.4lg %12.4lg\n",
             t,i,Of[i],p[i],pI[i],pp[i],gm);
 for(i=0;i<n;i++)
  {for(j=0;j<n;j++) printf("%lf  ",a[i][j]);
   printf("\n");
  }
 for(i=0;i<n;i++) printf("\n%lf  %lf",k2[i],k1[i]);
 printf("\n");
 system("PAUSE");
 return 0;
}


