alpsahin/tubitak-olimpiyat-dataset-v2 huggingface dataset:
Bilgisayar Olimpiyatı 2022, 1. Aşama, Soru 25

[24-26 soruları için ek açıklama]
Verilen dil formülü için çok büyük formüllerde zorluk yaşayan ekip görselleştirme kullanmaya karar verir. İşlerini kolaylaştırmak için durum makinesi tasarlamaya karar verirler. Bu makine durumlar ve durumlar arasındaki geçişlerden oluşmaktadır. Yeni gelen her bir harf bir durumdan başka bir duruma geçişi sağlayacaktır. Tabi ki başlangıç ve bitiş durumlarımız olmalıdır. Her bir durumu bir yuvarlak ile ifade eden ekip, bitiş durumlarını iki yuvarlak ile göstermeye karar verirler. Örneğin A+(TC)* dili için aşağıdaki durum makinesi oluşmalıdır:
[GÖRSEL]
Dil formülümüzde (TC) ifadesi * ile verildiğinden 1 ve 3 numaraları durumlarımız bitiş durumlarıdır. Makine başlangıç durumu kalın ok ile gösterilmektedir, yukarıda verilen örnekte boşluktan 0 durumuna giden ok olarak verilmiştir. Başlangıçta hiç harf yokken, A gelince 1 numaralı duruma geçiş yaparız. A'dan birçok defa gelebileceği için 1 durumundayken A geldiğinde tekrar aynı duruma geçiş yapmalıyız. (TC) gelmezse 1 numaralı durum bitiş durumumuz olabilir, ancak T harfi gelirse 2 numaralı duruma geçiş yapıp mutlaka C gelmesini beklemeliyiz. T'yi takip eden C harfi geldiğinde 3 numaralı duruma geçiş yapabiliriz. 3 numaralı durum da bitiş durumumuz olacaktır ve (TC) ifadesinin birden çok gelmesine müsaade etmektedir.

---

[GÖRSEL]
Yukarıda verilen durum makinesinin dil formülü aşağıdakilerden hangisidir?

Şıklar:
A) (G*T*)CA | B) (T*G)*CA | C) (GT)*C+A | D) (G*T)*CA | E) (GT)+CA

Cevap: D (G*T)*CA

Çözüm:
Durum makinesine göre G ile başlandıysa, birçok G gelebilir fakat takip eden harf T olmak zorundadır. 1 ve 0 durumları arasındaki geçiş bu şekilde ifade edilmiştir. G* ibaresi olduğu için T tek başına da gelebilir, bu nedenle 1. durumdayken G olmaksızın T gelirse tekrar 1. duruma dönüş yapılmalıdır. Dizinin tamamlanması için CA gelmesi mecburidir. Bu nedenle
Bilgisayar Olimpiyatı 2022, 1. Aşama, Soru 26

[24-26 soruları için ek açıklama]
Verilen dil formülü için çok büyük formüllerde zorluk yaşayan ekip görselleştirme kullanmaya karar verir. İşlerini kolaylaştırmak için durum makinesi tasarlamaya karar verirler. Bu makine durumlar ve durumlar arasındaki geçişlerden oluşmaktadır. Yeni gelen her bir harf bir durumdan başka bir duruma geçişi sağlayacaktır. Tabi ki başlangıç ve bitiş durumlarımız olmalıdır. Her bir durumu bir yuvarlak ile ifade eden ekip, bitiş durumlarını iki yuvarlak ile göstermeye karar verirler. Örneğin A+(TC)* dili için aşağıdaki durum makinesi oluşmalıdır:
[GÖRSEL]
Dil formülümüzde (TC) ifadesi * ile verildiğinden 1 ve 3 numaraları durumlarımız bitiş durumlarıdır. Makine başlangıç durumu kalın ok ile gösterilmektedir, yukarıda verilen örnekte boşluktan 0 durumuna giden ok olarak verilmiştir. Başlangıçta hiç harf yokken, A gelince 1 numaralı duruma geçiş yaparız. A'dan birçok defa gelebileceği için 1 durumundayken A geldiğinde tekrar aynı duruma geçiş yapmalıyız. (TC) gelmezse 1 numaralı durum bitiş durumumuz olabilir, ancak T harfi gelirse 2 numaralı duruma geçiş yapıp mutlaka C gelmesini beklemeliyiz. T'yi takip eden C harfi geldiğinde 3 numaralı duruma geçiş yapabiliriz. 3 numaralı durum da bitiş durumumuz olacaktır ve (TC) ifadesinin birden çok gelmesine müsaade etmektedir.

