C ile Programlamaya Giriş Quiz Soruları ve Çözümleri

Yazan : Şadi Evren ŞEKER

Soru 1) Bir dosyaya isminizi yazdırınız.

Çözüm 1) dosyaya ismimizi yazdıran kodu aşağıdaki şekilde yazabiliriz:

Yukarıdaki kodda dikkat edilecek bir husus, dosyanın “r” değil “w” şekliyle açılması ve dosyanın mutlaka kapatılmasıdır. Bilindiği üzere kapatılmayan dosyalara yazıldığından kesin olarak emin olamayız ve dosya kapatılmadıysa içerisine bilgi yazılmamış olabilir.

Yukarıdaki kod çalıştırıldıktan sonra aynı dizin içerisinde “dosya.txt” isimli bir dosya oluşturulur ve bu dosyanın wordpad benzeri bir programla açılması durumunda içinde ismimizin yazdığını görebiliriz.

Soru 2) Klavyeden okunan bir sayının asal çarpanlarını ekrana basan kodu yazınız.

Çözüm 2)

Yukarıdaki kodda görüldüğü üzere önce bir sayı okunmuş (kodun 7. Satırı) ardından bir döngü içerisinde, 2′den başlayarak bütün sayılara bu girilen sayıyı bölme denenmiştir. For döngüsünün (8. Satır) koşulu, sayının 1′den büyük olmasıdır. Dolayısıyla sayı 1 olunca yani bütün asal sayılara bölümü tamamlanınca çalışma duracaktır.

Yukarıdaki kodda bulunan iç döngü (9. Satırdaki while döngüsü) ise bir asal sayının birden fazla kere bölme ihtimaline karşı yazılmıştır. Örneğin 60 girdisi için 2 asal sayısı, 2 kere bölebilir. Bu durumda bir sonraki asal sayı ile deneme yapılmadan önce, şu anda bölmeyi denediğimiz asal sayı ile bölünmeyinceye kadar deneme yapıyoruz.

Kodun 11. Satırında ise, denediğimiz sayının, girilen sayıyı tam bölmesi durumunda bölerek sayıyı küçültüyor ve başarılı olarak bölebildiğimiz bu sayıyı bir çarpan olarak ekrana yazıyoruz.

Kodun örnek çalışması aşağıdaki şekildedir.

Soru 3) Bir dizgideki kelime sayısını ekrana bastıran kod yazınız.

Çözüm 3)

Soruda, girilen bir dizgideki (String) kelime sayısının saydırılması istendiği için, dizginin scanf ile okunması mümkün değildir. Bilindiği üzere scanf tek bir kelime okur ve bu durumda işe yaramaz. Birden fazla kelimenin boşlukları ile okunması istenen durumda gets fonksiyonu kullanılabilir. Yukarıdaki kodun 6. Satırında da bu şekilde dizgi okunmuştur. Ardından dizgide bulunan boşluklar dizgi sonuna kadar saydırılmıştır. Dizgi sonu kontrolü 8. Satırda bulunan for döngüsünde yapılırken, dizgi içerisinde o anda bakılan karakterin boşluk karakteri olup olmadığı 9. Satırdaki if kontrolü ile yapılmıştır. Şayet boşluk karakteri ise, kelimesayısı değişkeni 1 arttırılmıştır.

Basitçe hesaplanacağı üzere, bir dizgideki boşluk sayısı, kelime sayısından 1 eksik olur. Bu problemin çözümü için kelimesayısı değişkeni 0 yerine 1′den başlatılmıştır.

Kodun çalışan hali aşağıda verilmiştir.

Soru 4) Bir dizgideki en uzun kelimeyi bularak ekrana bastıran kodu yazınız

Çözüm 4)

Yukarıdaki kod, 3. Sorudaki koda benzer şekilde, dizgi sonuna kadar bütün karakterleri kontrol etmekte ve boşluk karakterlerinde kodun 15. Satırında bulunan if kontrolüne girmektedir. Bu kodda farklı olan bir özellik, iki adet karakter göstericisi (character pointer) ile dizgi üzerinde işaretleme yapılmasıdır.

