• پایان فعالیت بخشهای انجمن: امکان ایجاد موضوع یا نوشته جدید برای عموم کاربران غیرفعال شده است

آموزش C++ سي پلاس پلاس از پايه

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
برنامه ساده زير را هم نوشتيم تا بدانيد كه چطور توابع احضار با رفرنس كار مي كنند.

کد:
#include <iostream.h>
#include <conio.h>
void main()
{
int intOne;
[color=blue]int &my_pointer =intOne;[/color]

intOne =5;
cout <<"intOne=" <<intOne <<endl;
cout <<"my_pointer=" <<my_pointer <<endl;

my_pointer =7;
cout <<"intOne=" <<intOne <<endl;
cout <<"my_pointer=" <<my_pointer <<endl;

getch();

}


166a1.gif

.

من متغير دوم را انگار غلط اسم گذاري كرده ام. My_pointer يعني اشاره گر من ولي اصلا اشاره گر را اين طوري تعريف نمي كنند. بلكه با علامت ستاره * تعريف مي كنند.

کد:
[color=red]int *my_pointer[/color]
====================
====================

من برنامه بالا را به شكل زير تغيير دادم تا كلمه my_pointer با مسما بشه.

کد:
#include <iostream.h>
#include <conio.h>
void main()
{
clrscr();
int intOne;
[color=red]int *my_pointer;
my_pointer =&intOne;[/color]

intOne =5;
cout <<"intOne=" <<intOne <<endl;
cout <<"my_pointer=" <<my_pointer <<endl;

[color=red]*my_pointer =7;[/color]
cout <<"intOne=" <<intOne <<endl;
cout <<"my_pointer=" <<my_pointer <<endl;

getch();

}


166a2.gif

.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
سعي كنيد قضيه را درك كنيد، والا بايستي بخش زيادي از سي را ببوسيد و بگذاريد كنار. چون سي است و كار با آدرسها.

هر چند كه من خودم هنوز نفهميدم قضيه را ، ولي شما دو پست قبل را مدام تجزيه تحليل كنيد تا بفهيد چه اتفاقي افتاده.

بايد بفهميد كه &num چه فرقي با num داره.
در احضار معمولي در ورودي تابع num داشتيم.
در احضار by refrence در ورودي تابع &num داشتيم.

من الان بگم اشتباه مي گم . من هم ميرم فكر مي كنم تا به وضوح قضيه را بفهمم.
.
اساتيد گرامي اگر مي توانيد اين مفاهيم را كمي شفاف كنيد.
.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
براي اينكه قضيه كمي باز بشه ، من برنامه زير را نوشتم.
به نتيجه اجرا نگاه كنيد. Two يك اشاره گر است. وقتي مي خواهيم آنرا چاپ كنيم ، يك آدرس چاپ ميشه.
ولي one را وقتي مي خواهيم چاپ كنيم يك عدد چاپ ميشه. پس اشاره گر نيست.

نكته مهم : به آدرس num و one نگاه كنيد. يكي هستند . هر دو fff2 هستند.
يعني چه؟
آيا دو متغيري هستند كه در يك خانه زندگي مي كنند؟ يا اصلا يكي هستند؟
پاسخ هر چه باشد ، مفهوم يك چيز است ، از ديد Ram هر دو يك سهميه مشترك در حافظه دارند. و two درست دو خانه آن طرف تر اطراق كرده. يعني به فاصله يك int .

کد:
#include <conio.h>		
#include <iostream.h>				
				
void main()						
{		
clrscr();char c ;
 menu:
 // ----------- shoroe ghaaleb -------------
[color=blue] [size=4]int num=3;
 int &one=num;
 int *two; two=&num;[/size][/color]

cout<<"num= "<<num<<"          &num="<<&num<<endl;
cout<<"one="<<one<<"           &one="<<&one<<endl;
cout<<"two="<<two<<"  &two="<<&two<<endl;
 // ----------- entehaye ghaaleb -----------
    cout<<"----------------------new run"<<endl;
	c=getch();if(c != 'q') goto menu;
}



168.gif

.
 

programmer

