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

## [31-35 soruları için açıklama]
Verilen bir **S** karakter dizisinin içinde daha küçük bir **P** dizisinin karakterleri sırayla fakat ardışık olma şartı olmadan geçiyorsa bu durumu **gizli alt-dizi** olarak adlandırmaktayız. Mesela aşağıdaki **S** dizisinde
### gmtcoarbbhpoheaccvbttya
12345678901234567890123
**merhaba** dizisi [2,4,7,10,15,19,23] indislerinde gizli alt-dizi olarak geçmektedir. Aynı **merhaba** dizisi ayrıca [2,4,7,13,15,19,23] indislerinde de gizli alt-dizi olarak geçmektedir. Verilen bir **P** dizisinin bir **S** dizisi içinde kaç kez gizli alt-dizi olarak geçtiğini aşağıdaki özyineli yöntem ile bulabiliriz. **F(i,j)** fonksiyonu **P** dizisinin ilk **i** karakterinin **S** dizisinin ilk **j** karakteri içinde kaç kez gizli alt-dizi olarak geçtiğini göstersin. |**P**| de bir dizideki karakter sayısını ve **P[i]** **P** dizisinin **i**. karakterini göstersin.
\[F(0,0) = 1\]
\[F(i,0) = 0 \quad 1'den |P|'ye kadar olan i değerleri için\]
\[F(0,j) = 1 \quad 1'den |S|'ye kadar olan j değerleri için\]
\[F(i,j) = F(i,j-1) \text{ eğer } P[i] S[j]'den farklı ise\]
\[F(i,j) = F(i-1,j-1) + F(i,j-1) \text{ eğer } P[i] \text{ ve } S[j] \text{ aynı karakter ise}\]
Bir **P** dizisinin bir **S** dizisi içinde kaç kez gizl i alt-dizi olarak geçtiğini bulmak için **F(|P|,|S|)** değerini hesaplamak yeterli olacaktır.
Sadece ‘A’ karakterlerinden oluşan **M** uzunluğundaki bir dizide sadece ‘A’ karakterlerinden oluşan **N** uzunluğundaki bir dizi kaç kez gizli alt-dizi olarak geçer?
A) **M**!
B) **N**!
C) **M**! / **N**!
D) **M**! / ((**M**-**N**)!-**N**!)
E) **M**!-**N**!
Aynı karakterlerden oluşan iki dizi verildiğinde küçük dizinin büyük dizi içerisinde kaç kez gizli alt-dizi olarak bulunduğu sorusu “M adet karakter içinde kaç farklı şekilde N adet karakter seçebiliriz?” sorusu ile aynı soru haline gelir. Bu da **M**’nin **N**’li kombinasyonuna eşittir yani cevap D şıkkıdır.

---

‘DACCBBAADCBADCCBA’ dizisinde ‘ACB’ dizisi kaç kez alt-dizi olarak geçer?

Şıklar:
A) 10 | B) 14 | C) 20 | D) 22 | E) 32

Cevap: D 22

Çözüm:
Açıklamalarda verilen özyineli fonksiyonu kullanıp 4x18 boyutundaki aşağıdaki matrisi doldurduğumuzda cevabın matrisin sağ alt köşesinde bulunan 22 olduğunu görürüz.
<table><tr><td></td><td>-</td><td>D</td><td>A</td><td>C</td><td>C</td><td>B</td><td>B</td><td>A</td><td>A</td><td>D</td><td>C</td><td>B</td><td>A</td><td>D</td><td>C</td><td>C</td><td>B</td><td>A</td></tr><tr><td>-</td><td>1</td><td>1</td><td>1</td><td>1</td><td>1</td><td>1</td><td>1</td></tr><tr><td>A</td><td>0</td><td>0</td><td>1</td><td>1</td><td>1</td><td>1</td><td>2</td><td>3</td><td>3</td><td>3</td><td>3</td><td>4</td><td>4</td><td>4</td><td>4</td><td>5</td><td>5</td></tr><tr><td>C</td><td>0</td><td>0</td><td>0</td><td>1</td><td>2</td><td>2</td><td>2</td><td>2</td><td>2</td><td>5</td><td>5</td><td>5</td><td>9</td><td>13</td><td>13</td><td>13</td><td>13</td></tr><tr><td>B</td><td>0</td><td>0</td><td>0</td><td>0</td><td>0</td><td>2</td><td>4</td><td>4</td><td>4</td><td>4</td><td>9</td><td>9</td><td>9</td><td>9</td><td>9</td><td>22</td><td>22</td></tr></table>
Bilgisayar Olimpiyatı 2019, 1. Aşama, Soru 36

