PDA

Tam Sürümünü Görmek İçin : mesutbarlas'in verdigi bir "C++ kod orneginin" bir elestirisi


acehreli
08/03/2007, 00:21
mesutbarlas adli uye artik devam etmeyecegini soyledigi bir tartismanin bir noktasinda kendi deyisiyle bir "C++ ornegi" verdi. Sanirim amaci bizlerin o kodu anlayip anlamayacagimizi gormekti. Ozellikle ~ isareti uzerinde durdugu icin, saniyorum bozucu islevi (destructor) anlayip anlamadigimizla ilgileniyordu.

C++ bilen herkes ~ ile baslayan islevin bozucu islev oldugunu bildigi icin, ben onu atlayacagim.

O kodun bir elestirisi:


/*
* Programla ilgisi olmayan bir baslik. Herhalde asagida gereksizce cagrilan getch()
* islevini derleyebilmek icin eklenmis olmali...
*/
#include <conio.h>

/*
* C++ dilinin standartlasmadigi donemden kalmis deneysel bir baslik. Artik bu basligin
* yerine <iostream> basligi var. Ustelik C++ standardinin 1998 yilinda kabul edildigini,
* <iostream.h>'nin ise ondan iki yil kadar once birakildigini hatirlarsak, bu programin
* cok eski bir C++ programcisi tarafindan yazildigini anlayabiliriz.
*/
/* #include <iostream.h> */

/*
* O yuzden ben dogru olan basligi, yani <iostream>'i ekliyorum
*/
#include <iostream>

#include <dos.h>
class hayat
{
private:
/*
* time'in ne oldugunu bilmedigim icin ben bu programi derleyemiyorum. :(
*
* Bu 't' nesnesinin hayat sinifi nesneleriyle hicbir ilgisi yok. Onun icin burada
* tanimlanmasi hata olmus. 't', hayat'in kurucu (constructor) ve bozucu (destructor)
* islevlerinde gecici olarak kullaniliyor. Her bir hayat nesnesinin buyuklugunu bu
* gereksiz nesne ile arttirmak yerine, 't' hayat'in kurucu ve bozucu islevlerinde
* yerel olarak tanimlanabilirmis.
*
* Hatta, bir asagida yapacagim oneri ile, 't'ye hic gerek bile yok...
*/
struct time t;

/*
* Son derece kotu tasarlanmis bir sinif. Programcinin bu kadar cok ve karmasik adin
* icinden cikmasi oldukca zor. Onun yerine, bu sinifin iki tane 'struct time' nesnesi
* icermesi cok yararli olurmus:
*
* struct time kurulma_zamani;
* struct time bozulma_zamani;
*
*/
int gec,gec2,saat1,dakika1,saniye1,salise1,saat2,dakik a2,saniye2,salise2,top,top2;
public:
hayat()
{
/*
* Burada zamani kurulma_zamani'nin icine alabilirdik.
*/
gettime(&t);
saat1=t.ti_hour;
dakika1=t.ti_min;
saniye1=t.ti_sec;
salise1=t.ti_hund;
}
~hayat()
{
/*
* Burada da zamani bozulma_zamani'nin icine alirdik. Boylece saat1, vs. gibi
* karmasik nesnelerle ugrasmak zorunda kalmazdik.
*/
gettime(&t);
saat2=t.ti_hour;
dakika2=t.ti_min;
saniye2=t.ti_sec;
salise2=t.ti_hund;
top=salise2-salise1;
gec2=salise2;
if (top<0)
{
gec2=100-saniye2;
//top=top*(-1);
gec=saniye2-1;

/*
* Bu iki satirdaki kod tekrarini goruyor musunuz? Iyi degil... :( Onun yerine,
* zamani ekrana yazdiran bir islev tanimlanmali ve o islev burada iki kere
* cagrilmalidir.
*/
cout<<saat1<<" "<<dakika1<<" "<<saniye1<<" "<<salise1<<" "<<endl;
cout<<saat2<<" "<<dakika2<<" "<<saniye2<<" "<<salise2<<" "<<endl;

/*
* Hmmm... Burada boyle hesaplarla vicik vicik ugrasmak yerine, iki tane 'struct
* time' nesnesinin farkini dOndUren bir islev yararli olmaz miydi. Bu hesaplara,
* ozellikle de gec ve gec2'nin anlasilmazliklarina hic bulasasim yok. Onun icin
* hesaplarin her durumda dogru olup olmadigindan da emin degilim.
*/
cout<<"OMUR="<<saat2-saat1<<" saat "<<dakika2-dakika1<<" dakika "<<gec-saniye1<<" saniye "<<100-((-1)*top)<<" salise";
}
else
{
gec=saniye2;

/*
* Ha ha! Bu asagidaki satirlar size de tanidik geliyor mu? :) Birisi "kod tekrari"
* mi dedi? Yanlis, yanlis... Bunlarin yerine yukarida adi gecen islevi cagiralim
* lutfen.
*/
cout<<saat1<<" "<<dakika1<<" "<<saniye1<<" "<<salise1<<" "<<endl;
cout<<saat2<<" "<<dakika2<<" "<<saniye2<<" "<<salise2<<" "<<endl;
cout<<"OMUR="<<saat2-saat1<<" saat "<<dakika2-dakika1<<" dakika "<<gec-saniye1<<" saniye "<<top<<" salise";
}

/*
* Ah! Ne buyuk bir hata... :( Her hayat nesnesi olusturuldugunda kullanicinin bir
* tusa basmasi gerekiyor. Super kullanissiz bir sinif... :(
*/
getch();
}
};

