c++ mantık hatası, programımda bir hata oluştu

c++ mantık hatası, programımda bir hata oluştu

gulal

merhaba arkadaşlar aşağıdaki programda bir üniversitenin vize final notlarını hesaplamakda,hesapladıktan sonra baraj notuna göre geçti kaldı diye belirtmekte ve notların harf karşıllığını göstermesi planlanarak yapılmışıtr.Ama mesela bir öğrence 15 aldı ise bu notun karşılı olan FF ile beraber ffd en büyük olan diğer tüm harf karşıtlarını da göstermektedir yani notu CC düşen bir öğrenci için CC ve CC den daha büyük olan tüm harfleri gösteriyoru sorunu bulamadım yardımcı olursanız çok sevinirim teşeküürler.Buyrun program aşağıda


#include<iostream.h>
#include<conio.h>
main()
{
float vize,final,odev,ortalama;
cout<<"VİZE FİNAL NOTU HAZİRLAMA PROGRAMİNA HOSGELDİNİZ"<<"
"<<"vize notunuzu giriniz:";
cin>>vize;
cout<<"final notunuzu giriniz:";
cin>>final;
cout<<"odev notunuzu giriniz:";
cin>>odev;
ortalama=vize*4/10+final*6/10+odev;
cout<<"ortalama="<<ortalama<<" ";
if (ortalama<60)
{
cout<<"kaldi"<<" ";
}else{
cout<<"gecti"<<" ";
}
if (ortalama<20)
{cout<<"FF";}
if (ortalama<30)
{cout<<"FD";}
if (ortalama<40)
{cout<<"DD";}
if (ortalama<50)
{cout<<"DC";}
if (ortalama<60)
{cout<<"CC";}
if(ortalama<70)
{cout<<"CB";}
if (ortalama<80)
{cout<<"BB";}
if (ortalama<90)
{cout<<"BA";}
if (ortalama<100)
{cout<<"AA";}


getch();
}


umarım ilgilenirsiniz iyi günler kolay gelsin............. Budur

2009-02-18 12:47:19

Re:c++ mantık hatası, programımda bir hata oluştu

XxNEOxX

[quote=1606] Yazan: gulal


if (ortalama<20)
{cout<<"FF";}
if (ortalama<30)
{cout<<"FD";}
if (ortalama<40)
{cout<<"DD";}
if (ortalama<50)
{cout<<"DC";}
if (ortalama<60)
{cout<<"CC";}
if(ortalama<70)
{cout<<"CB";}
if (ortalama<80)
{cout<<"BB";}
if (ortalama<90)
{cout<<"BA";}
if (ortalama<100)
{cout<<"AA";}


[/quote]

bu bölümü su sekilde yazmalisin:

if (ortalama<20)
{cout<<"FF";}

if (ortalama<30 AND ortalama>20)
{cout<<"FD";}

if (ortalama<40 AND ortalama>30)
{cout<<"DD";}

if (ortalama<50 AND ortalama>40)
{cout<<"DC";}

if (ortalama<60 AND ortalama>50)... v.s.


sanirim buradan kaynaklaniyor.

2009-03-18 02:31:36

Cvp

kalimba

Eğer ortalama 20,30, vs. ise problem olur gibi gözüküyor.

if (ortalama<30 AND ortalama>20){cout<<"FD";}

30´dan küçük ve 20 den büyük koşulunun içinde 20 de dahil olmalı.

c++ yazma tipini bilmiyorum, bildiğim bişey üzerinde basitçe gösterim yapayım.

[pre]
<?php
switch(dolarortalama){
case (dolarortalama<20): dolarnot = "FF";break;
case (dolarortalama<30): dolarnot = "FD";break;
case (dolarortalama<40): dolarnot = "DD";break;
case (dolarortalama<50): dolarnot = "DC";break;
case (dolarortalama<60): dolarnot = "CC";break;
case (dolarortalama<70): dolarnot = "CB";break;
case (dolarortalama<80): dolarnot = "BB";break;
case (dolarortalama<90): dolarnot = "BA";break;
case (dolarortalama<=100): dolarnot = "AA";break;
default: dolarnot = "Not geçersiz";
}
echo dolarnot;

?>
[/pre]

switch kullanımı c++´da da benzer olmalı diye tahmin ediyorum. if´den daha basit bence.

İyi çalışmalar.

2009-03-18 12:03:21

Cvp

XxNEOxX

Mahmut´un yazdigi sekli daha dogru, ben sadece mantik hatasinin nerede oldugunu göstermek istedim.

2009-03-18 12:40:24

Cvp

chrome_nickel

konu biraz eski gerçi ama...


#include<iostream.h>
#include<conio.h>
main()
{

char sonuc[11][2]={"FF","FF","FD","DD","DC","CC","CB","BB","BA","AA","AA"};
// bu ff AA zımbırtılarını başta tanımlarsak daha düzgün bir bellek kullanımı olur. madem ki değişmeyen sabitler... bunlara gerektiğinde char dizisindeki sıra numarası ile ulaşabiliriz.



int vize,final,odev,ortalama; // gerekmedikce float kullanmak boşa ram ve işlem gücü harcatır.

cout<<"VIZE FINAL NOTU HAZIRLAMA PROGRAMINA HOSGELDINIZ
"<<" "<<"vize notunuzu giriniz:"; //
karakteri kullanmazsanız bütün işlem tek satırda geçer.

cin>>vize;

cout<<"
final notunuzu giriniz:";

cin>>final;

cout<<"
odev notunuzu giriniz:";

cin>>odev;

ortalama=vize*4/10+final*6/10+odev; // işlem doğru oluyor mu bilmiyorum. öncelikli hesaplanması gerekenleri parantez içine alırsanız sürpriz sonuçlar çıkmaz.

cout<<"
ortalama="<<ortalama<<" ";

if(ortalama<=60) cout << "gecti
"; // tek satırlık işlemler için kodları daha okunabilir yaptığına inanıyorum :)
else
{cout<<"kaldi
";} // nedense else ile aynısını yapınca arada bir problem yaşıyorum ben. belki derleyici sorunudur.

cout<<sonuc[(ortlama/10)]; // ortalamayı 10´a böldüğümüzde çıkan rakam ile sonuc dizisindeki o sıra numaralı içeriği gösteriyoruz. if yada switch döngülerine göre oldukça pratik olabilir.



if ve switch döngüleri bir çok hesap kitap ile sonuçlandığından böyle basit bir programda göze görünmese de
daha karmaşık programlarda ciddi performans ve gereksiz bellek harcamasına sebep olur.

yukarıda yaptığım şekilde hem gerekli tanımları başta yaparak belleğin daha düzgün organize olmasına yardımcı oluruz. hem de daha sonradan if else döngülerine göre çok çok az işlem ve bellek harcaması ile sonuca ulaşmış olacağız.

olurda poligon poligon hesap yapan ufak tefek oyunlar yazmaya kalkarsanız bu olay, adamlar milyon poligonu realtime hoplatıp zıplatıyo ben 1000 taneyi yaptıramıyorum nedendir sorusuna cevap olabilir bu.



kalimba
php ile cpp birbirine çok çok çok benzer. php bilen birisi her ne kadar cpp öğrenmeye kalktığında biraz zorlansa da, genel yazım ve mantıklar aynı olduğu için yolun yarısını katetmiş oluyor.
tersine cpp´ı iyi bilen birisi için php de iyiyim demek 2 - 3 günlük iş oluyor.

yine de switch, değişken uysun uymasın doğru sonucu bulabilmek için bütün "case" durumlarını tek tek test ettiği için ciddi performans sorunu yaratır.

yukarıdaki kaldı geçti programı için bu pek sorun olmasa da, php gibi zaten görece yavaş çalışan program sistemlerinde iyice sorun olur.

bu tür sabit karşılıklı işlemleri yukarıda örneğini verdiğim şekilde dizilerle çözebilirsiniz. performans açısından switch yada if´e göre oldukça etkili olur.

2009-04-04 23:52:36