PersianTools Forums

Go Back   PersianTools Forums > برنامه نویسی و طراحی وب، سیستمهای مدیریت سایت > برنامه نویسی > خانواده C++ , C

Reply
 
امکانات بيشتر
Old 12-21-2005, 05:40 PM   #91
saalek
مدیر بازنشسته
 
saalek's Avatar
 

Join Date: May 2005
Location: در پاي كوهپايه ها
Posts: 654
ما تقريبا در همه برنامه هاي خود clrscr() و getch() را استفاده كرده ايم .
و همواره بخاطر استفاده از اين 2 تابع conio.h را بالاي برنامه include كرده ايم.

حال ، ***** با كامپايلر يا اديتور خود conio.h را باز كنيد.
در زير ، ليست محتويات آن را مي بينيد:



/* conio.h

Direct MSDOS console input/output.

Copyright (c) 1987, 1991 by Borland International
All Rights Reserved.
*/

#if !defined(__CONIO_H)
#define __CONIO_H

#if !defined(__DEFS_H)
#include <_defs.h>
#endif

#define _NOCURSOR 0
#define _SOLIDCURSOR 1
#define _NORMALCURSOR 2

struct text_info {
unsigned char winleft;
unsigned char wintop;
unsigned char winright;
unsigned char winbottom;
unsigned char attribute;
unsigned char normattr;
unsigned char currmode;
unsigned char screenheight;
unsigned char screenwidth;
unsigned char curx;
unsigned char cury;
};

enum text_modes { LASTMODE=-1, BW40=0, C40, BW80, C80, MONO=7, C4350=64 };

#if !defined(__COLORS)
#define __COLORS

enum COLORS {
BLACK, /* dark colors */
BLUE,
GREEN,
CYAN,
RED,
MAGENTA,
BROWN,
LIGHTGRAY,
DARKGRAY, /* light colors */
LIGHTBLUE,
LIGHTGREEN,
LIGHTCYAN,
LIGHTRED,
LIGHTMAGENTA,
YELLOW,
WHITE
};
#endif

#define BLINK 128 /* blink bit */

extern int _Cdecl directvideo;
extern int _Cdecl _wscroll;

#ifdef __cplusplus
extern "C" {
#endif

void _Cdecl clreol( void );
void _Cdecl clrscr( void );
void _Cdecl gotoxy( int __x, int __y );
int _Cdecl wherex( void );
int _Cdecl wherey( void );
int _Cdecl getch( void );
int _Cdecl getche( void );
int _Cdecl kbhit( void );
int _Cdecl putch( int __c );

#ifndef _PORT_DEFS
int _Cdecl inp( unsigned __portid );
unsigned _Cdecl inpw( unsigned __portid );
int _Cdecl outp( unsigned __portid, int __value );
unsigned _Cdecl outpw( unsigned __portid, unsigned __value );
unsigned char _Cdecl inportb( int __portid );
void _Cdecl outportb( int __portid, unsigned char __value );
#endif /* !_PORT_DEFS */

int _Cdecl inport( int __portid );
void _Cdecl outport( int __portid, int __value );

void _Cdecl delline( void );
int _Cdecl gettext( int __left, int __top,
int __right, int __bottom,
void *__destin);
void _Cdecl gettextinfo (struct text_info *__r );
void _Cdecl highvideo( void );
void _Cdecl insline( void );
void _Cdecl lowvideo( void );
int _Cdecl movetext( int __left, int __top,
int __right, int __bottom,
int __destleft, int __desttop );
void _Cdecl normvideo( void );
int _Cdecl puttext( int __left, int __top,
int __right, int __bottom,
void *__source );
void _Cdecl textattr( int __newattr );
void _Cdecl textbackground( int __newcolor );
void _Cdecl textcolor( int __newcolor );
void _Cdecl textmode( int __newmode );
void _Cdecl window( int __left, int __top, int __right, int __bottom);

void _Cdecl _setcursortype( int __cur_t );
char * _Cdecl cgets( char *__str );
int _Cdecl cprintf( const char *__format, ... );
int _Cdecl cputs( const char *__str );
int _Cdecl cscanf( const char *__format, ... );
char * _Cdecl getpass( const char *__prompt );
int _Cdecl ungetch( int __ch );

#ifndef _PORT_DEFS
#define _PORT_DEFS

/* These are in-line functions. These prototypes just clean up
some syntax checks and code generation.
*/
unsigned char _Cdecl __inportb__( int __portid );
unsigned int _Cdecl __inportw__( int __portid );
void _Cdecl __outportb__( int __portid, unsigned char __value );
void _Cdecl __outportw__( int __portid, unsigned int __value );

#define inportb __inportb__
#define inportw __inportw__
#define outportb __outportb__
#define outportw __outportw__

#define inp( portid ) __inportb__( portid )
#define outp( portid,v ) (__outportb__( portid,v ), (int)_AL)
#define inpw( portid ) __inportw__( portid )
#define outpw( portid,v ) (__outportw__( portid,v ), (unsigned)_AX)

#endif /* _PORT_DEFS */

#ifdef __cplusplus
}
#endif

