تبليغاتX
C++ آموزش

در این جلسه.سعی میکنم مقدمات نیاز به شی گرایی را به گونه ای ملموس با کمک بررسی کامل. مسئله ی معروف برج هانوی بیان کنم

 

صورت مسئله ی برج هانوی:

فرض کنید سه میله داریم که برروی میله ی سمت چپ تعداد nحلقه با انداره های مختلف به صورت نزولی از پایین به بالا قرار داده شده و می خواهیم این حلقه هارا با شرایط زیر از میله ی سمت چپ به میله ی سمت راست منتقل کنیم

1.در هر جابجایی فقط یه حلقه را می توانیم جابجا کنیم

2.حق قرار دادن حلقه بزرگتر بر روی حلقه ی کوچکتر را نداریم

(روشن است که برای این منظور باید از حلقه ی وسط به عنوان یک محل قرارگیری موقت حلقه ها استفاده کنیم)

 

 

خب برای انتقال حلقه ی I از سمت چپ به راست باید تمام حلقه های روی حلقه ی I را به میله ی وسط منتقل کنیم و بعد حلقه ی I  را به میله ی سمت راست منتقل کنیم و بعد از آن حلقه هایی که روی میله ی وسط است به میله ی سمت راست منتقل کنیم اما مشکلی که وجود دارد این است که نمی توانیم تمام حلقه های قبل از حلقه ی I را در یک حرکت جابجا کنیم بنا براین باید اول حلقه ی i-1را جابجا کنیم این خود نیز نیازمند مراحل کاملا مشابه با حلقه Iاست پس باید حلقه ی i-2را جابجا کنیم و این روند تا جابه جایی حلقه ی دوم ادامه دارد.

 

دانلود این پست به صورت پی.دی.اف دانلود پی.دی.اف این مطلب

دانلود سورس برنامه برج هانوی

 

 ادامه ی مطلب یادتون نره

 


ادامه مطلب
+ نوشته شده توسط سجاد مهدی بیرقدار در چهارشنبه بیست و سوم آبان 1386 و ساعت 12:34 |
سلام  خوبین ؟ من برگشتم. داشتم یه پست خفن برای شروع مباحث شی گرایی درست می کردم کار طولانی شد حالا فعلا اینو داشته باشین تا اونی که گفتم چند روز آینده آماده شه. یکی از دوستان هم منبع برای ساختمان داده خواسته بود که من نمیشناسم(شرمنده)

آز آن جا که استراکچر ها انقدر ساده هستند که فقط با مثال قابل درک اند در این جلسه چند تابع ساده و مفید برای کار با استراکچرها را بررسی می کنیم

در این توابع از همان استراکچر personکه در جلسات قبل تعریف نمودیم استفاده می کنند.

struct date{

 int yy,mm,dd;

};

 

struct person{

 char name[40];

 date tt;

 float grade;

};

 

نکته:

نکته مهمی که یادم رفت بگم اینه که تعریف استراکچر ها باید قبل از تابع main باشند واین یک قاعده ی عمومی است و نه یک قاعده ی کلی یعنی ممکن است گاهی استراکچری جای دیگری تعریف شود.که بعنوان یک دانشجو با این حالت مواجه نخواهید شد(به احتمال زیاد)

 

در کلیه ی مثال ها فر ض می کنیم استراکچری از نوع personبه نام myvarداریم

مثال1:

تابع خواندن یک استراکچر از صفحه کلید.

void read(person *p){

 cin>>p->name;

 cin>>p->grade;

 cin>>p->tt.dd;

 cin>>p->tt.mm;

 cin>>p->tt.yy;

}

1.فرا خوانی این تابع به صورت read(&myvar);خواهد بود.

2.آرگمان تابع به صورت اشاره گر تعریف شده چرا که باید مقادیر خوانده شده به برنامه ی اصلی بر گردانده شود.

3.به نحوه ی دسترسی به فیلدهای اشاره گر pتوجه کنید .(استفاده از عملگر(<-))

4.بعد از دسترسی به فیلد ttبرای دسترسی به فیلد های dd,mm,yyاز عملگر نقطه استفاده شده چرا که tt یک استراکچر است نه یک اشاره گر.

 

باز نویسی تابع بالا با استفاده از رفرنس ها بجای اشاره گر

void read(person &p){

 cin>>p.name;

cin>>p.grade;

cin>>p.tt.dd;

cin>>p.tt.mm;

cin>>p.tt.yy;

}

فرا خوانی این تابع به صورت read(myvar);می باشد.

 

مثال 2:

تابع تعویض محتویات دو استراکچر:

void swap(person *p1,person *p2){

person tmp=*p1;

*p1=*p2;

*p2=tmp;

}

1.مانند همه اشاره گر ها برای دسترسی یه محتویات اشاره گر استراکچرها باید ار عملگر ستاره استفاده کنیم.

2.آرگمان ها به صورت اشاره گر هستند چون باید تغییرات به برنامه ی اصلی منتقل شود.

3.فراخوانی این تابع به صورت swap(&myvar1,&myvar2);است

 

باز نویسی لین تابع با رفرنس ها:

void swap(person &p1,person &p2){

person tmp=p1;

p1=p2;

p2=tmp;

}

3.فراخوانی این تابع به صورت swap(myvar1, myvar2);است

 

دانلود پی.دی.اف این پست دانلود این پست به صورت پی.دی.اف

فعلا

 

 


ادامه مطلب
+ نوشته شده توسط سجاد مهدی بیرقدار در پنجشنبه هفدهم آبان 1386 و ساعت 21:41 |

سلام

مطالب این جلسه رو خوب مطالعه کنید پست های قبل رو هم یه دوری بزنید

جلسه بعد به بررسی یه مثال خفن می پردازیم تا بالا خره مباحث شی گرایی رو شروع کنیم


استراکچر ها به سادگی مانند تمام متغیر های انواع اولیه می توانند آرگمان توابع باشند یعنی در واقع هیچ تفاوتی یا يكديگر ندارند جلسه ی قبل استراکچری به نامpersonتعریف کردیم حال به  نحوه ی تعریف آرگمان توابع از این نوع توجه کنید.

void print_person(person arg){

 cout<

 cout<

}

به همین راحتی! می بینید که هیچ فرقی با دیگر انواع ندارد.

 

نکته:

در برخی کامپایلرهای قدیمی نوشتن عبارت struct قبل از نام استراکچر در آرگمان تابع الزامیست.

void print_person(struct person arg){

 cout<

 cout<

}

این روش, روش ارسال با مقدار است یعنی تغییر مقدار آرگمان ها از درون تابع به برنامه اصلی(تابعی که تابع مورد بحث را فراخوانی نموده) منتقل نمی شود.

برای ارسال با ارجاع خوشبختانه استفاده از رفرنس ها هم به همان سادگی روش قبل است فقط باید یک علامت & قبل از نام متغییر درج شود

void print_person(person &arg){

 cout<

 cout<

}

حال هر تغیری بر آرگمان ها از درون تابع به برنامه اصلی نیز منتقل می شود.

اما روش دیگر ارسال با ارجاع استفاده از اشاره گرهاست به نحوه تعریف توجه نمایید.

void print_person(person *arg){

 cout<<*arg.name;

 cout<<*arg.grade;

}

 

  دانلود این پست در یافت این پست به صورت پی.دی.اف

 ادامه مطلب یادتون نره

 


ادامه مطلب
+ نوشته شده توسط سجاد مهدی بیرقدار در پنجشنبه سوم آبان 1386 و ساعت 0:18 |