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

[32 – 35] Sorular için Açıklama
X, Y ve Z aşağıda verildiği gibi tanımlanmış karşılıklı özyineli nesnelerdir. Tanımlarda toplam dört farklı (atomik) sembol (a, b, c ve ●) vardır. X, Y ya da Z ile tanımlanamayan tüm nesneler geçersizdir.
\[
X = \begin{bmatrix} a & ya da; \\ b \cdot X' \cdot a & ya da; \\ b \cdot Y' \cdot b & ya da; \\ b \cdot Z' \cdot c & ya da; \end{bmatrix} \quad Y = \begin{bmatrix} \cdot \cdot \cdot X' \cdot a & ya da; \\ \cdot \cdot \cdot Y' \cdot b & ya da; \\ \cdot \cdot \cdot Z' \cdot a & ya da; \end{bmatrix} \quad Z = \begin{bmatrix} a \cdot b & ya da; \\ c \cdot X' \cdot X'' & ya da; \\ b \cdot Y' \cdot Y'' & ya da; \\ a \cdot Z' \cdot Z'' & ya da; \end{bmatrix}
\]
İfadelerdeki X' ve X'' nesneleri X; Y' ve Y'' nesneleri Y; Z' ve Z'' nesneleri Z cinsinden nesnelerdir. Sırasıyla X, Y ve Z tipinden nesneleri girdi olarak alan f, g ve h fonksiyonları aşağıda tanımlanmıştır. Bu fonksiyonlar karşılıklı özyineli fonksiyonlar olup tamsayı değerler döndürürler.
\[
\begin{array}{l@{\quad}l@{\quad}l}
\text{ff(X)} = \begin{cases} -1 & \text{eğer } X = a \\ -4 + \text{f(X')} & \text{eğer } X = b \cdot X' \cdot a \\ -2 + \text{g(Y')} & \text{eğer } X = b \cdot Y' \cdot b \\ -1 + \text{h(Z')} & \text{eğer } X = b \cdot Z' \cdot c \end{cases} & \text{g(Y)} = \begin{cases} -2 & \text{eğer } Y = \cdot \\ \text{f(X')} & \text{eğer } Y = X' \cdot cX'' \\ -1 + 2\text{g(Y')} & \text{eğer } Y = Y' \cdot bY'' \\ -3 + 3\text{h(Z')} & \text{eğer } Y = Z' \cdot aZ'' \end{cases}
\end{array}
\]
AÇIKLAMA
Her nesnenin yukarıda belirtilen durumlarını yukarıdan aşağı numaralandıralım (X nesnesinin 1.durumu a, 2.durumu b • X' • a ...) ve soruları ona göre çözelim. Aynı zamanda çözümü hızlandırmak için X, Y ve Z nesnelerinin ● durumları sayısını artıralım.
\[
X: a, a \cdot b, b \cdot a, a, b \cdot \cdot \cdot \cdot b, b \cdot a \cdot b \cdot c
\]
\[
Y: \cdot, a \cdot c, a, \cdot \cdot b, \cdot a \cdot b \cdot a \cdot a \cdot b
\]
\[
Z: a \cdot b, c \cdot a, b \cdot \cdot \cdot \cdot a, a \cdot a \cdot b \cdot a \cdot b
\]

---

f(b \(\bullet a \bullet b \bullet aa \bullet b \bullet b \bullet b\)) işleminin sonucu kaçtır?

Şıklar:
A) 8 | B) 7 | C) 6 | D) 5 | E) Hiçbiri

Cevap: E Hiçbiri

Çözüm:
f fonksiyonu X nesnesi alır. İfadeyi sadeleştirirsek:
•  \( f(b \bullet a \bullet b \bullet aa \bullet b \bullet b \bullet b) \) , 3. durum
•  \( -2 + g(a \bullet b \bullet aa \bullet b \bullet b) \) , 3. durum
•  \( -2 + -1 + 2 \cdot g(a \bullet b \bullet aa \bullet b) \) , 4. durum
•  \( -3 + 2*(-3 + 3h(a \bullet b)) \) , 1. durum
•  \( -3 + 2*(-3 + 3*3) = 12 - 3 = 9 \)
Cevap hiçbiri.
Bilgisayar Olimpiyatı 2014, 1. Aşama, Soru 35

[32 – 35] Sorular için Açıklama
X, Y ve Z aşağıda verildiği gibi tanımlanmış karşılıklı özyineli nesnelerdir. Tanımlarda toplam dört farklı (atomik) sembol (a, b, c ve ●) vardır. X, Y ya da Z ile tanımlanamayan tüm nesneler geçersizdir.
\[
X = \begin{bmatrix} a & ya da; \\ b \cdot X' \cdot a & ya da; \\ b \cdot Y' \cdot b & ya da; \\ b \cdot Z' \cdot c & ya da; \end{bmatrix} \quad Y = \begin{bmatrix} \cdot \cdot \cdot X' \cdot a & ya da; \\ \cdot \cdot \cdot Y' \cdot b & ya da; \\ \cdot \cdot \cdot Z' \cdot a & ya da; \end{bmatrix} \quad Z = \begin{bmatrix} a \cdot b & ya da; \\ c \cdot X' \cdot X'' & ya da; \\ b \cdot Y' \cdot Y'' & ya da; \\ a \cdot Z' \cdot Z'' & ya da; \end{bmatrix}
\]
İfadelerdeki X' ve X'' nesneleri X; Y' ve Y'' nesneleri Y; Z' ve Z'' nesneleri Z cinsinden nesnelerdir. Sırasıyla X, Y ve Z tipinden nesneleri girdi olarak alan f, g ve h fonksiyonları aşağıda tanımlanmıştır. Bu fonksiyonlar karşılıklı özyineli fonksiyonlar olup tamsayı değerler döndürürler.
\[
\begin{array}{l@{\quad}l@{\quad}l}
\text{ff(X)} = \begin{cases} -1 & \text{eğer } X = a \\ -4 + \text{f(X')} & \text{eğer } X = b \cdot X' \cdot a \\ -2 + \text{g(Y')} & \text{eğer } X = b \cdot Y' \cdot b \\ -1 + \text{h(Z')} & \text{eğer } X = b \cdot Z' \cdot c \end{cases} & \text{g(Y)} = \begin{cases} -2 & \text{eğer } Y = \cdot \\ \text{f(X')} & \text{eğer } Y = X' \cdot cX'' \\ -1 + 2\text{g(Y')} & \text{eğer } Y = Y' \cdot bY'' \\ -3 + 3\text{h(Z')} & \text{eğer } Y = Z' \cdot aZ'' \end{cases}
\end{array}
\]
AÇIKLAMA
Her nesnenin yukarıda belirtilen durumlarını yukarıdan aşağı numaralandıralım (X nesnesinin 1.durumu a, 2.durumu b • X' • a ...) ve soruları ona göre çözelim. Aynı zamanda çözümü hızlandırmak için X, Y ve Z nesnelerinin ● durumları sayısını artıralım.
\[
X: a, a \cdot b, b \cdot a, a, b \cdot \cdot \cdot \cdot b, b \cdot a \cdot b \cdot c
\]
\[
Y: \cdot, a \cdot c, a, \cdot \cdot b, \cdot a \cdot b \cdot a \cdot a \cdot b
\]
\[
Z: a \cdot b, c \cdot a, b \cdot \cdot \cdot \cdot a, a \cdot a \cdot b \cdot a \cdot b
\]

---

Hangisi yanlıştır?

Şıklar:
A) İçinde hiç a sembolü olmayan X nesneleri vardır. | B) \( f(X) > 2014 \)  olacak şekilde X nesneleri vardır. | C) Herhangi bir X nesnesinde _ sembolü sayısı diğer sembollerin toplam sayısından fazla olamaz. | D) Bazı Y nesnelerinde toplam sembol sayısı çifttir. | E) Hiç bir Y nesnesi toplamda 5 adet sembol içeremez.

Cevap: C Herhangi bir X nesnesinde _ sembolü sayısı diğer sembollerin toplam sayısından fazla olamaz.

Çözüm:
Şikları inceleyelim:
• Doğru, b• • • b bir X nesnesidir.
• Doğru, f fonksiyonu 4. durumu çağırıp sonsuz değerler elde edilebilir.
• Yanlış, b• • • b de noktalar daha fazladır.
• Doğru, a•c a nesnesi çift sembol sayılı Y nesnesidir.
• Doğru, 4 sembollü Y nesnelerinin en küçük yükseltgenmesinde bile 5 den fazla sembol olur. 4 sembolden az sayıda Y nesnesi 1. durum hariç olamaz.
Bilgisayar Olimpiyatı 2014, 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.

---

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

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

Şıklar:
A) O | B) 1 | C) 7 | D) 10 | E) 11

Cevap: C 7

Çözüm:
Programı inceleyelim:
- Bir döngüde her için alı değeri: İden büyük her için alı değeri, eğer j tek ise eklenir, eğer j çift ise çıkartılır. Yani:
- i = O için, alı'nın son değeri \(9 + 8 - 7 + 6 - 5 ... = 13\) olur.
- i = 2 için, alı'nın son değeri \(7 + 6 - 5 + 4 - 3 ... = 10\) olur.
- i = 4 için, alı'nın son değeri \(5 + 4 - 3 + 2 - 1 + O = 7\) olur.
- i = 6 için, alı'nın son değeri \(3 + 2 - 1 + O = 4\) olur.
- i = 8 için, alı'nın son değeri \(1 + O = 1\) olur.
- Sonra \(13 - 10 + 7 - 4 + 1 = 7\) değerini ekrana bastırır.
Bilgisayar Olimpiyatı 2014, 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.

---

```c
void main(void) {
    long int a=3829421, b=0;
    do {
        printf("*");
        if (b<=a%10)
            b=a%10, printf("*");
        a/=10;
    } while (a);
}
```

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

Şıklar:
A) Derleme zamanı hatası vereceğinden O | B) 11 | C) 12 | D) 13 | E) Sonsuz sayıda

Cevap: B 11

Çözüm:
Programı inceleyelim:
- do-while döngüsüne ilk girildiğinde a=3829421 ve b = O'dir.
- Her adımda bir tane * sembolü çıktıya yazdırılır ve eğer a'nın 10 modundaki değeri b'nin son değerinden fazlaysa 1 tane daha sayı * yazdırılır.
- İlk printf 7 adımın her birinde * yazdırırken. İkinci printf sadece ilk 4 adımda * yazdırır.
- b'nin değeri ilk adımda O, sonra sırasıyla 1, 2, 4 ve 9 olmuştur. Her değişimde * yazdırılmış ve bunlardan başka değişim olmamıştır.
Son adımdan sonra ise a O olmuştur ve program toplam 11 * bastırıp bitmiş olur.
Bilgisayar Olimpiyatı 2014, 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.

---

```c
```
void main() {
    int i, s=0;
    int a[]={2, 20, 201, 2014};
    for (i=0; i<4; i++)
        while (a[i] >>= 1) s++;
    printf("%d", s);
}
```

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

Şıklar:
A) 14 | B) 22 | C) 26 | D) 2014 | E) Sonsuz döngüye gireceğinden çıktı üretmez

Cevap: C 26

Çözüm:
Programı inceleyelim:
- s sayısı her alı değerinin son bitinin derecesi kadar artırılır.
>> operatorü sayının bitlerini 1 sağa kaydırır. Yani alı'nın son bitinin derecesi kaç ise s o kadar artırılır. (2⁰ için 1, 2¹ için 2 ²² için 3... )
- İlk adımda s, 2'nin en büyük biti olan 2'nin derecesi 2 kere artırılır.
- İkinci adımda s, 2O'nin en büyük biti olan 16'nin derecesi 5 kere artırılır.
- Üçüncü adımda s, 2O'ın en büyük biti olan 128'nin derecesi 8 kere artırılır.
- Dördüncü adımda s, 2O14'nin en büyük biti olan 1024'nin derecesi 11 kere artırılır.
- Toplamda s 2+5+8+11 = 26 kere artırılır.
- s'in değeri olan 26 çıktıya yazdırılır.
Bilgisayar Olimpiyatı 2014, 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.

---

```c
```
void main(void) {
    int *a, i, s=0;
    a= (int *) malloc(20*sizeof(int));
    if (a!=NULL) {
        memset(a, 1, 20*sizeof(int));
        for (i=0; i<20; i++)
            s+=i*a[i];
    }
    printf("%d", s);
}
```

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

Şıklar:
A) Derleme zamanı hatası verir | B) Çalışma zamanı hatası verir | C) Çıktıya 190 yazdırır | D) Çıktıya 171 yazdırır | E) Hiçbiri

Cevap: E Hiçbiri

Çözüm:
Programı inceleyelim:
- Tam sayı gösterisi a, alınan 20 tam sayıdan oluşan bir dizinin ilk elemanını gösterir.
memset fonksiyonu ile a'nın içerisindeki değerler  \( 2^{0} + 2^{8} + 2^{16} + 2^{24} \)  e eşitlenir
- memset fonksiyonu içerisine bir karakter dizisi, eşitlenecek değer, ilk kaç basamağın eşitlenmesi gerektiğini alır ve o karakter dizisinin ilk verilen bir değer kadar elemanını verilen başka bir değere eşitler.
- Yani 20 uzunluğunda tamsayı dizisi verilirse ki bu 80 uzunluğundaki bir karakter dizine denk gelir, ve ilk 80 elemanın değeri 1'e eşitlenirse, bu dizideki her tamsayı 4 karaktermiş gibi işleme tabii tutulur ve her bir karakter 1'e eşitlenir.
Yani çıktıya s=2O*(2⁰ + 2⁸ + 2¹⁶ + 2²⁴) yazdırılır.
Bilgisayar Olimpiyatı 2014, 1. Aşama, Soru 42

## [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.

---

```c
void main() {
typedef struct tagABC {
    int a; float b; char c; struct tagABC *n; //A
} ABC;
ABC a = {1, 1.0, 'a', NULL}, b = {2, 2.0, 'b'}, c = {3, 3.0}, *p; //B
a.n = b; b.n = c; c.n = a; //C
p = &a; //D
while (p != NULL) {
    printf("%d", p->a); p = p->n; //E
}
}
```

Yukarıda verilen program hangi açıklama satırına karşılık gelen satır için derleme zamanı hatası verir?

Şıklar:
A) A | B) B | C) C | D) D | E) E