#endif /* __CONIO_H */



دو دستور مذكور را من با رنگ قرمز نشان داده ام.
چيزهاي مفيدي از ديدن سينتكس دستورات در header مربوطه مي آموزيم.
مثلا با ديدن void جلوي clrscr() مي فهميم كه خروجي نمي دهد و فقط صفحه را پاك مي كند و مقداري برنمي گرداند. ولي getch() مقداري صحيح برمي گرداند. داخل پرانتز براي هر دو كلمه void را داريم. اين يعني چه؟ يعني ورودي نمي گيرند .

****************
آزمايش بعدي:
حجم conio.h چقدر است؟
من به پوشه include رفتم و حجم آن را نگاه كردم. 4 مميز 22 كيلو.
مسلما چنين فايل كوچكي حاوي اين همه تابع نيست. پس توابع كجا هستند؟
حجم پوشه lib تقريبا برابر يك فلاپي است يعني يك و 55 است.
من مي خواهم بگويم كه header ها لينكي به كتابخانه ها هستند.
اگر اشتباه گفتم بگيد.
ولي چه لينك باشند يا نباشند ، نكته مهم اينه كه :
يك سري به header ها بزنيد ، شما مدام از توابع آنها استفاده نمي كنيد ، يك نگاه به ليست آنها مي تواند مفيد باشد.
.
بعد اين كه دستوري را انتخاب كرديد ، help توربو سي مي تواند راهنماي خوبي براي نوشتن يك برنامه باشد. چون نمونه برنامه هم گاهي دارد.
.
يك سئوال از حرفه اي تر ها: كتابخانه ها را با چه زباني نوشته اند؟
.


__________________
estefa va khoroj az forum. dostare hameye shoma.bye.

Last edited by saalek; 02-14-2006 at 12:33 AM..
saalek is offline   Reply With Quote
Old 12-21-2005, 08:19 PM   #92
programmer
Registered User
 
programmer's Avatar
 

Join Date: Nov 2005
Posts: 84
Quote:
من كنجكاو بودم كه break چه كاري انجام مي دهد.
استنباط من از متن بالا اينه كه ((بلوكهاي for و do و while و switch ،،، با اين دستور شكسته مي شوند و ...))
درسته برای خروج از حلقه ها و دستور Switch بکار برده میشه و یک کلمه کلیدیه.
این برنامه کاربرد Break رو مشخص میکنه :
Code:
#include<iostream.h>
#include<conio.h>
int main()
{
for(int i=0;;i++)
{
  cout<<i;
  if(i==10)
    break;
}
cout<<"Press any key to exit...";
getch();
return 0;
}
Quote:
كتابخانه ها را با چه زباني نوشته اند؟
با خود C و ++C مینویسن.در سطح پایین تر با اسمبلی و زبان ماشین.
خودتون هم میتونید یه هدر فایل بنویسد و برای خودتون کتابخانه شخصی بسازید.
programmer is offline   Reply With Quote
Old 12-23-2005, 12:41 AM   #93
saalek
مدیر بازنشسته
 
saalek's Avatar
 

Join Date: May 2005
Location: در پاي كوهپايه ها
Posts: 654
خيلي ممنون.
دو پاسخ شما مورد نياز من بود.
.
======================

با تشكر فراوان از مسئولين و مديران محترم

حالا كه راجع به conio.h صحبت شد ، يك نگاهي به dos.h و bios.h مي كنيم.
يكي از آنها struct هايي براي كار اسمبلي در سي است.
من امروز از سايت tebyan سورسهاي خوبي راجع به اسمبلي و سي دانلود كردم.
نكته جالب اين كه اين سايت كارت اينترنت مجاني به بازديد كنندگانش هديه مي كند. البته فقط باهاش مي توانيد داخل اين سايت بچرخيد. مسنجر هم باز نميشه. شماره تلفن 9718733 و يوزر و پسورد هر دو ، ميشه tebyannet . اسم سايت هم www.tebyan.net است.
قسمت سي اين سورسها هم در واقع اسمبلي نويسي در سي است كه رشته خيلي شيريني است. چون در همين محيط سي ، اسمبلي كار مي كنيم.
و اين خيلي خوبه . چون توابع سي خيلي آسانتر است كار باهاشون تا كار در محيط اسمبلي. البته اين نظر من است. ممكنه فردي با كامپايلر و زيربرنامه هاي مجهز اسمبلي ، محيط كارش خيلي راحت و دلچسب باشه.

