Yazılım.
CevapSitesi.com Beta!
Çözüm Noktası
Facebook, Twitter, Google+ veya e-posta ile paylaşın.
| Sorular | Makaleler | Üyeler | Etiketler  | İletişim
Soru sormak ya da cevap vermek için;
giriş yapın veya üye olun.

Sosyal medya hesaplarınızla da giriş yapabilirsiniz.

Yazılım Soruları

0

Basit bir harf notu uygulaması

#include<stdio.h>

int main() {
    float asayisi, bsayisi, csayisi, fsayisi, toplamharfsayisi, toplam, ortalama;
    char Not;
    printf("Harf notunu giriniz (Cikis icin H ya da h giriniz) :");
    scanf("%c", & Not);
    while (Not != 'H' || Not != 'h') {
        switch (Not) {
        case 'A':
            asayisi += 1;
            toplam += 4.0;
        case 'B':
            bsayisi += 1;
            toplam += 3.0;
        case 'C':
            csayisi += 1;
            toplam += 2.0;
        case 'F':
            fsayisi += 1;
            toplam += 0;
        default:
            printf("Gecersiz Not!!!!\n");
            printf("Harf Notunu giriniz (Cıkıs icin H ya da h giriniz) :");
            scanf("%c", & Not);
        }
    }
    printf("---------------------------------------\n");
    toplamharfsayisi = asayisi + bsayisi + csayisi + fsayisi;
    ortalama = toplam / toplamharfsayisi;
    printf("Girilen A larin sayisi:\t%.2f\n", asayisi);
    printf("Girilen B larin sayisi:\t%.2f\n", bsayisi);
    printf("Girilen C larin sayisi:\t%.2f\n", csayisi);
    printf("Girilen F larin sayisi:\t%.2f\n", fsayisi);
    printf("Toplam harf sayisi:\t%.2f\n", toplamharfsayisi);
    printf("Ortalama:\t%.2f\n", ortalama);
    return 0;
}

Harf notunu giriniz (Cikis icin H ya da h giriniz) :A
Gecersiz Not!!!!
Harf Notunu giriniz (C²k²s icin H ya da h giriniz) :Gecersiz Not!!!!
Harf Notunu giriniz (C²k²s icin H ya da h giriniz) :B
Gecersiz Not!!!!
Harf Notunu giriniz (C²k²s icin H ya da h giriniz) :Gecersiz Not!!!!
Harf Notunu giriniz (C²k²s icin H ya da h giriniz) :

1 Cevap

0
#include <stdio.h>
#include <conio.h>

int main() {
    int asayisi = 0, bsayisi = 0, csayisi = 0, fsayisi = 0, toplamharfsayisi = 0, toplam = 0;
    float ortalama = 'x'; // Kullanılmayan bir değer.
    char Not = 0;
    while (Not != 'H' && Not != 'h') {
        printf("Harf notunu giriniz (Cikis icin H ya da h giriniz) :");
        Not = _getch();
        printf("\nGirilen karakter: %c\n", Not);
        switch (Not) {
        case 'A':
            asayisi += 1;
            toplam += 4.0;
            break;
        case 'B':
            bsayisi += 1;
            toplam += 3.0;
            break;
        case 'C':
            csayisi += 1;
            toplam += 2.0;
            break;
        case 'F':
            fsayisi += 1;
            toplam += 0;
            break;
        case 'H': case 'h': break;
        default:
            printf("Gecersiz Not! (%c)\n", Not);
            break;
        }
    }
    printf("---------------------------------------\n");
    toplamharfsayisi = asayisi + bsayisi + csayisi + fsayisi;
    ortalama = (float)toplam / toplamharfsayisi;
    printf("Girilen A larin sayisi:\t%d\n", asayisi);
    printf("Girilen B larin sayisi:\t%d\n", bsayisi);
    printf("Girilen C larin sayisi:\t%d\n", csayisi);
    printf("Girilen F larin sayisi:\t%d\n", fsayisi);
    printf("Toplam harf sayisi:\t%d\n", toplamharfsayisi);
    printf("Ortalama:\t%.2f\n", ortalama);
    return 0;
}

scanf sorunludur. Sadece test için kullanılır. scanf Enter tuşunu ve diğer beyaz karakterleri de kaydeder. Bu yüzden Unicode giriş yapılıyorsa bir sürü karışıklık olur. Bastığın Enter tuşu ile eklediğin \n karakterini de hesaba katar ve bir sonra kullandığın scanf fonksiyonundaki karaktere bu değeri yükler. Hiç tavsiye etmem.

Tek karakter almak için bunun yerine conio.h 'de bulunan _getch() fonksiyonunu kullanabilirsin. Bu tek bir karaktere basıldığında Enter'e basmaya gerek kalmadan doğrudan karakteri alır (bir de getch var ama onun kullanımı önerilmiyor).

while döngüsünün önünde ve sonunda iki kere giriş almak gereksiz. Döngüyü sonlandırmak için kullanacağın değişkene bir ön değer ata (ben kullanılmayan x değerini atadım) ve döngünün başında giriş iste. Geçersiz notlara geçersiz not demesi için H ve h için switch içine boş iki case ekle.

switch 'in case bölümlerinden sonra birer break kullanman gerekir. Eğer kullanmazsan program akışı sonraki case 'e devam eder.
case 'H': case 'h': break;
Satırında da görüldüğü gibi H girildiğinde hiç bir işlem yapılmaz ve case 'h' bölümüne atlanır.  swicth case yapısını çalışman ve kullanım durumları hakkında örneklere bakman lazım.

Değişkenlere her zaman bir ön değer ata. Sonradan ortaya çıkabilecek beklenmeyen durumlara karşı bazı derleyiciler seni uyarır zaten.

Ondalık hane kullanmayacağın değerler için tamsayı kullan. Yazdığım kodda görüldüğü gibi sadece bir tane (ortalama) kayan noktalı tip var.

 while (Not != 'H' && Not != 'h') {
Satırında senin yazdığın kodda || vardı. Normalde ikisi de değilse demen lazım. Bunun için de && kullanmalısın. And ve Or ile ilgili örneklere bakman gerekir. Eğer bilmiyorsan birden fazla mantıksal karşılaştırmaların kısa devre özelliğine bakmalısın.

Diğer bir soruna verdiğim cevaptaki gibi tamsayıyı tamsayıya bölersen tamsayı alırsın. Dolayısıyla 2.50 gibi bir sonuç göremezsin. Bu yüzden
ortalama = (float)toplam / toplamharfsayisi;
satırında toplam değişkeninin değerini float'a çevirdim (tip zorlaması). Kayan noktalı tamsayıya bölündüğünde sonuç kayan noktalıdır.

Diğer sorularına bakmayacağım. Bu sorunun bağlantısını cevap olarak ekleyeceğim. Büyük ihtimalle aynı hatalar var. Sadece bir değerden fazla aldığın yerlerde (örneğin bir karakter ve bir tamsayı) arka arkaya ayrı ayrı her değişken için tek bir _getch ve scanf kullanırsan bunlardan kaynaklanan karışıklıklardan kurtulabilirsin.

Mantık hataları ile ilgili bir inceleme ve yorum yapmayacağım. Bunları senin bulmak çok faydalı olur.




Cevaplayan: 15.09.20 21:25
cevapsitesi
102,034p 15ü
Cevabı seçen: 17.09.20 21:04
cevapsitesi   102,034p 15ü