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

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


مطلب خیلی ساده است در هر عبارت انتساب عبارتی که می تواند سمت چپ قرار گیرد یک چپ مقدار است و عبارتی که می تو اند سمت را ست  قرار گیرد راست مقدار است و ای توانای بدین معناست که صحت عبارت را از بین نبرد در این مثال xچپ مقدار وyراست مقدار است

x = y;

در حالت کلی تمام متغیر ها و به عبارتی از دید شئ گرایی تمام اشیا چپ مقدارند

و تمام ثوابت رشته ای ,کاراکتری و عددی چه به صورت شناسه و چه به صورت تایپ مستقیم راست مقدارند. توجه داشته باشید که یک عبارت می تواند هم چپ مقدار و هم راست مقدار باشد

 

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

 

تمام متغیر ها هم می توانند چپ مقدار باشند هم راشت مقدار

 

هدف از بیان این اصطلاحات خسته کننده دونکته مهم است

اول

رفرنس ها برای گرفتن مقدار اولیه نیاز به چپ مقدار دارند

به مثال توجه کنید

;چپ مقدار =نام متغیر  &نوع داده ای

 

int& x= a++;

int& x= 78;

int& x=a/2;

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

اما مثال های زیر صحیح می باشند

int& x=a;

int& x=++a;

توابع دارای نوع بازگشتی راست مقدارند و نمی توانند در سمت چپ عبارات قرار گیرند

مثل myfunc()=4; اما راه حلی برای این کار وجود دارد حقیقت این است که برخی مواقع استفاده این چنینی از یک تابع می تواند خیلی مفید باشد برای انجام این کار باید نوع باز گشتی تابع را به عنوان رفرنس تعریف نمود

مثال معروف این مبحث

int& max(int& a,int& b){

   if(a>b)

       return a;

  else

    return b;

}

 

void main(){

   int x=3,y=4;

 max(x,y)=100;

cout<

}

دراین مثال بدون دانستن اینکه xبزرگتر است یا yمتغییر بزرگتر را تغییر دادیم و چاپ نمودیم!

      چگونه کار میکند؟

برای اجرا چنین توابعی خود را گیج نکنید مثل توابع معمولی ابتدا تابع را اجرا نمایید بعد بجای عبارت فرا خوانی تابع یک رفرنس معمولی در نظر بگیرید که این رفرنس دقیقاً رفرنس عبارت باز گشت داده شده توسط دستور returnدرون تابع است به همین سادگی

پس مسیر عکس این را در پیش نگیرید مثل این که عدد 100را بخواهید در تابع کپی کنید!!!

 

 

نکته:

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

توابعی ایجاد کرد که نوع بازگشتی رفرنس داشته باشن و آرکمان ها شون رفرنس نباشن پس این دو هیچ ربطی بهم ندارن اما دلیل این کار اینه که اگر آرگمان ها آرگمان معمولی باشند متغییر محلی محسوب میشوند و بعد از پایان اجرا تابع از بین میروند حالا اگر قرار باشد تابع رفرنسی به یکی از این متغییرها برگرداند مقدار باز گشتی تابع رفرنسی خواهد بود به محل نامعلومی از حافظه از آن فراتر تابع کار نخواهد کرد اما باتعریف اینگونه آرگمان ها پارامتر ها خود رفرنسی به متغیر های برنامه اصلی است و از حا فظه آنها (x,y)استفاده میکنند بنابر این بعد از پایان اجرا تابع حا فظه مربوط به آنها آزاد نخواهد شد. پس همیشه باید رفرنس باز گشتی تابع رفرنسی به متغیری باشد که بعد از پایان اجرا تابع حافظه اش  آزاد نشود(به سیستم برگردانده نشود).

 

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

 x[index]وfunc(index) هم معنی می شوند و کاملا یکسان عمل میکنند این مثال را در مباحث شی گرایی مطرح می کنیم.

 

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

جلسه ی آینده در مورد رشته ها بحث می کنیم

+ نوشته شده توسط سجاد مهدی بیرقدار در چهارشنبه بیست و هشتم شهریور 1386 و ساعت 0:3 |

سلام

امید وارم همه خوب وخوش وخرم باشید

اومدم بگم که من این ترم فرصت برای تکمیل کردن و نوشتن سری پست های آموزشی ندارم بنابراین همه دوستان در صورت نیاز به راه نمایی سوال و خلاصه هر مشکلی به من اطلاع بدن تا کمک کنم

