PDA

Tam Sürümünü Görmek İçin : hata bunun neresinde ? (c++)


trocin
24/11/2004, 18:22
# include <iostream>
using namespace std;
void main () {
int kenar;
int secenek;
cout<<"Kenar Gir";
cin>>kenar;
cout<<"Secenek Gir";
cin>>secenek;
int alan;
int cevre;
if (secenek==1)
alan=kenar*kenar
else if (secenek==2)
cevre=4*kenar
if (secenek==1)
cout<<"alan:"<<alan;
else if (secenek==2)
cout<<"cevre"<<cevre;
else
cout<<"Yanlıs Giris";
system("pause");
}

arkadaşlar yarın olacağım sınavda sorulacak kodlamalardan biri bu ancak c++ pek bilmediğim için hatayı da bilemiyorum.Yardım pls...


trocin
24/11/2004, 18:24
birde alttakinde sonuç hatalı çıkıyor nasıl düzeltebilirim ?

#include <iostream>
using namespace std;
void main () {
int n;
int i;
int fact;
cout<<"Sayi Giriniz Lutfen:";
cin>>n;
fact=1;
for(i=1;i<n+1;i++)
fact=fact*i;
cout<<"faktoriyel"<<fact<<endl;
system("pause");
}

trocin
24/11/2004, 18:38
ikincisinde hata yokmuş şu an çalışıyor ancak birincisine yardım ederseniz sevinirim...

Arkantos
24/11/2004, 19:58
Sanırım bu örnekte bir karenin alanını ve çevresini hesaplıyoruz.Benim ilk örnekte gördüğüm alan = kenar * kenar derken ve cevre = 4 * kenar derken en sondaki ;'leri koymayı unutmuşsun. Bunları yapınca program çalışıyor ama fazladan kod tekrarı yapmış oluyoruz. Yani o ikinci if (secenek == 1) satırlarına gerek yok. Bunun yerine şöyle yapmalıyız:
if (secenek == 1)
{
alan = kenar * kenar;
cout << "alan: " << alan;
}

Bir de C++'nin bir kolaylığı gereği değişkenleri aynı satırda bildirebiliriz.
int alan = 0, cevre = 0, hacim = 0; gibi..

void main ()'in doğrusu da int main () olacak. Kısacası senin kodunu düzenlediğimizde şunun gibi bir şey olacak..

Not : Bana da ikinci kodda bir hata yok gibi geldi. Yalniz unutmuşum 0! = 1 miydi yoksa 0 mıydı :)


#include <iostream>
using std::cout;
using std::cin;

int main ()
{
int kenar = 0, secenek = 0;
cout << "Karenin bir kenari girin: ";
cin >> kenar;
cout << "Karenin alanini hesaplatmak icin 1 cevre hesaplatmak icin 2'ye basin: ";
cin >> secenek;

if (secenek == 1)
{
cout << "Alan: " << kenar * kenar;
}
else if (secenek == 2)
{
cout << "Cevre: " << 4 * kenar;
}
else
{
cout << "Yanlis giris";
}

}

trocin
24/11/2004, 21:04
sağola arkantos ; virgülden kaynaklanıyormuş :)

trocin
24/11/2004, 22:18
#include <iostream>
using namespace std;
void main () {
int arr[10];
for(int i=0;i<10;i++)
{
cout<<"deger giriniz=";
cin>>arr[i];
}
int min=arr[0];
for(i=1;i<10;i++)
{
if(min>arr[i]);
{
min=arr[i];
minindis=i;
}
}
cout<<"min deger="<<min;
cout<<"indis;"<<minindis;
}
arr[minindis]=1000000;
min=arr[0];
for(i=1;i<10;i++)
{
min=arr[i]
min=i;
}


peki burda hata nerde?

acehreli
24/11/2004, 22:37
Bu kodda cok fazla hata var. Derleyicinin gosterdigi her noktada teker teker degisiklik yapman gerekiyor. Hemen gorebildiklerim:

- 'void main' demissin; 'int main' olmasi gerekiyor (Arkantos'un aciklamasini gozden kacirmis olmalisin.)

- Ikinci for dongusu degiskeni 'i' tanimlanmamis (Birinci dongunun 'i'si yalnizca birinci dongu icinde gecerlidir)

- minindis tanimlanmamis

- main islevinin arkasindan global ortamda kod satirlari var

Ali

acehreli
24/11/2004, 22:39
Bu arada, mektubunda belki de haddim olmayarak degisiklik yaptim. Program kodlarinin basina [code], sonuna da [//code] belirtecleri ekledim. Boylece program girintileri de belli olmus oldu.

Not: [//code] belirtecinde iki tane degil, bir tane / karakteri olacak.

Ali

Kozan
29/11/2004, 20:25
- 'void main' demissin; 'int main' olmasi gerekiyor (Arkantos'un aciklamasini gozden kacirmis olmalisin.)


Burada yanlış yoktur. Fonksiyon başındaki tür belirteci fonksiyonun döndürdüğü veriyle aynı türde olmaldır çünkü döndürülen değeri tutar.

main() fonksiyonu bir return ifadesi içermiyor gördüğüm kadarıyla. Hatta return 2; gibi bir int hiç döndürmüyor. O halde void main() kullanılması doğrudur bir hata bulunmamaktadır.

Ayrıca her derleyici uyarı verir mi bakmadım fakat çoğu derleyicide, sizin dediğiniz gibi int main() şeklindeki bir kullanımda main() fonksiyonu en azindan bir int türünde değer döndürebilirdi gibisinden bir warning görüntüler.


Saygılar...

acehreli
29/11/2004, 22:03
Kozan, main'in return satiri icermiyor olmasi, yillardir yapilan 'void main' hatasinin nedenlerinden birsidir.

Dilleri, onlarin tanimlari ve standartlari belirler; yanlis kodlari kabul eden derleyiciler veya yanlis kullanimlari yayan programcilar ve kitaplar degil... Hem C, hem de C++ main'in donus turunu int olarak belirlemistir. C'yi Kernighan & Ritchie'deki tanimiyla kabul edersek bile 'int main' olarak almamiz gerekir; cunku orada da 'void main' denmez; tek basina 'main' denir. Onlarin tanimladigi C dilinde donus turu belirtilmeyen islevlerin de int dondurdukleri var sayildigi icin, o kitapta bile 'int main'dir.

Bu konuda tekrarlayamaya usenecek kadar cok yazdim. Sunlar yararli olabilir:

http://groups.yahoo.com/group/cdili/message/3665
http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1044841143&id=1043284376

groups.google.com'da da

faq "void main" "int main"

gibi bir aramanin sonuncunda sunun gibi yazilar goruyorum:

http://groups.google.com/groups?q=faq+%22void+main%22+%22int+main%22&hl=en&lr=&c2coff=1&selm=39C8E8C4.5A27A742%40gorge.net&rnum=1

Ali

Kozan
29/11/2004, 22:41
Kusura bakmayın diyerek sözüme başlamak istiyorum önce;

Aşağıdaki kısmı okuduktan sonra unuttuğum birşey kafama dank etti :) Bununla birlikte aşağıdaki kısımda da bahsettiğin gibi "int döndürdükleri varsayıldığı" sözüne de açıklama getirmek istedim neden öyle olduğu hakkında.

Onlarin tanimladigi C dilinde donus turu belirtilmeyen islevlerin de int dondurdukleri var sayildigi icin, o kitapta bile 'int main'dir.

Aslında bu bir varsayım değil. main() fonksiyonu çağıran işleme (ki bu genellikle işletim sistemidir), bir int ( :) ) değer döndürür ve main() den bir değer döndürmek aynı değerle bir exit() fonksiyonunu çağırmakla eşdeğerdir. Bildiğimiz üzere de 0 döndürülmesi normal sonlandırılma diğer tüm değerler ise çıkışta bir hata olduğunu belirtir.

İşte bu bağlantıyı hatırlayamadığımdan sanırım böyle bir çelişkiye düştüm.

Hatırlatman ve uyarın için teşekkürler...

trocin
29/11/2004, 22:47
arkadaşlar sağolun bahsettiğim sınavdan 74 aldım iyi çalışmalar...