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

Metinde verilen çizgedeki k değeri en büyük k -çekirdek'de hangi düğümler bulunmaktadır?

Şıklar:
A) {p3, p5, p6, p7} | B) {p3, p4, p5, p6} | C) {p3, p4, p5, p6, p7} | D) {p5, p6, p7} | E) {p4, p5, p6, p7}

Cevap: C {p3, p4, p5, p6, p7}

Çözüm:
En büyük k değeri 3'tür. Çizgede, 3 çekirdekli {p3, p4, p5, p6, P7} altçizgesi bulunmaktadır.
Bilgisayar Olimpiyatı 2015, 1. Aşama, Soru 32

Metinde verilen çizgedeki k değeri en büyük k çekirdek'in k değerini bir arttırmak için, yani bu altçizge-
nin k+1-çekirdek olması için çizgeye en az kaç tane yeni kenar eklenmelidir?

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

Cevap: A 2

Çözüm:
3 çekirdekli (p3, p4, p5, p6, p7) altçizgesi, p3-p5 ve p4-p7 kenarlarının eklenmesiyle 4 çekirdekli yapılabilir. Daha iyi bir seçenek bulunmamaktadır.
Bilgisayar Olimpiyatı 2015, 1. Aşama, Soru 33

## [33 – 35] Sorular için Açıklama
Farklı büyüklüklerde satranç tahtası benzeri oyun tahtaları düşünelim. Bu tahtalar 8 * 8 boyundaki standart bir satranç tahtasından farklı olarak, örneğin 3 x 4, 2 x 2 ya da 5 x 2 gibi, farklı boylarda olabilirler. Bize verilen bir m x n boyundaki (m satır ve n sütundan oluşan) tahtanın sol üst köşesinden sağ alt köşesine sadece bir sağa ve bir aşağıya hamlelerle kareden kareye atlayarak gitmek istiyoruz. Aşağıdaki sorularda amacımız sol üst köşeden sağ alt köşeye kaç farklı yol olduğunu bulmaktır. Örnek olarak 1 x 1 ve 1 x 2'lik tahtalarda sol üst köşeden sağ alt köşeye 1 farklı yol varken 2 x 2'lik bir tahtada 2 farklı yol vardır.
## AÇIKLAMA
m x n boyutundaki bir satranç tahtasının sol üst köşesinden sağ alt köşesine gitmek için m-1 kere aşağıya, n-1 kere sağa gidilmelidir. Aşağı ve sağ hamlelerinin farklı sıralanmalarıyla farklı yollar oluşur. Aşağı ve sağ hamleleri C(n+m-2, m-1) farklı şekilde sıralanabilir.

---

3 x 2'lik bir tahtada sol üst köşeden sağ alt köşeye kaç farklı yol vardır?

Şıklar:
A) 2 | B) 3 | C) 4 | D) 4 | E) Hiçbiri

Cevap: B 3

Çözüm:
m-1=2, n-1=1 olduğundan C(2+1,1)=3 farklı yol vardır.
Bilgisayar Olimpiyatı 2015, 1. Aşama, Soru 34

## [33 – 35] Sorular için Açıklama
Farklı büyüklüklerde satranç tahtası benzeri oyun tahtaları düşünelim. Bu tahtalar 8 * 8 boyundaki standart bir satranç tahtasından farklı olarak, örneğin 3 x 4, 2 x 2 ya da 5 x 2 gibi, farklı boylarda olabilirler. Bize verilen bir m x n boyundaki (m satır ve n sütundan oluşan) tahtanın sol üst köşesinden sağ alt köşesine sadece bir sağa ve bir aşağıya hamlelerle kareden kareye atlayarak gitmek istiyoruz. Aşağıdaki sorularda amacımız sol üst köşeden sağ alt köşeye kaç farklı yol olduğunu bulmaktır. Örnek olarak 1 x 1 ve 1 x 2'lik tahtalarda sol üst köşeden sağ alt köşeye 1 farklı yol varken 2 x 2'lik bir tahtada 2 farklı yol vardır.
## AÇIKLAMA
m x n boyutundaki bir satranç tahtasının sol üst köşesinden sağ alt köşesine gitmek için m-1 kere aşağıya, n-1 kere sağa gidilmelidir. Aşağı ve sağ hamlelerinin farklı sıralanmalarıyla farklı yollar oluşur. Aşağı ve sağ hamleleri C(n+m-2, m-1) farklı şekilde sıralanabilir.

---