[36-50 soruları iç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.

---

Aşağıdaki program ekrana kaç satırlık çıktı yazar?
```c
int main()
{
int i;
for(i=15; i; i=i-4)
{
printf("%d\n", i);
}
return 0;
}
```

Şıklar:
A) 15 | B) 12 | C) 9 | D) 6 | E) Sonsuz

Cevap: E Sonsuz

Çözüm:
for döngülerinin koşul kısmının (ortadaki kısım) 0 olması durumunda döngü sonlanır. Yukarıda görülen döngü 15'den başladığı ve her seferinde 4 azaldığı için i hiçbir zaman 0 olmayacaktır. Bu yüzden döngü sonsuz döngüdür.
Bilgisayar Olimpiyatı 2019, 1. Aşama, Soru 37

[36-50 soruları iç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.

---

Aşağıdaki programın çıktısı nedir?
```c
int main()
{
int y = 6;
printf("%d, %d, %d", y, y<<3, y>>2);
return 0;
}
```

Şıklar:
A) 6, 48, 1 | B) 48, 6, 1 | C) 6, 24, 1 | D) 6, 24, 2 | E) 1, 24, 6

Cevap: A 6, 48, 1

Çözüm:
<< operatörü verilen sayıyı sola, >> ise sağa kaydırır. Kaç bit kaydıracağı verilen parametre ile belirlenir. Verilen koda göre y ilk olarak 3 bit sola kaydırılacak, yani 3 kez 2 ile çarpılacak, ve dolayısıyla ekrana 48 basılacak, ikinci durumda 2 bit sağa kayacak, yani 2 kez 2'ye bölünecek, ve ekrana 1 basılacaktır.
Bilgisayar Olimpiyatı 2019, 1. Aşama, Soru 38

[36-50 soruları iç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.

---

Aşağıdaki programın çıktısı şıklardan hangisinde doğru olarak verilmiştir?
```c
int main() {
int x = 1, y = 1, z = 2, i = 0;
for (i = 2; i < 5; i++)
printf("%d ", y++);
while (x < y) {
for (i = 4; i > z; --i)
printf("%d %d ", i, z);
x += 1;
}
return 0;
}
```

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

Cevap: D 1 2 3 4 2 3 2 4 2 3 2 4 2 3 2

Çözüm:
İlk for döngüsü i=2'den başlayıp 2,3 ve 4 değerleri için 3 kere dönecek ve her seferinde y'nin değerini ekrana basıp, sonra y'nin değerini 1 artıracaktır. Bu durumda ilk döngü ekrana 1 2 3 basar. Döngü bittiğinde y=4, x=1, i=5 ve z=2'dir. Bu durumda while döngüsü, her seferinde x 1 arttığı için 3 kere çalışacaktır. While döngüsünün her iterasyonunda içindeki for döngüsü i=4'den, i, z'ye eşit olana kadar (2 olana kadar) dönecektir. Dolayısıyla içteki for döngüsü başlangıçtan bitişe kadar ekrana 4 2 3 2 basacaktır. Bunu da üç kere basacağından while döngüsü ekrana 4 2 3 2 4 2 3 2 4 4 2 3 2 basacaktır. Sonuç olarak ekrana 1 2 3 4 2 3 2 4 2 2 3 2 4 2 3 2 basılacaktır.
Bilgisayar Olimpiyatı 2019, 1. Aşama, Soru 40

[36-50 soruları iç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.

---

İkili arama, sıralı bir sayı dizisi içinde, verilen bir sayının olup olmadığını dönebilen verimli bir yöntemdir. Sayıyı aramak için ilk olarak sıralı dizinin ortasına bakılır ve aranan sayı, ortadaki sayıdan küçükse, dizinin sol tarafı (daha küçük indeksli tarafı) için aynı arama tekrar edilir (özüneleme, "recursion"). Aranan sayı, ortadaki sayıdan büyükse de, dizinin sağ tarafı (daha büyük indeksli tarafı) için aynı arama tekrar edilir. (özüneleme, "recursion"). Aşağıda, küçükten büyüğe sıralı bir dizi üzerinde ikili arama yapan bir C fonksiyonu (ikiliArama) veriliyor. Fonksiyonun amacı, verilen x parametresini arr dizisi içindeki le ve ri indeksleri arasında aramaktır. Verilen sayıyı (x) bulursa, sayının indeksini, bulamazsa -1 dönmesi gerekiyor. Hangi satırlarda yapılacak değişikliklerle fonksiyon doğru çalıştır?
```c
1 int ikiliArama(int arr[], int le, int ri, int x) {
2     if (ri >= le) {
3         int mid = le + (ri - le) / 2;
4         if (arr[mid] == x)
5             return x;
6         if (arr[mid] > x)
```
7 return ikiliArama(arr, mid - 1, le, x);
8 return ikiliArama(arr, mid + 1, ri, x);
9 return -1;
}

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

Cevap: C 5, 7

Çözüm:
Fonksiyon, sayı bulunursa sayının indeksini dönmelidir. Fakat 5. satırda sayının kendisi dönülmektedir. Bu satırı "return mid;" olarak değiştirmek gerekir. İkinci yanlış satır ise özyineleme çağrısı olan 7. satırdır. Bu satırda aranan sayının dizinin sol tarafında olabileceği anlaşılmış olduğundan özyineleme çağrısı "return ikiliArama(arr, le, mid-1, x)" olarak değiştirilmelidir.
Bilgisayar Olimpiyatı 2019, 1. Aşama, Soru 41

[36-50 soruları iç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.

---

Aşağıdaki programın çıktısı nedir?
```c
int main() {
int dizi[] = {2, 4, 6, 8, 10};
int i = 0, N = sizeof(dizi)/sizeof(int);
for (i = 0; i < N; i++)
odzi[i] = dizi[(2*N-(i+1)) % N];
for (i = 1; i <= N; i++)
printf("%d", dizi[N-i]);
return 0;
}
```

Şıklar:
A) 1097910 | B) 1086810 | C) 98789 | D) 97579 | E) 1088810

Cevap: B 1086810

Çözüm:
N dizideki eleman sayısına eşit olacağından, ilk for döngüsünde i=0,1,2,3,4 için ((2*N-(i+1) % N) ifadesi sırasıyla 4,3,2,1,0 değerlerini alacaktır. Bu durumda, dizinin elemanları ilk döngü sonunda 10,8,6,8,10 olacaktır. Dizinin elemanlarını sondan başa doğru ekrana basan ikinci döngünün çıktısı da 1086810 olacaktır.
Bilgisayar Olimpiyatı 2019, 1. Aşama, Soru 42

[36-50 soruları iç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.

---

Aşağıdaki programın çıktısı nedir?
```c
int degistir1(int x) {
return x+=1;
}
void degistir2(int y) {
y = 2;
}
void degistir3(int *x) {
x[0]++;
}
int main() {
int x = 5, y = 3;
int arr[] = {1,2,3};
x = degistir1(x);
printf("%d ", x);
degistir2(y);
printf("%d ", y);
printf("%d ", degistir1(arr[0]));
degistir3(arr);
printf("%d ", arr[0]);
return 0;
}
```

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

Cevap: B 6 3 2 2

Çözüm:
degistir1 çağrısından sonra x'in değeri 6 olacaktır. degistir2 çağrısı main metodu içindeki y değerini etkilemeyecektir. degistir1(arr[0]) çağrısı arr'nin ilk elemanının değerini değiştirmeyecektir. Son olarak degistir3 çağrısı diziye bir gösterici üzerinden erişeceği için dizinin elemanını değiştirecek ve arr'nin ilk elemanı kod sonunda 2 olacaktır. Dolayısıyla ekranda 6 3 2 2 çıktısı görülecektir.
Bilgisayar Olimpiyatı 2019, 1. Aşama, Soru 43

[36-50 soruları iç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.

---

Aşağıdaki programın çıktısı ne olur?
int main() {
int a, b, c, d;
a = b = c = d = 1;
a = ++b > 1 || ++c > 1 && ++d > 1;
printf("%d%d%d%d", a, b, c, d);
return 0;
}

Şıklar:
A) Derleme-zamani hatası verir. | B) 1222 | C) 0221 | D) 0211 | E) 1211

Cevap: E 1211