Cevap: C C

Çözüm:
Programda açıklama satırları ile gösterilen yerleri sırasıyla inceleyelim:
- Açıklama satırı A: main fonksiyonu içerisinde tagABC fonksiyonu tanımlanır ve ABC ismiyle de kullanılabilir hale getirilir.
• Typedef özelliği ile veri yapısı, tagABC veya ABC olarak adlandırılabilir.
• Açıklama satırı B: ABC türünde 3 değişken alınır ve bazılarına başlangıç değerleri atılır.
- Başlangıç değerini doğrudan parantez içerisinde yazmak tanımlanma anına özgü bir özelliktir. Kaç değer verirsen yapının içerisinde tanımlanma sıralarına göre bu değerler değişkenlere atanır. Değer verilmemiş değişkenler önceden tanımlı (default) değerler alırlar.
- Açıklama satırı C: ABC türünü göstermesi gereken xın göstericileri ABC türü değişkenin adresi yerine içeriğine eşitlenir ve program derleme zamanında hata verir.
- Göstericiler her zaman kendi türünde bir değişkenin adresine eşit olurlar. İçeriği bir göstericiye vermek hataya yol açar.
Bilgisayar Olimpiyatı 2014, 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.

---

```c
void main() {
    switch (1) {
        case 1: ;
        case '1': 1; break;
        default : 1;
    }
}
```

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