ولي ممكنه شما اسمبلي كار نكرده باشيد. پس من كمي شرح مي دهم تا بعد بتوانيم برنامه هايي را با هم كار كنيم.
اگر به اسمبلي علاقه نداريد يا نياز نداريد اين پستها را رد كنيد. پستهايي كه برنامه هايش كلمه regs يا register داره را .


رجيستر ها ، register ، حافظه هايي درون خود پردازشگر هستند و از اين جهت خوبند كه پردازشگر با آنها خيلي راحته. يعني سرعت كار خيلي بالاست. البته در نهايت اطلاعات به Ram مي رود ولي محاسبات اوليه و زيادي در همين رجيسترها انجام مي شود.

چيز ديگه اي هم كه بايستي بدانيد اينه كه اسمبلي تعداد زيادي وقفه dos و bios دارد. و اين وقفه ها كه مثل تابع عمل مي كنند ، ورودي اشان را ممكنه از رجيسترها بگيرند و خروجي اشان را هم به يكسري رجيستر بدهند. خيلي كار جالبي است.

بهتره رجيسترها را طبقه بندي اشان را بگوييم. 4 تا از ax تا dx . كه خيلي از توابع ( بهتره بگيم وقفه ها) براي انجام كاراشون به آنها نگاه مي كنند و خروجي اشان را هم خيلي مواقع در آنها منعكس مي كنند. Ax=ffff اين عبارت نشان مي دهد كه ax دو بايت است. Ff اول يك بايت و ff دوم هم يك بايت.
بنابراين اين 4 رجيستر را به شكل ديگري هم استفاده مي كنند . ax تقسيم ميشه به ah و al . كه ميشه بگي high و low . بايت با ارزش بالاتر در ah است.

همين مقدمه كافيه تا كارمون را شروع كنيم. البته رجيسترهاي ديگري هست كه وسط برنامه ها شرح مي دهيم.
حالا يك سري به header هاي مذبور بزنيد. Struct هايي مي بينيد كه با اسمهاي reg مشخص مي شوند. قبلا struct را گفتيم. حداقل يكي دو تا مثال حل مي كنيم . بعدش بقيه هم شبيه همونهاست.
.

Last edited by saalek; 02-13-2006 at 03:01 PM..
saalek is offline   Reply With Quote
Old 12-23-2005, 03:57 AM   #94
saalek
مدیر بازنشسته
 
saalek's Avatar
 

Join Date: May 2005
Location: در پاي كوهپايه ها
Posts: 654
قبل از اينكه به سراغ اين struct ها برويم. مي خواهم با كلمه asm كمي كار كنيم.
اين كلمه از كلمات كليدي نيست ولي بعضي كامپايلرها آن را جزو كلمات كليدي آورده اند.
يك برنامه ساده در زير مي آورم تا كاربرد اين عبارت را تمرين كنيم.

Code:
#include <iostream.h>
#include <conio.h>

main ()
{
    char letter = 'c';

    cout<<"i love  ";

    asm {
        MOV AH, 02h
        MOV DL, [letter]
        INT 21h
    }

    getch() ;
    return 0;
}

همان طور كه در بالا مي بينيد ، كلمه asm آمده و بعد بلافاصله كروشه و بعد از خط بعدي دستورات اسمبلي شروع شده. دقت كنيد كه اگر كروشه را ببريد خط بعدي ، همه چيز به هم مي ريزه، پس كروشه بايد بلافاصله بعد كلمه asm باشه.

حالا چون ممكنه كسي اسمبلي بلد نباشه ، قسمت اسمبلي اش را توضيح مي دهم.
داريم int21h ، اول بگم كه h به معناي هگزايي است . يعني در مبناي 16 و بعد اينكه ما داريم از وقفه شماره 21 از Dos استفاده مي كنيم. اين وقفه كه ميشه بگيم تابع ، كارهاي زيادي انجام مي دهد كه خودش يك تاپيك ميشه اگر بخواهيم توضيح بدهيم. و كارهاي مختلف آن باتنظيم ah است. در اينجا چون ah مساوي 2 است ، كارش چاپ است. مثل همون cout در سي++ . حالا چي را چاپ مي كنه؟ عددي كه در dl باشه را كد اسكي مي گيره و كاراكتر مربوط به آن را چاپ مي كنه. مثل همون char . دقت كنيد كه letter در سي مقدار دهي شده و در اسمبلي مورد استفاده قرار مي گيره و اين خيلي كار زيبايي است.
نتيجه نهايي اجراي برنامه اينه كه سي مي نويسه I love و اسمبلي دنبالش مي نويسه c و ميشه كلا I love c .
.
{{{{{{{ccccccccccccc----------sssssssss}}}}}}}}}}}