7 x 4'lük bir tahta için sol üst köşeden sağ alt köşeye 84, 6 x 5'lük bir tahta için ise 126 farklı yol vardır. 7 x 5 lik tahta için sol üst köşeden sağ alt köşeye kaç farklı yol vardi?

Şıklar:
A) 210 | B) 212 | C) 208 | D) 10584 | E) Hiçbiri

Cevap: A 210

Çözüm:
m-1=6, n-1=4 olduğundan C(6+4, 4)=10*3*7=210 farklı yol vardır.
Bilgisayar Olimpiyatı 2015, 1. Aşama, Soru 35

## [33 – 35] Sorular için Açıklama
Farklı büyüklüklerde satranç tahtası benzeri oyun tahtaları düşünelim. Bu tahtalar 8 * 8 boyundaki standart bir satranç tahtasından farklı olarak, örneğin 3 x 4, 2 x 2 ya da 5 x 2 gibi, farklı boylarda olabilirler. Bize verilen bir m x n boyundaki (m satır ve n sütundan oluşan) tahtanın sol üst köşesinden sağ alt köşesine sadece bir sağa ve bir aşağıya hamlelerle kareden kareye atlayarak gitmek istiyoruz. Aşağıdaki sorularda amacımız sol üst köşeden sağ alt köşeye kaç farklı yol olduğunu bulmaktır. Örnek olarak 1 x 1 ve 1 x 2'lik tahtalarda sol üst köşeden sağ alt köşeye 1 farklı yol varken 2 x 2'lik bir tahtada 2 farklı yol vardır.
## AÇIKLAMA
m x n boyutundaki bir satranç tahtasının sol üst köşesinden sağ alt köşesine gitmek için m-1 kere aşağıya, n-1 kere sağa gidilmelidir. Aşağı ve sağ hamlelerinin farklı sıralanmalarıyla farklı yollar oluşur. Aşağı ve sağ hamleleri C(n+m-2, m-1) farklı şekilde sıralanabilir.

---

Aşağıdaki ifadelerden hangileri doğrudur?
I) En üst satırdaki herhangi bir kareye sol üst köşeden sadece bir yol vardır.
II) En sol sütundaki herhangi bir kareye sol üst köşeden sadece bir yol varıdır.
III) İlk sütunda olmayan bir p karesinin üzerinde başka bir r karesi varsa p'ye giden farklı yol sayısı r'ye giden farklı yol sayısından mutlaka fazladır.

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

Cevap: E I, II ve III

Çözüm:
İfadeleri inceleyelim:
- En üst satırdan ayrılmayacağımız için sadece sağ hamlelerinden oluşan bir yol vardır. Doğru.
- Aynı şekilde sadece aşağı hamlelerinden oluşan bir yol vardır. Doğru.
- p'nin hemen üzerindeki r karesine 1 hamle daha az oynayarak ulaşılabilir. Yani p'ye giden farklı yol sayısı C(n, r) ise r'ye giden farklı yol sayısı C(n-1, r) olur ki bu değer her zaman C(n, r) değerinden küçüktür.(n ≥ r ve n ≥ 1). Doğru.
Bilgisayar Olimpiyatı 2015, 1. Aşama, Soru 36

## [36 – 50] Sorular İç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.

---

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

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

Şıklar:
A) 63 | B) 64 | C) 65 | D) 66 | E) Hiçbiri

Cevap: E Hiçbiri

Çözüm:
Programı işletelim:
- Israsıyla 0, 1, 2, 4 değerlerini alır. Yani a[9] = 9(0), a[8] = 80, a[7] = 7(2) ve a[5] = 5(4) olur.
- Bütün değerlerin toplamı a[0]'a atılır ve yazdırılır. Bütün değerlerin toplamı normalde 9*10/2 = 45 iken ilk döngüde sırasıyla 9, 7, 5 ve 1 olmak üzere toplamda 22 artırılıp 67 olmuştur.
Bilgisayar Olimpiyatı 2015, 1. Aşama, Soru 37

## [36 – 50] Sorular İç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.

---

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

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

Şıklar:
A) 99    B) 100    C) 109    D) 110    E) 119

Cevap: C 109

Çözüm:
Programı inceleyelim:
• İlk döngüde [0,9) aralığındaki her j değeri en son i=9 için işleme alınıp 9 tek sayı olduğundan a[9]+1 = 10'a eşitlenir.
• a[0]: a[9] = 9'un ve 10'a eşit 9 tane sayının toplamı olan 99 kadar artırılır ve yazdırılır. Yani son değeri 10+99 = 109 olur.
Bilgisayar Olimpiyatı 2015, 1. Aşama, Soru 38

