algoritma

Bu başlık kilitlidir. Yeni mesajlar gönderilemez veya mevcut mesajlar düzenlenemez.
mazi71
17-12-2005, 22:06   |  #1  
OP Taze Üye
Teşekkür Sayısı: 0
1 mesaj
Kayıt Tarihi:Kayıt: Ara 2005

merhaba çözemediğim bir problemim var.acaba yardımcı olurmusun aşağıdaki C dilinde yazılmış programın akış şemasını çizermisin ilgilendiğiniz için teşekkürederim.
1.SORU
#include <stdio.h>
#include <stdlib.h>

int **hisse;
int sirket;
FILE *myfile;

struct listnode{
                int pos;
                int hisse;
                struct listnode* ileri;
               };

typedef struct listnode Listnode;
typedef Listnode* listnodeptr;

struct list{
            listnodeptr bas;
            int sayi;
           };

typedef struct list List;
typedef List* listptr;

listptr liste_uret()
{
listptr mylist=(listptr)malloc(sizeof(List));
mylist->sayi=0;
mylist->bas=NULL;
return mylist;
}

void liste_bosalt(listptr mylist)
{
listnodeptr mynode=mylist->bas,sonranode;
while (mynode)
  {
   sonranode=mynode->ileri;
   free(mynode);
   mynode=sonranode;
  }
mylist->sayi=0;
mylist->bas=NULL;
}

void listeye_ekle(int pos, int hisse, listptr mylist)
{
listnodeptr mynode=(listnodeptr)malloc(sizeof(Listnode));
mynode->pos=pos;
mynode->hisse=hisse;
mynode->ileri=NULL;
if (mylist->bas==NULL)
   mylist->bas=mynode;
else
  {
   mynode->ileri=mylist->bas;
   mylist->bas=mynode;
  }
mylist->sayi++;
}

void listeye_node_ekle(listnodeptr mynode, listptr mylist)
{
if (mylist->bas==NULL)
   mylist->bas=mynode;
else
  {
   mynode->ileri=mylist->bas;
   mylist->bas=mynode;
  }
mylist->sayi++;
}

void hisseleri_oku()
{
int loop,loop1,sirket1,sirket2,hissesi;
myfile=fopen("sirket.dat","r");
if (!myfile)
  {
   printf("File can not be opened for reading\n");
   exit(0);
  }
fscanf(myfile,"%d\n",&sirket);
hisse=(int **)malloc(sirket*sizeof(int *));
for (loop=0;loop<sirket;loop++)
  {
   hisse[loop]=(int *)malloc(sirket*sizeof(int));
   for (loop1=0;loop1<sirket;loop1++)
     hisse[loop][loop1]=0;
  }
while (fscanf(myfile,"%d %d %d\n",&sirket1,&sirket2,&hissesi)!=EOF)
   hisse[sirket1-1][sirket2-1]=hissesi;
fclose(myfile);
}

void kim_kime_sahip2()
{
int loop,loop1;
listptr durum=liste_uret();
listptr yeni_sahip_oldugu_hisseler=liste_uret();
listptr sahip_oldugu_hisseler=liste_uret();
listnodeptr mynode,secondnode,oncenode;
myfile=fopen("sirket.coz2","w");
if (!myfile)
  {
   printf("File can not be opened for writing\n");
   exit(0);
  }
for (loop=0;loop<sirket;loop++)
  {
   for (loop1=0;loop1<sirket;loop1++)
     if (loop1!=loop)
       if (hisse[loop][loop1]>50)
         listeye_ekle(loop1,hisse[loop][loop1],yeni_sahip_oldugu_hisseler);
       else
         listeye_ekle(loop1,hisse[loop][loop1],durum);
   while (yeni_sahip_oldugu_hisseler->sayi>0)
    {
     mynode=yeni_sahip_oldugu_hisseler->bas;
     while (mynode)
      {
       secondnode=durum->bas;
       while (secondnode)
        {
         secondnode->hisse+=hisse[mynode->pos][secondnode->pos];
         secondnode=secondnode->ileri;
        }
       secondnode=mynode->ileri;
       mynode->ileri=NULL;
       listeye_node_ekle(mynode,sahip_oldugu_hisseler);
       mynode=secondnode;
      }
     yeni_sahip_oldugu_hisseler->bas=NULL;
     yeni_sahip_oldugu_hisseler->sayi=0;
     oncenode=NULL;
     mynode=durum->bas;
     while (mynode)
      {
       if (mynode->hisse>50)
        {
         secondnode=mynode->ileri;
         mynode->ileri=NULL;
         listeye_node_ekle(mynode,yeni_sahip_oldugu_hisseler);
         if (oncenode==NULL)
           durum->bas=secondnode;
         else
           oncenode->ileri=secondnode;
         mynode=secondnode;
        }
       else
        {
         oncenode=mynode;
         mynode=mynode->ileri;
        }
      }
    }
   mynode=sahip_oldugu_hisseler->bas;
   while (mynode)
    {
     fprintf(myfile,"%d %d\n",loop+1,mynode->pos+1);
     mynode=mynode->ileri;
    }
   liste_bosalt(durum);
   liste_bosalt(sahip_oldugu_hisseler);
   liste_bosalt(yeni_sahip_oldugu_hisseler);
  }
fclose(myfile);
}