Çözüm:
Bütün değişkenlerin değeri ilk başta 1'dir. Dolayısıyla mantık operatörleri içeren ifadede mantıksal "veya" operatorü nedeniyle soldaki operand doğru olduğunda ifadenin geri kalannın göz ardı edileceği kuralı nedeniyle sadece ++b > 1 ifadesi çalıştırılıp, diğer ifadeler çalıştırılmayacak, sonuç olarak ekrana 1211 basılacaktır.
Bilgisayar Olimpiyatı 2019, 1. Aşama, Soru 44

[36-50 soruları iç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.

---

Aşağıdaki programın çıktısı nedir?
```c
int g(char *s) {
int i = 0, c = 0;
while (i < strlen(s)-1) {
if (s[i] < s[i+1]) {
c++;
i++;
}
return c;
}
int f(int x) {
return x>1?x:0;
}
int main() {
char *sehirPtr[4] = {"ankara", "erzurum", "izmir", "van"};
int i = 0;
for (i = 3; i >= 0; i--) {
printf("%d ", f(g(sehirPtr[i])));
}
return 0;
}
}
```

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

Cevap: B 0 2 3 2

Çözüm:
g fonksiyonu verilen parametre içindeki dizginin her i ve i+1'inci harflerini sırayla kontrol edip, eğer i. karakter i+1'inci karakterden küçükse (alfabetik olarak önce ise) c'yi artırıyor. sehirPtr dizisindeki dizgileri sondan başa doğru fonksiyona gönderdiğimizde ve bunların çıktılarını da f fonksiyonuna gönderdiğimizde çıktı olarak 0 2 3 2 görülecektir. İlk sayı 1'den küçük olduğu için f fonksiyonu 0 dönecektir.
Bilgisayar Olimpiyatı 2019, 1. Aşama, Soru 45

[36-50 soruları iç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.

---

Aşağıdaki kod ile ilgili hangisi doğrudur?
```c
#define N 2
void f(int A[][N], int B[][N], int C[][N]) {
int i, j, k;
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
C[i][j] = 0;
for (k = 0; k < N; k++) {
C[i][j] += A[i][k]*B[k][j];
}
}
}
int main() {
int A[N][N] = { {1, 2}, {4, 6} };
int B[N][N] = { {7, 1}, {3, 9} };
int C[N][N];
int i, j;
f(A, B, C);
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
printf("%d ", C[i][j]);
}
}
return 0;
}
}
```

Şıklar:
A) Çıktı olarak 13 19 46 58 üretir. | B) Çıktı olarak 13 46 19 58 üretir. | C) Çalışma-zamanı hatası verir. | D) Çıktı olarak 7 2 12 54 üretir. | E) Çıktı olarak 7 12 2 54 üretir.

Cevap: A Çıktı olarak 13 19 46 58 üretir.

Çözüm:
Dikkatle incelenirse f fonksiyounun verilen iki matrisin çarpımını hesapladığı görülecektir. Daha sonra sonuç matrisini satır sırasıyla ekrana basmaktadır. Bu yüzden çıktı 13 19 45 58 olacaktır.
Bilgisayar Olimpiyatı 2019, 1. Aşama, Soru 46

[36-50 soruları iç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.

---

Aşağıdaki C dilinde yazılmış aritmetik ifadede hangi boşluklara açma ve kapama parantezleri konmalıdır ki ifadenin sonucu 4.2 olsun? Boşluklar alt çizgi ile belirtilmiştir ve sorunun cevabını belirtebilmek için 1'den 10'a numaralandırılmışlardır.
```
3_ + 2.4_ /_3_ + 12.0_ /_5_
1 2 3 4 5 6 7 8 9 10
```

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

Cevap: D 1 ve 4

Çözüm:
4.2 elde edilebilmesi için öncelikle 3 ve 2.4'un toplanması ve sonra sonucun 3'e bölünerek sonuca 12.0/5=2.4'ün eklenmesi gereklidir. 3 ve 2.4 toplandıktan sonra diğer bütün işlemler aritmetiksel öncelik sırasına uymaktadır. 3 ve 2.4'ün öncelikli olarak toplanması aritmetik öncelik sırasına uymadığından bu işlemin önce gerçekleştirilebilmesi için 1 ve 4 pozisyonlarına parantez konulmalıdır.
Bilgisayar Olimpiyatı 2019, 1. Aşama, Soru 47

[36-50 soruları iç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.

---

Aşağıdaki programın çıktısı nedir?
```c
void f(int n) {
if (n>0) {
f(--n);
printf("%d ", n);
f(--n);
}
}
int main() {
f(4);
}
```

Şıklar:
A) 0 1 2 3 | B) 0 1 2 0 3 0 1 | C) 1 0 3 0 2 0 1 | D) Sonsuz döngüye girer | E) Derleme-zamanı hatası verir

