Yazar: Orhan Balci 06 Aralık 2009 tarihinde

Loading ...
Aşağıdakilerden hangisi 13 numaralı şekli çizer?
A) 4([i<[i]>[i]]>)
B) 4([i<[i>>i]]>>)
C) >4([i<[i]>>[i]]>>)
D) 4([i<[i]>>[i]]>>)
E) 4([i<[i]>>[i]]>)
CEVAP: 13 Numaralı şekli incelediğimizde Y biçimli bir şeklin 4 defa 4 ana yönde tekrarlandığını görmekteyiz. Öyleyse yapmamız gereken Y biçimli çizim için gerekli olan algoritmayı bulup bunu 4 defa yinelemek olacaktır. Kuzeye bakan Y biçimli yolu çizmeden önce yerimizi kaydetmeliyiz ki geri dönüp diğer yönelere de çizim yapabilelim. O zaman ifademiz [] içinde yeralacaktır. İlk yapmamız gereken kuzeye bir çizgi çizmek. İfademiz [i] şeklini aldı. Bu noktada iki farklı yöntem uygulanabilir. Önce soldaki sonra sağdaki bacak çizilebilir, veya tersi olarak önce sağdaki sonra soldaki bacak çizilebilir. Şıkları incelediğimizde tüm seçeneklerde önce sola dönüş yapıldığını görüyoruz yani önce soldaki bacağın çizilmesi isteniyor. Sol 45 derecelik bir dönüş gerekli. İfade [i<] şeklini alır. Bu noktaya sağ bacağı çizmek için geri döneceğimizden kaydediyoruz. İfade[i<[] şeklini alır. Sol bacağı çiziyoruz. İfade [i<[i] şeklini aldı. Sağ bacağı çizmek için bir önceki konumumuza gidiyoruz. İfade [i<[i]] şeklini aldı. Yönümüzü sağ bacağa çevirmek için 90 derece sağa dönmemiz gerekiyor. Çift dönüş gerekli. İfademiz [i<[i]>>] şeklini aldı. Burada yerimizi kaydetmemize gerek olmamasına rağmen tüm seçeneklerde yer kaydedilmiş. İfademiz [i<[i]>>[] şeklini aldı. Sağ bacağı çiziyoruz. [i<[i]>>[i]. Önce sağ bacağı çizmeden önceki konumumuza daha sonra da ilk konumumuza geri dönüyoruz. İfademiz [i<[i]>>[i]] oldu. Şu anda kuzeye bakan Y şeklini tamamlamış bulunuyoruz ve tosbağamızın yönü kuzeye bakıyor. Burada yine iki farklı yol izlenebilir. Saat yönünde veya saat yönünün tersinde ilerlenebilir. Saat yönünde dönmeyi tercih ediyoruz. 90 derecelik dönüş gerekli. İfademiz [i<[i]>>[i]]>> şeklini aldı. Aynı algoritmayı 4 kere uygulamak istiyoruz. İfademiz 4([i<[i]>>[i]]>>) şeklini aldı. Doğru seçenek D şıkkı. Burada tekrar dikkatinizi çekmek istiyorumaynı şekli çizecek birden fazla algoritma olabilir. Burada seçenekleri takip ederek doğru sonuca ulaşabilirsiniz.
Yazar: Orhan Balci 06 Aralık 2009 tarihinde

Loading ...
Aşağıdaki programın çalışması sonucu ekrana ne basılır?
int n=5, t, a, b, c;
main(void)
{ for (a=1; a<=n; a+=1)
for (b=1; b<=a; b+=2)
for (c=1; c<=b; c+=3) t += a+b+c;
printf("%d",t); }
A) 36
B) 54
C) 67
D) 74
E) 93
CEVAP: 42. Soruyla aynı tip soru. Takip edeceğimiz yöntem 42. soru ile aynı olacaktır. Yine döngü değişkenlerinin alabilecekleri değerleri yazarak işe başlayalım.
a : 1, 2, 3, 4, 5
b : 1, 3, 5
c : 1, 4
a = 1 iken b = 1 c = 1 olabilir
a = 2 iken b = 1 c = 1 olabilir
a = 3 iken b = 1 c = 1 olabilir
b = 3 c = 1 olabilir
a = 4 iken b = 1 c = 1 olabilir
b = 3 c = 1 olabilir
a = 5 iken b = 1 c = 1 olabilir
b = 3 c = 1 olabilir
b = 5 c = 1 olabilir
b = 5 c = 4 olabilir
Buradan t değişkeninde birikecek olan değer = [1+1+1] + [2+1+1] + [3+1+1] + [3+3+1] + [4+1+1] + [4+3+1] +[5+1+1] + [5+3+1] + [5+5+1]+ [5+5+4] = 74 Doğru seçenek D.
Yazar: Orhan Balci 03 Aralık 2009 tarihinde