---

Bu durum makinelerini çıkartmak için ekip içerisinde ciddi çalışmalar yürütülmüş ve 5 farklı algoritma geliştirilmiştir. Bu algoritmaların karmaşıklıkları farklıdır. Aşağıda her bir algoritmanın karmaşıklık değerleri big-O gösterimine göre verilmiştir. N bize girdi büyüklüğümüzü vermektedir. En hızlı olanını seçmek istiyorsak hangi algoritmanın seçilmesi gerekmektedir?

Şıklar:
A) \( O(5*N^{2}) \) | B) \( O(3*N^{3}) \) | C) \( O(1*N^{2}\log_{2}N) \) | D) \( O(2*N\log_{2}N) \) | E) \( O(1*2^{N}) \)

Cevap: D \( O(2*N\log_{2}N) \)

Çözüm:
Verilen ifadeler içerisinde en düşük değere sahip olan N lgN değeri olduğu için doğru cevap D 
seçeneğidir.
Bilgisayar Olimpiyatı 2022, 1. Aşama, Soru 27

[27-30 soruları için açıklama]
Yuvarlak bir masa etrafında 1 ve n arasındaki tamsayılarla sıralı bir şekilde numaralandırılmış n kişi oturmaktadır ve yemek beklemektedir. Bu masaya hizmet eden garson n defa mutfağa gidip gelecek ve her geldiğinde bir kişiye yemek servisi yapacaktır. Garson ilk gelişinde 3 numaralı kişiye, sonraki her gelişinde ise en son servis yaptığı kişiden başlayarak henüz yemek almamış üçüncü kişiye yemek servisi yapacaktır.
Örnek: n = 8 olduğu durumda yemek servisi şu sırayla yapılır: 3, 6, 1, 5, 2, 8, 4, 7.

---

n = 16 olduğu durumda yemek servisi en son kaç numaralı kişiye yapılmıştır?

Şıklar:
A) 14 | B) 11 | C) 1 | D) 4 | E) 8

Cevap: E 8

Çözüm:
Bu soru verilen algoritma elle gerçeklenerek çözülebilir. n = 16 olduğu durumda yemek servisi şu sırayla yaplır: 3, 6, 9, 12, 15, 2, 7, 11, 16, 5, 13, 4, 14, 10, 1, 8. Bu yüzden doğru cevap 8'dir.
Bilgisayar Olimpiyatı 2022, 1. Aşama, Soru 28

[27-30 soruları için açıklama]
Yuvarlak bir masa etrafında 1 ve n arasındaki tamsayılarla sıralı bir şekilde numaralandırılmış n kişi oturmaktadır ve yemek beklemektedir. Bu masaya hizmet eden garson n defa mutfağa gidip gelecek ve her geldiğinde bir kişiye yemek servisi yapacaktır. Garson ilk gelişinde 3 numaralı kişiye, sonraki her gelişinde ise en son servis yaptığı kişiden başlayarak henüz yemek almamış üçüncü kişiye yemek servisi yapacaktır.
Örnek: n = 8 olduğu durumda yemek servisi şu sırayla yapılır: 3, 6, 1, 5, 2, 8, 4, 7.

---

n = 81 olduğu durumda yemek servisi en son kaç numaralısı kişiye yapılmıştır?

Şıklar:
A) 16 | B) 23 | C) 32 | D) 34 | E) 37

Cevap: D 34

Çözüm:
Masada n kişi varken en son yemek servisi yapılan kişinin numarasını \(f(n)\) ile gösterelim. n'in 3'ün tam katı olduğu durumlarda aşağıdaki özyinelemeli denklem sonuca ulaşmakta kullanılabilir.
\[
f(3k) = f(2k) + \left\lceil \frac{f(2k)}{2} \right\rceil - 1
\]
Bir önceki sorunun çözümünden \(f(16) = 8\) olduğu bilinmektedir.
Yukarıdaki denklem kullanılarak \(f(24) = 8 + 4 - 1 = 11\) sonucu elde edilir. Bu sonuç yukarıdaki denklem ile beraber kullanıldığında \(f(36) = 11 + 6 - 1 = 16\) sonucu elde edilir. Bu sonuç yukarıdaki dönklem ile beraber kullanıldığında \(f(54) = 16 + 8 - 1 = 23\) sonucu elde edilir. Bu sonuç yukarıdaki değer kullanıldığında ise \(f(81) = 23 + 12 - 1 = 34\) sonucu elde edilir.
Bilgisayar Olimpiyatı 2022, 1. Aşama, Soru 29