Bu göstericilerden kelimebasi isimli gösterici, o ana kadar bulunan en uzun kelimeyi göstermekte, yenikelime göstericisi ise, üzerinden geçilen son kelimeyi göstermektedir.

Kodun çalışmasını aşağıdaki şekilde anlayabiliriz:

Yukarıda gösterildiği üzere, ilk başta iki gösterici de dizginin ilk karakterini göstermektedir. Ayrıca kelimeboyu ve yeniboy değişkenlerinin değeri 0′dır.

Ardından kodumuz döngü içerisinde karakter karakter ilerlemekte ve ilk boşluğu gördüğü anda aşağıdaki şekilde yeni kelim değişkeni hareket ettirilmektedir.

İlk boşluğa gösterici hareket ettirildikten sonra boşluğa kadar olan harf sayısı sayılmakta ve yeniboy 3 olmaktadır.

Tekrar bir boşluk karakterine kadar göstericimiz hareket eder:

Bulduğumuz yeni kelimenin boyu 4 olduğu ve şimdiye kadar bulduğumuz en uzun kelimeden daha uzun olduğu için kelimebasi göstericisini ilerletiyor ve yukarıdaki şekilde bulunan yeni kelimenin ilk karakterine atıyoruz, ayrıca yenikelime göstericisi, mevcut konuma ilerletiliyor ve bir sonraki kelimenin aranmasında kullanılıyor.

Yeni bulunan kelime boyu, o ana kadar bulunan kelime boyundan daha küçük olduğu için kelimebasi değişkenimiz hala o ana kadar bulunmuş en uzun kelimeyi göstermeye devam ediyor.

Bir önceki örnekte olduğu gibi, bulunan yeni kelimenin boyutu, ilk kelimeden büyük olmadığı için değişkenimiz ilerlemiyor.

Son olarak bulduğumuz yeni kelimenin boyu, şimdiye kadar bulunan kelimelerden uzun olduğu için, göstericiyi ilerletiyor ve kelimebasi olara bu kelimenin ilk harfini gösteriyoruz. Sonuçta dizgi sonuna kadar giderken, anlık olarak bir kelimenin boyutu değişkende tutuluyor, bir kelimenin boyutunun bu değişkende tutulan boyuttan daha uzun olması durumunda bu kelimeyi gösteren bir gösterici işaretleniyor ayrıca bu yeni kelimenin boyutu, elimizde o ana kadar bulunan en uzun kelime boyutu olarak tutuluyor.

Kodun çıktısı aşağıdaki şekildedir:

Soru 5) Kullanıcıdan bir sayı okuyarak, okunan bu sayı boyutlarında bir kare matrisi, her hücresine, en yakın kenara olan uzaklığı ile doldurunuz.

Çözüm 5)

Soruda her hücreye, en yakın kenara olan uzaklık yazılması istenmiş, bu durumda örneğin 5×5 boyutunda bir matris için aşağıdaki şekilde veri girilmesi gerekir:

1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1

Görüldüğü üzere kenar değerlerine 1 , bir içerdeki hücrelere 2 ve en ortadaki hücreye 3 yerleştirilmesi istenmiş.

Bu dorunun çözümünde sadece döngüler kullanılarak bir döngünün kenara olan uzaklığı hesaplanıp ekrana yazdırılabilir. Bu yöntemin çözümü aşağıdaki şekildedir:

Yukarıdaki kodda görüldüğü üzere, her hücre için, hücrenin kenara olan 4 farklı uzaklığı hesaplanmıştır. Bu değerlerden iki tanesi, koordinatları olan i ve j değerleridir ki bu değerler, sol kenara ve üst kenara olan uzaklık olarak düşünülebilir.

Ayrıca sağ kenar ve alt kenara olan uzaklıkların hesaplanması kodun 20. Ve 21. Satırlarında bulunan a ve b değişkenleri ile yapılmıştır. Matrisin boyutundan koordinat çıkarılmış ve 1 ilave edilmiştir.