Loading ...
Aşağıdaki programın çalışması sonucu ne basılır?
int n=5, t, a, b, c;
main(void)
{ for (a=1; a<=n; a+=1)
for (b=1; b<=a; b+=3)
for (c=1; c<=b; c+=2) t += a+b+c;
printf("%d",t); }
A) 36
B) 54
C) 67
D) 74
E) 93
CEVAP : İçiçe geçmiş döngü soruları çetrefilli olabilir. Genelde bu tür sorular için herkesin ayrı bir stratejisi vardır. Benim stretejim döngü değişkenlerinin alabileceği değerleri listeleyip kontrol ifadelerini doğrulamaktır. Yukarıdaki soru için sırasıyla a, b, c değişkeninin alabileceği değerleri yazalım :
a : 1, 2, 3, 4, 5
b : 1, 4
c : 1, 3
a = 1 iken b = 1 ve c = 1 olabilir.
a = 2 iken b = 1 ve c = 1 olabilir.
a = 3 iken b = 1 ve c = 1 olabilir.
a = 4 iken b = 1 ve c = 1 olabilir.
b = 4 ve c = 1 olabilir.
b = 4 ve c = 3 olabilir.
a = 5 iken b = 1 ve c = 1 olabilir.
b = 4 ve c = 1 olabilir.
b = 4 ve c = 3 olabilir.
Buradan t değişkeninde birikecek olan değer = [1+1+1] + [2+1+1] + [3+1+1] +[4+1+1] +[4+4+1] +[4+4+3] + [5+1+1]
+ [5+4+1] + [5+4+3] = 67. Doğrue seçenek C.
Yazar: Orhan Balci 02 Aralık 2009 tarihinde

Loading ...
Aşağıdaki programın derlenip çalıştırılmasında ne olur?
int i,j;
main(void)
{ for (;i<j<10; i++,j++) printf("*"); }
A)Sonsuz döngüye girip sürekli ‘*’ basar
B) 9 tane ‘*’ basar.
C) 45 tane ‘*’ basar.
D) Derleme hatası oluşacağından çalıştırılamaz
E) Çalışır ama hiç birşey basmaz.
CEVAP: Güzel bir operatör associativity sorusu. Associativity baskınlığı aynı olan operatörlerin sağdan sola mı soldan sağa mı hesaplanacağını belirtir. Burada döngü kontrol ifadesi olan
i<j<10
buna bir örnektir. < operatörünün hesaplanma yönü soldan sağadır. Yani yukarıdaki
i<j<10
ifadesinde öncelikle
i<j
hesaplanır. < operatörü mantıksal (logical) bir operatör olduğu için yanlış olduğu durumda 0 doğru olduğu durumda 1 döner. Soruda i ve j'ye değer atanmadığından dolayı ilk olarak 0 değerini alırlar. Bundan dolayı
i < j
ifadesi yanlış olur böylelikle 0 değeri döner.
i<j<10
ifadesi
0 < 10
olur ve döngüyü doğrular. i ve j değişkenleri döngünün her turunda eşit olacaklarından
i<j
ifadesi her zaman 0 döncektir. Böylelikle döngü sürekli dönecektir.
Doğru şıkkımız A.
Yazar: Orhan Balci 02 Aralık 2009 tarihinde

Loading ...
Aşağıdaki programın derlenip çalıştırılması sonucu ne basılır?
int i, a[] = {1,2,3,4,5,6,7};
void f(int i, int j)
{ int temp;
if (i==j) return;
temp = a[i];
a[i] = a[j];
a[j] = temp; }
main(void)
{ f(1,2);
f(2,6);
f(6,1);
for (i=0; i<7; i++) printf("%d ",a[i]); }
A) 1 2 7 4 5 6 3
B) 1 6 3 4 5 2 7
C) 1 2 3 4 5 6 7
D) 1 1 1 1 1 1 1
E) Derleme hatası oluşacağından, çalıştırılamaz.
CEVAP: Nispeten kolay bir soru. Öncelikle programda herhangi bir sentaktik hata yok. Tanımlanan f fonksiyonu bir değiş tokuş fonksiyonu (swap) olup parametrelerde verilen i. ve j. elemanların yerini değiştirir. Yapmamız gereken her f fonksiyonu çağrıldığında a dizisinin içeriğini yazarak takip etmek.
f(1,2) sonrası : 1 3 2 4 5 6 7
f(2,6) sonrası : 1 3 7 4 5 6 2
f(6,1) sonrası : 1 2 7 4 5 6 3
Görüldüğü gibi son durumda dizimizde sırasıyla 1 2 7 4 5 6 3 değerleri bulunur. Doğru seçenek A şıkkı.
Yazar: Orhan Balci 24 Kasım 2009 tarihinde