## [36 – 50] Sorular İç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.

---

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

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

Şıklar:
A) 29 | B) 40 | C) 50 | D) 55 | E) Hiçbiri

Cevap: B 40

Çözüm:
Programı inceleyelim:
• her adımda 3*1 % 3 = O ile (i+i) % 3 ilk indeksleri yer değiştirir.
• i = 1 için O ile 2 yer değiştirir. Yani b[i][1] = 4 olarak sabit kalırken b[O][1] = 6 (b[2][1]'nin eski değeri) olur.
• i = 2 için O ile 1 yer değiştirir. Yani b[i][2] = 3 (b[O][2]'nin eski değeri) olur.
• i = 3 için yer değiştirme olmaz. Yani b[2][3] = 12 olarak sabit kalır.
• i = 4 için O ile 2 yer değiştirir. Yani b[O][4] = 15 (b[2][4]'ün eski değeri) olur.
O zaman çıktı 6+3+12+15+4=40 olur.
Bilgisayar Olimpiyatı 2015, 1. Aşama, Soru 39

## [36 – 50] Sorular İç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.

---

```c
int dd(int d) {
    if (!d) return d;
    return d+dd(d-(d&-d));
}
void main() {
    printf("%d", dd(0xd0));
}
```

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

Şıklar:
A) 60 | B) 122 | C) 256 | D) 512 | E) 528

Cevap: E 528

Çözüm:
Programı inceleyelim:
• dd fonsiyonu sayının sonundan x tane bit çıkarılarak elde edilebilecek sayıların toplamını verir.
• İlk olarak sayının O tane bit çıkarılmış halini(kendisini) toplama ekler.
• Sonrasında kendisinin son bitini veren d&-d ifadesiyle 1 bitini çıkarıp aynı işlemi tekrarlatır.
• Bu fonksiyona OxdO ile gösterilen 16'lık tabanda dO sayısı gönderilir. Bu sayı 10'luk tabanda 16*14, 2'lık tabanda 1101 OOOO sayısına denk gelir.
• Yani fonksiyon 1101 0000, 1100 0000, 1000 0000 sayılarının toplamını döner.
Bu toplam ise  \( (13+12+8)*16=(32+1)*16=512+16=528 \)  dir. (bir bilgisayarcı 2'nin katlarını adı gibi bilmelidir.)
Bilgisayar Olimpiyatı 2015, 1. Aşama, Soru 40

## [36 – 50] Sorular İç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.

---

```c
int ddd(int *a, int *b) {
    if (a>=b) return 0;
    while (a<b && *a<*b) a++;
    if (a<b) return b-a + ddd(a, b-1);
    return 0;
}
void main() {
    int a[] = {1, 5, 3, 8, 7, 6, 3, 2, 9, 8, 1, 3};
    printf("%d", ddd(a, a+11));
}
```

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

Şıklar:
A) 25 | B) 26 | C) 27 | D) 28 | E) Hiçbiri

Cevap: A 25

Çözüm:
Programı inceleyelim:
• Bir dizinin ilk ve son elemanı gösteren iki gösterici ddd fonksiyonuna veriliyor.
• Soldaki a, sağdaki b'nin solunda kaldığı sürece şu işlemler yapılıyor:
• A'nın gösterdiği değer b'nin gösterdiği değerden büyük eşit olana kadar a'yı ilerlet.
• Aradaki uzaklığı toplama ekleyip b'yi 1 sola kaydır.
• İşlemleri yapacak olursak:
• a ve b nin konumlarını (a, b) şeklinde gösterelim. (başlangıçta (O, 11))
• *b = 3 olduğundan a. 3'den büyük eşit ilk değer olan 5'i gösterir. a=1 olur. Toplama 11-1 = 10 eklenir.
• *b = 1 olur ve a yerinde kalır. Toplama 10-1 = 9 eklenir.
• *b = 8 olur ve a=3, *a=8 olur. Toplama 9-3 = 6 eklenir.
• *b = 9 olur ve a b'nin gösterdiği yere kadar gelir. Fonksiyon toplamı döner.
• Bu işlemleri yaptığımızda elde edilen 10+9+6 = 25 toplamı çıktıya yazdırılır.
Bilgisayar Olimpiyatı 2015, 1. Aşama, Soru 41

## [36 – 50] Sorular İç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.

---