کاربر تازه وارد
تاریخ عضویت
1 نوامبر 2005
نوشته‌ها
85
لایک‌ها
0
احضار از طریق مقدار :

meghdar.JPG


در این نوع احضار، تابع یک کپی از متغیر مورد نظر (پارامتر) ایجاد میکنه و روی اون کپی، تغییرات رو اعمال میکنه.

بطوری که پس از اجرای تابع محتوای آن متغیر ، تغییر نمیکند.


________ _________ __________ __________ __________ _________
احضار از طریق ارجاع :

erja.JPG



در این نوع احضار تابع مستقیمآ روی خود متغیر کار میکند و آنرا تغییر میدهد و به همین علت پس از اجرای تابع ،مقدار

متغیر ممکن است تغییر کند(در صورتی که در تابع تغییر کرده باشد).
 

programmer

کاربر تازه وارد
تاریخ عضویت
1 نوامبر 2005
نوشته‌ها
85
لایک‌ها
0
احضار از طریق ارجاع مهمتره و باید بیشتر مورد توجه قرار بگیره.

در واقع در احضار به طریق ارجاع آدرس متغیر به تابع منتقل میشه (علامت & آدرس متغیر را میدهد ).به همین سبب

تابع مستقیمآ میره سراغ آدرس متغیر توی حافظه و روی اون کار میکنه.در صورتی که در احضار از طریق مقدار تابع

مقدار متغیر را خوانده و در یک سلول حافظه کپی می کند.سپس تغییرات را روی این کپی اعمال میکند.برای همین

بعد از خروج از تابع مقدار اون متغیر در حافظه تغییر نمی کند.
 

programmer

کاربر تازه وارد
تاریخ عضویت
1 نوامبر 2005
نوشته‌ها
85
لایک‌ها
0
اشاره گر ها :

یکی از مفاهیم پایه در ++C اشاره گرها هستند.

در واقع یک اشاره گر همونطور که از اسمش پیداست به یه داده اشاره میکنه !

به این برنامه توجه کنید :

کد:
#include<iostream.h>
#include<conio.h>
int main()
{
 clrscr();
 int x=10;
 int *pointer;
 pointer=&x;
 cout<<"x = "<<x<<endl;
 cout<<"*pointer = "<<*pointer<<endl;
 cout<<"&x = "<<&x<<endl;
 cout<<"pointer = "<<pointer<<endl;
 getch();
 return 0;
}

این هم خروجی برنامه :

pointer2.JPG


شکل زیر مفهوم پوینتر (اشاره گر) را خیلی واضح نشون میده :

pointer.JPG


هر متغیری چه اشاره گر و چه متغیر عادی فضایی در حافظه داره.

محتوای آن سلول حافظه در اشاره گر ها،آدرس یک سلول دیگه از حافظه است.

همونطور که در مثال بالا محتوای pointer برابر ff12 هست که این عدد،آدرس خانه x است !

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

مثلآ pointer * محتوای آدرس ff12 یعنی x را برمیگرداند.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
با تشكر از توضيحات خوب شما.
من از طرف تمامي خوانندگان از شما تشكر مي كنم.
خدا خيرتان بدهد.
.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
اشاره گر به اشاره گر:

کد:
#include <conio.h>		
#include <iostream.h>				
				
void main()						
{		
clrscr();char c ;
 menu:
 // ----------- shoroe ghaaleb -------------
 int number=3;
[size=4] int [color=red]*[/color]pointer1;[/size]
 pointer1=&number;
 
[size=4] int [color=red]**[/color]pointer2;[/size]
 pointer2=&pointer1;
 
 cout<<"number = "<<number<<"    &number="<<&number<<endl;
 cout<<"pointer1 =            "<<pointer1<<endl;
 cout<<endl<<endl;
 cout<<"&pointer1=            "<<&pointer1<<endl;
 cout<<"pointer2 =            "<<pointer2<<endl;
 // ----------- entehaye ghaaleb -----------
    cout<<"----------------------new run"<<endl;
	c=getch();if(c != 'q') goto menu;
}



174a1.gif


174a2.gif

.
 

programmer

کاربر تازه وارد
تاریخ عضویت
1 نوامبر 2005
نوشته‌ها
85
لایک‌ها
0
با تشكر از توضيحات خوب شما.
من از طرف تمامي خوانندگان از شما تشكر مي كنم.

خواهش میکنم.

فقط یه نکته :

در اشاره گرها با استفاده از * می توانیم به خانه ای که اشاره گر به آن اشاره میکند دسترسی داشته باشیم.

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

در مثال پست شماره 186 عبارت pointer2 ** معادل number است.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
به نقل از programmer :

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

رفرنس و اشاره گر دو تاست. و در مثالهاي قبل از هر دو مثال زديم.:

کد:
int a;
int &ref=a;                   // refrence
int *pointer; pointer=&a;     // pointer

مي توانيم اشاره گري داشته باشيم كه به جايي اشاره نكند كه null ناميده مي شود ولي رفرنس بي اشاره به جايي باعث ايجاد invalid program است.

اين اصطلاح يعني invalid program يعني برنامه اي كه خطا نداده و كار مي كند ولي اشتباه عمل مي كند.
من قبلا اين سئوال در ذهنم بود كه آيا اگر برنامه بي اعلام خطا از سوي كامپايلر اجرا شود ، آيا اين به اين معناست كه تمامي كارهاي من درست بوده؟ و حالا با اين اصطلاح invalid program جوابم را گرفتم. يعني ميشه برنامه اي خطا نگيرد ولي invalid باشد.
نقل از sams : شايد كامپايلر شما با null refrence مشكلي نداشته باشد ولي وقتي برنامه شما به كامپيوتر ديگري منتقل شود ، دچار مشكل شود.
نقل از saalek: من چيزي از اين حرفها نفهميدم. فقط گفتم تا به گوش شما هم خورده باشد.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
من خيلي به اين فكر مي كردم كه تابع آيا فقط يك خروجي مي تواند داشته باشد يا مي تواند چندين خروجي هم داشته باشد.
هنوز هم به جواب سئوال خود نرسيده ام.
چون تابع يك return دارد . پس نميشه چند تا چيز را return كرد.

ولي sams يه چيزايي گفته كه نقل مي كنم شايد شما بيشتر از من بفهميد.
گفته وقتي با رفرنس چند ورودي به تابع مي دهيم ، چون تابع روي همه ورودي ها تغييرات ايجاد مي كنه ، ميشه خودش به عنوان چند خروجي . و از return هم مي توانيم براي برگرداندن اعلام error ها استفاده كنيم.
كار قشنگيه؟ نه؟
جناب programmer البته مسلط هستند در اين قضيه ولي چون ممكنه وقت نداشته باشند ، از ايشان و يا هر يك از دوستان كه وقت دارند مي خواهم كه دو جمله اي بيشتر از اين متن كوتاه براي ما بگويند تا كمي بيشتر به عمل و بكارگيري اين ترفند نزديك شويم.
.
 

programmer

کاربر تازه وارد
تاریخ عضویت
1 نوامبر 2005
نوشته‌ها
85
لایک‌ها
0
جناب programmer البته مسلط هستند
شرمنده میفرمایید !

در مورد خروجی های تابع باید بدونیم که ممکنه تابعی احتیاج به بیش از یک خروجی داشته باشه.

مثلآ تابعی که که یک عدد را بگیرد و مجذوز و مکعب آنرا حساب کند !

مسلمآ تابع بیش از یک خروجی دارد ،چون باید هم مجذور و هم مکعب عدد را برگرداند.

به این برنامه نگاه کنید :

کد:
#include<iostream.h>
#include<conio.h>

void func(int n,int &a,int &b)
{
 a = n * n;
 b = a * n;
}
//.............
int main()
{
 int x,y,z;
 cout<<"Enter a number : ";
 cin>>x;
 func(x,y,z);
 cout<<"x   = "<<x<<endl;
 cout<<"x^2 = "<<y<<endl;
 cout<<"x^3 = "<<z<<endl;
 cout<<"Press any key to exit... ";
 getch();
 return 0;
}

این هم خروجی برنامه :

result.JPG