حالا مي خواهيم هر دو كار را سي انجام بدهد. ولي با تغيير رجيسترها. البته چاپ كار ساده اي است ولي تغيير رجيسترها گاهي خيلي به درد مي خوره و اين برنامه فقط يك مثاله.




در شكل بالا ، 3 قسمت را با رنگ زرد مشخص كرده ايم.
قسمت اول تعريف استراكتها و يونيون union است. دقت كنيد كه Dos.h بالاي برنامه به خاطر همين ها include شده. يك نگاهي به Dos.h بكنيد. اگر برويد نگاه كنيد ، مي بينيد كه اين struct ها و union براي تغيير همان رجيسترها است. مثل ax و ah .
يونيون را هنوز نگفته ايم. ولي يك جور استراكت است. بعدا با مثال مي گيم.
فعلا فقط اين را بگم كه يونيون همان استراكت است ولي تمامي اجزاي يونيون برخلاف استراكت ، از يك سري خانه حافظه استفاده مي كنند. فعلا مثالش دم دستم نيست، بعدا مي گذارم.
اما اين استراكتها و يونيون خلاصه كارشان تغيير رجيسترهاست. اين تكه را از Dos.h آوردم ، نگاه كنيد:

Code:
union   REGS    {
    struct  WORDREGS x;
    struct  BYTEREGS h;
};
داخل يونيون 2 تا استراكت تعريف شده. X و h يه جورايي نوبتي از يونيون استفاده مي كنند . باز اگر به اين header نگاه كنيد ، مي بينيد كه :

Code:
struct WORDREGS {
    unsigned int    ax, bx, cx, dx, si, di, cflag, flags;
};

struct BYTEREGS {
    unsigned char   al, ah, bl, bh, cl, ch, dl, dh;
};
يعني x براي تغيير ax و bx و cx و ... است. در اسمبلي به اينها word يا ((كلمه )) مي گويند. ((كلمه )) تشكيل شده از ((دو)) بايت.
و h براي بايتها است. البته مي دانيد كه مثلا ah و al باز خودشان روي هم ax را تشكيل مي دهند و اين تقسيم بندي براي راحتي كار است.

در دومين قسمت زرد رنگ ، مي بينيد كه از تعريف هاي قسمت اول استفاده شده .
استراكت كه جزوي از يونيون بود. رجيسترها هم كه جزئي از استراكت بودند، نتيجه اش همين سينتكس سه قلو ميشه. يعني اول اسم يونيون بعد دات(نقطه) بعد اسم استراكت ، باز دات و آخرش هم اسم رجيستر.

در سومين قسمت زرد رنگ هم وقفه 21 فراخواني شده. &regs رجيسترهاي تنظيم كننده اش را به اين وقفه مي ده. اسمبلي اش واضح تر بود ولي بعد مدتي كه عادت كنيد ، مي بينيد كه با سي راحت تره.

نتيجه اجراي برنامه : اول با cout مي نويسه I LOVE ، بعد با تغيير رجيسترها مي نويسه C .
عدد 43 كد حرف C است . البته بزرگش . كدها استاندارده و با فرق نداره. به عدد 02 هم كه به ah داديم ، بهش مي گويند شماره سرويس.
يعني ما داريم از سرويس 2 از وقفه داس به شماره 21 استفاده مي كنيم.
ليست وقفه هاي داس و بيوس را اگر خودتان ببينيد براحتي مي توانيد ازشان با اين ترتيب استفاده بكنيد.
من ديگه نمي خوام بيشتر توضيح بدهم ، چون موضوع تاپيك سي است ه اسمبلي. ولي اگر به تابع ها و كلاس و وراثت رسيديم و فريضه تاپيك انجام شد ، از همين سايت تبيان مثالهاي قشنگي دارم كه با هم كار مي كنيم. من راستش هنوز اطلاعاتم كامل نيست ولي ممكنه با وقفه ها و تغيير رجسترها بشه كاري كرد كه خود سي ازش عاجز باشه. اين را اساتيد بايد بحث كنند.
.

Code:
#include <iostream.h>
#include <conio.h>
#include <dos.h>

void main()
{
clrscr();
cout<<"I LOVE ";
// --------------------------------
  union REGS regs;
  struct BYTEREGS byteregs;
  struct SREGS sregs;

     regs.h.dl = 0x43;
     regs.h.ah = 0x02;

 intdosx( &regs, &regs, &sregs );
// --------------------------------

    getch() ;
 
}
.

Last edited by saalek; 02-14-2006 at 02:27 AM..
saalek is offline   Reply With Quote
Old 12-23-2005, 05:00 PM   #95
saalek
مدیر بازنشسته
 
saalek's Avatar
 

Join Date: May 2005
Location: در پاي كوهپايه ها
Posts: 654
نظر من راجع به سي:
اين نظر ها با توجه به سواد منه و علمي نيست. شما نظرتان مي تواند خيلي كاملتر باشد. لطفا بنويسيد.

