Girdi
Aşağıdaki programı çalıştırarak sonuçları yorumlayın.
#include <stdio.h>
int main(void)
{
int a, b, c, r;
printf("Bir sayı? ");
r = scanf("%d", &a);
printf("Okunanlar: %d, scanf return değeri: %d\n", a, r);
printf("İki sayı? ");
r = scanf("%d %d", &a, &b));
printf("Okunanlar: %d %d, scanf return değeri: %d\n", a, b, r);
printf("Üç sayı? ");
r = scanf("%d %d %d", &a, &b, &c);
printf("Okunanlar: %d %d %d, scanf return değeri: %d\n", a, b, c, r);
return 0;
}
scanf
'inreturn
yaptığı değerin anlamı nedir?Girdilerden en az birini örneğin
x
gibi geçerli olmayan bir veri olarak girdiğinizdescanf
ne değerreturn
ediyor?
İki sayıyı toplayan aşağıdaki programı çalıştırarak gözlemleyin.
#include <stdio.h>
int main(void)
{
int a, b, sum;
printf("Sayı 1? ");
printf("scanf return değeri: %d\n", scanf("%d", &a));
printf("Sayı 2? ");
printf("scanf return değeri: %d\n", scanf("%d", &b));
sum = a + b;
printf("Toplam: %d\n", sum);
return 0;
}
cc -o main main.c
./main
Aşağıdaki içerikte ab.txt
isimli bir dosya oluşturun.
4
6
Girdiyi bu dosyadan yönlendirerek programı çalıştırın ve sonuçları gözlemleyin.
./main <ab.txt
Programı aşağıda belirtilen şekillerde standart girdiden çalıştırarak sonuçları gözlemleyin.
./main <<INPUT
4
6
INPUT
echo -e "4\n6" | ./main
Programı boş bir girdiyle çalıştırdığınızda ne oluyor?
./main <<INPUT
INPUT
Programda scanf
çağrılarını hatalı yaparsak, örneğin değişkenin adresi yerine aşağıdaki örnekte olduğu gibi değişkenin kendisini yazarsak ne oluyor? Deneyin ve yorumlayın.
#include <stdio.h>
int main(void)
{
int a, b, sum;
printf("Sayı 1? ");
printf("scanf return değeri: %d\n", scanf("%d", &a));
printf("Sayı 2? ");
printf("scanf return değeri: %d\n", scanf("%d", b)); /* HATA: &b yerine b yazılmış */
sum = a + b;
printf("Toplam: %d\n", sum);
return 0;
}
Basit Döngüler
Kullanıcıdan doğal sayı olarak “alt sınır” ve “üst sınır” değerlerini alan, “alt sınır” dan “üst sınır”a kadar olan sayıları yan yana ekrana yazdırdıktan sonra alt satıra Bu kadar!
metnini yazdıran programı yazın ve çalıştırın. Örnek:
./main
2
18
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
Bu kadar!
2 sayısının üslerini ve üslerine karşılık gelen değerleri aşağıdaki gibi ekrana yazdıran programı yazın.
n 2^n
----------------
0 1
1 2
2 4
3 8
4 16
5 32
6 64
7 128
8 256
9 512
10 1024
11 2048
12 4096
13 8192
14 16384
15 32768
16 65536
Bilgi
printf
fonksiyonuna argüman olarak verilen ve tırnaklar arasında yer alan karakter dizilerinde\t
özel karakteri kullanılarak hizalama işlemi yapılabilir (metin editörlerinde sekme karakteri kullanılarak yapılabildiği gibi).Eğer
printf
fonksiyonu kullanarak, bir döngü içerisinde satır satır, basamak sayısı değişebilen bir tamsayı yazdıracaksak, bu tamsayıların yukarıdan aşağıya doğru sağa dayalı olarak hizalı durabilmesi için,%d
ifadesinde%
iled
arasına, döngüyle birlikte artan tamsayının sahip olabileceği en büyük değerin basamak adedini yazmak yeterli olacaktır. Örneğin,printf("%3d", sayi);
ifadesinde, sayı değişkeninin ekrana yazdırılması için her durumda 3 karakterlik yer ayrılacaktır. Değişkenin değeri 4 olsa bile, 4’ün soluna 2 adet boşluk karakteri yerleştirilerek hizalama sağlanacaktır.
Standart Girdi/Çıktı
Aşağıdaki programı çalıştırarak sonuçları yorumlayın.
#include <stdio.h>
int main(void)
{
long nc;
nc = 0;
while (getchar() != EOF)
++nc;
printf("%ld\n", nc;
return 0;
}
Bir metin dosyası oluşturarak dosyayı programa yönlendirdiğinizde sonuç ne oluyor?
./main <metin.txt
Aynı işlemi sıfır boyutlu bir dosya ile tekrar ettiğinizde sonuç ne oluyor?
echo -n >empty.txt ls -s empty.txt ./main <empty.txt
Bilgi
echo -n
komutu verilen bir dizgiyi (örnekte hiç bir şey verilmemiş) satır sonu olmadan standart çıktıda görüntüler.Aynı işlemi
touch
komutuyla da gerçekleştirebilirsiniz.Dosya boyutunu görmek için
ls -s
komutunu kullanabilirsiniz.
Bir önceki örneği aşağıdaki eşdeğer programla tekrar edin.
#include <stdio.h>
int main(void)
{
long nc;
for (nc = 0; getchar() != EOF; ++nc)
; /* nop */
printf("%ld\n", nc);
return 0;
}
Aşağıdaki programı çalıştırarak sonuçları yorumlayın.
#include <stdio.h>
int main(void)
{
printf("EOF: %d\n", EOF);
return 0;
}
EOF
değerini ne buldunuz?Bu sabit nerede tanımlanmış?
Aşağıdaki programı çalıştırarak sonuçları yorumlayın.
#include <stdio.h>
#include <limits.h>
int main(void)
{
printf("sizeof(int): %d\n", sizeof(int));
printf("INT_MAX: %d\n", INT_MAX);
printf("INT_MIN: %d\n", INT_MIN);
printf("sizeof(long): %d\n", sizeof(long));
printf("LONG_MAX: %ld\n", LONG_MAX);
printf("LONG_MIN: %ld\n", LONG_MIN);
printf("sizeof(unsigned long): %d\n", sizeof(unsigned long));
printf("ULONG_MAX: %lu\n", ULONG_MAX);
printf("sizeof(unsigned long long): %d\n", sizeof(unsigned long long));
printf("ULLONG_MAX: %llu\n", ULLONG_MAX);
}
Programda geçen sabitler nerede tanımlanmış?
İlgili veri tipinin boyutuyla sınır değerler arasındaki ilişkiyi görebiliyor musunuz? Açıklayın.
printf
ile tamsayı sınırlarını görüntülerkenlong
değerlerde%d
kullanırsanız sonuç ne oluyor?
Bilgi
INT_MAX
veINT_MIN
: Sırasıyla en büyük ve en küçükint
değerleriLONG_MAX
veLONG_MIN
: Sırasıyla en büyük ve en küçüklong int
değerleriULONG_MAX
: En büyükunsigned long
değeriULLONG_MAX
: En büyükunsigned long
değeri
Aşağıdaki programı çalıştırarak sonuçları yorumlayın.
#include <stdio.h>
int main(void)
{
int c, i, nwhite, nother;
int ndigit[10];
nwhite = nother = 0;
for (i = 0; i < 10; ++i)
ndigit[i] = 0;
while ((c = getchar()) != EOF)
if (c >= '0' && c <= '9')
++ndigit[c - '0'];
else if (c == ' ' || c == '\n' || c == '\t')
++nwhite;
else
++nother;
printf("digits = ");
for (i = 0; i < 10; ++i)
printf(" %d", ndigit[i]);
printf(", white space = %d, other = %d\n",
nwhite, nother);
return 0;
}
- Türkçe karakterlerin sayısını da görüntüleyecek şekilde programı geliştirin.
Bilgi
Türkçe karakterler: ı
, ğ
, ü
, ş
, ö
, ç
, Ğ
, Ü
, Ş
, İ
, Ö
, Ç
Koşul Deyimleri
1'den 100'e kadar (yüz dahil) tamsayılar görüntüleyen bir program yazın, öyle ki sıradaki sayı:
- 3'ün tam katı (fakat 5'in tam katı değil) ise sayı yerine
fizz
- 5'in tam katı (fakat 3'ün tam katı değil) ise sayı yerine
buzz
- hem 3 hem de 5'in tam katı ise
fizzbuzz
görüntülensin. Örnek:
./main
1 2 fizz 4 buzz 6 7 8 fizz buzz 11 fizz 13 14 fizzbuzz 16 ...
Bilgi: %
modulo operatörünü deneyin
15 % 3
5 % 3
İfadeler
Aşağıdaki kodu derleyerek, matematiksel karşılaştırma ifadelerini, döndürdükleri sonuçlar bakımından yorumlayınız:
#include <stdio.h>
int main(void)
{
printf("1 < 2 ifadesinin sonucu: %d\n", (1 < 2));
printf("2 < 1 ifadesinin sonucu: %d\n", (2 < 1));
}