Cevap: B 0 1 2 0 3 0 1

Çözüm:
f fonksiyonu 4 değeri ile çağrıldığında fonksiyon içinde ilk olarak özyineli olarak 3, 2, 1, 0 değerleri için çağrılır, 0 değerli çağrı hiçbir şey basmadan döner ve ilk olarak n'nin o anki değeri olan 0 ekrana basılır. Daha sonraki f(-1) çağrısı yine bir şey basmadan döner ve f(1) tamamlanmış olur. f(2) içinde n'nin o anki değeri olan 1
ekrana basılır ve sonraki f(0) çağrısı bir şey basmadan döner ve f(2) tamamlanmış olur. Sonra ekrana 2 basılır ve f(1) çağrılır. f(1) yine ekrana sadece 0 basar. f(3) de tamamlandıktan sonra ekrana 3 basılır ve f(2) çağrılır. Yine bir önceki aşamadaki değerler 0 ve 1 art arda basılırlar ve f(4) de tamamlanmış olur. Ekrana başka bir şey basılmadan ve sonsuz döngüye girmeden program sonlanmış olur.
Bilgisayar Olimpiyatı 2019, 1. Aşama, Soru 48

[36-50 soruları iç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.

---

Aşağıdaki programın çıktısı nedir?
int main()
{
int n=0;
while (n<6)
{
if (n%2) n++;
else if (n>2) n += 3;
else ++n;
printf("%d ", n);
}
}

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

Cevap: A 1 2 3 4 7

Çözüm:
Kodda tek sayılarda n değeri 1 arttırılmakta, 2'den büyük olan çift sayılarda 3 arttırılmakta, bu durumların dışında da yine 1 arttırılmaktadır. Sonra n yazdırılmakta ve bu döngü n 6'dan küçük olduğu müddetçe devam etmektedir. İlk olarak 0 ile girildiğinde birinci ve ikinci if doğru olmadığından n 1 arttırılır ve ekrana 1 basılır. Daha sonra n tek sayı olduğundan 1 arttırılır ve ekrana 2 basılır. Daha sonra n çift olduğu için ve hala 2'den büyük olmadığı için yine 1 arttırılır ve ekrana 3 basılır. Daha sonra n tek olduğu için 1 arttırılır ve ekrana 4 yazılır. n 4 iken ikinci if doğru olur ve n 3 arttırılıp 7 olur. 7 ekrana basılır ve daha sonra döngüden çıkılır.
Bilgisayar Olimpiyatı 2019, 1. Aşama, Soru 49

[36-50 soruları iç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.

---

Aşağıdaki fonksiyonun amacı ne olabilir?
```c
int f (char *s) {
char bosluk = ' ';
int k;
int i = 1;
k = strlen(s) - 1;
while (k >= 0 && i) {
if (s[k] == bosluk)
--k;
else
i = 0;
}
if (i) return -1;
else return k;
}
```

Şıklar:
A) Verilen bir karakter dizisindeki boşlukların sayısını bulmak | B) Verilen bir karakter dizisindeki son boşluğun indisini bulmak | C) Verilen bir karakter dizisindeki ilk boşluğun indisini bulmak | D) Verilen bir karakter dizisindeki boşluktan farklı ilk karakterin indisini bulmak | E) Verilen bir karakter dizisindeki boşluktan farklı son karakterin indisini bulmak

Cevap: E Verilen bir karakter dizisindeki boşluktan farklı son karakterin indisini bulmak