به نظر من سي را هر جور ميشه كار كرد.
مثلا مثل بيسيك باهاش ساده كار كرد.
يا مثل اسمبلي بهش سيستمي نگاه كرد.
يا اگر دنبال نوشتن برنامه هاي بزرگيد ، مي توانيد با استفاده از كلاس ، data ها و توابع را كپسوله كنيد و برنامه هاي خيلي بزرگ و در عين حال خوش ساختار داشته باشيد.
ميشه با سرعت بالاي آن گرافيكي حال كرد و اصلا با رياضي كار نداشت.
يا ميشه فقط دنبال فرمولهاي سنگين رياضي بود.
تا همين جا هم كه ما گفتيم ، الان ميشه برنامه هاي خوبي نوشت.
و بعدش هر روز ، يكي از توابع سي را ياد گرفت يا ساختار هاي حرفه اي تر را به كار برد.

به نظر من نيازي نيست كه خودتان را مجبور كنيد كه همه ساختارها را ياد بگيريد. چون به نظر من همه يك تعريف هستند كه خودتان هم مي توانيد ايجاد كنيد.
به نظر من آدم بعد مدتي برنامه نويسي ، مي فهمه كه يك ابزار اگه بود خيلي خوب بود و سي پيش بيني همه چيز را كرده. يعني براي راحتي برنامه نويس همه نوع ابزاري آماده كرده.
البته اينها نظرات يك مبتدي است بعدا حتما نظرم عوض ميشه. دوستان هم اگر اصلاح كنند حرفهاي من را ، مسلما همين امروز نظرم عوض ميشه.
*****************
يك نكته به نظرم اومد الان ، كه ميگم:
ببينيد در ويژوال بيسيك وقتي به متغيري بيش از گنجايش آن را مي دهيم، error ميده.
مثلا بالاي 32000 اگر به عدد صحيح كوچك بدهيد ، خطا مي دهد.
ولي سي خطا نمي گيره و نتايج را هم اعلام مي كنه ولي شما خودتان مي توانيد برويد ببينيد چطوري اين نتايج گاه عجيب حاصل شده. البته چيز عجيبي در كار نيست اگر به ماهيت بيت ها و بايت ها آگاه باشيم.
خلاصه كلام اين كه : سي دست ما را باز گذاشته پس كمي دقت بيشتر نيازه.
.
saalek is offline   Reply With Quote
Old 12-23-2005, 05:47 PM   #96
saalek
مدیر بازنشسته
 
saalek's Avatar
 

Join Date: May 2005
Location: در پاي كوهپايه ها
Posts: 654



به برنامه بالا نگاه كنيد. يكسري دستورات هستند كه با علامت پاند # شروع مي شوند. به اينها دستورات(( پيش پردازشگر)) مي گويند.
يعني قبل اينكه ((كامپايل)) صورت بگيرد ، اجرا مي شوند. در اينجا ما iii را define (تعريف) كرديم كه آن عبارت جلوش باشه. قبل از كامپايل هر جا iii باشه برداشته مي شود و آن عبارت جانشين ميشه.
كاربردش مي تواند اين باشه كه در تايپ صرفه جويي بشه.
.
Code:
#include <conio.h>		
#include <iostream.h>				

#define iii  int i=0;i<100;i++

void main()						
{		
clrscr();char c ;
 menu:
 // ----------- shoroe ghaaleb -------------
 for (iii)
{
cout<<"i= "<<i<<endl;
}
 // ----------- entehaye ghaaleb -----------
    cout<<"----------------------new run"<<endl;
	c=getch();if(c != 'x') goto menu;				
}

Last edited by saalek; 02-14-2006 at 02:30 AM..
saalek is offline   Reply With Quote
Old 12-23-2005, 06:49 PM   #97
لیلی
Registered User
 

