PDA

Tam Sürümünü Görmek İçin : Nerde hata olabilir???????


aysesule
29/05/2008, 00:45
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void program(int);
int main()
{
int n;

printf("Kaclik bir kare matriste programi uygulamak istiyorsunuz\n");
scanf("%d",&n);

program(n);
return 0;
}
void program(int n)
{
int dizi[100][100];
int i=1,k,m,j,a,b;

k=0+rand()%(n-1);
a=k;
m=0+rand()%(n-1);
b=m;
dizi[k][m]=i;


while(i<=n*n)
{
if(m!=(n-1))
{
m++;
}
else
{
m=0;
}
if(k!=0)
{
k--;
}
else
{
k=n-1;
}
if(dizi[k][m]!=NULL)
{
dizi[k][m]=i++;
a=k;
b=m;
}
else
{

if(a!=(n-1))
k++;
else
k=0;

a=k;
b=m;
dizi[k][m]=i++;
}

}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d\t",dizi[i][j]);
}
printf("\n");
}
}

Kodu calıştırdıgımda bazı yerlerde yapıyo gozukuyor kodu dıgerlerınde rasgele bi şeyler yazıyo soyle:
http://img147.imageshack.us/img147/8972/adszxu7.png (http://imageshack.us)


quasimodo
29/05/2008, 01:41
rand() % 4 nin sonucunda uretilen sayi 0 ile 3 arasinda olur.
rand() % n yapman daha dogru olacaktir.
Ayrica oradaki arti 0 in anlamini cikaramadim.

hasanyasin
29/05/2008, 01:41
Kod dümdüz olduğu için incelemek çok güç; o yüzden incelemedim. Sonuçlara bakınca sayıların çok fazla arttığı ve integer overflowla karşı karşıya kaldığınızı tahmin etmekse çok kolay, o yüzden böyle bir tahminde bulunmak istiyorum.

Veri tiplerinizi seçerken dikkat etmeniz gerekiyor.

acehreli
29/05/2008, 02:35
[aysesule'nin kod satirlarini 'code' belirtecleri icine aldim ve icerlettim.]

aysesule, gorebildigim bir hata, diziyi sifirlamadan kullaniyorsun. Sifirlamak su kadar kisadir:

int dizi[100][100] = { 0 };

Onun elemanlarini NULL'la karsilastirmak da kafa karistiriyor cunku icinde 'int'ler var. Dogrudan 0'la karsilastirabilirsin.

Ayrica kullandigin tek karakterli degiskenler bize hic yardimci olmuyor.

Ali

aysesule
29/05/2008, 23:19
[aysesule'nin kod satirlarini 'code' belirtecleri icine aldim ve icerlettim.]

aysesule, gorebildigim bir hata, diziyi sifirlamadan kullaniyorsun. Sifirlamak su kadar kisadir:

int dizi[100][100] = { 0 };

Onun elemanlarini NULL'la karsilastirmak da kafa karistiriyor cunku icinde 'int'ler var. Dogrudan 0'la karsilastirabilirsin.

Ayrica kullandigin tek karakterli degiskenler bize hic yardimci olmuyor.

Ali


Evet null'dan kaynaklanıyomş sorun dediğini yapınca oldu cok sagol.

x=0+rand()%n-1 dediğimde 0 dan baslayarak n-1 kdr olan bi sayi üretiyor diziler 0dan basladıgı için o amacla kullandım.

aysesule
30/05/2008, 00:24
k=0+rand()%(n-1);
a=k;
m=0+rand()%(n-1);
b=m;
dizi[k][m]=i;
printf("%d\n",k);
printf("%d\n",m);

örn:k=0,m=0 buluyo ama matris seklinde yazarken dogru yere yazmıyor.ama matriste yazdıgı yeri dogru kabul edip duzgun işlemler yapıyo tek bı hatayla(iki sayının yerinin yerdegiştirmesi gerekiyor)
normalde bu tek hatadan bır suru hata dogacaktır ama sdc o hatayı yapıyo ve dogru sayılar yazmış gıbı kabul edıp işleme devam edıyor yanı ekranda 4 gozukuyo ama o olması gereken sayıyı örn 3ü dusunerek onu devamında dogru şeyler üretiyor anlam veredım neden boyle oluyor????

acehreli
30/05/2008, 01:12
Soyledigin hatanin nedenini goremiyorum ama dOngu icinde m++ ve k-- gibi islemler var. Belki onunla ilgili mantik hatalari vardir.

Baska bir sey kesfettim ama: 'rand() % n' yazman gerekiyor cunku [0,n-1] araliginda rastgele degerler uretiyorsun. %(n-1) yanlis oluyor.

Ayrica, bir sayiyi sifirla toplamanin etkisiz oldugunu gor artik. ;) Yani kisaca soyle:

k = rand() % n;

[Duzeltme: Ayni konuyu quasimodo da soylemisti; gozardi etmissin.]

Ali

aysesule
30/05/2008, 10:11
Hayır gozardı etmedım neden oyle kullandıgımı acıkladım.Evet 0'ın toplamada etkisiz eleman oldugunu biliyorum:)ammavelakin kitapta aynen soyle diyor:
n=a+rand()%b;

a,kaydırma degeri(istenen aralığın baslangıc degeri) b derecelendirme faktoru(istenen aralıgın genışlıgı).
yanı;
n=5+rand()%3 desem(n=5,6,7olabilir)

n=rand()%6;
dedıgımde ise 0-5 arasında degerler uretebılecegını soylemış yanı 6 deger uretebılecek 6 orda onu simgelıyor.yanı 6 nında uretilecegini degil.

acehreli
30/05/2008, 19:14
Sifir konusunu sana birakiyorum; cunku bir sey degistirmiyor. :)

Ama haklisin, karisik soylemisim: quasimodo'nun rand() % n onerisini tekrarladigimi soylemek istedim. Sen (n-1)'e boluyorsun ama n olacak galiba. Senin de acikladigin gibi, [0,n-1] araligi icin %n demen gerekiyor. Yani soyle:

k = 0 + rand() % n;

(n-1) olmamasi gerektigini goruyor musun?

Ali

aysesule
30/05/2008, 22:48
Sifir konusunu sana birakiyorum; cunku bir sey degistirmiyor. :)

Ama haklisin, karisik soylemisim: quasimodo'nun rand() % n onerisini tekrarladigimi soylemek istedim. Sen (n-1)'e boluyorsun ama n olacak galiba. Senin de acikladigin gibi, [0,n-1] araligi icin %n demen gerekiyor. Yani soyle:

k = 0 + rand() % n;

(n-1) olmamasi gerektigini goruyor musun?

Ali


Ayyyyyyy utanarak söylüyorum ki evet görüyorum ben genişliğine farkında olmadan 0 katmadıgım için eksiltiyodum(o kdrda acıklamışım) teşekkürler.Ama aynı sorun devam edıyor yanı k=2,m=2 cıktıgında(i=1 için) örn; 3*3luk matris gosteriminde onu ekrana (1,0) yerine yazıyo.Bu sdc en son kısımdakı for'la ilgili bir yanlışlıktan olabilir diye düşünüyorum ama hata da bulamıyorum????