پرسش از شما پاسخ ازمن!

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

در ضمن به تاریخ آخرین آپدیت توجه نکنید من همیشه هستم اما ممکنه آپدیت نکنم!!!

 


جلسه هشتم(توابع واشاره گرها)

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

اشاره

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

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

تا به حال برای ارسال مقادیر به توابع  مقادیریا نام متغیر محتوی مقادیر را  در لیست آرگمان ها هنگام فرا خوانی تابع می نوشتیم با این کار درون حافظه تخصیص داده شده به تابع مورد نظر متغییر هایی ایجاد می شدند که مقادیر ارسالی به توابع درونشان کپی میشد  بعد از پایان کار تابع کل حافظه تخصیصی به همراه متغیر های مذکور از بین می رفتند  و نتایج  تابع که مثلا درون آن متغیر ها بود بدون دستیابی از بین می رفت

خب چاره چیست می خواهیم بوسیله اشاره گر ها کاری کنیم که متغییر های مذکور خارج از حافظه تخصیصی به تابع باشند تا بعد از پایان کار تابع از بین نروند اما خارج از حافظه تخصیصی تابع یعنی کجا دقیقا!!؟ خب منظو همان حافظه ی تخصیصی تابعی

 که تابع مد نظر رو فرا خوانی می کنه.

 

این پست چهار صفحه شده که چند تا عکس هم داره براهمین پی.دی.اف رو برای دانلود میگذارم ۸۲ کیلوبایت

 

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

سلام

یه برنامه نوشتم به نام نرم افزار اعلام نمرات!!

حالا چرا برنامه !! این همه امکانات جور واجور برنامه نویسی وب که این روزها  رواج داره دیگه واقعاً چرا برنامه

خب الان میگم...

اگه دانشجو باشین بعد فقط یه وبلاگ روی یه سرویس دهنده مجانی!! پول hostشدن و ... که نداریم پس ....

پس چی کارکنیم؟!

خب معلومه ادامه مطلب و بخونید بعدم برنامه رو دانلود کنید و مطمئن باشید کارتون رو راه می ندازه ( نه بابا!!!)

امکانات برنامه

ایجاد ومدیریت حساب های کاربری.

امکانات مدیریتی تحت عنوان حساب کاربری admin

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

ورودی اطلاعات به صورت فایل متنیtxt

رمز نگاری و محرمانگی اطلاعات

جداول قابل ویرایش در محیطی رنگی و گرافیکی با کاربری آسان

 

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


ادامه مطلب
+ نوشته شده توسط سجاد مهدی بیرقدار در یکشنبه یازدهم شهریور 1386 و ساعت 0:23 |

نام آرایه ها یک اشاره گر ثابت است.

اشاره گر ثابت یعنی اشاره گری که نمی توان محتویات آن یا محلی را که به آن اشاره می کند تغییر داد.

نام آرایه یک اشاره گر است یعنی نام آرایه به اولین خانه ی آرایه اشاره می کند.

به شکل توجه کنید.بافرض دو بایتی بودن طول نوعint(یعنی هر متغیر از این نوع دوبایت حافظه اشغال می کند)

چنین نگرشی به آرایه انعطاف بشتری می دهد.

 

مزایای این نگرش:

1.دسترسی به خانه های آرایه با استفاده از انجام اعمال جمع و تفریق روی اشاره گر ها:

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

 

توجه کنید تصویری که می بینید این که اشاره گر a واقعا در حافظه به این صورت قرار میگیره یانه مطمئن نیستم فقط برای تصور ذهنی و فهم بهتر اینطور به تصویر کشیدم.چراکه رفتارش رو کاملا روشن میکنه.

 

 نکته:

بدلیل ثابت بودن اشاره گر نام آرایه, نمی توان روی آن جمع وتفریق انجام داد.لذا باید اشاره گری تعرف نمود و نام آرایه را به آن انتساب داد وسپس روی این اشاره گر جدید اعمال محاسباتی انجام داد.

 

با اجرا این دستور ها

int a[5];

int pa=a;

می توان تصور کرد  این عبارات در هر سطر یک چیزند.

*pa         a[0]  *a

*(pa+1)  a[1]  *(a+1)

*(pa+2)  a[2]  *(a+2)

.

.

.

*(pa+4)  a[4]  *(a+4)

