C Öğrenirken Anlamadığım Basit Şey (Yardım)
-
İşlerimden ve okuduğum bölümden ( sevmiyorum) vakit buldukça C öğrenmeye çabalıyorum kendi imkanlarımca. Soru soracağım kodlar ve output aşağıda.
// Program to generate a table of prime numbers
#include <stdio.h>
int main (void)
{
int p, d;
_Bool isPrime;
for ( p = 2; p <= 50; ++p ) {
isPrime = 1;
for ( d = 2; d < p; ++d )
if ( p % d == 0 )
isPrime = 0;
if ( isPrime != 0 )
printf ("%i ", p);
}
printf ("\n");
return 0;
Output ise bu şekildedir. Göreceğiniz üzere asal sayıları yazdırmış 50'ye kadar olan : 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47
Benim ise 2 adet anlamadığım yer var . Birincisi asal sayıları yazdırma mantığını anlamadım.
Benim anladığım şöyle olması gerekiyor: iç for döngüsündeki "d" değişkeni "p-1" şeklinde ilerlediğinden dolayı:
p=3 , d= 2, p%d = 1
p=4, d= 3, p%d =1
p=5, d=4, p%d = 1
.
.p= 50, d = 49, p%d = 1
şeklinde gitmesi gerekiyor. Ancak bu durumda kalan sayı sürekli 1 olacağından p=2 den 50 ye kadar bütün geçtiği sayıları asal diye yazdırması gerekiyor(Yani hatalı şekilde). Bu benim anladığımdı. Ancak program gayet
doğru şekilde asal sayıları yazdırıyor. Ben bir yeri yanlış anlıyorum veya da bir şeyi kaçırıyorum lütfen biri açıklayabilir mi? ( Bilale anlatır gibi )ikinci soruma gelirsek:
Şunu farkettimki içteki for döngüsüne küme parantezi yani { } koyduğumuzda output garip bir şekil alıyor(aşağıda verdiğim). Bunun sebebini de aynı şekilde Bilale anlatır gibi anlatabilir misiniz?
3 5 5 5 7 7 7 7 7 9 11 11 11 11 11 11 11 11 11 13 13 13 13 13 13 13 13 13 13 13 15 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 21 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 25 25 25 27 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 29 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 31 33 35 35 35 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 37 39 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 43 45 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 47 49 49 49 49 49
balbazar tarafından 16/Ara/16 03:12 tarihinde düzenlenmiştir -
for dongusunun govdesi kod bloguna alinmadigi icin, kendisinden sonraki ilk ifadenin govdesinde oldugunu varsayacak; yani icteki for icerisindeki ilk if ifadesi icteki for dongusune ait, digeri ise distaki for dongusune ait.
yani kod aslinda boyle:
for ( p = 2; p <= 50; ++p ) {
isPrime = 1;
for ( d = 2; d < p; ++d ){
if ( p % d == 0 ) isPrime = 0;
}
if ( isPrime != 0 ) printf ("%i ", p);
}yanlis yeri kod blogu icerisine aliyorsun.
program 2 den baslayarak 50 sayisina kadar olan sayilarin, 2 den baslayarak kendisine kadar olan sayilar arasinda TAM boleni olup olmadigina bakiyor. bunu yaparken de ikinci for dongusune girmeden once her sayinin asal oldugunu varsayarak basliyor. eger TAM boleni varsa asal olma durumu ortadan kaldiriliyor.
yani;
p=2 iken, d=2 den 2ye, kosulu karsilamadigi icin for dongusu calismiyor, ikinci if ifadesi sayiyi yazdiriyor
p=3 oluyor, d=2 den 3e kadar donmek uzere ayarlaniyor, 3 sayisi 2 ye tam bolunuyor mu bakiyor, bolunmedigi icin geciyor, d=3 oluyor dongu bitiyor
bu sekilde devam ediyor...
herlocksholmes tarafından 16/Ara/16 03:23 tarihinde düzenlenmiştir -
-
cevap yukarda verilmiş. benim sana tavsiyem eğer kodu derlemek için visual studio yada eclipse kullanıyorsan adım adım debug seçeneğini kullanman. böylelikle değişkenlerin nasıl değiştiğini, döngünün nasıl çalıştığını daha iyi gözlemleyebilirsin.
-
@herlockholmes hocam elinize sağlık ve @alli hocam çok sağolun anladım sonunda.. Argo tabirle " çaktım mevzuyu". "introduction to computer science" diye bir ders alıyorum netten. Derleyici olarak cs50'yi verdiler.
çalışmalarınızı cloud storing yapmak için işe yarar. İsteyen olursa:
cs50.io burada kendisi. Ama girebilmek için bir şekilde Harvard cs50 öğrencisi olmanız veya da Edx'ten kayıt yaptırmanız gerekiyor.
balbazar tarafından 16/Ara/16 03:49 tarihinde düzenlenmiştir