Çözüm:
Kodda verilen bir karakter dizisinin sonra karakterinden başlayıp ilk karakterine giden bir döngü vardır. i değeri de bu döngüden erken çıkmak için kullanılan bir değişkendir. Döngüden erken çıkıldığında i 0 olur ve bu durumda k'nın son değeri fonksiyondan döner. Döngüden erken çıkılmazsa yani k 0 olana kadar ilk karaktere kadar gidilip döngüden çıkılmadan k -1 olursa o zaman fonksiyon -1 döner. Döngüden erken çıkma koşulu kodda görülebileceği gibi k. karakterin değerinin boşluk olmamasıdır. Yani bu fonksiyon sondan başlayıp boşluk gördükçe önceki karakterlere giden ve ilk boşluk olmayan karakterde döngüden çıkıp boşluk olmayan karakterin indisini döner. Diğer bir deyişle karakter dizisindeki boşluktan farklı son karakterin indisini döner.
Bilgisayar Olimpiyatı 2019, 1. Aşama, Soru 50

[36-50 soruları iç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.

---

Aşağıdaki programın çıktısı nedir?
int main() {
int i;
char str[] = "0123";
for(i=0; str[i]!=0; i++) {
switch(str[i]) {
case '0':
printf("A");
case '1':
printf("B"); break;
default:
printf("%c", str[i]);
case '2':
printf("C"); break;
}
}
}

Şıklar:
A) ABC3 | B) AB | C) ABBC3C | D) ACBC3 | E) Derleme-zamanı hatası verir

Cevap: C ABBC3C

Çözüm:
switch-case'de eğer break yazılmaz ise devam eden case ifadeleri de çalıştırılır. Case ifadeleri ilk doğru sağlandığında çalıştırılır. Program sırayla "0123" karakter dizisinin karakterlerine bakar. İlk karakter '0' olduğu için ilk durum doğru olur ve A yazılır ve devamında break olmadığı için bu karakter için aynı zamanda B de ekrana basılır. '1' için sadece B karakteri ekrana basılır. '2' C basılır ve son olarak '3' için 3C karakterleri ekrana basılır. Sonuç olarak ABBC3C basılmış olur.
Bilgisayar Olimpiyatı 2020, 1. Aşama, Soru 1

5 kırmızı ve 5 mavi top içeren bir torbadan bir kerede 6 tane topu rastgele seçersek, seçilen toplardan 2 tanesinin kırmızı olma ihtimali nedir?

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

Cevap: D 5/21

Çözüm:
Çözüm \(\frac{5}{21} \left( \frac{2}{10} \right) = \frac{5 \cdot 4}{10 \cdot 9 \cdot 8 \cdot 7} = \frac{5}{21}\) işlemi ile bulunur.
Bilgisayar Olimpiyatı 2020, 1. Aşama, Soru 2

Önerilen yeni bir algoritma, enerji dağıtım ağlarına saldırı olup olmadığını bulmak için geliştirilmiş ve pilot bölge olan Peraplis Adalarında denenmektedir. Peraplis Adalarında saldırı olma ihtimalinin 3/10 olduğu bilinmektedir. Bu tarz sızıntıları engellemek için iletişim ağına gelen bütün bağlantılar sistemin kontrolünden geçmektedir. Gelen bir paket saldırı amacı içeriyorsa algoritma 2/5 ihtimalle bu paketin zararlı bir paket olduğunu bulmaktadır. Eğer saldırı amacı içermiyorsa, sistem 6/7 ihtimalle paketin zararsız olduğunu söylemektedir. Bu bilgilere göre sistemin toplam doğruluk oranı yüzde kaçtır?

Şıklar:
A) %72 | B) %66 | C) %52 | D) %32 | E) %24

Cevap: A %72

Çözüm:
A şıkkı 72
\(\left( \frac{3}{10} \cdot \frac{2}{5} \right) + \left( \frac{7}{10} \cdot \frac{6}{7} \right)\)
Bilgisayar Olimpiyatı 2020, 1. Aşama, Soru 3

KATARAK kelimesindeki harflerin yerleri değiştirilerek anlamlı veya anlamsız 8 harfli üretilebilecek kelimelerin kaç tanesinde K harfini takip eden ilk harf A harfidir?

Şıklar:
A) 24 | B) 48 | C) 60 | D) 120 | E) 720

Cevap: C 60

Çözüm:
C şıkkı 60
KA harflerini hep birlikte düşünürsek toplam harf sayısı 2x(KA), A, T, R olarak değerlendirilebilir ve toplam 5 harfimiz olmuş olacaktır. Tekrarlı permütasyon gereği cevap  \( \frac{5!}{2!*1!*1!} \)  olacaktır.
Bilgisayar Olimpiyatı 2020, 1. Aşama, Soru 4