```c
int gc(char *p1, char *p2) {
    while (p1<p2) {
        if (*p1<*p2) return -1;
        else if (*p1>*p2) return 1;
        p1++; p2--;
    }
    return 0;
}
void main() {
    char dna[] = "gcccattttgcta";
    printf("%d %d ", gc(dna, dna+5), gc(dna+2, dna+8));
    printf("%d %d ", gc(dna+5, dna+8), gc(dna+9, dna+12));
}
```

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

Şıklar:
A) 1O - 1O | B) 1 - 1O | C) -1 - 1 - 1 | D) -1 - 1O 1 | E) -1O 1

Cevap: B 1 - 1O

Çözüm:
Programı inceleyelim:
- Bize, parametre olarak bir kelimenin başlangıç ve bitiş indeksinaları ve bu kelimenin tersten ve düzden okunuşlarını karşılaştıran gc fonksiyonu veriliyor.
- a < c < g < t
- alfabetik olarak önce gelen kelimenin normal haliye -1 döner.
- alfabetik olarak önce gelen kelimenin tersten okunmuş haliye de 1 döner.
- kelime tersten ve düzden aynıysa O döner.
- Sırasıyla 4 kelime gc fonksiyonuna gönderilir ve gelen sonuç yazdırılır.
- İlk kelime "gcccat" için, g < t olduğundan -1 döner.
- 2. kelime "ccatttt" için, c < t olduğundan -1 döner.
- 3. kelime "tttt" için O döner.
- 4. kelime "gtca" için, g > a olduğundan 1 döner.
Yani çıktı -1 -1 O 1 olur.
Bu programda yığıt yapısı kodlanmıştır. pu fonksiyonu yığıt'a eleman eklerken po fonksiyonu elemanı alır ve değerini döner. Yığıt yapısı ilk giren son çıkar mantığıyla çalışır. O zaman bu program:
- Yığıta 2, O, 1 ve 5'i ekler.
- Yığıtın son elemanı olan 5'i çıkarır ve ekrana bastırır.
- Yığıtın son elemanı olan 1'i çıkarır ve ekrana bastırır.
- Yığıttan 1 eleman çıkarıp geri ekler. Sonra Yığıtın son elemanı olan O'i çıkarır
- Yığıtın son elemanı olan 2'yi çıkarır ve ekrana bastırır.
Ekranda 5 1 2 yazar.
Bilgisayar Olimpiyatı 2015, 1. Aşama, Soru 43

## [36 – 50] Sorular İç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.

---

```c
#define LIMIT 30
void main() {
    int *p;
    int i, j, n;
    p = malloc(sizeof(int) * LIMIT);
    memset(p, -1, sizeof(int) * LIMIT);
    for (i=2; i<LIMIT; i++) {
        if (p[i]) {
            for (j=i; i*j<LIMIT; j++) {
                p[i*j]=0;
            }
        }
    }
    free(p);
}
```

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

Şıklar:
A) 1 3 | B) 1 4 | C) 1 5 | D) 1 6 | E) Hiçbiri

Cevap: E Hiçbiri

Çözüm:
Programı inceleyelim:
- Tamamı -1 olan p dizisi veriliyor.
- Döngü küçükten büyüğe gezerken daha önceden O yapılmamış değeri seçiyor ve bu değere bölünebilen bütün değerleri O yapıyor.
- O zaman seçilen değerlerden hiçbiri kendisinden küçük ve 1'den büyük herhangi bir sayıya tam bölünmüyor demektir. Yani seçilen değerler asal sayılardır ve bu değerler döngünün sonunda -1 olarak kalır.
- Bir döngüde i asal olduğu sürece n artırılıyor ve n = 7 olunca çıktıya yazdırılıyor.
- Yani 7.asal sayıyı çıktıya yazdırıyor. Asal sayılar: 2 3 5 7 11 13 17 olduğundan çıktıya 17 bastırılır.
Bilgisayar Olimpiyatı 2015, 1. Aşama, Soru 44

## [36 – 50] Sorular İç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.

---

```c
void gg(int n)
{
int i;
while (n%2 == 0)
printf("%d ", 2), n = n/2;
for (i = 3; i <= n; i = i+2)
while (n%i == 0)
printf("%d ", i), n = n/i;
void main() {
```

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

Şıklar:
A) 2 2 2 1 1 3 2 | B) 2 5 1 1 3 4 | C) 5 2 2 1 1 3 | D) 2 5 1 1 2 2 3 | E) Hiçbiri

Cevap: D 2 5 1 1 2 2 3

