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

## [32-35] Sorular için açıklama
Önce sürekli artan bir seri onu takiben sürekli azalan başka bir serinin birleşiminden oluşan dizilere **bitonik diziler** denir. Yani, n eleman içeren A[0..n-1] dizisi, eğer öyle bir k indisi (0 < k < n-1) için \(\forall i 0 \le i < k.A[i] < A[i+1]\) ve \(\forall i k < i < n-1.A[i] > A[i+1]\) sağlanıyorsa bitonik dizidir.
Örnek bitonik ve bitonik olmayan diziler aşağıdaki tabloda verilmiştir.
<table><tr><td>dizi</td><td>bitonik?</td><td>açıklama</td></tr><tr><td>1 2 7 8 6 3 2</td><td>evet</td><td>1 2 7 8 artan bir seri, 6 3 2 azalan bir seri</td></tr><tr><td>1 2 7 8 8 3 2</td><td>evet</td><td>1 2 7 8 artan seri, 8 3 2 azalan bir seri</td></tr><tr><td>1 2 7 7 8 8 3 2</td><td>hayır</td><td>1 2 7 8 artan bir seri ancak azalan seri yok</td></tr><tr><td>1 2 7 8</td><td>hayır</td><td>1 7 7 8 sürekli artmıyor</td></tr><tr><td>6 3 2</td><td>hayır</td><td>1 2 7 8 artan seri ancak azalan seri yok</td></tr><tr><td>6 3 2 1 2 7 8</td><td>hayır</td><td>6 3 2 azalan bir seri ancak artan bir seri yok</td></tr><tr><td>2 6 3 2 1 7 8</td><td>hayır</td><td>artan ve azalan seri var ancak sıra doğru değil, önce artan olmalı çok sayıda artan ve azalan seri var</td></tr></table>

---

Bitonik olduğu bilinen 50 elemanlı bir dizi için aşağıdaki mantıksal önermelerden hangileri doğrudur?
(I) En büyük elemanı bulmak için en fazla 15 karşılaştırma yeterlidir.
(II) Dizide herhangi bir x sayısı en fazla iki kez yer alabilir.
(III) En büyük elemanı bulmak için en az 24 karşılaştırma gereklidir.

Şıklar:
A) Yalnız I | B) Yalnız II | C) I ve II | D) I, II ve III | E) II ve III

Cevap: C I ve II

Çözüm:
Önermeleri inceleyelim:
(I) En büyük elemanı üçlü arama yaparak bulabiliriz. Bu durumda elemandan 2 tanesini seçeriz. Soldaki eleman küçükse en büyük eleman onun sonunda olamaz. Sağdaki eleman küçükse en büyük eleman onun sağında olamaz. Bu şekilde her adımda eleman sayısını 2/3 e indirgeyebiliriz. (3/2)¹⁵ ≈ 437 olduğundan 15 karşılaştırma ile rahatlıkla bulunabilir. Doğru
(II) Bitonik dizi iki tane artan ve elemanları birbirinden farklı diziden oluştuğundan bir sayı en fazla 2 kez geçebilir. Doğru.
(III) 1. Seçenekteki açıklamaya göre yanlış.
Bilgisayar Olimpiyatı 2012, 1. Aşama, Soru 34

