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

## [29-31 soruları için açıklama]
Ortaçağdan yeniçağa geçilirken Avrupa'da feodalite son bulmuştur. Bu süreçte şehir devletleri (derebeylikler) ortadan kalkmış ve bütün şehirlerin tek merkezden yönetildiği imparatorluklar kurulmuştur. Bu sürecin aşağıda anlatıldığı şekilde gerçekleştiğini varsayalım.
Tek merkezden yönetim sistemine geçiş işleminin sağlıklı bir şekilde gerçekleştirilmesi için şehir devletleri yavaş yavaş birleştirilmiştir. Bu süreçte birleştirilecek olan şehir devletleri arasındaki ulaşım sorununu da dikkate alarak, şehir devletlerinin hangi sırayla birleştirileceğine ve süreç içerisinde oluşacak şehir devletleri topluluklarını hangi derebeyinin yöneteceğine karar verecek bir kurul oluşturulmuştur.
Kurul öncelikli olarak aşağıdaki şekildeki gibi şehirlerin yuvarlaklarla yolların ise çizgilerle gösterildiği bir harita oluşturmuştur. Her bir şehre 1'den başlayarak bir numara verilmiştir. Aşağıdaki şekilde 8 tane şehir vardır ve başlangıçta her bir şehir o şehrin derebeyi tarafından yönetilmektedir. Her bir yolun üzerine de o yolun uzunluğu yazılmıştır. Kurul daha sonra sürecin işleyişine ilişkin aşağıda verilen kuralları belirlemiş ve bütün şehir devletleri de bu kurallara uymayı kabul etmişlerdir.
[GÖRSEL]
Yolları uzunluklarına göre küçükten büyüğe sırayla ele alalım. Aynı uzunluktaki yollar kendi aralarında herhangi bir şekilde sıralanabilirler. Eğer ele aldığımız yolun bağladığı iki şehir farklı derebeyleri tarafından yönetiliyorsa yazı tura atalım. Yazı gelirse numarası küçük olan şehri yöneten derebeyi numarası büyük olan şehri yöneten derebeyinin yönettiği bütün şehirlerin yönetimini devralsın. Tura gelirse tam tersi uygulansın yani numarası büyük olan şehri yöneten derebeyi numarası küçük olan şehri yöneten derebeyinin yönettiği büttün şehirlerin yönetimini devralsın. Eğer ele aldığımız yolun bağladığı ikişehir aynı derebeyi tarafından yönetiliyor ise herhangi bir işlem uygulanmaz ve sıradaki yola bakılır.

---

Haritada her birine 1 ile 100 arasında bir numara verilmiş 100 tane şehir olsun. Her (farklı) iki şehir arasında doğrudan bir yol olsun ve bir yolun uzunluğu birbirine bağladığı şehirlerin numaralarının toplamı kadar olsun. Bu durumda ele alındığında yazı tura atılan yolların uzunlukları toplamı kaçtır?

Şıklar:
A) 5048 | B) 5148 | C) 9999 | D) 10100 | E) Hiçbiri

Cevap: B 5148

Çözüm:
Bu durumda en küçük örten ağaç merkezinde 1 numaralı düğüm olan yıldız topolojisinde olacaktır. Kemar uzunlukları toplamı  \( (1 + 2) + (1 + 3) + \ldots + (1 + 100) \)  olacaktır. Bu da  \( 101 \times \frac{102}{2} - 3 = 5148 \)  eder.
Bilgisayar Olimpiyatı 2020, 1. Aşama, Soru 31