/*
* main'in dOnUs turu int'tir; degistiriyorum...
*/
/* void main() */
int main()
{
/*
* Ne? Ekranda bulunan bilgileri silmeye ne hakkimiz var! :) Neden kendi ciktimizla
* mutlu olmayi bilemiyoruz? Neden baskalarinin bilgilerini siliyoruz? :)
*/
clrscr();

/*
* n1 cok kotu bir nesne adi; ama olsun... :/
*/
hayat n1;

/*
* Bu ne ya?
*/
getch();
}


Dikkat ettiniz mi? hayat sinifinin kopyalayicisi yok. Eger main'in icine n1'in kopyasi olan baska bir nesne olustursak, o nesne de n1 ile ayni zamanda yasamina baslamis gibi gorulecektir. Sinifin tanimi bunu gerektiriyor olabilir ama ben bunu genelde yanlis buluyorum. Bence kopyalarin olustuklari ani da ozel olarak kaydetmek gerekirdi.

Ustelik, gorunuse gore amaci nesne yasam sureclerini belgelemek olan bir programin kopyalarin yasamlarini da dogru olarak vermesi cok yararli olurdu.

mesutbarlas, kodu verme amacinizi dogru olarak anlamis miyim? Bu kodla baska ne yapmamizi istiyordunuz acaba?

Ali


mesutbarlas
08/03/2007, 02:03
Tartışma konusunu kişiselleştirmeyeceğim için size "Aferin bukadar basit bir kodu 2 günde mi çözümleyebildin. İçinde uhte kalmış sanırım uzun vakitler irdeleyip bu adam nerde hata yaptı bulmam lazım diye mi düşündün" diye bir cümle yöneltmeyeceğim
Sidik yarışı yapmaya hiç niyetim yok

Dip not : Yazdığım kod zaten eksik olan bir kod
Doğrusu olarak

#include <conio.h>
#include <iostream.h>
#include <dos.h>
class hayat
{
private:
struct time t;
int gec,gec2,saat1,dakika1,saniye1,salise1,saat2,dakik a2,saniye2,salise2,top,top2;
public:
hayat()
{
gettime(&t);
saat1=t.ti_hour;
dakika1=t.ti_min;
saniye1=t.ti_sec;
salise1=t.ti_hund;
}
~hayat()
{
gettime(&t);
saat2=t.ti_hour;
dakika2=t.ti_min;
saniye2=t.ti_sec;
salise2=t.ti_hund;
top=salise2-salise1;
gec2=salise2;
if (top<0)
{
gec2=100-saniye2;
//top=top*(-1);
gec=saniye2-1;
cout<<saat1<<" "<<dakika1<<" "<<saniye1<<" "<<salise1<<" "<<endl;
cout<<saat2<<" "<<dakika2<<" "<<saniye2<<" "<<salise2<<" "<<endl;
cout<<"™MšR="<<saat2-saat1<<" saat "<<dakika2-dakika1<<" dakika "<<gec-saniye1<<" saniye "<<100-((-1)*top)<<" salise";
}
else
{
gec=saniye2;
cout<<saat1<<" "<<dakika1<<" "<<saniye1<<" "<<salise1<<" "<<endl;
cout<<saat2<<" "<<dakika2<<" "<<saniye2<<" "<<salise2<<" "<<endl;
cout<<"™MšR="<<saat2-saat1<<" saat "<<dakika2-dakika1<<" dakika "<<gec-saniye1<<" saniye "<<top<<" salise";
}
getch();
}
};
void main()
{
clrscr();
hayat n1;
getch();
}