Join Date: Nov 2005
Location: Esf
Posts: 15
سلام
ببخشید میدونم از مبحث اشاره گر ها گذشتیم ولی از اونجایی که خیلی از اشاره گر ها بدم میاد.(نمی دونم چرا)
خیلی نخوندمش حالا هم خیلی توش اشکال دارم.
یه برنامه میخوام که بزرگترین و کوچکترین عنصر یک ارایه رو مشخص کنه با استفاده از تابع زیر
void SL( double *array , double &largest , double &smallest, int size
ممنون میشم اگه برام توضیح هم بدید
لیلی is offline   Reply With Quote
Old 12-23-2005, 07:06 PM   #98
saalek
مدیر بازنشسته
 
saalek's Avatar
 

Join Date: May 2005
Location: در پاي كوهپايه ها
Posts: 654
از مبحث اشاره گرها نگذشتيم.
من دارم دنبال راهي براي رخنه به آن مي گردم. خيلي هم برام مهمه اشاره گرها.
شايد اگر سي اشاره گر نداشت اصلا سراغش نمي آمدم.
اين چند پست اخير مي دونم بي ربط بوده. ولي بايد بگم كه من خودم در حال يادگيري ام. و هر چي را مي فهمم ، اين جا هم مي گم. شايد بعدا يك تاپيك منظم ساختيم. ولي فعلا داريم تمرين سي مي كنيم .

مسائل رشته شما را هم دارم فكر مي كنم و دنبال توابعش هستم . اين مسائل را هم دنبال حلش مي گردم.
ولي من خيلي كندم.
خيلي ممنون كه پيام داديد .
.
saalek is offline   Reply With Quote
Old 12-26-2005, 05:14 PM   #99
saalek
مدیر بازنشسته
 
saalek's Avatar
 

Join Date: May 2005
Location: در پاي كوهپايه ها
Posts: 654
با سلام.
من اين يكي دو روزه كمي دنبال asp و javascript و php و html و vbscript و اينها بودم.
و يكي هم اين كه دچار يك مشكل در جاي ديگر شدم. اين آموزش در 2 فروم همزمان ارائه مي شود و آنجا من دچار مشكل اديت كل پستها بودم.

ولي با همه اين ها ، خيلي سي تمرين كردم. و به نكات خوبي دست يافتم كه خدمت شما عرض مي كنم.
.
اول اينكه (( تابع )) را خيلي استفاده كردم و خيلي مسلط شدم. و بحث ديگر هم كلاسهاي متغير ها بود كه خيلي ور رفتم.

در شكل زير ، هم يك تابع استفاده شده و هم يك متغير عمومي استفاده شده.






سعي كردم ساده ترين تابع ممكن را بنويسم تا يادگيري آن بلافاصله باشد.
نكته: من در نوشتن همين برنامه يك اشتباه كردم كه بلافاصله تصحيح كردم. و آن اين بود كه متغير x را درون main تعريف كردم و تابع f1 به آن دسترسي نداشت و برنامه خطا داد.
بنابراين x را بيرون main تعريف كردم. اين جوري ، هم داخل main ميشه استفاده كرد ، هم بيرون main ، يعني در توابعي كه بيرون main قرار دارند.
دوستان اگر توضيحات تكميل كننده دارند ، بنويسند.

حالا مي رسيم به تعريف تابع خود:
اين تابع يك اسمي دارد كه f1 است. بالاي main بايد معرفي بشه. البته فكر كنم بشه كه ، قبل صدا كردن هم معرفي بشه ولي فعلا از اين قالب استاندارد استفاده مي كنيم.
در پايين ، يعني زير main ، تابع عرضه شده و هر وقت صدايش كنيم ، كار خود را انجام مي دهد.
نكته املايي: در بالا كه مي خواهيم بگوييم ما تابعي داريم ، علامت سمي كالن لازم است ولي در پايين كه تابع نوشته مي شه ، جلويش سمي كالن نمي خواهد.

كار تابع ما اينه كه x را به توان 2 مي رساند.
البته مي دونيد كه مي بايست x به تابع ارسال ميشد، ولي من چون خواستم اولين درس تابع ساده باشه ، فعلا از توابعي كه مقدار برمي گردانند و مقدار ورودي دارند اجتناب كردم. تابع فعلي ما از نوع void است ، يعني مقداري برنمي گرداند. و فقط كارش اينه كه وقتي x به توان 2 را حساب كرد، خودش چاپش مي كنه و چيزي برنمي گرداند.

Code:
#include <conio.h>		
#include <iostream.h>				

void f1();

    int x;
void main()						
{		
clrscr();char c ;
 menu:
 // ----------- shoroe ghaaleb -------------

   x=5 ;
f1();


 // ----------- entehaye ghaaleb -----------
 cout<<"----------------------new run"<<endl;
	c=getch();if(c != 'x') goto menu;				
}

void f1()
{
int y;
y=x*x;
cout<<y<<endl;
}

Last edited by saalek; 02-14-2006 at 02:31 AM..
saalek is offline   Reply With Quote
Old 12-26-2005, 05:36 PM   #100
saalek
مدیر بازنشسته
 
saalek's Avatar
 

Join Date: May 2005
Location: در پاي كوهپايه ها
Posts: 654
حالا كه تابع را گفتيم ، بگذاريد تجربيات چند روز اخير خود را بگويم.
من يك برنامه نسبتا بزرگ نوشتم . كه گرافيكي بود. يك بازي شبيه بازي simcity اگر ديده باشيد.
شايد خنده دار باشد كه بخواهيم يك بازي شبيه اين بازي مجهز بنويسيم. ولي تلاش كه بد نيست و من هم طرح ساده اي از آن را نوشتم. بدون جلوه هاي گرافيكي آن.

حالا چه آموختم؟

تجربه اول: مسلما در برنامه هاي بزرگ نمي شه همه برنامه در يك فايل باشد. پس header سازي امري لازم است. چون وقتي يك فايل خيلي طولاني باشد ، خستگي زيادي با بالا و پايين رفتن در درازي برنامه ايجاد مي شود و گاهي اصلا خودمان هم ديگر سردرنمي آوريم چه كار كرده ايم و مجبوريم پروژه را رها كنيم.

تجربه دوم: هميشه اسم هاي مناسب براي متغيرها و توابع بگذاريد. من اول از f1 تا fn استفاده كردم ولي بعد مدتي ديگه نمي دانستم كدوم به كدومه. پس مجبور شدم با صرف وقت ، تمامي توابع و متغيرها را به اسامي با معنا تغيير دهم.

ولي بگم كه 1 ساعت شايد وقت گرفت تغيير نامها ولي بعدا به شدت باعث افزايش سرعت كار شد.

--
تجربه فني اول: وقتي يك متغير در header تعريف بشه ، در برنامه اصلي هم قابل دسترس است . ولي اگر در برنامه اصلي تعريف بشه ، در header غيرقابل دسترس است.

تجربه فني دوم: من براي راحتي خودم تمامي متغيرها را بيرون main تعريف كردم تا در كل فايل قابل دسترس باشه. ( كل فايل ميشه عمومي – كل پروژه را مي گويند جهاني يا گلوبال. البته اين 2 اصطلاح را من از ويژوال بيسيك با خود آورده ام ولي اسم مهم نيست. دوستان اگر مي توانند اسمهاي مناسب را بفرمايند.)

پس اگر بالاي main متغير تعريف بشه در كل همان فايل main در دسترس است. به اين مي گن عمومي.
ولي اگر در يك header ( كه توربوسي بهش ماژول هم ميگه) تعريف بشه جهاني يا گلوبال ميشه ( يعني در كل پروژه) .

من متغيرهايي كه main نياز داشت را در header تعريف كردم و main هم نگفت كه بدون تعريف داري در main از متغيري استفاده مي كني.

تجربه فني سوم: من توابع زيادي داشتم و در header هاي مختلف پخش كردم. اولش اضطراب اين را داشتم كه يك تابع كه مي خواهد يك تابع ديگر در header ديگر را صدا كند ، به آن دسترسي نداشته باشد ، ولي...

ولي متوجه شدم كه توابعي كه در header مختلف هستند به راحتي همديگر را پيدا مي كنند.
انگار كه همه پيش هم هستند و فقط در فايلهاي مختلف اقامت دارند.
بقيه اش را بعدا مي گم. فعلا مي روم به ادامه پروژه خود بپردازم.
.
البته مسلم است كه تجربيات من خيلي ساده و عقب افتاده است و دوستان متخصص صدها برابر نكته مي دانند ولي من هم در حد سوادم گفتم.
.
saalek is offline   Reply With Quote
Old 12-26-2005, 06:10 PM   #101
saalek
مدیر بازنشسته
 
saalek's Avatar
 

Join Date: May 2005
Location: در پاي كوهپايه ها
Posts: 654
اين هم همان برنامه 2 پست قبل است ولي جوري نوشته ايم كه تابع مقدار برگرداند. و مقدار هم ، همان مجذور 5 يعني 25 است.




چون تابع مقدار برمي گرداند ، بايد حواسمان باشد كه ظرفي آماده كنيم كه آن مقدار را تحويل بگيريم. و اين ظرف در برنامه ما majzoor است . نوع آن int است. چون تابع int برمي گرداند.
ورودي تابع هم int است. خروجي را قبل اسم تابع مي نويسند و ورودي را داخل پرانتز بعد اسم تابع مي نويسند.
برويد header هاي مختلف را كنيد و ببينيد ورودي و خروجي آنها چيست. و به اين ترتيب از آنها استفاده كنيد. ولي گاهي مشكل است اين كار كه از مثالهاي توربو سي و سورسهايي كه از جاهاي مختلف پيدا مي كنيد استفاده كنيد.
سايت پلانت يكي از منابع اين سورس هاست. سعي كنيد beginner ها را دانلود كنيد . چون حرفه اي ها بزرگ است و حجم زياد برنامه رديابي ها را مشكل مي كند.
.

Code:
#include <conio.h>		
#include <iostream.h>				

int f1(int);
 
void main()						
{		
clrscr();char c ;
 menu:
 // ----------- shoroe ghaaleb -------------
   int majzoor;
   majzoor=f1(5);
    cout<<"majzoor="<<majzoor<<endl;
 // ----------- entehaye ghaaleb -----------
 cout<<"----------------------new run"<<endl;
	c=getch();if(c != 'x') goto menu;				
}

int f1(int x)
{
int y;
y=x*x;
return y ;

}

Last edited by saalek; 02-14-2006 at 02:32 AM..
saalek is offline   Reply With Quote
Old 12-26-2005, 06:25 PM   #102
saalek
مدیر بازنشسته
 
saalek's Avatar
 

Join Date: May 2005
Location: در پاي كوهپايه ها
Posts: 654
Quote:
نوشته ای از M I N A
-------[/email]
.
شما دوست گرامي بهتره كه برنامه اتان را اينجا شرح دهيد تا خواننده ها بدانند سطح و موضوع چيه . خيلي ها اينجا متخصص هستند ولي با نامه وقت ندارند پيگيري كنند.
.

Last edited by saalek; 12-27-2005 at 07:43 PM..
saalek is offline   Reply With Quote
Old 12-26-2005, 09:29 PM   #103
saalek
مدیر بازنشسته
 
saalek's Avatar
 

Join Date: May 2005
Location: در پاي كوهپايه ها
Posts: 654
من داشتم همون پروژه گرافيكي را كار مي كردم كه دچار مشكلي شدم.
و آن اين بود كه نمي توانستم در حالت گرافيكي ، اعداد را چاپ كنم. تصميم گرفتم كه اعداد را به رشته تبديل كنم و بعد چاپ كنم. البته شايد مي شد اعداد را در حالت گرافيكي چاپ كرد ولي من بلد نبودم.
حالا مي خواهم اين تابع (( تبديل عدد به رشته )) را اين جا بگويم.
من يك سورس داشتم . در تاپيك ((يك ساعت گرافيكي)) اين سورس را گذاشته ام.

من از اين سورس خيلي چيزها يادگرفته ام. تبديل عدد به رشته را هم نويسنده اين سورس استفاده كرده.
او از تابع itoa استفاده كرده. من براي خودم مي خوانم (( int ،، to ،، askii )) ولي نمي دانم مخفف چيست. Ltoa هم داريم كه ميشه (( long به ....)) و utoa كه ميشه (( unsighn به ...))

من رفتم به index از help توربو سي و سينتكس آن را ديدم و يك مثال هم براي itoa زده بود كه در زير عينا آورده ام.

Code:
#include <stdlib.h>
#include <stdio.h>

int main(void)
{
   int number = 12345;
   char string[25];

   itoa(number, string, 10);
   printf("integer = %d string = %s\n", number, string);
   return 0;
}
من كمي تغييرش دادم تا به قالبهاي خودم شبيه بشه.

Code:
#include <conio.h>		
#include <iostream.h>				
#include <stdlib.h>
void main()						
{		
clrscr();char c ;
 menu:
 // ----------- shoroe ghaaleb -------------
 


   int number = 12345;
   char string[25];

   itoa(number, string, 10);
   //printf("integer = %d string = %s\n", number, string);
   cout<<"integer="<<number<<"    string="<<string<<endl;


 // ----------- entehaye ghaaleb -----------
    cout<<"----------------------new run"<<endl;
	c=getch();if(c != 'x') goto menu;				
}
نكته : اين تابع در stdlib.h است. پس include كردن آن بالاي برنامه فراموش نشود.

در اين header داريم:

Code:
char   *_CType itoa(int __value, char *__string, int __radix);
سه نوع ورودي مي گيرد اين تابع و خروجي اش هم char است.
در help توربو سي گفته radix عددي بين 2 و 36 است. و اين توضيح را داده:


Specifies the base to be used in converting value

If value is negative and radix is 10, itoa and ltoa set the first character
of string to the minus sign (ultoa does not).

من منظورشو نفهميدم. اگه كسي مي داند توضيح بدهد. فعلا 10 مي گذاريم تا بعدا بفهميم چيه.
.
saalek is offline   Reply With Quote
Old 12-27-2005, 01:40 AM   #104
mostafa_gm
Registered User
 
mostafa_gm's Avatar
 

Join Date: Apr 2005
Location: Nowhere
Posts: 1,780
Send a message via Yahoo to mostafa_gm
radix مبنای عددی هست که باید به رشته تبدیل بشه.
فکر میکنم شما اینجا با مبنای 10 کار میکنی(decimal)
mostafa_gm is offline   Reply With Quote
Old 12-27-2005, 02:32 AM   #105
saalek
مدیر بازنشسته
 
saalek's Avatar
 

Join Date: May 2005
Location: در پاي كوهپايه ها
Posts: 654
Quote:
نوشته ای از mostafa_gm
------------
خيلي ممنون از راهنمايي . بله من در مبناي 10 كار مي كردم ولي نمي دانستم اين عدد چيه.
.
saalek is offline   Reply With Quote
Reply

امکانات بيشتر

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT +4.5. The time now is 09:39 PM.

PersianTools RSS Feeds


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd.