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

[GÖRSEL]

Yukarıdaki çizgede, C düğümünden başlayarak Genişlik Öncelikli Arama (Breadth-First Search - BFS) yapıldığında, aşağıdaki düğüm gezilerinden kaç tanesi görülebilir?

\( C \rightarrow B \rightarrow D \rightarrow F \rightarrow G \rightarrow A \rightarrow H \rightarrow E \)
\( C \rightarrow D \rightarrow B \rightarrow F \rightarrow G \rightarrow H \rightarrow A \rightarrow E \)
\( C \rightarrow G \rightarrow D \rightarrow F \rightarrow B \rightarrow E \rightarrow A \rightarrow H \)
\( C \rightarrow B \rightarrow F \rightarrow A \rightarrow D \rightarrow G \rightarrow H \rightarrow E \)
\( C \rightarrow B \rightarrow H \rightarrow A \rightarrow F \rightarrow E \rightarrow D \rightarrow G \)
\( C \rightarrow D \rightarrow F \rightarrow B \rightarrow H \rightarrow A \rightarrow E \rightarrow G \)

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

Cevap: C 3

Çözüm:
BFS başlangıç düğümünden itibaren düğümleri seviye-seviye gezer. Yani bu algoritmaya göre 
ilk olarak başlangıç düğüm (seviye 1), sonra çocuk düğümler (seviye 2), sonra çocuk 
düğümlerin ilk ziyaret sırasına göre çocukları (seviye 3) vs. şeklinde düğümler gezilir.  Buna 
göre ilk 3 sırada verilen düğümlerin gezme sırası doğrudur.
Bilgisayar Olimpiyatı 2025, 1. Aşama, Soru 32

A: [B]
B: [A, C]
C: [E]
D: [A, C]
E: [G]
F: [C]
G: [F]
Yukarıda komşuluk listesi ile temsil edilen yönlü bir çizgede, aşağıdaki düğüm çiftlerinden kaç tanesi aynı güçlü bağlı bileşen (Strongly Connected Component) içinde yer almaz? Not: Komşuluk listesi ile temsilde bir X düğümünden Y düğümüne giden bir kenar var ise bu X: [Y] şeklinde gösterilir.
Düğüm Çiftleri:
• A ve B
• C ve E
• D ve F
• E ve G
• A ve C

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

Cevap: B 2

Çözüm:
A -> B ve B -> A olduğu için A ve B arasında karşılıklı bir bağlantı vardır. Bu nedenle A ve B aynı SCC içindedir.
C -> E -> G -> F -> C şeklinde bir döngü bulunmaktadır. Bu, C, E, G ve F düğümlerinin birbirlerine ulaşılabilir olduğunu gösterir. Dolayısıyla C, E, G ve F aynı SCC içindedir.
D -> A ve D -> C bağlantıları vardır. Ancak çizgedeki herhangi bir düğümden D'ye doğrudan bir dönüş yolu garanti edilmez. Bu nedenle D tek başına bir SCC oluşturur. Dolayısıyla D ve F farklı SCC içindedir.
E -> G ve G -> F ve F -> C -> E olduğu için E ve G aynı SCC içindedir.
A -> B -> C ile A’dan C’ye gidilebilir ancak C’den A’ya herhangi bir yol yoktur. Bu nedenle A ve C farklı SCC içindedir.
Sonuç olarak toplam 2 düğüm çifti farklı SCC içinde yer almaktadır.
Bilgisayar Olimpiyatı 2025, 1. Aşama, Soru 33

0: [1, 2]
1: [3]
2: [3]
3: [4, 5]
4: []
5: []
Yukarıda komşuluk listesi ile temsil edilen yönlü bir çizgenin kaç tane farklı topolojik sıralaması vardır? Not: Komşuluk listesi ile temsilde bir X düğümünden Y düğümüne giden bir kenar var ise bu X: [Y] şeklinde gösterilir.

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

Cevap: D 4

Çözüm:
Bu çizgede toplam 4 farklı topolojijk sıralama vardır ve bu sıralamalar şu şekildedir:
0 -> 1 -> 2 -> 3 -> 4 -> 5
0 -> 1 -> 2 -> 3 -> 5 -> 4
0 -> 2 -> 1 -> 3 -> 4 -> 5
0 -> 2 -> 1 -> 3 -> 5 -> 4
Bilgisayar Olimpiyatı 2025, 1. Aşama, Soru 34

Derinlik öncelikli arama (Depth First Search - DFS) ve Genişlik öncelikli arama (Breadth First Search - BFS) ile ilgili aşağıdaki ifadelerden kaç tanesi doğrudur?
o BFS ve DFS’in teorik çalışma zamanları eşittir.
o DFS, bir düğümün tüm komşularını ziyaret ettikten sonra bir sonraki seviyeye geçer.
o DFS, çizgelerde döngü tespiti için kullanılabilir.
o DFS, yönsüz ve ağırlıksız çizgelerde başlangıç düğümünden diğer tüm düğümlere kenar sayısı açısından en kısa yolu bulmayı garanti eder.

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

Cevap: C 2

Çözüm:
Bu ifadeleri inceleyelim. 
o BFS ve DFS’in teorik çalışma zamanları eşıttir: Doğru. Her iki algoritmanın çalışma zamanı Θ(V+E)’dir.
o DFS, bir düğümün tüm komşularını ziyaaret ettikten sonra bir sonraki seviyeye geçer: Yanlış. Bu ifade BFS için doğrudur.
o DFS, çizgelerde döngü tespiti için kullanılabilir: Doğru. Ters kenar (Back edge) tespit edildiğinde çizgede döngü vardır.
o DFS, yönsüz ve ağırlıksız çizgelerde başlangıç düğümünden diğer tüm düğümlere kenar sayısı açısından en kısa yolu bulmayı garantı eder: Yanlış. Bu ifade BFS için doğrudur.
Bilgisayar Olimpiyatı 2025, 1. Aşama, Soru 35

Verilen yönsüz, ağırlıksız ve basit bir çizge, A komşuluk matrisi ile temsil edilsin. Buna göre aşağıdaki ifadelerin kaç tanesi doğrudur?
 Eğer A[i][j]=1 ise, her zaman A[j][i]=1 olur.
 A matrisi her zaman simetriktir.
 Bir düğümün derecesi (degree) A matrisinin o satırındaki 1'lerin sayısı ile bulunabilir.
 Çizgedeki düğüm sayısı arttıkça, A’nın bellekte kapladığı yerin verimliliği komsuluk listesine göre daha fazla artar.

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

Cevap: D 3

Çözüm:
Bu ifadeleri inceleyelim.
o Eğer A[i][j]=1 ise, her zaman A[j][i]=l olur: Doğru. Çizge yönsüz olduğu için bu ifade doğrudur.
o A matrisi her zaman simetriktir: Doğru. Çizge yönsüz olduğundan dolayı komşuluk matrisi her zaman simetriktir.
o Bir düğümün derecesi (degree) A matrisinin o satırında ki 1'lerin sayısı ile bulunabilir: Doğru. Bir satırın içindeki 1’lerin sayısı ilgili satırdaki düğümün derecesini verir.
o Çizgedeki düğüm sayısı arttıkça, A’nının bellekte kapladığı yerin verimliliği komsuluk listesiğe göre daha artar: Yanlış. Komşuluk matrisi Ø(n2) yer kaplar. Çok büyük ama seyrek (sparse) çizgelerde komşuluk listesi çok daha verimlidir.
Bilgisayar Olimpiyatı 2025, 1. Aşama, Soru 36

[36-50] Sorular İçin Açıklama
- Soruları C programlama dili çerçevesinde cevaplayınız.
- Derleyici olarak gec 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 main() {
char word[5] = "ABCDE";
int i;
for (i=1; i<6; i++) {
printf("%c", word[i-1] + i % 3);
}
return 0;
}
```
Yukarıdaki kod parçacığı çalıştırıldığında konsola aşağıdakilerden hangisini yazdırır?

Şıklar:
A) BDCEG | B) ACEGI | C) BDFHJ | D) ACEDF | E) BCCFG

Cevap: A BDCEG

Çözüm:
i = 1 değeri için word[0] yani "A" harfi alınarak i % 3 işleminin sonucu ile toplanacak 1 % 3 = 1.
A + 1 = B olacaktır. Döngünün ilk aşamasında ekrana B yazdırılacaktır.
i = 2 değeri için word[1] yani "B" harfi alınarak i % 3 işleminin sonucu ile toplanacak 2 % 3 = 2.
B + 2 = D olacaktır. Ekrana D yazdırılacaktır.
i = 3 değeri için word[2] yani "C" harfi alınarak i % 3 işleminin sonucu ile Toplanacak 3 % 3 = 0.
C + 0 = C olacaktır. Ekrana C yazdırılacaktır.
i = 4 değeri için word[3] yani "D" harfi alınarak i % 3 işleminin sonucu ileToplanacak 4 % 3 = 1.
D + 1 = E olacaktır. Ekrana E yazdırılacaktır.
i = 5 değeri için word[4] yani "E" harfi alınarak i % 3 işleminin sonucu iletoplanacak 5 % 3 = 2.
E + 2 = G olacaktır. Ekrana G yazdırılacaktır.
Bilgisayar Olimpiyatı 2025, 1. Aşama, Soru 37

[36-50] Sorular İçin Açıklama
- Soruları C programlama dili çerçevesinde cevaplayınız.
- Derleyici olarak gec 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 main() {
int i, count = 0;
for(i=1; i<17; i=i+i) {
int j = 2;
do {
count++;
j *=2;
} while (j<=i);
}
printf("%d\n", count);
return 0;
}
```
Yukarıdaki kod parçacığı çalıştırıldığında programın çıktısı aşağıdakilerden hangisi olur?

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

Cevap: D 11

Çözüm:
Program: 1, 1, j:2 değerleri ile başlar ve içteki döngü ile devam eder. count 1 artar ve içteki döngü sonlanır. i değeri 2 olur ve j değeri de 2'den başlar.
i: 2, j:2 için count 1 artar ve j 4 olur içteki döngü sonlanır. i değeri 4 olur ve j değeri 2'den başlar.
i: 4, j:2 için count 1 artar ve j 4 olur ve içteki döngü devam eder.
i: 4, j:4 için count 1 artar ve j 8 olur ve içteki döngü sona erer. i değeri 8 olur ve j değeri 2'den başlar.
i: 8, j:2 için count 1 artar ve j 4 olur ve içte ki döngü devam eder.
i: 8, j:4 için count 1 artar ve j 8 olur ve içte ki döngü devam eder.
i: 8 j:8 için count 1 artar ve j 16 olur ve içteki döngü sona erer. i değeri i 16 olur ve j değeri 2'den başlar.
i: 16, j:2 için count 1 artar ve j 4 olur ve içteği döngü devam eder.
Program: 1, 1, j:2 değerleri ile başlar v e içteki döngü ile devam eder. count 1 artar ve içteki döngü sonlanır. i değeri 2 olur ve i değeri de 2'den başlar.
i: 2, j:2 için count 1 artar ve j 4 olun içteki döngü sonlanır. i değeri 4 olun ve j değeri 2'den başlar.
i: 4, j:2 için count 1 artar ve j 4 olun ve içteki döngü devam eder.
i: 4, j:4 için count 1 artar ve j 8 olun ve içteki döngü sona erer. i değeri 8 oluş ve j değeri 2'den başlar.
i: 4, j:4 için count 1 artar ve j8 olur ve içteki döngü sona erer. i değer 8 olur ve j değeri 2'den başlar.
i: 4, j:2 için count 1 artar ve j4 olur ve içteki döngü devam eder.
i: 8, j:8 için count 1 artar ve j 16 olur ve içteki doğu sona erer. i değeri 16 olur ve j değeri 2'den başlar.
i: 16, j:2 için count 1 artar ve j 4 olun ve içteği döngü devam eder.
i: 8, j:8 için count 1 artar ve j8 olur ve içteki döngü devam eder.
i: 8, j:8 için count 1 artar ve j16 olur ve içteki döngü sona erer. i değerleri 16 olur ve j değeri 2'den başlar.

text</td>
[[114, 831, 879, 867]]<|/det|>
i: 16, j:2 için count 1 artar ve j4 olur ve içteki doğu devam eder.
i: 16, j:2 için count 1 artar ve j16 olur ve içteki döngü devam eder.
i: 16, j:4 için count 1 artar ve j 8 olur ve içteki döngü devam eder.
i: 16, j:8 için count 1 artar ve j 16 olur ve içteki döngü devam eder.
i: 16, j:16 için count 1 artar ve j 32 olur ve içteki döngü sona erer. Daha sonrasında i 32 olur ve dıştaki döngü de sona erer. Program sonunda count değeri 11 olur.
Bilgisayar Olimpiyatı 2025, 1. Aşama, Soru 38

[36-50] Sorular İçin Açıklama
- Soruları C programlama dili çerçevesinde cevaplayınız.
- Derleyici olarak gec 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 main() {
int A[9] = {5, 3, 6, 2, 4, 1, 8, 7, 9};
int i;
for (i = 0; i < 7; i++) {
if (i % 2 == 0) {
if (A[i] < A[i+2]) {
int j = A[i];
A[i] += A[i+2];
A[i] -= j;
A[i+2] = j;
} else {
int j = A[i+1];
A[i+1] += A[i];
A[i+1] -= j;
A[i] = j;
}
} else {
int j = A[i-1];
A[i-1] += A[i];
A[i-1] -= j;
A[i] = j;
}
}
for (i = 0; i < 9; i++) {
printf("%d ", A[i]);
}
return 0;
}
```
Yukarıdaki kod parçası hangi çıktıyı üretir?

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

Cevap: E 3 6 5 2 1 8 9 7 4

Çözüm:
Döngünün başında i değeri 0 ile başlar ve 0%2 = 0 doğru olduğundan if bloğu çalışır.
Daha sonrasında A[0] < A[2] olduğundan içerideki if çalışır ve if blokları içindeki kod satırları sadece eleman değişikliği yapmaktadır. Yani 0 ve 2. elemanlar yer değiştirilir. 6 3 5 2 4 1 8 7 9
Sonraki iterasyonda i = 1 olur ve else kısmı çalışır. Burada A[0] ve A[1] yer değiştirilir. 3 6 5 2 4 1 8 7 9
Sonraki iterasyonda i = 2 olur ve if bloğu içerisindeki else kısmı çalışır A[2]<A[4] ifadesi yanlıştır. Burada A[2] ve A[3] elemanlarının yerleri değişir. 3 6 2 5 4 1 8 7 9
Sonraki iterasyonda i = 3 olur ve else kısmı çalışır. Burada A[3] ve A[2] yer değiştirilir. 3 6 5 2 4  1 8 7 9
Sonraki iterasyonda i = 4 olur ve if bloğu içerisindeki if kısmı çalışır A[4]<A[6] ifadesi doğrudur. Burada A[4] ve A[6] elemanlarının yerleri değişir. 3 6 5 2 8 1 4 7 9
Sonraki iterasyonda i = 5 olur ve else kısmı çalışır. Burada A[5] ve A[4] yer değiştirilir. 3 6 5 2 1 8 4 7 9
Son iterasyonda i = 6 olur ve if bloğu içerisindeki if kısmı çalıĢır A[6]<A[8] ifadesi doğrudur. Burada A[6] ve A[8] elemanlarının yerleri değiĢir. 3 6 5 2 1 8 9 7 4
Bilgisayar Olimpiyatı 2025, 1. Aşama, Soru 39

[36-50] Sorular İçin Açıklama
- Soruları C programlama dili çerçevesinde cevaplayınız.
- Derleyici olarak gec 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 MAX_SIZE 9  void insert(int arr[MAX_SIZE], int value) {  int index = 0;  while (index != -1) {  if (arr[index] == 0) {  arr[index] = value;  return;  }  if (value < arr[index]) {  int ind = 2 * index + 1;  if (ind >= MAX_SIZE) return;  index = ind;  }  else {  int ind = 2 * index + 2;  if (ind >= MAX_SIZE) return;  index = ind;  }  }  int main() {  int arr[9] = {0,0,0,0,0,0,0,0,0,0};  insert(arr,6);  insert(arr,8);  insert(arr,9);  insert(arr,4);  insert(arr,5);  insert(arr,2);  insert(arr,7);  insert(arr,3);  insert(arr,1);  int i;  for(i=0; i<9; i++) {  printf("%d ", arr[i]);  }  return 0;  }
```
Yukarıdaki kod parçası çalıştığında ekrana aşağıdakilerden hangisini yazdırır?

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

Cevap: A 6 4 8 2 5 7 9 1 3

Çözüm:
Verilen insert fonksiyonu binary search tree (ikili arama ağacı)’nı diziler ile oluşturacak şekilde tasarlanmıştır.
insert(arr,6) sonucunda 6 ilk eleman olarak diziye eklenir.  6 0 0 0 0 0 0 0 0  insert(arr,8) sonucunda 8 arr[2] indeksine eklenir.  6 0 8 0 0 0 0 0 0  insert(arr,9) sonucunda 9 arr[6] indeksine eklenir.  6 0 8 0 0 9 0 0 0  insert(arr,4) sonucunda 4 arr[1] indeksine eklenir.  6 4 8 0 0 0 9 0 0  insert(arr,5) sonucunda 5 arr[4] indeksine eklenir.  6 4 8 0 5 0 9 0 0  insert(arr,2) sonucunda 2 arr[3] indeksine eklenir.  6 4 8 2 5 0 9 0 0  insert(arr,7) sonucunda 7 arr[5] indeksine eklenir.  6 4 8 2 5 7 9 0 0  insert(arr,3) sonucunda 3 arr[8] indeksine eklenir.  6 4 8 2 5 9 0 3  insert(arr,1) sonucunda 1 arr[7] indeksine eklenir.  6 4 8 2 5 8 9 1 3
Bilgisayar Olimpiyatı 2025, 1. Aşama, Soru 40

[36-50] Sorular İçin Açıklama
- Soruları C programlama dili çerçevesinde cevaplayınız.
- Derleyici olarak gec 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 f1(int n) {
int c = 0;
while (n) {
c += n & 1;
n >>= 1;
}
return c;
}
int f2(int n, int m) {
return n ^ (1 << m);
}
int main() {
int n = f2(26, 2);
printf("%d", f1(n));
return 0;
}
```
Yukarıdaki kod parçası hangi çıktıyı üretir?

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

Cevap: C 5

Çözüm:
26'nın ikiliye dönüşümünü şu şekilde adım adım yapabiliriz:

\[ 26 \div 2 = 13, \text{ kalan } 0 \]
\[ 13 \div 2 = 6, \text{ kalan } 1 \]
\[ 6 \div 2 = 3, \text{ kalan } 0 \]
\[ 3 \div 2 = 1, \text{ kalan } 1 \]
\[ 1 \div 2 = 0, \text{ kalan } 1 \]

Son olarak, kalanları alttan üste doğru sıralarsak 11010 ikili sayısı elde edilir.

Yani, 26 sayısının ikili (binary) karşılığı \textbf{11010}'dur.

f2(26,2) şeklinde çağırıldığında
\( 1 \ll 2 \) şeklinde shift edilip 100 olur. 26 (11010) ile 100 xor operasyonu yapıldığında:

\begin{verbatim}
   11010
   00100
xor-----
   11110
\end{verbatim}

f1 fonksiyonu bu değerle çağırıldığında döngünün her aşamasında son basamak 1 ile and işlemine tabi tutulup sonuç bulunur ve bir kez sağ shift işlemi ile son basamaktan kurtulur.

\begin{verbatim}
  11110         1111          111           11            1
  00001         0001          001           01            1
&-------      &-------      &-------      &-------      &-------
    0     +       1     +       1     +       1     +       1  =  4
\end{verbatim}
Bilgisayar Olimpiyatı 2025, 1. Aşama, Soru 41

[36-50] Sorular İçin Açıklama
- Soruları C programlama dili çerçevesinde cevaplayınız.
- Derleyici olarak gec 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 SIZE 4
void func(int matrix[SIZE][SIZE], int result[SIZE][SIZE])
{
int i, j;
for (i = 1; i < SIZE - 1; i++) {
for (j = 1; j < SIZE - 1; j++) {
int t = 0;
t += matrix[i-1][j];
t += matrix[i+1][j];
t += matrix[i][j-1];
t += matrix[i][j+1];
result[i][j] = t;
}
}
}
int main() {
int matrix[SIZE][SIZE] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12},
{13, 14, 15, 16}
};
int sonuc[SIZE][SIZE] = {0};
func(matrix, sonuc);
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
printf("%d\n", sonuc[i][j]);
}
}
return 0;
}
```
Yukarıdaki kod parçası çalıştığında her satırda ekrana sonuc dizisinin bir elemanını yazdırmaktadır. Program aşağıdaki değerlerden hangisini ekrana yazdırmaz?

Şıklar:
A) 24 | B) 28 | C) 36 | D) 40 | E) 44

Cevap: C 46

Çözüm:
Verilen fonksiyona matris gönderildiğinde iç içe olan iki döngü ilk olarak
i = 1, j = 1 değeri için çalışacak ve
matrix[i-1][j] yani matrix[0][1] = 2
matrix[i+1][j] yani matrix[2][1] = 10
matrix[i][j-1] yani matrix[1][0] = 5
matrix[i][j+1] yani matrix[1][2] = 7 değerlerinin toplamı 2+10+5+7 = 24
i = 1, j = 2 değeri için çalışacak ve
matrix[i-1][j] yanı matrix[0][2] = 3
matrix[i+1][j] yanı matrix[2][2] = 11
matrix[i][j-1] yanı matrix[1][1] = 6
matrix[i][j+1] yanı matrix[1][3] = 8 değerlerinin toplamı 3+11+6+8 = 28
i = 2, j = 1 değeri için çalışacak ve
matrix[i-2][j] yanı matrix[1][1] = 6
matrix[i+1][j] yanı matrix[3][1] = 14
matrix[i][j-1] yanı matrix[2][0] = 9
matrix[i][j+1] yanı matrix[2][2] = 11 değerlerinin toplamı 6+14+9+11 = 40
i = 2, j = 2 değeri için çalışacak ve
matrix[i-2][j] yani matrix[1][2] = 7
matrix[i+1][j] yani matrix[3][2] = 15
matrix[i][j-1] yani matrix[2][1] = 10
matrix[i][j+1] yani matrix[2][3] = 12 değerlerinin toplamı 7+15+10+12 = 44
olacak ve döngüler sonlanacaktır. Matrisin diğer elemanları da 0 olarak kalacaktır.
Yani program 36 değerini ekrana yazdıramayacaktır.
Bilgisayar Olimpiyatı 2025, 1. Aşama, Soru 42

[36-50] Sorular İçin Açıklama
- Soruları C programlama dili çerçevesinde cevaplayınız.
- Derleyici olarak gec 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 main() {
int i, j, k, count=0;
for(i=1; i<100; i=i<<1) {
for(j = i++; j<100; j=j<<2)
count++;
}
printf("%d", count);
return 0;
}
```
Yukarıdaki kod parçası hangi çıktıyı üretir?

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

Cevap: D 13

Çözüm:
Döngülerin içerisindeki count++ işlemi sadece aşağıdaki i ve j değerleri için toplamda 13 kez çalışacaktır.
i:2, j:1
i:2, j:4
i:2, j:16
i:2, j:64
i:5, j:4
i:5, j:16
i:5, j:64
i:11, j:10
i:11, j:40
i:23, j:22
i:23, j:88
i:47, j:46
i:95, j:94
Bilgisayar Olimpiyatı 2025, 1. Aşama, Soru 44

[36-50] Sorular İçin Açıklama
- Soruları C programlama dili çerçevesinde cevaplayınız.
- Derleyici olarak gec 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 SIZE 5
int main() {
char matrix[SIZE][SIZE] = {0};
for (int i = 0; i < SIZE; i++) {
for (int j = 0; j < SIZE; j++) {
if (j == i && i <= SIZE / 2) {
matrix[i][j] = 1;
}
if (j == SIZE - i - 2 && i <= SIZE / 2) {
matrix[i][j] = 1;
if (i > SIZE / 2 && j == SIZE / 2) {
matrix[i][j] = 1;
}
}
}
}
for (int i = 0; i < SIZE; i++) {
for ( int j = 0; j < SIZE; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
return 0;
}
```
Yukarıdaki kod parçacığı çalıştığında aşağıdakilerden hangisi ekrana yazdırılır?

Şıklar:
A) 10010 | B) 10010 | C) 10001 | D) 10100 | E) 10101

Cevap: A 10010

Çözüm:
Döngülerin i=0 ve j=0 değeri ile başlayacak ve aşağıdaki gibi ilerleyecektir.
i:0, j:0
i:0, j:1
i:0, j:2
i:0, j:3
i:0, j:4
i:1, j:0
i:1, j:1
i:1, j:2
i:1, j:3
i:1, j:4
i:2, j:0
i:2, j:1
i:2, j:2
i:2, j:3
i:2, j:4
i:3, j:0
i:3, j:1
i:3, j:2
i:3, j:3
i:3, j:4
i:4, j:0
i:4, j:1
i:4, j:2
i:4, j:3
i:4, j:4
İlk if bloğu i'nin j'ye eşit olduğu ve i'nin SIZE/2 ye küçük eşit olduğu yani 2 ye küçük eşit olduğu durumlarda dizinin elemanını 1 yapar. Sadece aşağıdaki durumlar:
i:0, j:0
i:1, j:1
i:2, j:2
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0
İkinci if bloğu j değerini SIZE - i - 2 olarak başlatır ve i <= SIZE / 2 oldukça devam eder.
j = 3 - i olarak başlar ve i <=2 iken çalışır. Bu durumda:
i = 0 için j = 3
i = 1 için j = 2
i = 2 için j = 1 durumlarında dizinin elemanları 1 yapılır.
1 0 0 1 0
0 1 1 0 0
0 1 1 0 0
0 0 0 0 0
0 0000
İkinci if bloğu j değerini SIZE - i - 2 olara k başlatır ve i <= SIZE / 2 oldukça devam eder.
j = 3 - i olarak başlar ve i <=2 iken çalısır. Bu durumda:
i = 0 için j = 3
i = 1 için j = 2
i = 2 için j = 1 durumlarında dizinin elemanları 2 yapılır.
1 0 0 1 0
0 1 0 0 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
Son if bloğu i > SIZE / 2 yani i > 2 ve j = SIZE / 2 yani j = 2 olduğunda çalışır. Bu durumda: i = 3 için j = 2 i = 4 için j = 2 durumlarında dizinin elemanları 1 yapılır. 
1 0 0 1 0
0 1 1 0 0
0 1 1 0 0
0 0 0 0 0
0 0 0 0 0
Bilgisayar Olimpiyatı 2025, 1. Aşama, Soru 45