[27-30 soruları için açıklama]
Yuvarlak bir masa etrafında 1 ve n arasındaki tamsayılarla sıralı bir şekilde numaralandırılmış n kişi oturmaktadır ve yemek beklemektedir. Bu masaya hizmet eden garson n defa mutfağa gidip gelecek ve her geldiğinde bir kişiye yemek servisi yapacaktır. Garson ilk gelişinde 3 numaralı kişiye, sonraki her gelişinde ise en son servis yaptığı kişiden başlayarak henüz yemek almamış üçüncü kişiye yemek servisi yapacaktır.
Örnek: n = 8 olduğu durumda yemek servisi şu sırayla yapılır: 3, 6, 1, 5, 2, 8, 4, 7.

---

\(n = 82\) olduğu durumda yemek servisi en son kaç numaralı kişiye yapılmıştır?

Şıklar:
A) 16 | B) 23 | C) 32 | D) 34 | E) 37

Cevap: E 37

Çözüm:
Masada \(n\) kişi varken en son yemek servisi yapılan kişinin numarasını \(f(n)\) ile gösterelim. Bir \(k\) tamsayısı için \(f(2k) + \left\lceil \frac{f(2k)}{2} \right\rceil + 2\) ifadesinin değeri \(3k + 1\)'den büyük değilse \(f(3k + 1)\)'in değeri bu ifadenin değerine eşittir. Aksi taktirde \(f(3k + 1) = 1\)'dir. Bir önceki sorunun çözümünden \(f(54) = 23\) olduğu bilinmektedir. Öyleyse, \(f(82) = 23 + 12 + 2 = 37\)'dir.
Bilgisayar Olimpiyatı 2022, 1. Aşama, Soru 30

[27-30 soruları için açıklama]
Yuvarlak bir masa etrafında 1 ve n arasındaki tamsayılarla sıralı bir şekilde numaralandırılmış n kişi oturmaktadır ve yemek beklemektedir. Bu masaya hizmet eden garson n defa mutfağa gidip gelecek ve her geldiğinde bir kişiye yemek servisi yapacaktır. Garson ilk gelişinde 3 numaralı kişiye, sonraki her gelişinde ise en son servis yaptığı kişiden başlayarak henüz yemek almamış üçüncü kişiye yemek servisi yapacaktır.
Örnek: n = 8 olduğu durumda yemek servisi şu sırayla yapılır: 3, 6, 1, 5, 2, 8, 4, 7.

---

\(n = 123\) olduğu durumda yemek servisi en son kaç numaraları kişiye yapılmıştır?

Şıklar:
A) 55 | B) 62 | C) 82 | D) 95 | E) 116

Cevap: D 95

Çözüm:
Masada \(n\) kişi varken en son yemek serisi yapılan kişinin numarasını \(f(n)\) ile gösterelim.
İki önceki sorunun çözümünden \(f(123) = f(82) + \left\lceil \frac{f(82)}{2} \right\rceil - 1\) olduğunu biliyoruz. Bir önceki sorunun çözümünden ise \(f(82) = 37\) olduğunu biliyoruz. Öyleyse, \(f(123) = 37 + 19 - 1 = 55\)'tir.
Bilgisayar Olimpiyatı 2022, 1. Aşama, Soru 31

[GÖRSEL]

Yukarıda verilen çizgenin kaç tane güçlü bağlı bileşeni (Strongly Connected Component) 
vardır?

Şıklar:
A) 2 
B) 3 
C) 4 
D) 5 
E) 6

Cevap: D 6

Çözüm:
Bir çizgenin güçlü bağlı bileşenlerinin bulunması için derinlik öncelikli aramanın çalıştırılması gerekmektedir.  Bu çizgenin güçlü bağlı bileşenleri şu şekildedir: {E}, {A}, {B}, {H,G,I}, ve {C,D,J,F}. Buna göre çizgede toplam 5 tane güçlü bağlı bileşen vardır.
Bilgisayar Olimpiyatı 2022, 1. Aşama, Soru 32

