C Programlama Alıştırmaları

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'in return yaptığı değerin anlamı nedir?

  • Girdilerden en az birini örneğin x gibi geçerli olmayan bir veri olarak girdiğinizde scanf ne değer return 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 % ile d 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ülerken long değerlerde %d kullanırsanız sonuç ne oluyor?

Bilgi

  • INT_MAX ve INT_MIN: Sırasıyla en büyük ve en küçük int değerleri

  • LONG_MAX ve LONG_MIN: Sırasıyla en büyük ve en küçük long int değerleri

  • ULONG_MAX: En büyük unsigned long değeri

  • ULLONG_MAX: En büyük unsigned 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));
}
Son Güncelleme:
Yazarlar: Recai Oktaş