[36-50] Sorular İçin Açıklama
- Soruları C programlama dili çerçevesinde cevaplayınız.
- Derleyici olarak gec 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 f2(int a, int b) {
if (a == 0)
return b;
return f2(a - 1, b + a);
}
int f1(int x, int y) {
if (--x > y++) && x-- == ++y) {
return f2(x, y);
} else {
return f2(y, x);
}
}
int main() {
int x = 5, y = 2;
printf("%d", f1(x, y));
return 0;
}
```
Yukarıdaki kod parçası ekrana aşağıdakilerden hangisini yazdırır?

Şıklar:
A) 7 | B) 8 | C) 10 | D) 11 | E) 13

Cevap: C 10

Çözüm:
Program f1(5,2) değeri ile çağırılır. f1 içerisindeki if kısmında:
if (--x > y++) && x-- == ++y)
--x > y++
4 > 2 doğru x:4 y:3 olur. y kullanımdan sonra artar.
x-- == ++y
4 == 4 doğru olur x:3: y:4 olur. x kullanımdan sonra azalır.
Doğru && Doğru işleminin sonucu Doğru olur ve if bloğu çalışır.
Program f2(3,4) sonucunu yazdırır.
f2(3, 4) sonucunu hesaplarsak.
a = 0 olduğunda b değeri dönecek ancak değilse f2(a-1,b+a) hesaplanacak.
f2(3,4) = f2(2,3+4), f2(2,7)
f2(2,7) = f2(1, 2+7) = f2(1,9)
f2(1,9) = f2(0, 1+9) = f2(0,10)
f2(0,10) = 10
Bilgisayar Olimpiyatı 2025, 1. Aşama, Soru 46

[36-50] Sorular İçin Açıklama
- Soruları C programlama dili çerçevesinde cevaplayınız.
- Derleyici olarak gec 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 main() {
int arr[] = {1, 2, 3, 4, 5};
int *ptr1 = arr + 3;
int *ptr2 = ptr1 - 2;
printf("%d\n", *(ptr2 + (*ptr1 - *ptr2)));
return 0;
}
```
Yukarıdaki kodun ekran çıktısı nedir?

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

Cevap: E 4

Çözüm:
Bu kodun açıklaması şu şekildedir:
int arr[] = {1, 2, 3, 4, 5};
Bu satırda, arr adında bir tamsayı dizisi (integer array) oluşturuluyor ve başlangıç değerleri atanıyor. Dizi, [1, 2, 3, 4, 5] elemanlarını içeriyor.
int *ptr1 = arr + 3;
ptr1 adında bir tamsayı göstericisi (integer pointer) oluşturuluyor.
arr + 3 ifadesi, arr dizisinin başlangıç adresine 3 tamsayılık yer ekliyor. Bu, ptr1'in arr dizisinin 4. elemanını (diziler 0'dan başladığı için arr[3]) işaret etmesini sağlıyor. Yani, ptr1'in gösterdiği değer 4'tür.
int *ptr2 = ptr1 - 2;
ptr2 adında başka bir tamsayı göstericisi oluşturuluyor.
ptr1 - 2 ifadesi, ptr1'in gösterdiği adresten 2 tamsayılık yer çıkarıyor. Bu, ptr2'nin arr dizisinin 2. elemanını (diziler 0'dan başladığı için arr \( ^{[1]} \) ) işaret etmesini sağlıyor. Yani, ptr2'nin gösterdiği değer 2'dir.
*ptr1
ptr1'in gösterdiği adresteki değeri verir. Bu, 4'tür.
*ptr2
ptr2'in gösterdiği adresteki değeri verir. Bu, 2'dir.
*ptr1 - *ptr2
4 - 2 işleminin sonucunu verir, yani 2'dir.
ptr2 + (*ptr1 - *ptr2)
ptr2'nin gösterdiği adrese 2 tamsayılık yer ekliyor. ptr2 başlangıçta arr[1]'i gösteriyordu, bu nedenle ptr2 + 2, arr[3]'ü gösterir.
* (ptr2 + (*ptr1 - *ptr2))
ptr2 + 2 ifadesinin gösterdiği adresteki değeri verir. Bu, arr[3]'ün değeri olan 4'tür.
printf("%d\n", * (ptr2 + (*ptr1 - *ptr2));
Sonuç olarak, 4 ekrana yazdırılır.