I. Bir düğümün gelen derecesi 0 ise, bu düğüm topolojik olarak sıralanmış düğüm listesinde herhangi bir yerde bulunabilir.
II. Topolojik sıralama algoritmasının kullanılabilmesi için girdi çizgesinin çevrimi (cycle) olamaz.
III. Topolojik sıralama O(V+E)'de yapılabilir
IV. Bir çizge topolojik sıralanabilirse ve bu çizgede v düğümünden u düğümüne bir yol varsa, o zaman u düğümü, topolojik olarak sıralanmış düğümlerde v‘den önce görünmelidir.
Yukarıdaki ifadelerin kaç tanesi doğrudur?

Şıklar:
A) 0 | B) 1 | C) 2 | D) 3 | E) 4

Cevap: C 2

Çözüm:
Verilen ifadeleri teker teker inceleyelim.
I. Bu ifade yanlıştır çünkü bir düğümün giden derecesi sıfırdan büyükse o düğüm kendisine komşu olan düğümlerden önce gelmek zorundadır.
II. Doğru. Çevrim olursa çizgeye topolojik sıralama yapılamaz.
III. Doğru. Topolojik sıralama derinlik öncelikli arama algoritmasının çalıştırılması gerekmektedir. Bu da O(V+E)'de yapılır.
IV. Yanlış. İfadenin tersi doğrudur. Yani, eğer v'den u'ya yol varsa o zaman v'nin u'dan önce topolojik sıralamada görünmesi gerekir.
Buna göre toplam 2 ifade doğrudur.
Bilgisayar Olimpiyatı 2022, 1. Aşama, Soru 33

I. Genişlik Öncelikli Aramanın asimptotik zaman karmaşıklığı, Derinlik Öncelikli Aramanın asimptotik zaman karmaşıklığını eşittir
II. Genişlik Öncelikli Arama, FIFO (ilk gelen ilk çıkar) kuyruğunu kullanır
III. Derinlik Öncelikli Arama, her düğüm ile başlangıç düğüm arasındaki kenar sayısı açısından en kısa yolu bulur.
IV. Çizgelerin komşuluk listesi ile gösterimi metodu depolama için  \( \Theta(V) \)  yer alır.
Yukarıdaki ifadelerin kaç tanesi doğrudur?

Şıklar:
A) 0 | B) 1 | C) 2 | D) 3 | E) 4

Cevap: C 2

Çözüm:
Verilen ifadeleri teker teker inceleyelim.
I. Doğru. Bu iki algoritma eşit zaman karmaşıklığına sahiptir.
II. Doğru. Genişlik Öncelikli Arama, FIFO'yu kullanarak hangi düğümün hangi sıraya göre ziyaret edileceğine karar verir.
III. Yanlış. Bu, Genişlik Öncelikli Arama ile elde edilir. Derinlik Öncelikli Arama bu şekilde en kısa yol bulamaz.
IV. Yanlış. Bu yöntemde kenar sayısı da kullanılır. Bu nedenle depolama için  \( \Theta(V+E) \) 'lik yer gerekmektedir.
Buna göre toplam 2 ifade doğrudur.
Bilgisayar Olimpiyatı 2022, 1. Aşama, Soru 34

[GÖRSEL]
Yukarıdaki çizgede B düğümünden başlamak üzere Genişlik Öncelikli Arama yaptığımızı 
varsayalım. Buna göre aşağıdaki ifadelerin hangisi her zaman doğrudur?

Şıklar:
A) F, A'dan önce ziyaret edilir 
B) E, C'den önce ziyaret edilir 
C) H, D'den önce ziyaret edildi 
D) G, C'den önce ziyaret edilir 
E) E, H'den önce ziyaret edilir

Cevap: E E, H'den önce ziyaret edilir

Çözüm:
Genişlik Öncelikli Arama düğümleri seviye seviye gezmektedir. Aynı seviyedeki düğümler 
farklı sırada ziyeret edilebilir. Örnek olarak, birinci seviyede olan F ve A düğümleri, önce F sonra 
A ya da önce A  sonra F şeklinde ziyaret edilebilir. Ancak, eğer bir düğüm diğerinden başlangıç 
düğümü olan B’ye kenar sayısı açısından daha yakınsa o düğümün mutlaka önce ziyaret edilmesi 
gerekmektedir. Buna göre, E düğümünün mutlaka D’den ve H’den önce ziyaret edileceğini 
söyleyebiliriz.
Bilgisayar Olimpiyatı 2022, 1. Aşama, Soru 35