Loading ...
char a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
void x(char i,char j)
{ char s;
s = a[i][j];
a[i][j] = a[2-i][2-j];
a[2-i][2-j] = s; }
main(void)
{ int i,j;
for (i=0; i<4; i++) @@@@@@ ;
for (i=0; i<3; i++) for (j=0; j<3; j++) printf("%d ",a[i][j]); }
Yukarıdaki programın çalıştırılması sonucu
9 8 7 6 5 4 3 2 1
basılması için @@@@@@ ile gösterilmiş yerde ne olaması gerekir?
A) x((i+1)%3-1,(i-1)%3+1)
B) x((i-1)%3+1,(i+1)%3-1)
C) x((i+1)%3,i/3)
D) x(i/3,i%3)
E) Bu seçeneklerden başka bir ifade.
CEVAP : Programımızın verilen girdideki elemanlarının sırasını tersine çevirmesi beklenmektedir. Bunun için x(i,j) fonksiyonumuz tanımlanmıştır. x(i,j) iki boyutlu dizimizde (i,j) elemanı ile (2-i,2-j) elemanının yerlerini değiştiren bir swap fonksiyonudur. Örneğin i = 0, j = 0 için fonksiyonumu z a[0][0] ile a[2][2] elemanlarının yerlerini değiştirir. Dizimizin tersine çevrilmesi için şu yer değiştirme işlemleri yapılmalıdır :
[0][0] <--> [2][2]
[0][1] <--> [2][1]
[0][2] <--> [2][0]
[1][0] <--> [1][1]
Yani x(i,j) fonksiyonumuzun alması gereken parametreler yukarıdaki değişimlerin sol tarafındaki değerlerdir. @@@@@@ ile gösterilen yer for (i=0; i<4; i++) döngüsünün altındadır. Buradan 1. sütundaki değerleri i/3 integer bölmesi ve i%3 mod işlemi ile elde edilebileceği görülmektedir. Doğru seçeneğimiz D olacaktır.
Yazar: Orhan Balci 20 Kasım 2009 tarihinde

Loading ...
Aşağıdaki programın derlenip çalıştırılması sonucu ne basılır?
int a,b,c;
int main(void)
{ a = 9;
{ int b = 8;
c = b;
{ int c=7;
a = b;}}
printf("%d %d %d",a,b,c);}
A) 8 7 8
B) 8 0 8
C) 9 8 7
D) 7 0 8
E) Derleme hatası vereceğinden çalıştırılamaz.
CEVAP: Yine klasik sayılabilecek bir değişken kapsamı (scope) ve gölgeleme (shadowing) sorusu. C’de değişkenlerin kapsamları ve ömürleri kapsama alanı içinde bulundukları süslü parantezlerle {} belirlenir. Örneğin programın başında tanımlanan int a,b,c, değişkenleri herhangi bir parantez içinde olmadıklarından evrensel(global) değişkenlerdir ve kod içinde her yerden ulaşılabilirler. Ömürleri programın başlamasıyla başlar bitişiyle sona erer. main fonksiyonu gövdesi içinde içiçe iki kod bloğu var. Bunlardan birincisinde tanımlanan int b = 8 ifadesi global b değişkenini gölgeler. Yani bu ifadededen sonra gelen ve blok içinde kalan tüm b’ler bu tanımdaki b’ye işaret eder. yine aynı şekilde ikinci iç blokta tanımlanan int c = 7 ifadesi evrensel c değişkenini gölgeler. Bu kurallar gözönünde bulundurarak değişkenlerimize atanan değerleri iç bloktan dış bloğa doğru takip edersek kolayca çözüme ulaşırız. En iç bloktaki a = b ifadesi ile evrensel a değişkenine 8 değeri atanır. İlk bloktaki c = b ifadesi ile de aynı şekil de evrensel c değişkenine 8 değeri atanır. kod bloklarına dikkatlice bakılacak olursa evrensel b değişkenine herhangi bir değer atanmamıştır dolayısıyla varsayılan değer olarak 0 değerindedir. Doğru cevabımız B seçeneği olacaktır.