Şıklar:
A) Derleme zamanı hatası verir | B) Derler fakat çalışma zamanı hatası verir | C) Derler ve çıktı olarak 1 yazdırır | D) Derler ve çıktı olarak 11 yazdırır | E) Hiçbiri

Cevap: E Hiçbiri

Çözüm:
Swich-case yapısında case ile default birlikte bulunabilir. Case durumlarında sabit(const) değerler bulunmalıdır. Her case özelliğinde sabit değer bulunduğundan program derleme hatası vermez. Case 1 durumuna girer ve hiçbir şey yazdırmadan biter.
Bilgisayar Olimpiyatı 2014, 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.

---

```c
long f(int x) {
    int a0=1, a1=-8, a2=3;
    return a2*x*x+a1*x+a0;
}
```

Yukarıda verilen f fonksiyonu için hangisi söylenemez?

Şıklar:
A) O değerini döndürebilir | B) Negatif bir değer döndürebilir | C) x in farklı pozitif değerleri için daima farklı değerler döndürür | D) Asla -5 den daha küçük bir değer döndürmez | E) Derleme zamanı hatası vermez

Cevap: A O değerini döndürebilir

Çözüm:
Bu fonksiyon \(x^2 - 8x + 3\) şeklinde yazılabilir. Bu denklemde \(D = (-8)^2 - 4*(1*3) = 52 > 7*7\) olur. O zaman:
- 52 tam kare olmadığından bu denklemin tam sayı kökü yoktur. O değerini döndüremez.
- Negatif değer \([8-7)/2, (8+7)/2]\) aralığındaki herhangi bir x tamsayısı için negatif değer döner.
- Polinomun sağ kolu birebir ve artan bir fonksiyondur. Sağ kolda kalan her pozitif x değeri için farklı bir değer döner. Fakat polinomun merkezi \(8/2 = 4 > 0\) olduğundan sol kolda kalan pozitif değerler vardır ve bu değerler sağ koldaki simetriğiyle aynı değeri taşır. Yani her \(O < x < 4\) için \(f(x) = f(4+(4-x))\) olur.
- Merkezin değeri fonksiyonun en küçük değeridir ve \(f(4) = 4*4 - 4*8 + 3 = -13\) e eşittir.
- Derleme hatası vermez.
Bilgisayar Olimpiyatı 2014, 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.

---

```c
int ff(int s, int r) {
    if (s>=r) return -r;
    return r/100 + ff(s, (s+r)>>1);
}
void main() {
    printf("%d", ff(1, 2014));
}
```

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

Şıklar:
A) 37 | B) 38 | C) 39 | D) 40 | E) 41

Cevap: A 37

Çözüm:
ff(1, 2014) değerini hesaplayalım:
- ff(1, 2014) = 20 + ff(1, 1006)
- ff(1, 1006) = 10 + ff(1, 503)
- ff(1, 503) = 5 + ff(1, 252)
- ff(1, 252) = 2 + ff(1, 126)
- ff(1, 126) = 1 + ff(1, 63)
- ff(1, 63) = 0 + ff(1, 32) = ... = 0 + ff(1, 1) = -1
- Yani ff(1, 2014) = 20 + 10 + 5 + 2 + 1 - 1 = 37
Bilgisayar Olimpiyatı 2014, 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.

---

```c
int fff(int *a, int *b) {
    int r1;
    if (a>b) return 1;
    else if (a==b) return *a;
    r1=fff(a+1, b-1)%11;
    return (r1**a**b)%11;
}

void main() {
    int a[16]={1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7};
    printf("%d %d", fff(a, a+15), fff(a+2, a+12));
}
```

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