## [32-35] Sorular için açıklama
Önce sürekli artan bir seri onu takiben sürekli azalan başka bir serinin birleşiminden oluşan dizilere **bitonik diziler** denir. Yani, n eleman içeren A[0..n-1] dizisi, eğer öyle bir k indisi (0 < k < n-1) için \(\forall i 0 \le i < k.A[i] < A[i+1]\) ve \(\forall i k < i < n-1.A[i] > A[i+1]\) sağlanıyorsa bitonik dizidir.
Örnek bitonik ve bitonik olmayan diziler aşağıdaki tabloda verilmiştir.
<table><tr><td>dizi</td><td>bitonik?</td><td>açıklama</td></tr><tr><td>1 2 7 8 6 3 2</td><td>evet</td><td>1 2 7 8 artan bir seri, 6 3 2 azalan bir seri</td></tr><tr><td>1 2 7 8 8 3 2</td><td>evet</td><td>1 2 7 8 artan seri, 8 3 2 azalan bir seri</td></tr><tr><td>1 2 7 7 8 8 3 2</td><td>hayır</td><td>1 2 7 8 artan bir seri ancak azalan seri yok</td></tr><tr><td>1 2 7 8</td><td>hayır</td><td>1 7 7 8 sürekli artmıyor</td></tr><tr><td>6 3 2</td><td>hayır</td><td>1 2 7 8 artan seri ancak azalan seri yok</td></tr><tr><td>6 3 2 1 2 7 8</td><td>hayır</td><td>6 3 2 azalan bir seri ancak artan bir seri yok</td></tr><tr><td>2 6 3 2 1 7 8</td><td>hayır</td><td>artan ve azalan seri var ancak sıra doğru değil, önce artan olmalı çok sayıda artan ve azalan seri var</td></tr></table>

---

Aşağıdaki mantıksal önermelerden hangileri doğrudur?
(I) En az 5 eleman içeren tüm tamsayı dizileri, elemanlarının yerleri değiştirilerek bitonik dizi haline getirilebilir.
(II) 50 elemanlı bir dizinin bitonik olup olmadığını anlamak için en fazla 24 karşılaştırma yeterlidir.
(III) Eleman sayısı n tek sayı olan bir bitonik dizide artan ve azalan serilerin eleman sayıları aynı olamaz.

Şıklar:
A) Yalnız II | B) Yalnız III | C) I ve II | D) II ve III | E) Hiçbiri

Cevap: B Yalnız III

Çözüm:
Önermeleri inceleyelim:
(I) Elemanları aynı olan bir tamsayı dizisi bitonik hale getirilemez. Yanlış.
(II) 24 karşılaştırma da farklı elemanlar arasında yapılsa bile karşılaştırılmayan 2 tane eleman kalır ve bunlar bitonikliği bozabilir. Yanlış.
(III) Artan ve azalan dizilerin eleman sayıları eşit ve k dersek toplam eleman sayısı n=2k olacağından n tek sayı ise eleman sayıları eşit olamaz. Doğru.
Bilgisayar Olimpiyatı 2012, 1. Aşama, Soru 35

## [32-35] Sorular için açıklama
Önce sürekli artan bir seri onu takiben sürekli azalan başka bir serinin birleşiminden oluşan dizilere **bitonik diziler** denir. Yani, n eleman içeren A[0..n-1] dizisi, eğer öyle bir k indisi (0 < k < n-1) için \(\forall i 0 \le i < k.A[i] < A[i+1]\) ve \(\forall i k < i < n-1.A[i] > A[i+1]\) sağlanıyorsa bitonik dizidir.
Örnek bitonik ve bitonik olmayan diziler aşağıdaki tabloda verilmiştir.
<table><tr><td>dizi</td><td>bitonik?</td><td>açıklama</td></tr><tr><td>1 2 7 8 6 3 2</td><td>evet</td><td>1 2 7 8 artan bir seri, 6 3 2 azalan bir seri</td></tr><tr><td>1 2 7 8 8 3 2</td><td>evet</td><td>1 2 7 8 artan seri, 8 3 2 azalan bir seri</td></tr><tr><td>1 2 7 7 8 8 3 2</td><td>hayır</td><td>1 2 7 8 artan bir seri ancak azalan seri yok</td></tr><tr><td>1 2 7 8</td><td>hayır</td><td>1 7 7 8 sürekli artmıyor</td></tr><tr><td>6 3 2</td><td>hayır</td><td>1 2 7 8 artan seri ancak azalan seri yok</td></tr><tr><td>6 3 2 1 2 7 8</td><td>hayır</td><td>6 3 2 azalan bir seri ancak artan bir seri yok</td></tr><tr><td>2 6 3 2 1 7 8</td><td>hayır</td><td>artan ve azalan seri var ancak sıra doğru değil, önce artan olmalı çok sayıda artan ve azalan seri var</td></tr></table>

---

n elemanlı bir bitonik diziyi azalmayan-sırada sıralamanın zaman karmaşıklığı en az hangisidir? [Açık- lama: Zaman karmaşıklığı, problemi çözen bir algoritmanın en kötü durum için çalışma zamanının n ile ifade edilen formülünden düşük dereceli terimlerin ve tüm sabit katsayıların silinmesi ile elde edilir; örneğin 3n³ + 5n - 2 log n formülü için n³.]

Şıklar:
A) \(\log n\) | B) \(\sqrt{n}\) | C) n | D) n log n | E) \(n^2\)

Cevap: C n

Çözüm:
Soldan ve sağdan elemanları seçip küçük olanı yeni diziye atarsak O(n) de sıralayabiliriz. Her elemanın değerine en az bir kez bakmamız gerektiğinden ve yeni dizi n eleman içereceğinden daha küçük bir karmaşıklıkla bu işlem gerçekleştirilemez.
Bilgisayar Olimpiyatı 2012, 1. Aşama, Soru 36

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

---

```c
int a[9]={9, 8, 7, 6, 5, 4, 3, 2, 1}, i;
void main() {
    for (i=0; i<9; i++)
        a[i]+=a[8-i]+=i;
    printf("%d %d %d", a[8], a[7], a[6]);
}
```

Yukarıda verilen program çıktı olarak ne üretir?

Şıklar:
A) 21 23 20 | B) 19 20 21 | C) 19 21 23 | D) Çalışma zamanı hatası verir | E) Derleme zamanı hatası verir

Cevap: C 19 21 23

Çözüm:
Programda önemli değerleri için alı değişimini inceleyelim: (alı'nın yeni değerini -> ile göstereceğiz.)
- i=0 için, a[0] += a[8] += 0; (a[8]=1, a[0]=9), a[8] -> 1, a[0] -> 10
- i=1 için, a[1] += a[7] += 1; (a[7]=2, a[1]=8), a[7] -> 3, a[1] -> 11
- i=2 için, a[2] += a[6] += 2; (a[6]=3, a[2]=7), a[6] -> 5, a[2] -> 12
- i=6 için, a[6] += a[2] += 6; (a[6]=5, a[2]=12), a[2] -> 18, a[6] -> 23
- i=7 için, a[7] += a[1] += 7; (a[7]=3, a[1]=11), a[1] -> 18, a[7] -> 21
- i=8 için, a[8] += a[0] += 8; (a[8]=1, a[0]=10), a[0] -> 18, a[8] -> 19
Bilgisayar Olimpiyatı 2012, 1. Aşama, Soru 37

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

---

```c
int a[9]={9, 8, 7, 6 , 5, 4, 3, 2, 1};
int i, j;
void main() {
    for (i=0; i<9; i++)
        for (j=i; j<8; j++)
            a[i]+=a[j+1]%2;
    printf("%d %d %d", a[0], a[3], a[6]);
}
```

Yukarıda verilen program çıktı olarak ne üretir?
[GÖRSEL]

Şıklar:
A) 13 9 4 | B) 13 5 9 | C) 13 4 5 | D) Çalışma zamanı hatası verir | E) Derleme zamanı hatası verir

Cevap: A 13 9 4

Çözüm:
Programdaki döngülerde a dizisinin elemanları soldan sağa doğru değiştiğinden ve değiştirilirken sadece değişmemiş olan sağ tarafa bakıldığından her elemanın değişimi birbirinden bağımsızdır. Yani i=0, 3 ve 6 için bakmamız yeterli:
• i=0 için: a[i], j ∈ [1, 9) değerlerindeki tek sayıların sayısı kadar artırılır(8→14 tane).
• a[0] -> 9+4 = 13
• i=1 için: a[i], j ∈ [4, 9) değerlerindeki tek sayıların sayısı kadar arttırılır(5→13 tane).
• a[3] -> 6+3 = 9
• i=2 için: a[i], j ∈ [7, 9) değerlerindeki tek sayıların sayısı kadar arrtırılır(2→11 tane).
• a[6] -> 3+1 = 4
Bilgisayar Olimpiyatı 2012, 1. Aşama, Soru 38

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