\( (a + 2b + c)^{5} \)  açılmında yer alan  \( ab^{2}c^{2} \)  teriminin katsayısı kaçtır?

Şıklar:
A) 32 | B) 40 | C) 80 | D) 120 | E) 160

Cevap: D 120

Çözüm:
D şıkkı 120
\( a^{1}(2b)^{2}c^{2} \)  terimi sorulmaktadır. Burada b teriminin katsayısı 2 olduğu için  \( 2^{2}a^{1} \)  olunun katsayıyla çarpılacaktır. Terimin katsayısı da 2 adet 2li tekrar olduğu için  \( \frac{5!}{2!*2!} \)  işleminin sonucuyla bulunacaktır.
Bilgisayar Olimpiyatı 2020, 1. Aşama, Soru 5

Lise döneminde iyi arkadaş olan Burcu, Ali, Zeynep, Cavit ve Ebru üniversite sınavına girdikten sonra her biri farklı bir bölüme (Mühendislik, Mimarlık, Matematik, Tarih, Türk Dili ve Edebiyatı) girmeye hak kazanmıştır. Üniversiteye girdikten sonra kimin hangi bölümü kazandığına dair kendi aralarında görüşüyorlar. Görüşme sonunda herkesin gittiği bölüm ortaya çıkıyor.
Ali: Ebru Mühendislikte değil
Burcu: Zeynep Türk Dili ve Edebiyatı bölümüne gitti
Ebru: Cavit Mimarlık bölümünde
Zeynep: Ali Tarih bölümüne katıldı
Cavit: Ben Türk Dili ve Edebiyatı bölümünde değilim
Mimarlık bölümünü kazanan kişinin doğru söylediği ve bu isimlerden biri hariç kalanların yanlış bilgi verdiği biliniyorsa Burcu'nun kazandığı bölüm hangisidir?

Şıklar:
A) Mühendislik | B) Mimarlık | C) Matematik | D) Tarih | E) Türk Dili ve Edebiyatı

Cevap: C Matematik

Çözüm:
Burcu Matematik bölümünü kazanmıştır. Verilen ifadelere göre sadece Mimarlık bölümünü kazanan kişi doğru söylemektedir. Cavit TDE bölümünde olmadığını söylemektedir, bunun doğru olma ihtimali yoktur dolayısıyla Cavit'in TDE bölümünde olduğu çıkarılabilecektir. Aynı şekilde Ebru'nun da doğruyu söylemediği ve Mimarlık bölümünde olmadığı çıkarılabilecektir. Benzer bir durum Burcu için de geçerlidir, çünkü Cavit TDE bölümündedir ve iki kişi aynı bölümde değildir. Bu durumda Ali veya Zeynep'ten birisi doğru söylemektedir. Doğru söyleyen Ali olsaydı herkesin bölümünü çıkaramayacaktık. Bu nedenle Zeynep doğru söylüyor ve Mimarlık bölümünde ve Ali Tarih bölümünde. Ali doğruyu söylemediğine göre Ebru Mühendislik bölümünde olacak ve sonuç olarak ta Burcu Matematik bölümünü kazanmış olacaktır.
Bilgisayar Olimpiyatı 2020, 1. Aşama, Soru 6

Bir torbadaki 6 elmadan 2'si çürüktür. Torbadan tek seferde rastgele 3 elma aldığımızda bu 3 elmanın hiçbirinin çürük olmama ihtimali nedir?

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

Cevap: A 1/5

Çözüm:
Çözüm \(\frac{4}{3} = \frac{4}{6 \cdot 5 \cdot 4} = \frac{1}{20} = \frac{1}{5}\) işlemi ile bulunur.
Bilgisayar Olimpiyatı 2020, 1. Aşama, Soru 7

Yağmurlu havalarda postacının eve uğrama ihtimali 0.3'tür. Yağmursuz havalarda uğrama ihtimali ise 0.8'dir. Yarın 0.6 ihtimalle hava yağmursuz olacaksa, postacının yarın eve uğrama ihtimali nedir?

Şıklar:
A) 0.18 | B) 0.48 | C) 0.6 | D) 0.7 | E) 0.8

Cevap: C 0.6

Çözüm:
Çözüm 0.6 × 0.8 + 0.4 × 0.3 = 0.6 ile bulunur.