[GÖRSEL]
Yukarıdaki çizgede G düğümünden başlamak üzere Derinlik Öncelikli Arama yaptığımızı 
varsayalım. Buna göre aşağıdaki ifadelerin hangisi her zaman doğrudur?

Şıklar:
A) H, B'den önce ziyaret edilir. 
B) E, C'den önce ziyaret edilir. 
C) F, E'den önce ziyaret edilir. 
D) D, H'den önce ziyaret edilir. 
E) C, D'den önce ziyaret edilir.

Cevap: C F, E'den önce ziyaret edilir.

Çözüm:
Derinlik Öncelikli Aramada G’den başlamak üzere E’ye gelmek için şu düğümler mutlaka 
ziyaret edilmelidir: F,B ve A. Not: G’den E’ye gelirken diğer düğümler yani C,D ve H de 
daha önce ziyaret edilebilir ancak bunlar kesin olarak edilmelidir diyemeyiz. Buna göre C 
şıkkında verilen ifade her zaman doğrudur.
Bilgisayar Olimpiyatı 2022, 1. Aşama, Soru 36

[36-50 soruları için açıklama]
- Soruları C programlama dili çerçevesinde cevaplayınız.
- Derleyici olarak gcc kullanıldığını varsayınız.
- Gerekli tüm başlık (header) dosyalarının verilen programa dahil edildiğini varsayınız.

---

Aşağıdaki programın çıktısı şıklardan hangisinde doğru olarak verilmiştir?
main()
{
int a = 0;
for (int b = 55; b > 0; a++, b = b - a);
printf("%d", a);
}

Şıklar:
A) 5 | B) 7 | C) 8 | D) 10 | E) Program derleme hatası verir.

Cevap: D 10

Çözüm:
Döngünün yapısı incelendiğinde, b değişkeninden 1'den başlamak üzere giderek artan tamsayıların çıkarıldığı görülmektedir. Çıkarılan sayıların toplamı 55'e (veya üstüne) ulaştığında döngü sonlanacaktır. 1'den 10'a kadar sayıların toplamı 55'i bulduğu için en son a = 10 değeri b'den çıkarıldığında döngü sonlanır ve bu değer basılır.
Bilgisayar Olimpiyatı 2022, 1. Aşama, Soru 37

[36-50 soruları için açıklama]
- Soruları C programlama dili çerçevesinde cevaplayınız.
- Derleyici olarak gcc kullanıldığını varsayınız.
- Gerekli tüm başlık (header) dosyalarının verilen programa dahil edildiğini varsayınız.

---

Aşağıdaki programın çıktısı şıklardan hangisinde doğru olarak verilmiştir?
main()
{
unsigned char c = 17;
c = c + (c << 1);
c = c + (c << 2);
c = c - (c << 3);
printf("%d", (int)c);
}

Şıklar:
A) 7 
B) 17 
C) 51 
D) 247 
E) 255

Cevap: A 7

Çözüm:
c değişkeni ikilik tabanda sırasıyla 00010001, 00110011, 11111111, 00000111 değerlerini almaktadır. Son değerin 11111111 - 11111000 farkı şeklinde alındığına dikkat ediniz. Son değerin onluk tabandaki karşılığı 7'dir.
Bilgisayar Olimpiyatı 2022, 1. Aşama, Soru 38

[36-50 soruları için açıklama]
- Soruları C programlama dili çerçevesinde cevaplayınız.
- Derleyici olarak gcc kullanıldığını varsayınız.
- Gerekli tüm başlık (header) dosyalarının verilen programa dahil edildiğini varsayınız.

---

Aşağıdaki program ekrana kaç adet “.” karakteri yazar? 
int kare(x) 
{  
printf("."); 
return x * x; 
} 
main() 
{ 
if (kare(1) > 1 || kare(2) > 2 || kare(3) > 3) 
printf("."); 
}

Şıklar:
A) 0 
B) 1  
C) 2 
D) 3 
E) 4

Cevap: D 3

