#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.