## [29-31 soruları için açıklama]
Ortaçağdan yeniçağa geçilirken Avrupa'da feodalite son bulmuştur. Bu süreçte şehir devletleri (derebeylikler) ortadan kalkmış ve bütün şehirlerin tek merkezden yönetildiği imparatorluklar kurulmuştur. Bu sürecin aşağıda anlatıldığı şekilde gerçekleştiğini varsayalım.
Tek merkezden yönetim sistemine geçiş işleminin sağlıklı bir şekilde gerçekleştirilmesi için şehir devletleri yavaş yavaş birleştirilmiştir. Bu süreçte birleştirilecek olan şehir devletleri arasındaki ulaşım sorununu da dikkate alarak, şehir devletlerinin hangi sırayla birleştirileceğine ve süreç içerisinde oluşacak şehir devletleri topluluklarını hangi derebeyinin yöneteceğine karar verecek bir kurul oluşturulmuştur.
Kurul öncelikli olarak aşağıdaki şekildeki gibi şehirlerin yuvarlaklarla yolların ise çizgilerle gösterildiği bir harita oluşturmuştur. Her bir şehre 1'den başlayarak bir numara verilmiştir. Aşağıdaki şekilde 8 tane şehir vardır ve başlangıçta her bir şehir o şehrin derebeyi tarafından yönetilmektedir. Her bir yolun üzerine de o yolun uzunluğu yazılmıştır. Kurul daha sonra sürecin işleyişine ilişkin aşağıda verilen kuralları belirlemiş ve bütün şehir devletleri de bu kurallara uymayı kabul etmişlerdir.
[GÖRSEL]
Yolları uzunluklarına göre küçükten büyüğe sırayla ele alalım. Aynı uzunluktaki yollar kendi aralarında herhangi bir şekilde sıralanabilirler. Eğer ele aldığımız yolun bağladığı iki şehir farklı derebeyleri tarafından yönetiliyorsa yazı tura atalım. Yazı gelirse numarası küçük olan şehri yöneten derebeyi numarası büyük olan şehri yöneten derebeyinin yönettiği bütün şehirlerin yönetimini devralsın. Tura gelirse tam tersi uygulansın yani numarası büyük olan şehri yöneten derebeyi numarası küçük olan şehri yöneten derebeyinin yönettiği büttün şehirlerin yönetimini devralsın. Eğer ele aldığımız yolun bağladığı ikişehir aynı derebeyi tarafından yönetiliyor ise herhangi bir işlem uygulanmaz ve sıradaki yola bakılır.

---

Haritadaki herhangi iki şehir arasında doğrudan ya da başka şehirlerden geçerek yolculuk yapılabildiğini varsayalım. N tane şehir ve M tane yol var ise toplamda kaç defa yazı tura atılır?

Şıklar:
A) N - 1 | B) M - 1 | C) \( N \times M \) | D) \( N + M \) | E) Yollar hakkında daha fazla bilgi vermeden hesaplanamaz.

Cevap: A N - 1

Çözüm:
Bir ağaç oluşturulacağı ve ağaçtaki kenar sayısı düğüm sayısının bir eksiği olacağından cevap N - 1.
Bilgisayar Olimpiyatı 2020, 1. Aşama, Soru 32

Aşağıdaki boru hattı ağından saniyede en fazla kaç litre petrol geçebilir?
[GÖRSEL]

Şıklar:
A) 14 | B) 18 | C) 20 | D) 26 | E) 35

Cevap: C 20

Çözüm:
Aşağıda gösterilen duruma bir ek uygun hat eklemek mümkün olmadığı için maksimum geçebilecek litre 20’dir.
Bilgisayar Olimpiyatı 2020, 1. Aşama, Soru 33

Aşağıdaki boru hattı ağından saniyede en fazla kaç litre petrol geçebilir?
[GÖRSEL]

Şıklar:
A) 10 | B) 15 | C) 18 | D) 19 | E) 20

Cevap: D 19

Çözüm:
Aşağıda gösterilen duruma bir ek uygun hat eklemek mümkün olmadığı için maksimum geçebilecek litre 19'dur.
Bilgisayar Olimpiyatı 2020, 1. Aşama, Soru 34

Aşağıdaki boru hattı ağından saniyete en fazla kaç litre petrol geçebilir?
[GÖRSEL]

Şıklar:
A) 9 | B) 10 | C) 11 | D) 12 | E) 13

Cevap: B 10

Çözüm:
Aşağıda gösterilen duruma bir ek uygun hat eklemek mümkün olmadığı için maksimum geçebilecek litre 10'dur.
[GÖRSEL]
Bilgisayar Olimpiyatı 2020, 1. Aşama, Soru 35

Boru hattından geçebilecek en fazla petrol miktarını bulmaya yarayan algoritma hakkında aşağıdaki ifadelerden hangileri yanlıştır?
I. Algoritma sonlandığında, hiçbir zaman içinden petrol transfer edilmeyen boru kalmaz
II. Bu algoritma hiçbir zaman sonsuz döngüye girmez
III. Algoritmanın her arada adımında transfer edilen toplam petrol miktarı mutlaka artar
IV. Kuyudan çıkan boruların toplam kapasitesi rafineriye giren boruların toplam kapasitesinden farklı olabilir

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

Cevap: A Yalnız I

Çözüm:
Yukarıdaki ifadelerden B, C, D ve E şıklarındaki ifadelerin hepsi doğrudur. Algoritma sonlandığında içinden hiç petrol transfer edilmeyen bir boru kalabilir. Böyle bir sonuç alınabilecek örnek bir boru hattı ağı aşağıda verilmektedir. Bu çözümde 1-2 arasındaki boru boş kalmak zorundadır. İfadelerden yalnızca I. numaralı ifade yanlıştır.
[GÖRSEL]
Bilgisayar Olimpiyatı 2020, 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 kod parçası verilen fonksiyonun görevi nedir?
```c
b = 0;
int fonksiyon(int sayi)
{
if (sayi == 0)
return b;
b += (sayi%10);
fonksiyon(sayi/10);
return b;
}
```

Şıklar:
A) Verilen sayıyı tersine çevirmek | B) Verilen sayıyı basamaklarına ayırmak | C) Verilen sayıların mod 10'a göre toplamını hesaplamak | D) Verilen sayının basamak değerleri toplamını hesaplamak | E) Verilen sayıların ilk basamaklarının toplamını hesaplamak

Cevap: D Verilen sayının basamak değerleri toplamını hesaplamak

Çözüm:
Verilen kod sayının basamaklarının toplamını bulmayı hedeflemektedir. Bunun için özyinelemeli bir şekilde sayının son basamağını mod 10 ile alıp genel toplama eklemektedir. Sonrasında fonksiyon kendisini yeni değerle birlikte tekrar çağırmaktadır. Yeni değer integer division ile hesaplanıp bu sayede son rakam atılmış olacaktır.
Bilgisayar Olimpiyatı 2020, 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.

---

```c
int a[6] = {6, 5, 4, 3, 2, 1};
printf("%d", (1 + 1)[a] - a[3] + (a + 1)[3]);
```
Verilen kod parçasının çıktısı nedir?

Şıklar:
A) Hata verecektir | B) 2 | C) 3 | D) Hafızada yer alan rastgele bir sayı verecektir | E) -2

Cevap: C 3

Çözüm:
Doğru cevap C şıkkıdır. Array üzerinde (x)[a] değeri a[x] ile aynı pozisyonu göstermektedir. a+1 ise pointer 
kavramı göz önünde bulundurulduğunda a[1] ile aynı pozisyonu gösterecektir. Bu durumda listeden çekilen 
değerler sırasıyla 4, 3 ve 2 olacaktır. 4 – 3 + 2 sonucunda doğru cevap olarak C şıkkına ulaşılabilecektir.
Bilgisayar Olimpiyatı 2020, 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.

---

int liste[9] = {1,2,3,4,2,3,7,4,9};
for (int i=0; i<9; i++)
{
char farkli = ......I......
for(int j=0; j<i; j++)
if (......II......)
{
farkli = ......III......;
break;
}
if(!farkli)
printf("%c ",liste[i]);
}
Yukarıda verilen kod parçası verilen bir listenin içindeki farklı olan sayıları yazdırmak olarak amaçlanmıştır. Bu amaca ulaşmak için aşağıdaki ifadelerden hangisi doğrudur?
I. I numaralı yere 0 ve III numaralı yere 1 gelmeli
II. II numaralı yere 1 = 1 ifadesi gelmeli
III. I numaralı yere 1 ve III numaralı yere 0 gelmeli
IV. II numaralı yere liste[i] == liste[j] ifadesi gelmeli

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

Cevap: B I ve II

Çözüm:
I numaralı yere 0 (false anlamına gelir)
II numaralı yere liste[i] == liste[j]
III numaralı yere 1 (true anlamına gelir)
değerleri gelmelidir. Program listenin bir elemanını alıp eğer kendinden önce aynı eleman hiç gelmediyse o değeri yazdırmaktadır.
Bilgisayar Olimpiyatı 2020, 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ğıda verilen kodun çıktısı nedir?  
 
#define N 1000000 
 
int f(int arr[], int l, int r, int x)  
{  
    if (r >= l) {  
        int m = l + (r - l) / 2;  
        if (arr[m] == x)  
            return m;  
        if (arr[m] > x)  
            return f(arr, l, m - 1, x);  
        return f(arr, m + 1, r, x);  
    }  
    return -1;  
} 
 
int main(void)  
{  
    int A[N];  
    for (int i = 0; i < N; i++) 
        A[i] = i * 2;  
    int res = f(A, 123, 999997, 1512626); 
    (res == -1) ? printf("%d\n",-1) : printf("%d\n",res);  
    return 0;  
}

Şıklar:
A) -1 
B) 1512626 
C) 756313 
D) 756311 
E) 0

Cevap: C 756313

Çözüm:
Kod dikkatli incelenirse, bunun bir ikili arama (binary search) kodu olduğu görülecektir. A dizisinin 123 indeks ile 999997 indeksi arasında, verilen 1512626 sayısının olup olmadığını dönecektir. A dizisinin her indeksinde o indeksin 2 katı değeri bulunduğundan 1512626 sayısı 756313 indeksinde bulunacaktır. Ekrana da bu indeks basılmaktadır.
Bilgisayar Olimpiyatı 2020, 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 kodla ilgili hangisi doğrudur?  
int main(){ 
int b = 0; 
while (b++ < 4) { 
int d = b; 
do { 
printf("%d\n",--d); 
} while (d > 2); 
} 
}

Şıklar:
A) Sonsuz döngüye girer. 
B) Verdiği çıktıların toplamı 8’dir. 
C) Ekrana 4 satırlık çıktı basar. 
D) Ekrana 6 satırlık çıktı basar. 
E) Derleme hatası verir.

Cevap: B Verdiği çıktıların toplamı 8’dir.

Çözüm:
Kod izlenirse çıktısının 0 1 2 3 2 sayılarından oluştuğu ve dolayısıyla cevabın B olduğu görülecektir.
Bilgisayar Olimpiyatı 2020, 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 kodun çıktısı nedir?
```c
int main(void) {
int *x, *y;
x = malloc(sizeof(int));
for (int i = 0; i < 4; i++) {
x[i] = i + 1;
y = x;
x = malloc(2*sizeof(int));
x[0]++;
x[1]--;
for (int i = 0; i < 4; i++) {
printf("%d ", y[i]);
}
}
}
```

Şıklar:
A) Derleme hatası verir. | B) 2 1 | C) 1 2 | D) 1 2 3 4 | E) 2 1 3 4

Cevap: A Derleme hatası verir.

Çözüm:
Kod izlenirse çıktısının 1 2 3 4 olduğu görülecektir. Çünkü x dizisinin değişmesi y'yi etkilemeyecektir.
Kod bit operatörleri kullanarak verilen sayının iki tabanında gösteriminde kaç tane 1 olduğunu sayıyor. Bu durumda cevap 6'dır.
Bilgisayar Olimpiyatı 2020, 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.

---

Aşağıda tanımlı fonksiyon 1265 parametresi ile çağrılırsa ne döner?  
int co(int n) { 
int c = 0; 
while(n) { 
n = n & (n-1); 
c++; 
} 
return c; 
}

Şıklar:
A) 6 
B) 7 
C) 8 
D) 9 
E) 10

Cevap: A 6

Çözüm:
Kod bit operatörleri kullanarak verilen sayının iki tabanında gösteriminde kaç tane 1 olduğunu sayıyor. Bu durumda cevap 6'dır.
Bilgisayar Olimpiyatı 2020, 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 program ekrana ne yazar?
```c
int f(int *A)
{
int *p, b = 0;
for (p = A; p < (A + 7); p++)
b += *p;
return b;
}
int main()
{
int dizi[8] = {7, 5, 11, 8, 2, 1, 15, 3};
printf("%d", f(dizi));
}
```

Şıklar:
A) 33 | B) 34 | C) 49 | D) 52 | E) Ekrana bir şey yazmaz çünkü derleme-zamanı hatası verir.

Cevap: C 49

Çözüm:
f fonksiyonu parametre olarak verilen dizinin ilk 7 elemanının toplamını döndürmektedir.
Bilgisayar Olimpiyatı 2020, 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?
```c
int i = 0;
int f(int y)
{
i++;
if (y == 0)
return i;
return f(y / 2) + f(y - 1);
}
int main()
{
printf("%d\n", f(4));
}
```

Şıklar:
A) 45 | B) 60 | C) 90 | D) 115 | E) 120

Cevap: D 115

Çözüm:
f fonksiyonuna parametre olarak 4 değeri verildiği için özyineleme ağacı çizilir ve f fonksiyonunun 0 değeriyle çağırıldığındaki i değişkeninin değerlerinin toplamı ekrana yazılır. Cevap 4 + 5 + 7 + 8 + 11 + 12 + 15 + 16 + 18 + 19 = 115 olacaktır.
Bilgisayar Olimpiyatı 2020, 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ı şıklardan hangisinde doğru olarak verilmiştir?
int main()
{
int i, j;
int a[4][4] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
{
int h = a[i][j];
a[i][j] = a[3 - i][3 - j];
a[3 - i][3 - j] = h;
}
for (i = 0; i < 4; i++)
{
for (j = 0; j < 4; j++)
printf("%d ",a[i][j]);
printf("\n");
}
}

Şıklar:
A) 
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16

B) 
4 3 2 1
8 7 6 5
12 11 10 9
16 15 14 13

C)
13 14 15 16
9 10 11 12
5 6 7 8
1 2 3 4

D) 
16 15 14 13
12 11 10 9
8 7 6 5
4 3 2 1

E) 
1 5 9 13
2 6 10 14
3 7 11 15
4 8 12 16

Cevap: A 1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16

Çözüm:
Dıştaki for döngüsünde i = 0 için ilk satır tersten son satıra yazılmakta son satır da tersten ilk satıra yazılmaktadır. Ancak i = 3 için de aynı işlem yapıldığından ilk ve son satır başlangıç durumuna gelmektedir. Benzer şekilde bu for döngüsünü i = 1 için ikinci satırı tersten üçüncü satıra yazmakta üçüncü satırı da tersten ikinci satıra yazmaktadır. Ancak i = 2 için de aynı işlem yapıldığından ikinci ve üçüncü satır başlangıç durumuna gelmektedir. Yani üstteki for döngüleri çalıştıktan sonra a dizisi başlangıç durumuna geri gelmektedir. Alttaki for döngüsü ise a dizisini ekrana satır satır yazdırmaktadır. Bu yüzden cevap A şıkkında verildiği gibidir.
Bilgisayar Olimpiyatı 2020, 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 programın çıktısı şıklardan hangisinde doğru olarak verilmiştir?
```c
int main()
{
int a = 18 + 37 / 4 * 6 - 5;
int b = 4 * 38 / 8 + 20 - 5;
if (++a > 67 && --b < 45)
printf("a = %d b = %d\n", a, b);
if (b-- == 33 || a-- == 67)
printf("a = %d b = %d\n", a, b);
}
```

Şıklar:
A)
a = 68 b = 33 | 
B)
a = 68 b = 33
a = 69 b = 32 |
C) 
a = 68 b = 33 
a = 68 b = 32 | 
D)
Kod herhangi bir çıktı üretmez. | 
E)
Derleme-zamanı hatası verir.

Cevap: C a = 68 b = 33
a = 68 b = 32

Çözüm:
Başlangıçta a = 67 ve b = 34'tür. Program birinci if'e girer ve ekrana a = 68 b = 33 yazar. Sonrasında ikinci if'e de girer ve ekrana a = 68 b = 32 yazar.
Bilgisayar Olimpiyatı 2020, 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.

---

Aşağıdaki fonksiyon verilen \(6 \times 6\) boyutundaki bir matrise aşağıdaki işlemlerden hangisini gerçekleştirir?
```c
void f(int A[6][6]) {
int B[6][6];
int i, j, k, m;
for (i=0; i<6; i++)
for (j=0; j<6; j++) {
m = 0;
for (k=0; k<6; k++) m+=A[i][k]*A[k][j];
B[i][j] = m;
}
for (i=0; i<6; i++)
for (j=0;j<6;j++) A[i][j]=B[i][j];
}
```

Şıklar:
A) Verilen matrisin karesini alır | B) Verilen matrisin transpozunu alır | C) Verilen matrisin tersini bulup matrise eşitler | D) Verilen matriste bir değişikliğe neden olmaz | E) Bu fonksiyon derleme-zamanı hatası verir

Cevap: A Verilen matrisin karesini alır

Çözüm:
f fonksiyonu içerisinde verilen \(6 \times 6\) boyutundaki matris, matris çarpma işlemi ile kendisi ile çarpılmakta yani ikinci kuvveti (karesi) alınmaktadır. Elde edilen değerler geçici bir matriste depolandıktan sonra tekrar verilen matris içerisine kopyalanmakta ve böylelikle verilen matrisin karesi alınmış olmaktadır.
Bilgisayar Olimpiyatı 2020, 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.

---

myrand(x) fonksiyonunun 0 ile x arasında (0 ve x dahil) her sayı eşit olasılıkla gelecek şekilde rastgele bir sayı ürettiğini varsayarsak, aşağıdaki fonksiyonun verilen bir diziyi, dizideki elemanların herhangi bir permütasyonu eşit olasılıkla gelebilecek şekilde, karıştırması için boşluk kısmına seçeneklerdeki hangi kod gelmelidir? Fonksiyon parametrelerinden a diziyi ve n de dizideki eleman sayısını göstermektedir.
```c
void karistir(int n, int *a) {
int i, tmp, k;
k = n-1;
while (k>0) {
tmp = a[i];
a[i] = a[k];
a[k] = tmp;
k = k - 1;
}
}
```

Şıklar:
A) i = myrand(n); | B) i = myrand(n-1); | C) i = myrand(k); | D) i = myrand(k-1); | E) i = myrand(k+1);

Cevap: C i = myrand(k);

Çözüm:
Kodun bir dizinin elemanlarını herhangi bir permütasyon eşit olacak şekilde karıştırabilmesi için dizinin son elemanından başlayarak her adımda 0 ile o anki son elemanın indeksi arasında (yani 0 ile k arasında) rastgele bir sayı üreterek o anki son eleman ile üretilen indeksteki elemanın yeri değiştirilmelidir. k değişkeni kodda o anki son elemanın indeksini gösterdiği için myrand(k) fonksiyonu ile 0 ile k arasında bir sayı üretilmelidir. Yani
Bilgisayar Olimpiyatı 2020, 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.

---

Aşağıdaki programın çıktısı ne olur?
```c
void f(int a, int b) {
a = b - a;
b = b - a;
a = b + a;
}
int main() {
int x = 8;
int y = 2;
f(x, y);
printf("x = %d, y = %d\n", x, y);
}
```

Şıklar:
A) x = 2, y = 8 | B) x = -6, y = 10 | C) x = 10, y = -6 | D) x = 8, y = 8 | E) Yukarıdakilerden hiçbiri

Cevap: E Yukarıdakilerden hiçbiri

Çözüm:
Yukarıdaki program çalıştırıldığında fonksiyona gönderilen değerler "değer ile çağrılma" (ing. call by value) ile fonksiyona gönderildiklerinden fonksiyondaki değişiklikler bu değişkenleri etkilemez. Yani programın çıktısı x = 8, y = 2 olur. Bu da hiçbir şıkta verilmediğinden
Bilgisayar Olimpiyatı 2020, 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.

---

Aşağıdaki program ekrana kaç tane * basar?
```c
void g(int, int);
void f(int a, int b) {
if (a%2==0) g(2*a,b-1);
else g(a,b*2);
}
void g(int a, int b) {
printf("*\n");
if (b>0) f(a/2,b);
}
int main() {
f(8,3);
}
```

Şıklar:
A) 2 | B) 3 | C) 4 | D) 5 | E) Yukarıdakilerden hiçbiri

Cevap: B 3

Çözüm:
Programı çalıştırdığımızda ilk olarak f fonksiyonu içerisinden g fonksiyonu 16 ve 2 parametreleri ile çağrılır ve 1 tane * basılır. g fonksiyonu tekrar f’yi 8 ve 2 parametreleri ile çağırır. f fonksiyonu g fonksiyonunu ikinci kez 16 ve 1 parametreleri ile çağırır ve ikinci * basılmış olur. g fonksiyonu da f’yi 8 ve 1 parametreleri ile çağırır. f fonksiyonu son kez g’yi 16 ve 0 parametreleri ile çağırır ve üçüncü kez * basılır. Bundan sonra f fonksiyonu çağrılmadan g fonksiyonu son bulur ve programdan çıkarız. Toplamda 3 kez * basılmış olur.
Bilgisayar Olimpiyatı 2021, 1. Aşama, Soru 1

Bir öğrenci yurdunda adları Ali, Buğra, Can, Demir, Enes ve Faruk olan 6 öğrenci kalmaktadır. Yurt müdürü öğrencilerden iki tanesinin Galatasaray-Fenerbahçe maçını izlemek için yurttan kaçtığını tespit etmiştir ancak hangi iki tanesinin kaçtığını bilmemektedir. Kaçan öğrencileri bulmak için öğrencilere sorular sormuştur. Öğrenciler ise aşağıdaki cevapları vermiştir.
- Can, “Ali ve Buğra kaçtılar” demiş,
- Buğra, “Demir ve Enes kaçtılar” demiş,
- Enes, “Buğra ve Faruk kaçtılar” demiş,
- Ali, “Buğra ve Can kaçtılar” demiş,
- Demir, “Enes ve Faruk kaçtılar” demiş,
- Faruk ise cevap vermemiş.
Sorulara cevap veren beş öğrenciden dört tanesi kaçan öğrencilerden birinin adını doğru vermiş, öbürünün adını yanlış vermiştir. Bir öğrenci ise her iki adı da yanlış vermiştir.
Maç izlemek için yurttan kaçan öğrenciler kimlerdir?

Şıklar:
A) Buğra ve Enes | B) Buğra ve Demir | C) Enes ve Faruk | D) Verilen bilgiler çelişkilidir. | E) Verilen bilgiler hangi öğrencilerin kaçtığını kesin olarak tespit etmek için yetersizdir.

Cevap: B Buğra ve Demir

Çözüm:
Çocukların adlarını baş harfleri olan \(a, b, c, d, e\) ve \(f\) ikili (binary) değişkenleri ile simgeleyelim. Değişkenin 1 değerini alması ilgili öğrencinin kaçtığını, 0 değerini alması ise kaçmadığını göstersin. Çocuklardan iki tanesi kaçtığına göre \(a + b + c + d + e + f = 2\)'dir. Dört öğrenci bir adı doğru verdiğine ve bir öğrenci her iki adı yanlış verdiğine göre: \((a + b) + (d + e) + (b + f) + (b + c) + (e + f) = a + 3b + c + d + 2e + 2f = 4\)'tür. Bu eşitlikten ilk elde ettiğimiz eşitliği çıkartırsak \(2b + e + f = 2\)'dir. \(b = 0\) ise \(e = 1\) ve \(f = 1\) olmak zorundadır ancak bu durumda Demir kaçan iki öğrencinin de adını doğru vermiş olur. Öyleyse, \(b = 1\), \(e = 0\) ve \(f = 0\)'dir. Bu durumda Can'ın söylediklerinden \(a = 0\) olmalı, Ali'nin söylediklerinden de \(c = 0\)'dir. Değişkenlerin toplamı 2 olduğundan \(d = 1\) olmalıdır. Öyleyse kaçan öğrenciler Buğra ve Demir'dir.