از متغیر های y و z به عنوان خروجی استفاده شده است.و تابع با return اصلآ چیزی بر نمیگرداند.
 

programmer

کاربر تازه وارد
تاریخ عضویت
1 نوامبر 2005
نوشته‌ها
85
لایک‌ها
0
در واقع در احضار از طریق ارجاع چون دسترسی مستقیم به متغیر های ارسال شده به تابع ممکن است،میتوان از این

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

همانطور که در مثال بالا میبینید دو متغیر y و z بوسیله ارجاع به تابع فرستاده شده اند و تابع میتواند آنها را

دستکاری کند.مقدار اولیه این متغیر ها اصلآ مهم نیست و در تابع استفاده نمیشود. تابع فقط برای اینکه بتواند بیش

از یک خروجی تولید کند از آنها استفاده میکند.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
مثال شما كاملا گويا بود. پس بحث تابع با چند خروجي هم حل شد.
در ادامه به باقي ريزه كاريها مي پردازيم.
مثل آرايه ، رشته، و ريزه كاريهاي ديگر .
.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
به نقل از carp3 :
سلام. من فقط به شما خوش آمد ميگم.
و نمي توانم جواب شما را بدهم . ولي دوستان ممكنه جواب بدهند.
اگر منظورتون داشتن شكل و شمايل ويندوزي براي برنامه است، من هم دنبالشم. ولي هنوز پيدا نكردم. گذاشته ام اين كارها را وقتي رسيدم به ويژوال سي.
البته ممكنه با توربو سي هم بشه كه من بلد نيستم.
ديگه همين ها را مي دونستم.
شرمنده .
.
 

carp3

کاربر تازه وارد
تاریخ عضویت
15 آپریل 2005
نوشته‌ها
1,318
لایک‌ها
1
سن
95
خواهش میکنم پس منتظر میمونم تا بفهمم
183.gif
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
تنظيمات توربو سي:
در منوي option زير منوي دايركتوري ها ، سومين آدرس را ميشه تغيير داد تا وقتي برنامه را run مي كنيم ، فايل obj و exe در پوشه ديگري تشكيل بشه.
اين طوري هم دايركتوري محل كارمان تمييز مي مونه و هم اين كه آن پوشه كه مي تواند پوشه اي دور از دسترس باشه ، ميشه يك بايگاني از كارهاي ما.

باز هم براي تمييزي پوشه محل كار ، ميشه بگيم فايل بك آپ ( با پسوند bak ) ساخته نشه.
منوي option ، زير منوي invironment ، گزينه editor ، اولين انتخاب را تيكش را برداريد. يعني create backup files را.
بقيه تنظيمات را فعلا من كار نكرده ام. اگر كسي توانست بنويسد.

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

لیلی

کاربر تازه وارد
تاریخ عضویت
7 نوامبر 2005
نوشته‌ها
15
لایک‌ها
0
سن
38
محل سکونت
Esf
سلام
ببخشید دوباره سوال من مربوط به مبحث قبلیه.(اخه account تموم شده بود.این شد که از بحث یکم عقب افتادم.)
در مورد return من 2 تا برنامه امتحان کردم.
کد:
#include<iostream.h>
int Max(int a,int b){
if(a>b)
return 1;
else if(b>a)
return -1;
else
return 0;
}
int main (){
int a,b;
cin>>a>>b;
cout<<Max(a,b);
return 0;
}
توی این برنامه 3 تاreturn داره.که هر 3 تاشون عمل میکنند.
اما توی این برنامه فقط return اولی عمل میکنه.چرا؟
کد:
#include<iostream.h>
int calculate(int a,int b){
int Mul,Sum,Div;
Mul=a*b;
return Mul;
Sum=a+b;
return Sum;
Div=a/b;
return Div;
}
int main (){
int a,b;
cin>>a>>b;
cout<<calculate(a,b);
return 0;
}
سوال دیگه هم مربوط به return کردن یک ارایه است.مثلا تابعی که یه ماتریس بگیره و عناصر روی قطر اصلی رو توی یک ارایه ذ خیره کنه و اون ارایه رو return کنه ؟
 
بالا