void kim_kime_sahip()
{
int loop,loop1,loop2;
int *sahiplik=(int *)malloc(sirket*sizeof(int)),yenisahip;
int *durum=(int *)malloc(sirket*sizeof(int));
int *yeni_sahip_oldugu_hisseler=(int *)malloc(sirket*sizeof(int)),index;
myfile=fopen("sirket.coz","w");
if (!myfile)
  {
   printf("File can not be opened for writing\n");
   exit(0);
  }
for (loop=0;loop<sirket;loop++)
  {
   yenisahip=0;
   for (loop1=0;loop1<sirket;loop1++)
    {
     sahiplik[loop1]=hisse[loop][loop1];
     if (sahiplik[loop1]>50)
      {
       durum[loop1]=1;
       yeni_sahip_oldugu_hisseler[yenisahip]=loop1;
       yenisahip++;
      }
     else
       durum[loop1]=0;
    }
   while (yenisahip>0)
    {
     for (loop1=0;loop1<yenisahip;loop1++)
      {
       index=yeni_sahip_oldugu_hisseler[loop1];
       for (loop2=0;loop2<sirket;loop2++)
         sahiplik[loop2]+=hisse[index][loop2];
      }
     yenisahip=0;
     for (loop1=0;loop1<sirket;loop1++)
       if ((sahiplik[loop1]>50)&&(durum[loop1]==0))
        {
         durum[loop1]=1;
         yeni_sahip_oldugu_hisseler[yenisahip]=loop1;
         yenisahip++;
        }
    }
   for (loop1=0;loop1<sirket;loop1++)
     if ((durum[loop1]==1)&&(loop!=loop1))
       fprintf(myfile,"%d %d\n",loop+1,loop1+1);
  }
fclose(myfile);
}

void main()
{
hisseleri_oku();
kim_kime_sahip();
kim_kime_sahip2();
}

2.SORU
#include<stdio.h>
#include<stdlib.h>
#include<values.h>

int n;
int **matris,**kaplama;
FILE *myfile;
int *eslendir;

void ucret_matrisi_oku()
{
int loop,loop1;
myfile=fopen("input.txt","r");
if (!myfile)
  {
   printf("File can not be opened for reading\n");
   exit(0);
  }
fscanf(myfile,"%d\n",&n);
matris=(int **)malloc(n*sizeof(int *));
kaplama=(int **)malloc(n*sizeof(int *));
eslendir=(int *)malloc(n*sizeof(int));
for (loop=0;loop<n;loop++)
  {
   eslendir[loop]=-1;
   matris[loop]=(int *)malloc(n*sizeof(int));
   kaplama[loop]=(int *)malloc(n*sizeof(int));
   for (loop1=0;loop1<n;loop1++)
     fscanf(myfile,"%d",&(matris[loop][loop1]));
  }
fclose(myfile);
}

void satir_sutunlari_sifirla()
{
int loop,loop1,min;
for (loop=0;loop<n;loop++)
  {
   min=MAXINT;
   for (loop1=0;loop1<n;loop1++)
     if (matris[loop][loop1]<min)
       min=matris[loop][loop1];
   if (min!=0)
     for (loop1=0;loop1<n;loop1++)
       matris[loop][loop1]-=min;
  }
for (loop=0;loop<n;loop++)
  {
   min=MAXINT;
   for (loop1=0;loop1<n;loop1++)
     if (matris[loop1][loop]<min)
       min=matris[loop1][loop];
   if (min!=0)
     for (loop1=0;loop1<n;loop1++)
       matris[loop1][loop]-=min;
  }
}

int minimum_koleksiyon()
{
int loop,loop1,kaplanmayansifir=0,sayac,max,maxindex,res=0;
for (loop=0;loop<n;loop++)
   for (loop1=0;loop1<n;loop1++)
     if (matris[loop][loop1]==0)
      {
       kaplama[loop][loop1]=2;
       kaplanmayansifir++;
      }
     else
       kaplama[loop][loop1]=0;
while (kaplanmayansifir>0)
  {
   max=0;
   for (loop=0;loop<n;loop++)
    {
     sayac=0;
     for (loop1=0;loop1<n;loop1++)
       if (kaplama[loop][loop1]==2)
         sayac++;
     if (sayac>max)
      {
       max=sayac;
       maxindex=loop;
      }
    }
   for (loop=0;loop<n;loop++)
    {
     sayac=0;
     for (loop1=0;loop1<n;loop1++)
       if (kaplama[loop1][loop]==2)
         sayac++;
     if (sayac>max)
      {
       max=sayac;
       maxindex=loop+n;
      }
    }
   res++;
   if (maxindex<n)
    {
     for (loop=0;loop<n;loop++)
       if (kaplama[maxindex][loop]==2)
        {
         kaplama[maxindex][loop]=3;
         kaplanmayansifir--;
        }
       else
         if (kaplama[maxindex][loop]<=0)
           kaplama[maxindex][loop]--;
    }
   else
    {
     for (loop=0;loop<n;loop++)
       if (kaplama[loop][maxindex-n]==2)
        {
         kaplama[loop][maxindex-n]=3;
         kaplanmayansifir--;
        }
       else
         if (kaplama[loop][maxindex-n]<=0)
           kaplama[loop][maxindex-n]--;
    }
  }
return res;
}

void matris_degistir()
{
int loop,loop1,min=MAXINT;
for (loop=0;loop<n;loop++)
   for (loop1=0;loop1<n;loop1++)
     if ((kaplama[loop][loop1]==0)&&(matris[loop][loop1]<min))
       min=matris[loop][loop1];
for (loop=0;loop<n;loop++)
   for (loop1=0;loop1<n;loop1++)
     if (kaplama[loop][loop1]==0)
       matris[loop][loop1]-=min;
     else
       if (kaplama[loop][loop1]==-2)
         matris[loop][loop1]+=min;
}

void bagimsiz_sifir_bul()
{
int loop,loop1,loop2,min,minindex,sayac,minpos;
for (loop2=0;loop2<n;loop2++)
  {
   min=MAXINT;
   for (loop=0;loop<n;loop++)
     if (eslendir[loop]==-1)
      {
       sayac=0;
       for (loop1=0;loop1<n;loop1++)
         if (matris[loop][loop1]==0)
           sayac++;
       if (sayac<min)
        {
         min=sayac;
         minindex=loop;
         if (min==1)
           break;
        }
      }
   for (loop=0;loop<n;loop++)
     if (matris[minindex][loop]==0)
      {
       minpos=loop;
       eslendir[minindex]=minpos;
       break;
      }
   for (loop=0;loop<n;loop++)
     if (matris[minindex][loop]==0)
       matris[minindex][loop]=1;
   for (loop=0;loop<n;loop++)
     if (matris[loop][minpos]==0)
       matris[loop][minpos]=1;
  }
}

void sonuc_yaz()
{
int loop;
myfile=fopen("output.txt","w");
if (!myfile)
  {
   printf("File can not be opened for writing\n");
   exit(0);
  }
for (loop=0;loop<n;loop++)
   fprintf(myfile,"%d ",eslendir[loop]+1);
fclose(myfile);
}

void main()
{
int k;
ucret_matrisi_oku();
satir_sutunlari_sifirla();
k=minimum_koleksiyon();
while (k<n)
  {
   matris_degistir();
   k=minimum_koleksiyon();
  }
bagimsiz_sifir_bul();
sonuc_yaz();
}