Şıklar:
A) 10 | B) 12 | C) 11 | D) 22 | E) 21

Cevap: E 21

Çözüm:
fft fonksiyonunun özelliklerine bakalım:
- 2 göstericiyi parametresi olarak alır.
- Bu iki göstericinin değerlerini, fff(a+1, b-1) fonksiyonun değeri ile çarpıp kendi değerini elde eder. Bu değer 11 modundadır.
- Her zaman a < b olacağı için bu parametreleri sol ve sağ indeksler olarak düşünürsek. Bu fonksiyon verilen aralığın içerisindeki her değerin çarpımının 11 modundaki değerini döner.
- Yani fff(a, a+15) = (1*2*3*4*5*6*7*8*9*1*2*3*4*5*6*7) % 11 = 2,
- fff(a, a+12) = (3*4*5*6*7*8*9*1*2*3 * 4) % 11 = 1 olur.
Bilgisayar Olimpiyatı 2014, 1. Aşama, Soru 47

## [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.

---

```c
int fff(int *x, int y) {
    int z;
    x=*(x+y%2+1);
    return *x+y;
}

void main() {
    int a[]={1, 2, 3, 4, 5, 6, 7, 8, 9}, *z;
    z=&a[8];
    *z=ffff(&a[3], a[5]);
    printf("%d %d ", a[3], *z);
    *z=ffff(&a[5], *z);
    printf("%d %d ", a[5], *z);
}
```

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

Şıklar:
A) Derleme zamanı hatası verir | B) Çalışma zamanı hatası verir | C) 5 19 11 8 | D) 5 11 19 8 | E) Hiçbiri

Cevap: E Hiçbiri

Çözüm:
Programı inceleyelim:
- Bir a dizisi ve bir z göstericisi tanımlanıyor.
- z göstericisi a dizisinin 8. elemanını gösteriyor.
- ffff fonksiyonu parametre olarak aldığı x göstericisinin gösterdiği yerin değerini, dizide kendisinden y%2+1 sonra gelen elemanın değerine eşitliyor ve bu değerin y fazlasını dönüyor.
- O zaman ffff fonksiyonuna dizinin 3. Elemanı ve dizinin 5. elemanın değeri olan 6 verildiğinde a[3] = a[(3+6%2+1)] = a[4] işlemini yapar(a[3]=5 olur) ve a[3]+y = 5+6 = 11 döner.
- z = a[8] = 11 olur ve çıktıya 5 11 bastırır.
- Aynı şekilde ffff(a+5, 11) için a[5] = a[7] = 8 olur ve fonksiyon 8+11 = 19 döner.
- Çıktıya 8 19 basar.
Programın çıktısı en son 5 11 8 19 olur.
Bilgisayar Olimpiyatı 2014, 1. Aşama, Soru 48

## [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.

---

```c
int fffff(char *pl, char *p2) {
    int i, n;
    for (n=0; (*pl!=0) && (*p2!=0); n++, pl++, p2++);
    if (*pl>*p2) return 1;
    else if (*pl<=p2) return -1;
    for (i=0, p1--n, p2--n; i<n; i++, p1++, p2++) {
        if (*p1>*p2) return 1;
        else if (*p1<=p2) return -1;
    }
    return 0;
}

void main() {
    printf("%d ", fffff("ayva", "erik"));
    printf("%d ", fffff("kiraz", "nar"));
    printf("%d ", fffff("kemal", "kemelettin"));
    printf("%d ", fffff("ali", "ahmet"));
    printf("%d ", fffff("ankara", "istanbul"));
    printf("%d ", fffff("istanbul", "izmir"));
}
```

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

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

Cevap: A -11 -1 -1 -11

Çözüm:
f
ffff fonksiyonunu incelersek:
• İlk olarak n değişkenini küçük boylu olan kelimenin uzunluğuna eşitler
• Herhangi birinin değeri 0 oluncaya kadar n’i artır komutuyla hallolur. p1 ve p2 n kadar azaltıldığında göstericiler 
eski yerlerine dönmüş olur.
• Eğer ikisinden biri n’den uzunsa, yani n. yeri 0 değilse, bir değer döndür.
• Büyük olan ilkiyse 1, ikincisiyse -1 döner.
• Eğer uzunlukları eşitse farklı olan ilk harfine göre bir değer döndürür.
• Aynı şekilde büyük olan ilkiyse 1, ikincisiyse -1 döner.
O zaman:
• fffff fonksiyonu “ayva”, “erik” için, uzunlukları aynı bulur ve farklı olan ilk harf “erik”de daha büyük olduğundan -1 
döner.
• fffff fonksiyonu “kiraz”, “nar” için, “kiraz” daha uzun olduğundan 1 döner. 
• fffff fonksiyonu “kemal”, “kemalettin” için, “kemalettin” daha uzun olduğundan -1 döner. 
• fffff fonksiyonu “ali”, “ahmet” için, “ahmet” daha uzun olduğundan -1 döner. 
• fffff fonksiyonu “ankara”, “istanbul” için, “istanbul” daha uzun olduğundan -1 döner. 
• fffff fonksiyonu “istanbul”, “izmir” için, “istanbul” daha uzun olduğundan 1 döner.
Çıktıda -1 1 -1 -1 -1 1 yazar.
Bilgisayar Olimpiyatı 2014, 1. Aşama, Soru 49

## [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.

---

```c
int ffffff(int x, int y) {
    int z;
    while (y != 0) {
        z = y;
        y = x % y;
        x = z;
    }
    return x;
}
void main() {
    int a = 360, b = 75, c = 15;
    b = a * b / ffffff(a, b);
    c = b * c / ffffff(b, c);
    printf("%d", c);
}
```

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

Şıklar:
A) 24 | B) 225 | C) 1125 | D) 1800 | E) Hiçbiri

Cevap: D 1800