Çözüm:
Programı inceleyelim:
- Verilen bir n değerinin asal çarpanlarını içerisinde geçme sayısına göre küçükten büyüğe yazdıran g fonksiyonu veriliyor.
- 24 = 2³.3 olduğundan g fonksiyonu 24 için 2 2 2 3 çıktıya basar.
- G fonksiyonu: 10 için 2 5¹. 11 için 11¹, 12 için 2 2 3 ü çıktıya basar.
Bilgisayar Olimpiyatı 2015, 1. Aşama, Soru 45

## [36 – 50] Sorular İç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.

---

```c
void main() {
    int a=1;
    switch (a+1) {
        default: printf("%d", a-a); break;
        case a: printf("%d", a); break;
        case a+a: printf("%d", a+a);
        case a+a+a: a;
    }
}
```

Yukarıda verilen program için hangisi doğrudur?

Şıklar:
A) Derleme zamanı hatası verir | B) Çalışma zamanı hatası verir | C) Çıktı olarak 2 üretir | D) Çıktı olarak 1 üretir | E) Çıktı olarak 0 üretir

Cevap: A Derleme zamanı hatası verir

Çözüm:
Switch case yapısında case den sonra gelen sayı sabit(const) olmalıdır. 'a' sabit sayı(const int) olmadığından derleme hatası verir. Default ve case'i birlikte kullanmanın bir sakıncası yoktur.
Bilgisayar Olimpiyatı 2015, 1. Aşama, Soru 46

## [36 – 50] Sorular İç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.

---

```c
void main() {
    int i=2015;
    for (printf("*"); i%=i/=10; i--; printf("*"));
    if (i%2==1) printf("*");
}
```

Yukarıda verilen program çıktıya kaç tane * sembolü yazar?

Şıklar:
A) Derleme zamanı hatası vereceğinden 0 | B) 1 | C) 5 | D) 9 | E) 11

Cevap: B 1

Çözüm:
Programı inceleyelim:
- 1 tane * sembolü yazar.
- i/=10 ifadesiyle i'yi 10'a böler. İ'nin yeni değeri 201 olur. İ%=(i/=10) ifadesiyle 201 mod 201 işleminin sonucunu i'ye eşitler. i=0 olur ve for döngüsünden çıkar.
Toplamda 1 tane * sembolü yazar.
Bilgisayar Olimpiyatı 2015, 1. Aşama, Soru 47

## [36 – 50] Sorular İç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.

---

```c
void yy(int n) {
    printf("*");
    if (n<=1) return;
    yy(n-1);
    yy(n-2);
    printf("*");
}
void main() {
    yy(5);
}
```

Yukarıda verilen program çıktıya kaç tane * sembolü yazar?

Şıklar:
A) 8 | B) 14 | C) 22 | D) 28 | E) Hiçbiri

Cevap: C 22

Çözüm:
yy fonksiyonunun kaç tane * sembolü yazdırdığını inceleyelim:
- yy(O) = yy(1) = 1 çünkü O ve 1 için 1 tane * yazdırıp çıkar.
- Sonraki her x için, yy(x) = yy(x-2) + yy(x-1) + 2 diyebiliriz.
- yy(2) = yy(O) + yy(1) + 2 = 1 + 1 + 2 = 4
- yy(3) = yy(1) + yy(2) + 2 = 1 + 4 + 2 = 7
- yy(4) = yy(2) + yy(3) + 2 = 4 + 7 + 2 = 13
- yy(5) = yy(3) + yy(4) + 2 = 7 + 13 + 2 = 22
yy(5) fonksiyonu 22 tane * bastırır.
Bilgisayar Olimpiyatı 2015, 1. Aşama, Soru 48

## [36 – 50] Sorular İç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.

---

```c
void main() {
int i;
typedef struct tagXYZ {
int x; long int y; long long int z;
} XYZ;
printf("%d", (sz(a)+sz(*b)+sz(c)+sz(*d)+sz(**d))/i);
```

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

Şıklar:
A) 5 | B) 12 | C) 13 | D) 14 | E) 15

Cevap: C 13

