PDA

Tam Sürümünü Görmek İçin : bir c kodu " ifler de hatami var acaba ?


xsee
09/01/2008, 01:15
program bütün elemanlari 0 olan bi matrisin elemanlarini random fonk siyonuna gore arttiriyor
while dongüsünden sonra istenen sonucu vermiyor acaba iflerde mi hata var?



#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define satir 5
#define sutun 5
main()
{

int matris[satir][sutun];
int i,j;
for(i=0;i<satir;i++)
{
for(j=0;j<sutun;j++)
{
matris[i][j]=0;
printf("%d%c" ,matris[i][j],' ');

}printf("\n");
}
int x,y;
x=0;
y=0;
matris[0][0]=1;
printf("\n\n");
for(i=0;i<satir;i++)
{
for(j=0;j<sutun;j++)
{

printf("%d%c" ,matris[i][j],' ');

}printf("\n");
}

int sifir_sayisi;
sifir_sayisi=24;
while(sifir_sayisi>0)
{
sifir_sayisi=0;
srand(time(NULL));
int random();
int a;
a=rand()% 4 + 1;
printf("%d\n" , a);
if(x==0||y==0)
{
if(a==1)
{
x=x+1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==2)
{
x++;
y++;
matris[x][y]=matris[x][y]+1;

}
else
{
continue;
}
if(a==3)
{
y=y+1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==4)
{
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
}
else
{
continue;
}
a=rand() % 4 + 1;
printf("%d\n" , a);
if(x==0||y==sutun)
{
if(a==1)
{
y=y-1;
x=0;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==2)
{
y=y-1;
x=x+1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==3)
{
x=x+1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==4)
{
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}

}
else
{
continue;
}
a=rand() % 6 + 1;
printf("%d\n" , a);
if(x==0||y>0)
{
if(a==1)
{
x=x;
y=y-1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==2)
{
x=x+1;
y=y+1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==3)
{
x=x+1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==4)
{
x=x+1;
y=y+1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==5)
{
y=y+1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==6)
{
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}

}
else
{
continue;
}
a=rand() % 4 + 1;
printf("%d\n" , a);
if(x==satir||y==sutun)
{
if(a==1)
{
y=y-1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==2)
{
x=x-1;
y=y-1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==3)
{
x=x-1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==4)
{
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
}
else
{
continue;
}
a=rand() % 6 + 1;
printf("%d\n" , a);
if(x>0||y==sutun)
{
if(a==1)
{
x=x+1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==2)
{
x=x+1;
y=y+1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==3)
{
y=y-1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==4)
{
x=x-1;
y=y-1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==5)
{
x=x-1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==6)
{
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
}
else
{
continue;
}
a=rand() % 4 + 1;
printf("%d\n" , a);
if(x==satir||y==0)
{
if(a==1)
{
x=x-1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==2)
{
x=x-1;
y=y+1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==3)
{
y=y+1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==4)
{
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
}
else
{
continue;
}
a=rand() % 6 + 1;
printf("%d\n" , a);
if(x==satir||y<sutun)
{
if(a=!1)
{
y=y-1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==2)
{
x=x-1;
y=y-1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==3)
{
x=x-1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==4)
{
x=x-1;
y=y+1;
}
else
{
continue;
}
if(a==5)
{
y=y+1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==6)
{
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
}
else
{
continue;
}
a=rand() % 6 + 1;
printf("%d\n" , a);
if(x>0||y==0)
{
if(a==1)
{
x=x+1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==2)
{
x=x+1;
y=y+1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==3)
{
y=y+1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==4)
{
y=y+1;
x=x-1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==5)
{
x=x-1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==6)
{
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
}
else
{
continue;
}
a=rand() % 9 + 1;
printf("%d\n" , a);
if(x<satir||x>0||y>0,y<sutun)
{
if(a==1)
{
y=y-1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==2)
{
x=x-1;
y=y-1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==3)
{
x=x-1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==4)
{
x=x-1;
y=y+1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==5)
{
y=y+1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==6)
{
x=x+1;
y=y+1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==7)
{
x=x+1;
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
if(a==8)
{
x=x-1;
y=y-1;
}
else
{
continue;
}
if(a==9)
{
matris[x][y]=matris[x][y]+1;
}
else
{
continue;
}
}
else
{
continue;
}





for(i=0;i<satir;i++)
{
for(j=0;j<sutun;j++)
{
if(matris[i][j]==0)
{
sifir_sayisi=sifir_sayisi+1;
}
else
{
continue;
}

}
}
printf("\n");
for(i=0;i<satir;i++)
{
for(j=0;j<sutun;j++)
{
matris[i][j]=0;
printf("%d%c" ,matris[i][j],' ');

}printf("\n");
}

}

return 0;
}


acehreli
09/01/2008, 03:21
xsee, bu kod hem senin hem de bizim icin anlasilmasi cok zor bir hale gelmis. Bunun bir kac nedeni var:

1) Her sey main'in icinde: Bunu halletmek icin kodu fonksiyonlara ayirmalisin. Ornegin matrisi cizdirme fonksiyonu soyle olabilir:


void matris_ciz(int matris[satir][sutun])
{
int i, j;

for(i=0; i < satir; ++i)
{
for(j=0; j < sutun; ++j)
{
printf("%d " ,matris[i][j]);
}

printf("\n");
}
}


Ondan sonra kod icinde her istedigin yerde soyle demen yeterli:

matris_ciz(matris);

Senin amacin, boyle bir suru kucuk fonksiyon yazmak, ve onlari teker teker calisir hAle getirmek olmali. Boylece hepsini kullaninca buyuk olasilikla program calisir. Veya, hata ayiklamak kolay olur.

Ornegin soyle bir fonksiyon da isine yarayabilir:

/* Matristeki toplam sifir sayisini verir */
int toplam_sifir_sayisi(int matris[satir][sutun]);

O fonksiyonda butun matrisi tara ve sifir_sayisini hesapla. Boylece while dOngUsu cok kolaylasir:

while (toplam_sifir_sayisi(matris) > 0)

2) Kod tekrari var: Fonksiyonlara ayirinca buyuk olcude kurtulacaksin, ama yine de

matris[x][y]=matris[x][y]+1;

satirlarini x ve y'nin degeri belirledikten sonra yap. else'ler icindeki continue'lar da tamamen yanlis olmus. Sen while'i tekrar dOndUrmek istemiyorsun. Ornegin soyle demek istiyorsun:


if(a==1)
{
x=x+1;
matris[x][y]=matris[x][y]+1;
}
else if(a==2)
{
x++;
y++;
matris[x][y]=matris[x][y]+1;

}
else if(a==3)
{
y=y+1;
matris[x][y]=matris[x][y]+1;
}
else if(a==4)
{
matris[x][y]=matris[x][y]+1;
}


O matris satirini da en sona indirip kisaca soyle yazabilirsin:


if(a==1)
{
x=x+1;
}
else if(a==2)
{
x++;
y++;
}
else if(a==3)
{
y=y+1;
}
else if(a==4)
{
/* x ve y ayni */
}

++matris[x][y];


Eger switch bloklarini ogrendiyseniz, burada onu da kullanabilirsin ama sart degil.

Bir kac tane de oneri:

1) Lutfen main'in dOnUs turunu acikca 'int' olarak yaz. Her seferinde ben eklemekten biktim! :)

int main

2) srand'i bastan ve yalnizca bir kere cagir. Ornegin main'de yaptigin ilk is olsun. Yoksa, time'in duyarligi saniye duzeyinde oldugu icin, while dOngUsu srand'e bir saniye boyunca hep ayni cekirdek degeri verir ve senin rand hep ayni degeri dOndUrur.

3) Butun else { continue; } bloklarini zaten yukarida ben kaldirdim.

Ali