yaratılan nesnenin süre bazında ne kadar süredir çalıştığını gösterir.

acehreli
08/03/2007, 02:39
Hayir, iki gun surmedi. Ben o koda bakmaya sizin tekrar hatirlatmaniz uzerine bugun karar verdim. Hani iki kere artik devam etmeyeceginizi soylediginiz bir konu var ya... O konunun 65 numarali mektubunda *bugun* soyle soylediniz:

"Ispat niteliginde ise o zaman daha önce attigim postlardaki örnek kodun açiklamasini bana sunun !"

Ben de bunun uzerine merak ettigim icin baktim. Bir kac hata gosterdim ve duzelttim, ama hAlA o kodun artik devam etmediginiz o diger konuyla ilgisini kuramiyorum. :(

Ali

mesutbarlas
08/03/2007, 02:51
:) kodu ilk yazdığımda ise hayat nedir peki ya ~hayat nerden çıkmış yazıyor tabi dikkatli bakmayınca böyle sonuçlar doğuruyor.

Bastra bastıra dediğiniz hani şu birdaha yazmayacağım yazısı var ya sizler ne o pişman mı oldun ve benzeri kelimeler kullandığı sürece postlarım devam edecektir. Buyrun diğerlerinide irdeleyin ;)

Euclides
08/03/2007, 07:26
@mesutbarlas:
iyi eğlenceler...

#include\
<stdio.h>
#include <stdlib.h>
#include <string.h>

#define w "Hk~HdA=Jk|Jk~LSyL[{M[wMcxNksNss:"
#define r"Ht@H|@=HdJHtJHdYHtY:HtFHtF=JDBIl"\
"DJTEJDFIlMIlM:HdMHdM=I|KIlMJTOJDOIlWITY:8Y"
#define S"IT@I\\@=HdHHtGH|KILJJDIJDH:H|KID"\
"K=HdQHtPH|TIDRJDRJDQ:JC?JK?=JDRJLRI|UItU:8T"
#define _(i,j)L[i=2*T[j,O[i=O[j-R[j,T[i=2*\
R[j-5*T[j+4*O[j-L[j,R[i=3*T[j-R[j-3*O[j+L[j,
#define t"IS?I\\@=HdGHtGIDJILIJDIItHJTFJDF:8J"

#define y yy(4),yy(5), yy(6),yy(7)
#define yy( i)R[i]=T[i],T[i ] =O[i],O[i]=L [i]
#define Y _(0 ], 4] )_ (1 ], 5] )_ (2 ], 6] )_ (3 ], 7] )_=1
#define v(i)( (( R[ i ] * _ + T [ i ]) * _ + O [ i ]) * _ + L [ i ]) *2
double b = 32 ,l ,k ,o ,B ,_ ; int Q , s , V , R [8 ], T[ 8] ,O [8 ], L[ 8] ;
#define q( Q,R ) R= *X ++ % 64 *8 ,R |= *X /8 &7 ,Q=*X++%8,Q=Q*64+*X++%64-256,
# define p "G\\QG\\P=GLPGTPGdMGdNGtOGlOG" "dSGdRGDPGLPG\\LG\\LHtGHtH:"
# define W "Hs?H{?=HdGH|FI\\II\\GJlHJ" "lFL\\DLTCMlAM\\@Ns}Nk|:8G"
# define U "EDGEDH=EtCElDH{~H|AJk}" "Jk?LSzL[|M[wMcxNksNst:"
# define u "Hs?H|@=HdFHtEI" "\\HI\\FJLHJTD:8H"
char * x ,*X , ( * i )[ 640],z[3]="4_",
*Z = "4,8O4.8O4G" r U "4M"u S"4R"u t"4S8CHdDH|E=HtAIDAIt@IlAJTCJDCIlKI\\K:8K"U
"4TDdWDdW=D\\UD\\VF\\FFdHGtCGtEIDBIDDIlBIdDJT@JLC:8 D"t"4UGDNG\\L=GDJGLKHL\
FHLGHtEHtE:"p"4ZFDTFLT=G|EGlHITBH|DIlDIdE:HtMH|M=JDBJLDKLAKDALDF KtFKdMK\
\\LJTOJ\\NJTMJTM:8M4aGtFGlG=G|HG|H:G\\IG\\J=G|IG|I :GdKGlL=G|JG|J:4b"W
S"4d"W t t"4g"r w"4iGlIGlK=G|JG|J:4kHl@Ht@=HdDHtCHdPH|P:HdDHdD=It\
BIlDJTEJDFIdNI\\N:8N"w"4lID@IL@=HlIH|FHlPH|NHt^H|^:H|MH|N=J\\D\
J\\GK\\OKTOKDXJtXItZI|YIlWI|V:8^4mHLGH\\G=HLVH\\V: 4n" u t t
"4p"W"IT@I\\@=HdHHtGIDKILIJLGJLG:JK?JK?=JDGJLGI|MJDL:8M4 \
rHt@H|@=HtDH|BJdLJTH:ITEI\\E=ILPILNNtCNlB:8N4t"W t"4u"
p"4zI[?Il@=HlHH|HIDLILIJDII|HKDAJ|A:JtCJtC=JdLJtJL\
THLdFNk|Nc|\
:8K"; main (
int C,char** A) {for(x=A[1],i=calloc(strlen(x)+2,163840);
C-1;C<3?Q=_= 0,(z[1]=*x++)?((*x++==104?z[1]^=32:--x), X =
strstr(Z,z)) &&(X+=C++):(printf("P2 %d 320 4 ",V=b/2+32),
V*=2,s=Q=0,C =4):C<4?Q-->0?i[(int)((l+=o)+b)][(int)(k+=B)
]=1:_?_-=.5/ 256,o=(v(2)-(l=v(0)))/(Q=16),B=(v(3)-(k=v(1)
))/Q:*X>60?y ,q(L[4],L[5])q(L[6],L[7])*X-61||(++X,y,y,y),
Y:*X>57?++X, y,Y:*X >54?++X,b+=*X++%64*4:--C:printf("%d "
,i[Q][s]+i[Q ][s+1]+i[Q+1][s]+i[Q+1][s+1])&&(Q+=2)<V||(Q=
0,s+=2)<640
||(C=1));}

mesutbarlas
08/03/2007, 11:40
Euclides sizede iyi eğlenceler...

Euclides
08/03/2007, 14:17
Yok ben kod ile eğlencemi daha önce yaptım, sizde eğlenin diye yolladım . Bu kod ne yapar şu kod ne yapar konularıda çok meraklısınız ilgi alanınız sayılır... Devamlı kod yollacağınıza birazda yollananları okursunuz değişiklik olur...

mesutbarlas
08/03/2007, 15:17
Hadi ya :) öyle mi. Verdiğim kodlar örnek teşkil etmesindendir yoksa kimin neyi ne kadar bildiği hiç umrumda bile değil ki test edeyim. Egomu tatmin edecek yaşta değilim ki ben iyiyim ben bitaneyim diyip siz bilmiyorsunuz bilemezsiniz hehe diyeyim bunlar sadece basit örneklemeler tabi istediğiniz doğrultuya çekmek te sizin elinizde. Anladığınız yanlış mubâlalar ile de yanlış laflar söylemeyin. 1. kodun muattabı geneldir ve kodu göstermemdeki amaç constructor ve destructor nedir neden kullanılır iç yapısı nedir kullanıyorsunuz ama görevi nedir ? Şeklinde bir örneklemedir bu bir soru değil örneklemedir. 2. kodun muattabı ise tek bir kişidir yine örnek teşkil etmektedir.

Eğlence konusu arıyorsanız eğlenecek farklı yollar bulun bana laf atarak değil.

C-Nem
08/03/2007, 15:39
neyin tartışmasını yapıyorsunuz ki siz ?