بله خودمم متوجه شده بودم کلا برای تمام خونه های سطر ها و ستون های اولیه و انتهایی چنین مشکلی وجود داره. اون دیگه باید توسط خودشون در نظر گرفته بشه. فکر می کنم مشکل دوستمون هم بیشتر توی کد نویسی باشه
بله خودمم متوجه شده بودم کلا برای تمام خونه های سطر ها و ستون های اولیه و انتهایی چنین مشکلی وجود داره. اون دیگه باید توسط خودشون در نظر گرفته بشه. فکر می کنم مشکل دوستمون هم بیشتر توی کد نویسی باشه
آرايه نوعي استفاده از اشاره گر هست.
ببينيد،ما با يك اشاره گر به يك خونه اي از حافظه اشاره ميكنيم.از آنجايي كه خونه هاي حافظه پشت سر هم هستن،ميتونيد با اظافه كردن اشاره گر به مقدار يك به خونه ي حافظه ي بعدي رجوع كنيد.اين كار رو ميشه به صورت *(p+1) انجام داد .
با اين روش ما ميتونيسم يك سلسله مراتبي از خونه هاي حافظه رو مقدار دهي كنيم،و بهشون دسترسي داشته باشيم اما!!
مشكل اينجاست كه اون خونه هاي حافظه كه مقدار دهي شدن هيچ ثباتي ندارند.يعني هر لحظه ممكنه توسط زير برنامه ي ديگري overwrite بشن.براي حل اين منظور دو تا راه وجود داره كه يكي در سي و ديگري در سي++ هست.
در سي:
اين كا رو ما توسط تابع malloc انجام ميديم كه در فايل سرآمد alloc.h هست.اين تابع ،تعداد خانه هايي از يك نوع داده( صحيح،اعشاري،كاراكتر) در جايي از جافظه برامون رزرو ميكنه و اجازه overwrite شدن رو بهش نميده مگر توسط خود كاربر.
تعريف تابع به اين صورته:
Int w*;
w=(datatype*)malloc(n*sizeof(datatype);
براي مثال،براي نوع داده ي صحيح ميشه:
w=(int*)malloc(n*sizeof(int));
كه در اينجا n تعداد خانه هاي مورد نظر كاربره.
الان ديگه ميتونيد به صورت يك آرايه باهاش رفتار كرده و همونطور به خونه هاي حافظه ي اشاره گر دسترسي داشته باشيد:
w[1]=*(w+1)=0;
،ما به ساخت يك آرايه ي پويا رو ميگيم٠
پس در نهايت ميشه گفت،آرايه نوعي اشاره گر است.
اگر جاييش رو نفهميديد يا تابع سي++ اون هم ميخواستيد بگيد.
موفق باشيد.
Mehrdad Sh.
مهرداد جون واقعا لطف کردی
اگه زحمت c++ رو هم بکشی ممنون میشم. من اینطوری با اشاره گر رشته تعریف می کنم:
ولی نمی تونم از ورودی مقدار بگیرم. اگه جلوگیری از overwrite رو هم بگی دیگه خیلی عالی میشهکد:برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید
بازم ممنون
سلام
من باید یک بازی بنویسم که مثلا خرگوش از ورودی که صفر 0 اول هستش وارد میشه و باید به هویج یا در خروجی که همون صفر آخری هستش برسش .
نکته: نکته اینجاست که فقط خرگوش میتونه از مسیر هایی حرکت کنه که صفر باشه و عدد 1 به منزله دیوار یا یک مانع می باشه
ترو خدا کمک کنید فقط باید مسیر حرکت چاپ کنه فقط همین
ترو خدا کمک کنید اینو باید پس فردا برسونم دست استادم.این خرگوش فقط مثال زدم وگرنه نمیخواد
Last edited by ebi136934; 20-05-2013 at 14:31.
خیلی آسونه. می شه به راحتی نوشتش ولی بهتر نیست یکم خودتون در موردش فکر کنید؟ الگوریتمش واقعا ساده اس. به نظر من بهتره خونه اول رو در نظر بگیری، یه حلقه while بذاری که رسیدن به خونه آخر رو مشخص کنی و توی اون هم یه شرط بذاری، یه بار شماره ستون رو زیاد کنی، یه بار هم شماره سطر رو زیاد کنی ببینی توی کدوم حالت مقدار داخل خونه، صفر هستش. حالا اون خونه رو در نظر بگیری و مختصاتش رو چاپ کنی. دفعه بعد که حلقه اجرا میشه همین شرط برای خونه جدید چک میشه. این کار ادامه پیدا می کنه تا به خونه آخر برسه و شرط حلقه while درست نباشه.
تمرین شما که خیلی خوبه. پروژه من خیلی داغونه. تا الان 211 خط نوشتم ولی هیچ کاری نکردم هنوز. الگوریتمش رو خودم پیش میرم و بعضی جاها که نمی دونم کدش رو چطوری بنویسم اینجا سوال می کنم. سعی کنید خودتون سوالات رو حل کنید
اینم مشکلات من با کلاس ها:
[ برای مشاهده لینک ، با نام کاربری خود وارد شوید یا ثبت نام کنید ]
Last edited by Mohammad_Virus; 21-05-2013 at 12:34.
سلام. شما برنامه تون رو با چه نرم افزاري مينويسيد ؟ من Visual Studio 2010 دارم وقتي F5 يا Ctrl+F5 رو ميزنم ارور ميده و ديباگ نميشه برنامه .
ارورش اينه :
Unable to start program C:\Documents and settings\...\ali.exe
The system can't find the file specified.
غير از Visual Studio چه برنامه ي ديگه اي پيشنهاد ميكنيد ؟
لطفا زود جواب بدين امتحان دارم :دي
سلام دوستان
من این چند تا کلاس رو نوشتم ولی نمی دونم چرا نمی شه از کلاس های چهر عمل شی گرفت میشه کمکم کنید!!!#include <iostream>
#include <math.h>
using namespace std;
class operators
{
public:
virtual float calculate(float ,float=0)=0;
};
class mainopr:public operators
{
public:
// char ch;
virtual float calculate(float ,float)=0;
};
class mathfunc:public operators
{
public:
//char name[4];
virtual float calculate(float)=0;
};
class plus:public mainopr
{
public:
virtual float calculate(float right,float left){return left+right;}
};
class minus:public mainopr
{
public:
virtual float calculate(float right,float left){return left-right;}
};
class multiplication:public mainopr
{
public:
virtual float calculate(float right,float left){return left*right;}
};
class division:public mainopr
{
public:
virtual float calculate(float right,float left){return left/right;}
};
int main()
{
mainopr *m=new plus;
operators *p=m;
cout<<p->calculate(2,3);
return 0;
}
عزيز شما با كد بالا يه رشته تعريف كرديد به اسم s. ولي!!!!در 'حقيقت' يك اشاره گر تعريف كرديد كه به خانه اي از حافظه از اشاره كرده و آن و خانه هاي متوالي بعد از آن (كه به صورت يك بايتي در نظر گرفته ميشوند،چون از نوع كاراكتر تعريف شدن) را مقدار دهي ميكند.
الان در اولين خانه مقدار f و در ٤ خانه ي بعدي نيز مقدار f مقداردهي شده.
شما با دستور s[0] ميتونيد به اولين خانه ي حافظه اي كه s اشاره ميكنه دسترسي پيدا كنيد كه f هست.يعني دقيقا ميتونيد به صورت يك آرايه ،ولي نامحدود و ناثبات رفتار كنيد.
براي اينكه اجازه ي overwrite شدن رو به اون فضايي از حافظه كه ميخوايم در اختيار نداشته باشم رو نديم،بايد از كامپيلر درخواست كنيم كه او حافظه رو برامون رزرو كنه و در اختيار زيربرنامه اي ديگر نزاره.
در سي با تابع malloc كه قبلا توضيح دادم و در سي ++ با تابع new قابل دسترسي است.
Mytype *fb=new Mytype [n];
كه mytype نوع داده مون هست،در اصل نوع ترتيب ذخيره سازي بلوك هاي حافظه است و ميتونه ثابت يا اعشاري و.. باشه.n هم تعداد خانه هاي حافظه اي است از نوع داده ي مورد نظر هست.fb هم اسم اشاره گر مورد نظره.
يادت باشه كه mytype ها بايد يكسان باشند و در آخر براي داشتن برنامه اي بهينه،بعد از اتمام استفاده ،آن مقدار حافظه ي ذخيره شده رو آزاد كني از طريق تابع delete.
مثال:
int *mohammad=new int [100];
delete [100] mohammad;
اين دقيقا كاري هست كه كامپايلر،وقتي كاربر يك آرايه تعريف ميكنه انجام ميده.
ولي،مهمترين تفاوتش اين هست كه مقدار تعداد خانه هاي حافظه در آرايه "بايد" قبل از زمان كامپايل مشخص باشه ،اون هم به مقدار ثابت(عدد) ولي در ساختار بالا،اينطور نيست.به همين دليل به اين ميگيم آرايه ي پويا.
مثلا در مرتب سازي mergesort مرتب آرايه به دو زير آرايه تبديل ميشن و اندازه ي زير آرايه ها بستگي به اندازه ي آرايه و اينكه كدامين بازگشت هست ربط داره و نميشه مقدار دهيه اوليه كرد و اينجا به اين ساختار نياز پيدا ميكني.
در نهايت هم اين هم بگم كه ،با تابع free() در ساختار malloc ميتونيد حافظه ي درخواست شده را آزاد كنيد.
موفق باشي محمد.
Mehrdad Sh.
سلام.
عزيز شما در منو ي Build، روي Clean Solution بريد و بعد در همان منو Rebuild solution رو بزنيد.اگر درست نشد ،يك بار از برنامه خارج شيد و دوباره rebuild كنيد.
گه گاهي هم علت نمايش اخطار بالا ،درست نبودن برنامه است.
در عين حال،ميتونيد از Borland C 5 كه كار با اون نسبتا راحت تر هست استفاده كنيد.
Mehrdad Sh.
هم اکنون 1 کاربر در حال مشاهده این تاپیک میباشد. (0 کاربر عضو شده و 1 مهمان)