توجه کنید که در این عبارات paوaتفاوتی ندارند.فرق paدراین است که می تواند به هر نقطه دلخواه اشاره کند.به عبارتی میتوان محتویاتش را تغیر داد لذا نسبت به aانعطاف بیشتری دارد.مثلا می توان با اعمال عملگر++ بر آن به خانه بعدی آرایه اشاره کرد.

Cout<< *pa++;

اجرای متوالی این دستور موجب چاپ تمام خانه های آرایه می شود این در حالیست که همین دستور با اشاره گر aغیر مجاز است.

 

2.تخصیص حافظه پویا:

سیستم عامل زمان اجرای برنامه حافظه محدودی در اختیار برنامه قرار میدهد و برنامه نمی تواند بیش از مقدار این حافظه متغییر ایجاد کند حال فرض کنید حافظه مذکور برای برنامه نا کافی بود در این حالت میتوانید مدل حا فظه بزرگتری برای برنامه انتخاب کنید و این مشکل را حل کنید اما بازهم محدودیت هایی وجود دارد. شاید بازهم باتمام این کارها نیاز برنامه رفع نشد.

به این شیوه ی تعریف صریح متغیرها در برنامه تخصیص حافظه استاتیک میگویند که دارای محدودیت های فوق است این محدودیت ها مخصوصا زمانی خود نمایی می کنند که ندانیم چه تعداد متغییر نیاز داریم .

مثال بارز این موضوع زمانیست که می خواهیم تعداد نامعلومی داده از کا بر بگیریم

اول این که نمیدانیم باید چند متغییر تعریف کنیم .

دوم شاید تعداد داده ها آنقدر باشد که تخصیص حافظه استاتیک کفاف ندهد.

اینجاست که تخصیص حافظه ی پویا وارد عمل می شود.

می توان فرض کرد حافظه ی پویا منبع بزرگی از حافظه است که می توانیم مقدار دلخواهی از آن را در حال اجرا برنامه از سیستم بگیریم استفاده کنیم وبه سیستم بر گردانیم.

در زبان C++با عملگر newاز سیستم حافظه می گیرد و عملگر deleteحافظه را آزاد می کند یا به عبارتی به سیستم بر می گر داند .

عملگر newدر صورت موفقیت آدرس حافظه گرفته شده را بر می گرداند در غیر این صورت مقدار NULL را بر میگرداند. خب نتیجه این که باید یک اشاره گر داشته باشیم تا بتوانیم مقدار بازگشتی این عملگر را ذخیره کنیم بعد باید چک کنیم که آیا حا فظه ای در اختیار برنامه قرار گرفته یا نه

به مثال توجه کنید

برنامه در یافت n عدد صحیح از کاربر:

#include

#include

int main(){

int n,*arr;

cout<<"Enter number of records?"

cin>>n;

arr=new int[n];

if(!arr)

  cout<<"can not allocate memory";

else{

  for(int i=0;i>arr[i];

  delete[] arr;

{

}

 

شرط!arrزمانی صحیح می شود که arrنادرست باشد.به عبارتی حافظه تخصیص نیافته باشد. در پایان حافظه تخصیص یافته آزاد می شود. در صورتی که فقط بخواهیم یک متغیر بسازیم عبارت [n]را جلوی new intنمینویسیم وبرای آزاد سازی آن عبارت []را جلوی deleteنمی نویسیم.

برای نوشتن معادل این برنامه در زبان Cباید به جای خطوط هفتم و هشتم به ترتیب نوشت :

arr=(int*) malloc(sizeof(int)*n);

free(arr);

این توابع در هدر فایل stdlib.hتعریف شده اند و عملکردی کاملا مشابه عملگر های new,deleteدارند.

عبارت (int*)تبدیل نوع است و تابع sizeofطول نوع intرا بدست آورده و در نهایت در nضرب می کنیم تا به تابعmalloc بگوییم چند بایت حافظه از سیستم بگیرد.

 

تخصیص حافظه ی پویا و اشاره گر ها کاربرد های فراوانی دارند که شاید نتونیم مواردشون رو نام ببریم.در آینده در بحث ساختمان های داده بیشتر در این مورد صحبت می کنیم.  جلسه ی آیند به برسی استفاده اشاره گرها و رفرنس ها در زمینه ی بر گرداندن چندین مقدار از توابع به بر نامه اصلی صحبت می کنیم.

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