Standart C Programlama Dili


4.P. Problemler

1. Altkısım 4.2.1’in sonundaki printf deyiminin çıktısı

4! = 24

şeklinde olur. Bir an için, fakt’ın sayi değişkeninin değerini gerçekten değiştirdiğini varsayın; bu durumda da çıktının aynı olacağını söyleyebilir miyiz?

2. C dilinde bir fonksiyon çağrısı esnasında verilen argümanların sayı ve tipinin bildirimdeki ile aynı olmasına gerek yoktur. Ancak, çok gerekmedikçe bu özelliği kullanmak iyi değildir. printf kütüphane fonksiyonu buna bir örnektir. Burada, sizden (sayısı belli olmayan) argümanların enbüyüğünü döndüren maks adında bir fonksiyon yazmanızı istiyoruz. Listenin sonunu belirtmek için çağrıdaki son argüman her zaman sıfır olacaktır. Örnekler: maks(15,-62,21,57,43,0)==57; maks(0)==0; maks(-10,0)==-10. Yazacağınız fonksiyonun tanımında tek bir parametre belirtmeniz yeterli olacaktır. Arkadan gelen argümanları adres alma ve dolaylama işleçlerini kullanarak elde edebilirsiniz. Bu fonksiyonun taşınabilir olmadığına dikkat edin.

Dikkat: Eski bir Microsoft C derleyicisinde (ve muhtemelen diğer birçok eski C derleyicilerinde) argümanlar bellekte arka arkaya olan yerlerde geçirilirler; yani, ikinci argüman ilk argümanın hemen arkasında saklanır vs. Eğer böyle eski bir derleyici kullanıyorsanız, burada anlatılan deneme anlamlı olabilir. Ancak, yeni derleyicilerin çoğu argüman geçirmede çok daha karmaşık yöntemler kullanır; bu yüzden yapacağınız denemeler başarılı olmayacaktır.

3. Eski bir derleyici ile derlendiğinde,

#include <stdio.h>

int main (void)
{
  { int y = 1994; }
  {
    int i;
    printf("%d\n", i);
  }
  return 0;
}

programı

1994

çıktısını vermekte idi. Bunu açıklayabilir misiniz? (Ancak, yeni derleyiciler derleme sırasında uyarı mesajları verecektir. Program derlendiğinde ise muhtemelen yukarıdaki çıktıyı vermeyecektir.)

4. Eski bir derleyici ile derlendiğinde,

#include <stdio.h>

int main (void)
{
  { int a1=111, a2=222, a3=333, a4=444; }
  {
    register int r1, r2, r3, r4;
    printf("%d %d %d %d\n", r1, r2, r3, r4);
  }
  return 0;
}

programı

131 3982 333 444

çıktısını vermekte idi. Bu size register değişken tanımı konusunda neyi düşündürür? r3 değişkeni bir yazmaçta mı saklanmaktadır?

5. Bölüm 0’ın başında verilen programın ne yaptığını anlatın.

6. Bir önceki bölümde anlatılan ve C kütüphanesinde bulunan strcpy, strcmp, strcat ve strlen fonksiyonlarının işlevsel benzerlerini yazın.

7. 8 vezir programını, yerlestir özçağrılı fonksiyonu içindeki sira değişkeninin küresel bir değişken olacağı şekilde tekrar düzenleyin. Şimdi program daha az yığıt yeri kullanacaktır.

8. 8 vezir programını özçağrılı olmayana (yani yinelemeli olana) çevirin.

9. Sudoku (sayı yerleştirme) bulmacalarını çözen bir özçağrılı program yazın. Program girdi olarak aşağıdakine benzer bir bulmacayı almalı ve çıktı olarak, eğer birden fazla varsa, tüm çözümleri vermelidir.

- 6 -   - 5 -   - - 3
- - 1   8 - -   - - 9
- - 4   7 - -   - - 2

- 3 -   - 6 -   - - -
- 8 -   - - -   - 5 -
- - -   - 2 -   - 4 -

5 - -   - - 3   6 - -
8 - -   - - 9   1 - -
7 - -   - 4 -   - 8 -

Yazdığınız program aşağıdakine benzer zor bulmacaları ne kadar zamanda çözebilmektedir?

- - -   - - -   - - -
- - -   - - 3   - 8 5
- - 1   - 2 -   - - -

- - -   5 - 7   - - -
- - 4   - - -   1 - -
- 9 -   - - -   - - -

5 - -   - - -   - 7 3
- - 2   - 1 -   - - -
- - -   - 4 -   - - 9

10. Altkısım 4.2.3’te verilen programı, aynı kısmın sonunda bahsi geçen envp dizisini de bastıracak şekilde genişletin.