Çözüm:
kare() fonksiyonu, verilen tamsayının karesini hesaplayan, fakat bunu yaparken ekrana bir adet “.” 
yazan bir fonksiyondur. Koşuldaki mantıksal “veya” (||) ifadesinin birinci kısmı yanlış, ikinci ve 
üçüncü kısımları doğrudur. C dilinde “veya” ifadelerinde tembel değerlendirme uygulandığından, 
“veya” ifadesinin birinci ve ikinci kısımlarındaki kare() fonksiyonu çalışacak fakat üçüncü kısmındaki 
çalışmayacaktır. Bu sebeple, koşulun altında yazılan “.” ile birlikte, toplam üç “.” ekrana 
yazılacaktır.
Bilgisayar Olimpiyatı 2022, 1. Aşama, Soru 39

[36-50 soruları için açıklama]
- Soruları C programlama dili çerçevesinde cevaplayınız.
- Derleyici olarak gcc kullanıldığını varsayınız.
- Gerekli tüm başlık (header) dosyalarının verilen programa dahil edildiğini varsayınız.

---

Aşağıdaki h fonksiyonuna yapılan bir h(x,y) çağrısı tam olarak hangi (yeterli ve gerekli) 
durumda düzgün biçimde sonlanır?  
void h(short int x, short int y) 
{  
if (x == y) 
return; 
else if (x > y) 
return h(y, x); 
else 
return h(x + 1, y - 1); 
}

Şıklar:
A) x ile y eşit ise. 
B) x y’den küçük ise. 
C) x ve y’nin farkı çift sayı ise. 
D) y x’in tam katı ise. 
E) Hiçbiri.

Cevap: C x ve y’nin farkı çift sayı ise.

Çözüm:
h fonksiyonunun özyinelemesine dikkat edildiğinde, parametreleri eşitlenene birbirine yaklaştırdığı 
görülmektedir. Bu yaklaştırmayı küçük parametreye 1 ekleyerek, büyük parametreden ise 1 
çıkararak yapmaktadır. (Özyinelemenin genelinde küçük parametrenin ilk parametre olduğuna 
dikkat ediniz. Eğer verilen parametreler bu kuralı bozuyorsa, fonksiyondaki ikinci koşul bu durumu 
düzeltmektedir.) Her yaklaştırmada parametrelerin arasındaki fark 2 azalmaktadır. Eğer 
parametrelerin arasındaki fark çift sayı ise, nihai olarak parametreler eşitlenecek ve özyineleme 
sonlanacaktır. Aksi takdirde, özyinelemenin sonlanmasını sağlayacak herhangi bir mekanizma 
bulunmamaktadır.
Bilgisayar Olimpiyatı 2022, 1. Aşama, Soru 40

[36-50 soruları için açıklama]
- Soruları C programlama dili çerçevesinde cevaplayınız.
- Derleyici olarak gcc kullanıldığını varsayınız.
- Gerekli tüm başlık (header) dosyalarının verilen programa dahil edildiğini varsayınız.

---

Aşağıdaki karar() fonksiyonunda yorumlarla etiketlenmiş satırlardan hangisi çıkarılır ise 
fonksiyonun davranışında değişme olmaz? 
int karar(int a, int b) 
{  
/* 1 */ if (a > 100) return 1; 
/* 2 */ if (b < 100) return 2; 
/* 3 */ if (a > b) return 3; 
/* 4 */ if (b > a) return 4; 
return 0; 
}

Şıklar:
A) 1 
B) 2 
C) 3 
D) 4 
E) Herhangi bir satırı çıkarmak davranışı bozmaktadır.

Cevap: C 3

Çözüm:
3 nolu satıra gelinebilmesi için a ≤ 100 ve b ≥ 100 olmalıdır. Bu koşullar altında a > b olması 
mümkün değildir. Dolayısıyla 3 nolu satırdaki koşul her zaman yanlıştır ve bu satırdaki dönüş ifadesi 
hiçbir zaman çalışamaz. Söz konusu satırı kaldırmak fonksiyonun davranışını değiştirmemektedir.
Bilgisayar Olimpiyatı 2022, 1. Aşama, Soru 41

[36-50 soruları için açıklama]
- Soruları C programlama dili çerçevesinde cevaplayınız.
- Derleyici olarak gcc kullanıldığını varsayınız.
- Gerekli tüm başlık (header) dosyalarının verilen programa dahil edildiğini varsayınız.

---

Aşağıdaki programın çıktısı nedir?  
main() 
{ 
int i = 0, j = 0, c = 0; 
do 
{ 
i = i + 11; 
j = j + 1; 
c++; 
} 
while(i % 1024 != j % 1024); 
printf("%d", c); 
}