---

```c
int x=3, y=2, z=1;
void main() {
x *= z-y ? y+=-z : (z+=-y-z+2);
printf("%d %d %d", x, y, z);
```

Yukarıda verilen program çıktı olarak ne üretir?

Şıklar:
A) 1 2 3 | B) 3 1 1 | C) 2 2 3 | D) Çalışma zamanı hatası verir | E) Derleme zamanı hatası verir

Cevap: B 3 1 1

Çözüm:
İfadeye bakalım:
• z-y = 2-1 = 1 olduğundan ifade x* = (y+=-z) olur.
• y, -z(-1) kadar artar y -> 1 olur ve x* = 1 ile x -> 3 olur.
• 311 çıktıya yazılır.
Bilgisayar Olimpiyatı 2012, 1. Aşama, Soru 39

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

---

```c
int r(int n) {
if (n<=2) return 5;
return 3+r(n/5)+n;
}
void main() {
printf("%d", r(2012));
}
```

Yukarıda verilen program çıktı olarak ne üretir?

Şıklar:
A) 2527 | B) 2423 | C) 2023 | D) 2533 | E) Hiçbiri

Cevap: D 2533

Çözüm:
r(2012)yi sadeleştirerek gidelim:
- r(2012)
- 3 + r(402) + 2012
- 3 + (3 + r(80) + 402) + 2012 = r(80) + 2420
- (3 + r(16) + 80) + 2420 = r(16) + 2503
- (3 + r(3) + 16) + 2503 = 2522 + r(3)
- 2522 + (3 + r(0) + 3) = 2522 + (3 + 5 + 3) = 2533
Bilgisayar Olimpiyatı 2012, 1. Aşama, Soru 40

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

---

```c
int rr(int n) {
    if (n<2) return 1-n;
    return rr(n/2)+1-(n%2);
}

void main() {
    printf("%d", rr(2012));
}
```

Yukarıda verilen program çıktı olarak ne üretir?

Şıklar:
A) 1006 | B) 0 | C) 2 | D) 2012 | E) 3

Cevap: E 3

Çözüm:
r(2012)’yi sadeleştirerek gidelim:
• r(2012)
• r(1006) + 1 – 0
• 1 + (r(503) + 1 - 0), (1006 % 2 = 0)
• 2 + (r(251) + 1 - 1), (503 % 2 = 1)
• 2 + (r(125) + 1 - 1), (251 % 2 = 1)
• 2 + (r(62) + 1 - 1), (125 % 2 = 1)
• 2 + (r(31) + 1 - 0), (62 % 2 = 0)
• 3 + r(31) = 3 + r(1) çünkü 31’i böldüğümüzde sayılar tek çıkar ve cevap değişmez.
• 3 + r(1) = 3 + (1-1) = 3
Bilgisayar Olimpiyatı 2012, 1. Aşama, Soru 41

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

---

```c
int rrr(int *d, int n) {
    int i;
    if (n<=1) return d[0];
    for (i=0; i<n-1; i+=2) {
        d[i/2]=d[i];
        if (d[i+1]<d[i])
            d[i/2]=d[i+1];
    }
    if (n%2==1) d[(n-1)/2]=d[n-1];
    return rrr(d, (n+1)/2);
}

int a[17]={1,2,3,4,5,6,7,8,0,-8,-7,-6,-5,-4,-3,-2,-1};
void main() {
    printf("%d", rrr(a, 17));
}
int a[17]={1,2,3,4,5,6,7 ,8,0,-8,-7,-6,-5,-4,-3,-2,-1}; 
void main() { 
    printf("%d", rrr(a, 17)); 
}
```

Yukarıda verilen program çıktı olarak ne üretir?

Şıklar:
A) 1 | B) 0 | C) 17 | D) -1 | E) -8

Cevap: E -8