Sonuçta elimizde 4 farklı kenara olan 4 farklı uzaklık bulunmaktadır. Bizden istenen bu uzaklıklardan en küçüğünü ekrana basmamız. Bu durumda kodun 4-13 satırları arasında bulunan ve verilen 4 sayıdan en küçüğünü döndüren fonksiyonu çağırarak bu 4 uzaklıktan en küçüğünü bulabiliriz.

Kodun çalışan hali aşağıdaki şekildedir:

Bu yazıyı beğendiyseniz, başkalarının da ilgisini çekebilirsiniz:


2,797 views

11 responses to “C ile Programlamaya Giriş Quiz Soruları ve Çözümleri”
  1. ern says:

    4. sorunun 27. satırındaki if’deki büyüktür ters verilmiş galiba hocam.

  2. ern says:

    yeniboyu tanımlarken hata yapmışım. :) teşekkürler..

  3. sarııı says:

    ben b.t.t. bölümünegiden 10 sınıf ögrenciyim hoca benden C koduyla üç sayı girerek girilen sayılardan ör:25 sayısına en yakın sayıyı bulmamı istedi bana yardımcı olabilirmisiniz

  4. Elbette yardımcı olabiliriz. Basit bir formül ile 25′e yakınlığı test etmeye çalışalım. Buradaki sorun 25′ten büyük ve küçük sayılar arasındaki mesafenin değişmesidir. Örneğin 22 sayısı ile 25 arasında 3 varken 28 ile de 3 vardır. O halde bu iki sayı eşit uzaklıktadır. Ancak siz
    mesafe = 25 – (girilen sayı)
    şeklinde bir formül kullanırsanız sonuçta 28 gibi bir sayı için mesafe -3 çıkarken 22 için mesafe +3 çıkacaktır. Bu + ve – problemini çözmek için genelde mesafenin karesi alınır (kare alma fonksiyonu çift bir fonksiyondur ve sonucu her zaman pozitif döner)
    mesafe = (25 – (girilen sayı))2
    şeklinde yazarsak 22 için de 28 için de sonuç 9 çıkacaktır ve fonksiyonumuz her durumda çalışacaktır.
    O halde problemimizi artık kodlayabiliriz:

    #include <stdio.h>
    int main(){
       int enyakinmesafe=25;
       int enyakinsayi=25;
       for(int i = 0;i<3;i++){
         int sayi;
         scanf("%d",&sayi);
         if((25-sayi)*(25-sayi)<enyakinmesafe){
                    enyakinmesafe = (25-sayi)*(25-sayi);
                    enyakinsayi = sayi;
         }
       }
       printf("en yakin sayi : %d",enyakinsayi);
    }
    

    Yukarıdaki kodun çalışması sonucu aşağıdaki şekildedir:

    SADIs-MacBook-Air:prolog sadievrenseker$ ./a.out
    15
    22
    28
    en yakin sayi : 22

  5. yavuz kececi says:

    3. soruda 9. satır içinde if koşuluna dizgi[i+1]!=” ” kodunu eklemezsek bir boşlukta birden fazla kez space tuşuna basılmış ise kelime sayısının fazla dönmesiyle karşılaşırız.
    teşekkürler

  6. eda balcı says:

    hocam soracam sorunun bu konuyla alakası yok ama c++ ya dda java da ebob ekok bulma programı yapıyoruz..bir muhendis olarak hangi yazılımlarda bu işimize yarayacak..şimdiden teşekkürler hocam

  7. Şadi Evren ŞEKER says:

    Sorunuzu şu şekilde anlıyorum. Bilgisyar Mühendisliği eğitimi sırasında, çok fazla sayıda, gerçek hayatta doğrudan kullanılmayan kod yazıyorsunuz ve bu kodları yazarken verdiğiniz emeğin değip değmeyeceğini soruyorsunuz.

    Siz üniversitede öğrenci olarak ilk okulu, listeyi bitirmiş binlerce sayfalık not tutmuş birisisiniz. Bu tuttuğunuz notların yanına kişisel olarak yazdıklarınızı da ekleyin. Ömrünüz boyunca bir yerlere yazdığınız bütün cümleleri bir düşünün. Gerçek hayatta yazı yazmak işinize yarayan birşey ve binlerce sayfalık yazı yazmışsınız. Peki bu binlerce sayfa yazının arasında kaç kere “Ali topu at.” cümlesini yazdınız? Gerçek hayatta kaç kere bu cümleye ihtiyaç duydunuz? Defterlerinize yazdığınız cümlelerin kaçta kaçı “Ali topu at.” cümlesi?

    İlk okulda size bu cümleyi yazdırmalarındaki amaç, yazı yazmayı öğretmekti. Elbette farklı cümleler de kullanılabilir ama karmaşık olmayan basit, öğrenmenizi sağlayacak bir cümleye ihtiyaç var ki yazı yazmayı, cümlenin ne olduğunu öğrenesiniz ve bu bilgiyi hayatınızın geri kalanında kullanasınız ve hayatınızın geri kalanındaki milyonlarca cümleyi buradan edindiğiniz tecrübe ile doğru bir şekilde kurasınız.

    Bilgisayar mühendisliği eğitiminde de, gerçek hayatta, belki kullanacağınız, belki hiç kullanmayacağınız pek çok kod yazıyorsunuz. Bunların amacı size gerçek hayatta işinize yarayacak bilgiyi ve tecrübeyi kazandırmaktır.

    Elbette elmizde mükemmel bir eğitim sistemi yok ve hataları olduğunu biliyoruz. Ayrıca yine biliyoruz ki, farklı eğitim metodu önerileri, zaman içinde çıkacak ve eğitim sisteminde değişiklikler olacaktır ama şimdilik elimizdeki en iyi yöntem, henüz programlamayı yeni öğrenmiş kişilere altından kalkabilecekleri basit program örnekleri vermek (ebob gibi) ve bu örneklerle kendilerini geliştirmelerini sağlamak.

    Bu arada benim çok fazla sayıda projemde ebob kod yazmam gerektiğini de belirteyim. Belki bu durum şifreleme ile ilgilenmemden kaynaklandı, herkes aynı ihtiyacı duyacak diye bir kural yok ama bence yazdığınız kodlardan öğrendiğiniz size kardır.

    Zaten aksi de mümkün değil. Yani herkesin hayatının sonuna kadar hangi şirkette çalışacağını ve tam olarak nelere ihtiyacı olacağını bilebilseydik. Ve herkese özel bir eğitim sistemi uygulayabilseydik, tam olarak istediklerinizden oluşan bir eğitim içeriği hazırlayabilirdik. Ama aldığınız eğitim genel bir eğitim ve aranızda çok farklı alanlarda çalışacak kişiler var. Dolayısıyla eğitim içeriğinde belki hayatınızda hiç kullanmayacağınız şeyler olması çok normal.

    Bütün bunların yanında unutmayın ki sizin çalışma hayatınız boyunca, henüz hiç hayal bile edilmemiş teknolojileri kullanmanız gerekecek (en azından istatistikler bize bunu gösteriyor).

    Pek çoğunuz belki de şu anda ismi bile olmayan mesleklerde çalışacak. Geçmişe baktığımızda, hiçbirimiz eğitimini aldığımız dilde kod yazmıyoruz. Örneğin ben 1. sınıfta pascal dili almıştım. Bugün bu dil neredeyse hiç kullanılmıyor. Görüldüğü üzere, size sadece ve doğrudan işinize yaracayak şeyleri anlatmak imkansız.

    Sorunuza dönecek olursak, bir mühendis olarak, iyi bir mühendis olmaya bakın, şu anda yapabileceğiniz en iyi şey bu.

    başarılar

  8. ufuk ertan says:

    hocam soracağım soru asal sayılar ile ilgili…. soru şöyle; kullanıcı tarafından girilen bir sayıyı asal çarpanlarına ayırıp daha sonra asal çarpanlarının üslerini hesaplayan bir program nasıl yazabilirim…

    örneğin; n=24 sayısı çarpanları; 2*2*2*2*3 yani 2 üssü 4 * 3 üssü 1 şeklinde olur.. sonuçta çıkan işlemde kaç tane asal çarpan varsa o sayıyı 2 ile çarpacaz.. mesela 24 sayısında 2 ve 3 asal çarpanları 2 tane var bunu 2 ile çarparsak üsler toplamını 2*2=4 buluruz normalde de üslerin toplamı 3+1= 4 oluyor…

    algoritma mantığını ancak bu kadar çıkarabildim ama programı bi türlü yazamadım bu konuda yardımcı olursanız sevinirim….

    şimdiden teşekkürler….

  9. Asal çarpanlara ayırdıktan sonra bu değerleri bir dizide tutmayı deneyin. Örneğin yukarıdaki soruda verilen çarpanlara ayırma koduna ilave olarak bulunan çarpanları doğrudan ekrana basmak yerine önce bir diziye atıp ardından eşit olanları basabilirsiniz. Farklı bir yöntem olarak da eski üst değerini tutup üst değerinde değişme olduğunda sayaç kullanabilirsiniz.

    Aşağıdaki şekilde kodlanabilir: (Yukarıdaki 3. sorunun çözümünde 7. satırdan sonrası için):

    int sayac = 0;
    for(int i = 2 ; sayi > 1;i++){
       if(sayi%i == 0){
          while(sayi%i == 0){
             sayac ++;
             sayi = sayi / i ;
          }
          printf("%d^%d   ",i,sayac);
          sayac = 0;
       }
    }
    

    Başarılar

  10. koray1234 says:

    slm hocam sıze bı sorum olucak.diskte sayı.txt olarak kayıtlı dosyanın her satırında 0ile 10000 arasında sayılar kayıtlıdır. bu içeriği okuyup diskte sayi2.txt ismi altında sayıların 1000e bölünmüş hallerını kayıteden c programını sorabilirmiym.tesekkur edrım.

  11. Yapmanız gereken, ilk dosyayı okuduktan sonra aldığınız değerleri sayıya çevirmektir. Bunun için iki yoldan birini izleyebilirsiniz. Birincisi dosya içeriğini fscanf fonksiyonu ile %d kullanarak sayı olarak okumaktır ki bu sayede bir int değişkene değer atayabilirsiniz. Diğer yol ise okuduğunu string değerleri atoi fonksiyonu kullanarak int değere çevirmektir.

    Ardından okunan değerleri bölebilir ve ikinci bir dosyaya yazdırabilirsiniz. Kabaca müsvette kodu aşağıdaki şekilde olacaktır:

    dosya1 aç
    dosya2 aç
    dosya1'in sonuna gelen kadar {
      dosya1'den değer oku
      okunan değeri 1000'e böl
      bölünmüş değeri dosya2'ye yaz
    }
    dosya1'i kapat
    dosya2'yi kapat
    

    Kim olduğunuzu ve sorunuzun ödev olup olmadığını bimediğim için ancak bu kadar yardımcı olabiliyorum aslında oldukça basit bir kod ama en kötü yazmaya çalışın, kodunuzu ve takıldığınız noktaları sorun ve yardımcı olmaya çalışayım.

    Başarılar

Leave a Reply


6 + dokuz =

Benzer Yazılar:

Bilgisayar Kavramları üzerinde şu anda okumakta olduğunuz 'C ile Programlamaya Giriş Quiz Soruları ve Çözümleri' isimli yazı 13 Jan 2010 tarihinde, saat: 16:03 'de Şadi Evren ŞEKER tarafından gönderilmiş, toplam2,797 defa okunmuştur.

Benzer yazıları C/C++, Kod Örnekleri, Programlama Dilleri, Sınavlar kategorilerinden okuyabilirsiniz. Yazar ile irtibat kurmak için email gönderebilirsiniz. Yazıya yorum yapabilir ya da yapılan yorumları RSS 2.0 ile takibe alabilirsiniz.


Category: C/C++, Kod Örnekleri, Programlama Dilleri, Sınavlar