Çözüm:
fffff fonksiyonu OEB( x, y ) = OEB( y, x mod y ), x > y esasına dayanan Euler OEBE fonksiyonudur. Şimdi programa bakalım:
• a = 36O, b = 75 ve c = 15 olmak üzere 3 değişken tanımlanır.
• b = a*b/fffff(a, b) için b = 36O*75/OEB(36O, 75) = 36O*75/15 = 18OO olur.
• c = b*c/fffff(b, c) için c = 18OO*15/OEB(18OO, 15) = 18OO*15/15 = 18OO olur.
En sonunda çıktıya c = 18OO yazdırılır.
Bilgisayar Olimpiyatı 2014, 1. Aşama, Soru 50

## [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.

---

```c
void ffffff(int n) {
    if (n<=0) return;
    printf("1");
    ffffff(n/15);
    printf("%d ", n);
}
void main() {
    ffffff(2014);
}
```

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

Şıklar:
A) 11181342014 | B) 111888 | C) 111111 | D) 111201420142014 | E) Hiçbiri

Cevap: A 11181342014

Çözüm:
fffff fonksiyonu başına 1, ortaya n/15'den gelen ifade, en son da n yazdırır ve bu n yerel olduğundan değişmez. Şimdi programı inceleyelim:
• ffffff(2014) çağlıyor yani yazdırılacak ifade şimdilik ffffff(2014)
• Sonraki adımda 1 ffffff(134) 2014 olur.
• Sonraki adımda 1 1 ffffff(8) 134 2014 olur.
• Sonraki adımda 11 1 ffffff(0) 8 134 2014 olur.
• En son 1118 134 2014 olur.
Bilgisayar Olimpiyatı 2015, 1. Aşama, Soru 1

Üç basamaklı pozitif tam sayılardan kaç tanesi 2 ya da 5'in tam katıdır?

Şıklar:
A) 90 | B) 180 | C) 450 | D) 540 | E) 630

Cevap: D 540

Çözüm:
2 ya da 5'in tam katı demek birler basamağındaki sayının 0, 2, 4, 5, 6 veya 8 olması demektir. Yüzler basamağı 1'den 9'a onlar basamağı da 0'dan 9'a değer alacağından cevap 9*10*6 = 540 olur.
Bilgisayar Olimpiyatı 2015, 1. Aşama, Soru 2

4 çocuklu bir ailenin çocuklarının tam olarak 3 tanesinin kız olma ihtimali kaçtır? [Bir çocuğun kız veya erkek olma ihtimalinin eşit olduğunu ve bir çocuğun cinsiyetinin diğerini etkilemediğini kabul ediniz]

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

Cevap: A 1/4

Çözüm:
Toplamda 16 farklı durum vardır. Bu durumlardan erkeğin doğma sırasına göre C(4, 3) = 4 tanesinde 3 kız olur. O zaman olasılık 4/16 = 1/4'tür.
Bilgisayar Olimpiyatı 2015, 1. Aşama, Soru 3

Aşağıdaki ifadelerden hangisi, 5 kişilik bir öğrenci topluluğunda en az 2 öğrencinin aynı gün doğmuş olma ihtimalini verir?

Şıklar:
A) (365 × 364)/365² | B) (365 × 364 × 363 × 362 × 361)/365⁵ | C) 1 - (365 × 364)/365² | D) 1 - (365 × 364 × 363 × 362 × 361)/365⁵

Cevap: D 1 - (365 × 364 × 363 × 362 × 361)/365⁵

Çözüm:
Hiçbir kişinin aynı günde doğmama olasılığı 365*364*363*362*361/365⁵'tir. Bunu 1 den çıkartırsak en ez 2 kişinin aynı günde doğma olasılığını elde ederiz.
Bilgisayar Olimpiyatı 2015, 1. Aşama, Soru 4

10 tane madeni paranın 8 tanesi hilesizdir, 2 tanesinin ise her iki yüzü de turadır. Bu 10 madeni paradan bir tanesi rasgele seçilir ve 2 defa yazı-tura atılırsa, her ikisinin de tura gelme ihtimali kaçtır?

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

Cevap: B 2/5

Çözüm:
8 / 10 İhtimalle hilesiz para seçilirse 1 / 4 İhtimalle iki tura gelir. 2 / 10 İhtimalle hileli para gelirse her türlü 2 tura gelir. Yani gerçekleşme olasılığı (8/10) * (1/4) + (2/10) = 2/5 olur.