Şıklar:
A) 94 
B) 128 
C) 188 
D) 376 
E) 512

Cevap: E 512

Çözüm:
Söz konusu program i ve j değişkenlerini 0’dan başlatıp, 1024 modundaki değerleri tekrar denk 
olana kadar artırmaktadır. Her dönüşte i ile j arasındaki farkın 10 arttığına dikkat ediniz. Artış 
miktarı 1024’ün katı olduğu zaman, i ve j 1024 modunda tekrar denk olacak ve döngü 
sonlanacaktır. 10 ile 1024’ün tek ortak çarpanı 2 olduğu için, artış miktarının 1024’ün katı olması 
için 1024 / 2 = 512 dönüş gerekmektedir. c değişkeni dönüş sayısını tuttuğu için, programın çıktısı 
512 olacaktır.
Bilgisayar Olimpiyatı 2022, 1. Aşama, Soru 42

Aşağıdaki fonksiyonun amacı ne olabilir? 
int f(char *a, char *b) 
{  
for (; a[0] != '\0' && b[0] != '\0'; a++, b++); 
return a[0] == '\0' && b[0] == '\0'; 
} 
Not: Kelime katarının İngilizcesi string’dir.

Şıklar:
A) Verilen kelime katarlarının sonlanıp sonlanmadığını kontrol etmek. 
B) Verilen kelime katarlarının boylarının eşitliğini kontrol etmek. 
C) Verilen kelime katarlarının ilk karakterlerini karşılaştırmak. 
D) Verilen kelime katarlarında '\0' karakterinin geçip geçmediğini kontrol etmek. 
E) Hiçbiri.

Cevap: B Verilen kelime katarlarının boylarının eşitliğini kontrol etmek.

Çözüm:
C dilinde '\0' karakteri “boş karakter” olarak bilinir ve kelime katarlarını sonlandırmak için 
kullanılır. Fonksiyondaki döngüde, katar göstergeleri boş karaktere varana kadar birlikte 
ilerletilmektedir. Döngü sonlandığında, eğer iki gösterge birden boş karaktere işaret ediyorsa, iki 
katarın boyu aynıdır. Sondaki dönüş ifadesi da bu koşulu kullanmaktadır. Dolayısıyla bu fonksiyon 
verilen kelime katarlarının boylarının eşitliğini kontrol etmektedir.
Bilgisayar Olimpiyatı 2022, 1. Aşama, Soru 43

[36-50 soruları için açıklama]
- Soruları C programlama dili çerçevesinde cevaplayınız.
- Derleyici olarak gcc kullanıldığını varsayınız.
- Gerekli tüm başlık (header) dosyalarının verilen programa dahil edildiğini varsayınız.

---


Aşağıdaki fonksiyonun amacı ne olabilir? 
int g(int a[], int n) 
{  
int t = 0; 
for (int i = 0; i < n; i++) 
{ 
int j; 
for (j = i + 1; j < n; j++) 
if (a[j] == a[i]) 
break; 
if (j == n) 
t++; 
} 
return t; 
}

Şıklar:
A) Verilen dizide kaç değişik değerin olduğunu bulmak. 
B) Verilen dizide beliren değerlerin toplamda kaç kez tekrar edildiğini bulmak. 
C) Verilen dizideki herhangi bir değerin en çok kaç kez tekrar edildiğini bulmak.  
D) Verilen diziyi sıralamak. 
E) Hiçbiri.

Cevap: A Verilen dizide kaç değişik değerin olduğunu bulmak.

Çözüm:
Fonksiyonun döndüğü t değişkeni birer birer artırılan bir değişkendir. t en üstteki döngünün her 
bir dönüşü için en fazla bir kez artabilir. Bu artmanın olması için, içteki döngünün kırılmadan 
tamamlanması gerekmektedir. Bu olay a[i] değerinin, a[] dizisinin kendisinden sonra kalan 
kısmında tekrar edilmemesi durumunda gerçekleşmektedir. Diğer bir deyişle, dizideki her değerin 
en son görünüşü için t değişkeni artırılmaktadır. Dolayısıyla bu fonksiyon dizide kaç değişik değer 
olduğunu bulmaktadır.
Bilgisayar Olimpiyatı 2022, 1. Aşama, Soru 44