Çözüm:
Programi inceleyelim:
• İçerisinde 1 int, 1 long int ve 1 long long int bulunan tagXYZ yapısı ve XYZ değişkeni tanımlanıyor.
- Typedef özelliği ile tagXYZ'yi belirten XYZ ifadesiyle 1O'luk bir dizi, 1 gösterici, 1 değişken ve 1O'luk bir gösterici dizisi alınıyor.
• tagXYZ tanımlanırken 1'den fazla değişken tanımlanmış olsaydı, değişkenlerin hepsi tagXYZ veriyapısını temsil ederdi.
• İ,1 tagXYZ türünden değişken olan XYZ'nin hafızada kapladığı alana eşitlenir.
- XYZ değişkeni 4 byte olan 1 int, 4 byte olan 1 long int ve 8 byte olan bir long long int değişkenine sahip olduğundan hafızada 16 byte yer kaplar.
- Günümüzde çoğu derleyicide 1 int ve 1 long int aynısınırlara ve aynı boyuta sahiptir. 16-bit bilgisayar sistemlerinde 1 int, 2 byte yer kapladığından 4 byte yer kaplayan özel long int yapısı vardır. 32-bit ve 64-bit sistemlerde yse 1 int ve 1 long int, 4 byte yer kaplar.
• 1XYZ değişkeni 16 byte olduğundan 1O tanesini barındıran 'a' 16O byte yer kaplar.
• 1 değişkeni temsil eden *b, c ve **d ifadeleri toplam 3*16; bir gösterici olan *d ifadesi 4 byte yer kaplar.
• d bir gösterici dizisidir. *d ifadesi bu dizinin ilk elemanını ifade eder. d[O] ile aynı işlevi görür.
Yani çıktıya (16O+3*16+4)/16 = 13 verilir.
Bilgisayar Olimpiyatı 2015, 1. Aşama, Soru 49

## [36 – 50] Sorular İç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.

---

```c
int hh(int x, int y) {
    if (x<y) return -1;
    else if (y==0) return x;
    else
        return hh(y, x % y);
}
```

Yukarıda verilen hh fonksiyonu için aşağıdakilerden hangisi yanlıştır?

Şıklar:
A) x=25O y=1OO argümanları ile çağrıldığında 5O döndürür | B) x=9 y=8 argümanları ile çağıldığında 1 döndürür | C) x ve y pozitif iken hiç bir zaman sıfır döndürmez | D) x ve y pozitif tek sayı iken çift sayı döndürebilir | E) x ve y pozitif iken -1 hariç negatif bir sayı asla döndürmez

Cevap: A x=25O y=1OO argümanları ile çağrıldığında 5O döndürür

Çözüm:
hh fonksiyonu öklit en büyük ortak böleni bulma algoritmasıdır. x, y'den küçük değilse x ve y'nin en büyük ortak bölenini döner. O zaman:
• 25O ve 1OO'ün en büyük ortak böleni 5O'dir. Doğru.
• 9 ve 8'ün en büyük ortak böleni l'dir. Doğru.
• Herhangi iki pozitif sayının en büyük ortak böleni O'dan büyüktür. Doğru.
• İki pozitif tek sayının çift böleni olamaz. Yanlış.
• Herhangi iki pozitif sayının en büyük ortok böleni O'dan büyüktür. Doğru.
```c
void main() {
int a[] = {1, 4, 2, 7, 3, 5, 6, 9, 2, 1, 9, 4, 3, 8, 9, 1, 5, 0};
int mi, ma, i;
ma = mi = a[0];
for (i = 1; i < sizeof(a) / sizeof(a[0]); i++) {
if (a[i] > ma)
ma = a[i];
else if (a[i] < mi)
mi = a[i];
}
printf("%d %d", mi, ma);
}
```
**50. Yukarıda verilen programda ma=a[i]; deyimi kaç kez çalıştırılır?**
A) 3
B) 4
C) 5
D) 6
E) 7
Programı inceleyelim:
- Ma ve mi'nin ilk değeri a[0] = 1 olur.
- 1'den başlayan ve a dizisindeki eleman sayısına giden bir döngü başlar.
- sizeof(a) a dizisindeki her elemanın, sizeof(a[0]) ise a[0] değişkeninin hafızada kapladığı alanı döner. o zaman sizeof(a)/ sizeof(a[0]) a dizisinin eleman sayısını döner.
- a[i]'nin ma'dan büyük her değeri için ma=a[i] deyimi çalışır.
- i=1 için; a[i] = 4, ma = 1 olur. ma = a[i] = 4 deyimi çalışır.
- i=3 için; a[i] = 7, ma = 4 olur. ma = a[i] = 7 deyimi çalışır.
- i=7 için; a[i] = 9, ma = 7 olur. ma = a[i] = 9 deyimi çalışır.
- Başka bir yerde ma'nın değeri artmaz.
Toplamda 3 kere ma=a[i] deyimi çalışır.