Çözüm:
Fonksiyonun içerisindeki döngülü yapıyı incelediğimizde her k=i/2 için:
```c
d[k] = min(d[k+k], d[k+k+1]) olduğunu görürüz. Yani fonksiyon her adımda diziyi ikişerli gruplayıp her grubun küçük elemanını yeni bir diziye((n+1)/2 uzunluğunda olmalı) atıyor ve bu dizi için tekrar çözüyor. Yani elemanları büyük olanı sile sile azaltıyor. O zaman en sona kalan sayı en küçük sayı olur. O sayı da -8'dir.
Bilgisayar Olimpiyatı 2012, 1. Aşama, Soru 42

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

---

```c
float toplam=0.0;
int i=0;
void main() {
    do {
        i++;
        toplam += 2.0/(i*(i+1))+(i+2);
    } while (i<15);
    printf("%.3f", toplam);
}
```

Yukarıda verilen program çıktı olarak ne üretir?

Şıklar:
A) 151.875                                B) 150.125                                C) 151.125                                D) 152.500                                E) Hiçbiri

Cevap: A 151.875

Çözüm:
Döngüyü incelediğimizde 'in'in 1 ile 15 arasındaki(sınırlar dahil) değerleri için toplam'ın ne kadar arttığı soruluyor. Artışı ikiye ayırıp 2.O/(i*(i+1)) ile (i+2)'nin artırdığı miktarı ayrı ayrı bulalım:
- 2.O/(i*(i+1)) için toplam 2.O/(i*2) + ... + 2.O/(15*16) olur.
- 2.O/(i*(i+1)) = 2/i - 2/(i+1) olduğundan ifade 2/i - 2/2 + 2/2 - 2/3 + ... 2/15 - 2/16 = 2-2/16 = 1.875 olur. (noktalı sayı bölmesi yapılır.)
- (i+2) için toplam (1+2) + (2+2) + ... + (15+2) = 1+2+...+15 + 2*15 = 15*16/2 + 30 = 150 olur.
- 150 + 1.875 = 151.875 toplamın son değeridir.
Bilgisayar Olimpiyatı 2012, 1. Aşama, Soru 43

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

---

```c
int a[4][4]={{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 0, 1, 2}, {3, 4, 5, 6}}, 1;
void main() {
for (i=1; i<4; i++) {
*(a[i-1]+i-1) += *(a[i]+i);
printf("%d ", a[i-1][i-1]);
}
}
```

Yukarıda verilen program çıktı olarak ne üretir?

Şıklar:
A) 7 7 7 | B) 7 6 7 | C) 7 8 8 | D) 7 6 9 | E) Derleme zamanı hatası verir

Cevap: A 7 7 7

Çözüm:
*(a[i-1]+i-1) → a[i-1][i-1]. *(a[i]+i) → a[i][i] demektir. Buna göre i=1, 2 ve 3 değerleri için döngünün içerisini yapalım:
- i=1 için, a[0][0] += a[1][1], (a[1][1] = 6, a[0][0] = 1), a[0][0] -> 7 olur.
- i=2 için, a[1][1] += a[2][2], (a[1][1] = 6, a[2][2] = 1), a[1][1] -> 7 olur.
- i=3 için, a[2][2] += a[3][3], (a[2][2] = 1, a[3][3] = 6), a[2][2] -> 7 olur.
Bilgisayar Olimpiyatı 2012, 1. Aşama, Soru 44

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

---

```c
int a[4][3]={{5, 3, 7}, {6, 8, 7}, {5, 9, 3}, {7, 5, 9}};
int i, j;
void main() {
for (i=0; i<12; i++) {
}
printf("%d", a[2][0]+a[2][1]+a[2][2]);
}
```

Yukarıda verilen program çıktı olarak ne üretir?

Şıklar:
A) 2O | B) 19 | C) 18 | D) 17 | E) Çalışma zamanı hatası verir

Cevap: A 2O

Çözüm:
Kolaylık olsun diye 2 boyutlu diziyi soldan sağa tek boyutlu olarak düşünürsek [x/3][x%3] yeri tek boyutta [x] yerine eşit olur. Şimdi a'yı 12'lik tek boyutlu dizi ve ifadeleri j=alı, alj=1 şeklinde yazıp soruya tekrar bakalım:
- al2[0] -> al6, al2[1] -> al7, al2[2] -> al8 olur. Buna döngüde yapılan olay dizide geçen her elemanın içeriğini indeksine eşitlemektir. (alj=1) Yani daha önceden değiştirilmemiş bir elemanın 6, 7 veya 8 değerine sahip olması gerekir.
- i=2 için, 2 daha önce geçmemiştir ve al7=7 olur.
- i=3 için, 3 daha önce geçmiştir ve al3=3 olduğundan al6 değişmez.
- i=4 için, 4 daha önce geçmemiştir ve al8=8 olur.
- Başka 6 olmadığı için al6=5 olarak kalır.
- Toplam 5+7+8 = 20
Bilgisayar Olimpiyatı 2012, 1. Aşama, Soru 45

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

---

```c
char mart[100]="Mart", nisan[100]="Nisan", mayıs[100]="Mayıs";
void main() {
    strcat(mart+strlen(nisan)-2, strstr(mayıs, "ay")+2);
    printf("%s", mart);
}
```

Yukarıda verilen program çıktı olarak ne üretir?

Şıklar:
A) Martay | B) Martayis | C) MartNisan | D) Martis | E) Matis

Cevap: D Martis

Çözüm:
Strlen() fonksiyonu verilen karakter dizisinin uzunluğunu döndürür. Yani strlen(nisan) = 5.
Strstr() fonksiyonu verilen karakter dizisinde verilen kelimenin ilk geçtiği yerin başlangıç adresini döndürür. Geçmiyorsa boş döner(NULL). O zaman strstr(mayıs, "ay") = mayıs+1
Strcat() fonksiyonu verilen ilk adresteki kelimenin sonuna verilen ikinci adresteki kelimeyi yazar. Buna göre strcat(mart+5-2, mayıs+1+2) denirse mart kelimesinin sonuna mayıs+3 deki kelime("is") eklenir.
Bilgisayar Olimpiyatı 2012, 1. Aşama, Soru 46

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

---

```c
void main() {
    char sel='I';
    switch (sel) {
        sel='S';
        case 'Y': sel='S'; printf("Yaz");
        case 'K': sel='I'; printf("Kis"); break;
        case 'I': sel='K'; printf("Ilkbahar");
        case 'S': sel='Y'; printf("Sonbahar");
        case 32: printf("Guzel"); break;
        default: printf("HepsiGuzel");
    }
}
```

Yukarıda verilen program çıktı olarak ne üretir?

Şıklar:
A) Ilkbahar | B) IlkbaharSonbaharGuzel | C) SonbaharGuzel | D) Derleme zamanı hatası verir | E) Sonsuz döngüye girer

Cevap: B IlkbaharSonbaharGuzel

Çözüm:
Switch'e verilen değer sel='I' olduğundan case 'I' ya gider, sel='K' yapar ve bu case sonunda break olmadığından sırasıyla "Ilkbahar", "Sonbahar" ve "Guzel" yazdırıp break ifadesiyle çıkar.
Bilgisayar Olimpiyatı 2012, 1. Aşama, Soru 47

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

---

```c
int f(int k) {
    if (k == 0) return 1;
    return k-m(f(k-1));
}
int m(int n) {
    if (n == 0) return 0;
    return n-f(m(n-1));
}
void main() {
    int i;
    for (i=1; i<6; i++) {
        printf("%d ", f(i));
    }
}
```

Yukarıda verilen program çıktı olarak ne üretir?

Şıklar:
A) 1 2 2 2 3  B) 1 2 3 2 3 
C) 1 2 3 3 3  D) 1 2 2 3 3 
E) Sonsuz döngüye girer

Cevap: D 1 2 2 3 3

Çözüm:
f ve m fonksiyonlarının artan sayılara göre değerlerini bulalım:
- \(m(O) = 0\), \(f(O) = 1\).
- \(m(l) = 1 - (f(m(O)=0) = 1) = 0\), \(f(l) = 1 - (m(f(O)=1) = 0) = 1\)
- \(m(2) = 2 - (f(m(l)=0) = 1) = 1\), \(f(2) = 2 - (m(f(l)=1) = 0) = 2\)
- \(m(3) = 3 - (f(m(2)=1) = 1) = 2\), \(f(3) = 3 - (m(f(2)=2) = 1) = 2\)
- \(m(4) = 4 - (f(m(3)=2) = 2) = 2\), \(f(4) = 4 - (m(f(3)=2) = 1) = 3\)
- \(m(5) = 5 - (f(m(4)=2) = 2) = 3\), \(f(5) = 5 - (m(f(4)=3) = 2) = 3\)
\(f(x), x \in [1,6]\) için \(f(x)\) değerleri (1, 2, 2, 3, 3) cevabı verir.
Bilgisayar Olimpiyatı 2012, 1. Aşama, Soru 48

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

---

```c
void main() {
int *ip=0, i=1;
float f=3.14;
ip=(int *) &f;
*(float *)ip=10;
printf("%.2f", f+(float)i);
}
```

Yukarıda verilen program çıktı olarak ne üretir?

Şıklar:
A) 4.14 | B) 6.14 | C) 10.00 | D) 11.00 | E) 13.00

Cevap: E 13.00

Çözüm:
Kodu işletelim:
- tanımlamalar tamamlandıktan sonra ip göstericisi'nin adresini gösterir.
- 'İn'in adresini gösteren ip göstericisinin içerik değeri 3 olur. Yani i=3 olur.
- ip float cinsindeki bitleri int cinsindeki bitlermiş gibi görür ve f'yi gösterir.
- ip'nin gösterdiği yerin bitleri float tarzında 10'a eşitlenir.
- Float tarzındaki 10 ile int tarzındaki 10'un bitleri çok farklıdır. Eşitlemelerde tür göz önüne alınmalıdır. Bir float'un bitleri int tarzında 10'un bitlerine (0..01010) eşit olursa değişik bir değer gösterir. (Sayıların çoğu ve 10 için 0.0)
- 10.0 ile 3.0 toplanıp yazdırılır. 10.0 + 3.0 = 13.0
Bilgisayar Olimpiyatı 2012, 1. Aşama, Soru 49

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

---

Aşağıda üç tane program verilmiştir.
<table><tr><td>I</td><td>II</td><td>III</td></tr><tr><td>void main() {<br/>unsigned int n;<br/>for (n=1; n&gt;0; n++)<br/>printf("%d", n);<br/>}</td><td>void main() {<br/>int n=1;<br/>while (n) {<br/>printf("%d", n);<br/>n=n;<br/>}</td><td>void foo() {<br/>int n=1000;<br/>if (n!=0)<br/>foo();<br/>}</td></tr><tr><td></td><td></td><td>void main() {<br/>foo();<br/>}</td></tr></table>
Buna göre, hangi programlar sonsuza kadar çalışır?

Şıklar:
A) Yalnız I | B) Yalnız II | C) Yalnız III | D) I ve III | E) I, II ve III

Cevap: B Yalnız II

Çözüm:
Seçenekleri inceleyelim:
(I) n'den başlar. \(2^{32}-1\)'a kadar gider ve O olur. O olunca döngüden çıkar ve program biter.
(II) n'den başlar. Sırayla -1 ve 1 değerlerini alır ve hiçbir zaman O olmayacağından program sonsuza kadar çalışır.
(III) Foo() fonksiyonu özyinelemeli olarak sonsuza kadar çalışıyorken sürekli fonksiyon açar, bilgisayarın yığın kapasitesi dolunca hata verir ve program kapanır.
Bilgisayar Olimpiyatı 2012, 1. Aşama, Soru 50

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

---

```c
void main() {
    int i, j;
    for (i=0; i<29; i++) {
        if (i%2==1) {
            j=i;
            while (j>0)
                j=j-2;
        }
    }
}
```

Verilen programda j=j-2; deyimi kaç kez çalıştırılır?

Şıklar:
A) 85 | B) 90 | C) 95 | D) 100 | E) 105

Cevap: E 105

Çözüm:
j>0 şartlı döngüye her girildiğinde j
2 kez j=j-2; deyimi çalışır. Bu döngüye ise aralıktaki her tek i sayısı için girer.  
Yani j=1, 3, …, 27 için bu döngüye girer. O zaman bu deyim 1+2+…+14 = 15*14/2 = 7*15 = 105 kez çalıştırılır.
Bilgisayar Olimpiyatı 2013, 1. Aşama, Soru 1

\((x + y + 2z)^{10}\) ifadesinin açılımında \(x^5y^2z^2\) teriminin katsayısı kaçtır?

Şıklar:
A) 10080 | B) 5040 | C) 2520 | D) 1440 | E) 1260

Cevap: A 10080

Çözüm:
Sorunun çözümünde binom açılımı kullanılırsa cevap \(1^5 \times C(10,5) \times 1^3 \times C(5,3) \times 2^2 \times C(2,2) = 10080\) olarak elde edilir.
Bilgisayar Olimpiyatı 2013, 1. Aşama, Soru 2

Hileli olmayan bir zar 3 defa ardarda atılmaktadır. Gelen sayıların toplamının en az 15 olma ihtimali kaçtır?

Şıklar:
A) 2/27 | B) 5/54 | C) 1/6 | D) 1/3 | E) 5/6

Cevap: B 5/54

Çözüm:
Eğer her toplam için bu toplamı kaç farklı şekilde elde edebileceğimizi yazarsak
- 3 toplamı için 1 durum
- 4 toplamı için 3 durum
- 5 toplamı için 6 durum
- 6 toplamı için 10 durum
.....
.....
.....
- 15 toplamı için 10 durum
- 16 toplamı için 6 durum
- 17 toplamı için 3 durum
- 18 toplamı için 1 durum
elde edilir. Dolayısıyla istenen şartı 20 durum sağlar. Toplam durum sayısı ise \(6 \times 6 \times 6\) dan 216'dır. Sonuç olarak cevaba \(\frac{20}{216} \cdot \frac{5}{54}\) olarak ulaşılır.
Bilgisayar Olimpiyatı 2013, 1. Aşama, Soru 3

\(X = \{2, 3, 5, 8, 13\}\), \(Y = \{2, 3, 5, 7, 11\}\) ve \(Z = \{1, 4, 9, 16, 25\}\) olmak üzere bu kümelerden birer eleman \(x \in X, y \in Y, z \in Z\) rasgele seçiliyor. \(x \prec y \prec z\) olması ihtimali kaçtır?

Şıklar:
A) 0.167 | B) 0.208 | C) 0.216 | D) 0.232 | E) 0.333

Cevap: C 0.216

Çözüm:
Y'nin her elemanı için Z kümesinde istenen şartı sağlayan kaç eleman olduğunu bulalım. Sırasıyla her eleman için bu sayılar [4,4,3,3,2] dizisi olarak bulunur. Şimdi ise X kümesinden seçtiğimiz her eleman için şartı sağlayan Y kümesi elemanlarını bulup her bir eleman için oluşturduğumuz dizide denk gelen sayıyı istenen durum sayısına ekleyelim. X'ten sayı değeri 2 olan elemanı seçersek Y'de ilk eleman dışında her elemanı seçebiliriz bu da istenen durum sayısına 4 + 3 + 3 + 2 = 12 ekler. X'ten 3 ü seçersek istenen durum sayısına 3 + 3 + 2 = 8 eklenir. Kalan elemanlar için ise sırasıyla 3 + 2 = 5, 2 ve O eklenir. Toplam istenen durum sayısına ise 12 + 8 + 5 + 2'den 27 olarak ulaşılır. Toplam durum sayısı ise 5 x 5 x 5 = 125 tir. Dolayısıyla cevap \(\frac{27}{125} = 0.216\) olur.