[36-50 soruları için açıklama]
- Soruları C programlama dili çerçevesinde cevaplayınız.
- Derleyici olarak gcc kullanıldığını varsayınız.
- Gerekli tüm başlık (header) dosyalarının verilen programa dahil edildiğini varsayınız.

---

Aşağıdaki programın çıktısı nedir? “==” işleminin önceliğinin mantıksal işlemlerinkinden 
(“||” ve “&&”) daha fazla olduğuna dikkat ediniz. 
main() 
{  
int a = 1; 
int b = a == 1; 
int c = a || b == 0; 
int d = a && c == 1; 
int e = d == 1 || 0; 
printf("%d", a + b + c + d + e); 
}

Şıklar:
A) 1 
B) 2 
C) 3 
D) 4 
E) 5

Cevap: E 5

Çözüm:
C dilinde mantıksal ifadeler (||, &&, == gibi) doğruluk değerini ifade etmek üzere 0 (yanlış) veya 1 
(doğru) dönerler. Bu sorudaki değişkenler, tanımlandıkları satırdaki mantıksal ifadenin değerine 
eşitlenmektedirler. Programdaki eşitlemeler sırasıyla uygulandığında, bütün değişkenlerin 1 değerini aldığı görülmektedir.
Bilgisayar Olimpiyatı 2022, 1. Aşama, Soru 45

[36-50 soruları için açıklama]
- Soruları C programlama dili çerçevesinde cevaplayınız.
- Derleyici olarak gcc kullanıldığını varsayınız.
- Gerekli tüm başlık (header) dosyalarının verilen programa dahil edildiğini varsayınız.

---

Aşağıdaki programın çıktısı nedir? 
int f(int x) 
{  
    if (x <= 0) 
        return 0; 
    else 
        return 1 + f(g(x)); 
} 
int g(int x) 
{ 
    if (x == 1) 
        return 0; 
    else 
        return 1 + g(x/2); 
} 
main() 
{ 
    printf("%d", f(1024)); 
}

Şıklar:
A) 0 
B) 4 
C) 11 
D) 22 
E) 55

Cevap: B 4

Çözüm:
g() fonksiyonu özyinelemeli olarak 1’e ulaşana kadar parametresini 2’ye bölmekte (tamsayı 
bölmesiyle) ve her bölüş için dönüş değerine 1 eklemektedir. Dolayısıyla, g() fonksiyonu pozitif 
tamsayılar için ⌊𝑙𝑜𝑔2𝑥⌋ fonksiyonunu temsil etmektedir. Bu mantıkla f(1024) çağrıldığında, 
sırasıyla f(10), f(3), f(1) ve f(0) çağrılmaktadır. Her alt çağrım dönüş değerine 1 eklediği 
için f(1024) çağrısı 4 dönmektedir.
Bilgisayar Olimpiyatı 2022, 1. Aşama, Soru 46

[36-50 soruları için açıklama]
- Soruları C programlama dili çerçevesinde cevaplayınız.
- Derleyici olarak gcc kullanıldığını varsayınız.
- Gerekli tüm başlık (header) dosyalarının verilen programa dahil edildiğini varsayınız.

---

Aşağıdaki h(x) fonksiyonu hangi x parametresi için 1 döner? 
int h(int x) 
{  

for (int i = 2; i < x; i++) 
{  
int j; 
for (j = i; j < x; j = j + i); 
if (j == x) 
return 0; 
}
return 1;
}

Şıklar:
A) 512 
B) 545 
C) 651 
D) 723 
E) Hiçbiri

Cevap: E Hiçbiri

Çözüm:
Fonksiyonun iç döngüsü artan şekilde i’nin katlarını üretmekte ve bu katları j değişkeni ile temsil 
etmektedir. j değişkeni değer olarak x’e eşitlendiğinde veya x’i geçtiğinde döngü sonlanmaktadır. 
Eğer sonlanma döngü sonrası koşulda olduğu gibi eşitlenme durumu ile olursa, bu x’in i’nin tam 
katı olduğu anlamına gelir. Diğer bir deyişle, i x’in böleni ise program erken sonlanarak 0 
dönmektedir. Programın erken sonlanmayarak 1 dönmesi için x’in 2 ile (x-1) arasında hiç bir 
böleni olmamalı, yani x asal sayı olmalıdır. Bu koşulu sağlayan bir şık bulunmamaktadır.