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.