تمرینات منزل - مرجع پروژه و کتاب

Download Report

Transcript تمرینات منزل - مرجع پروژه و کتاب

‫بسم هللا الرحمن الرحیم‬
‫مدرس ‪ :‬ناصر خنجری‬
‫ّ‬
‫ویرایش ‪ :‬محمود حیدری نژاد‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪ -1‬کالس ها و اشیا‬
‫‪ -2‬وراثت‬
‫‪ -3‬سربارگزاری عملگرها‬
‫‪ -4‬چند ریختی‬
‫‪ -5‬قالب ها‬
‫‪ -6‬فایل ها‬
‫‪ 15‬نمره‬
‫‪ ‬امتحان‬
‫‪ 5‬نمره‬
‫‪ ‬پروژه‬
‫‪ ‬تمرینات کالسی ‪ +‬جزوه ‪ +‬حضور در کالس‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫فصل اول‪ :‬کالس ها و اشیا‬
‫جلسه اول‬
‫اصول و مفاهیم موجود در برنامه نویسی شی گرا‬
‫کالس (‪(Class‬‬
‫شئ (‪(Object‬‬
‫تمرینات منزل‬
‫جلسه دوم‬
‫نحوه تعریف توابع‬
‫سازنده )‪(constructor‬‬
‫سازنده های پارامتردار‬
‫مخرب )‪(destructor‬‬
‫تمرینات منزل‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫جلسه سوم‬
‫توابع ورودی (یادآوری)‬
‫توابع خروجی(یادآوری)‬
‫جلسه چهارم‬
‫تابع دوست یک کالس )‪(friend‬‬
‫جلسه پنجم‬
‫پشته )‪(stack‬‬
‫صف )‪(quee‬‬
‫فصل دوم ‪ :‬وراثت‬
‫جلسه ششم‬
‫وراثت )‪(Inhertance‬‬
‫جلسه هفتم‬
‫مروری بر اشاره گرها‬
‫اعمال محاسبتی بر روی اشاره گر ها‬
‫جلسه هشتم‬
‫مقایسه اشاره گرها‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫اشاره گر به اشاره گر‬
‫تخصیص حافظه پویا‬
‫رابطه اشاره گر و آرایه یک بعدی‬
‫رابطه اشاره گر و آرایه دو بعدی‬
‫نحوه تعریف آرایه دو بعدی با استفاده از اشاره گرها‬
‫تابع )‪(strchr‬‬
‫تابع )‪(strstr‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪ -1‬کپسوله کردن (‪ :)Encapsulation‬یعنی پنهان سازی جزئیات پیاده سازی از دید کاربران‪.‬‬
‫مثل)سیستم تلفن از زمان اختراع تا کنون تغییرات زیادی داشته است اما شماره گیری همچنان ثابت‬
‫باقی مانده است‪.‬‬
‫‪ -2‬وراثت (‪:)inheritance‬به این معنی که اشیائی را از روی اشیاء موجود ایجاد نماییم به طوری‬
‫که ویژگی های آن شئ را در خود داشته باشد (به ارث ببرد) و همچنین ویژگی های مخصوص خود‬
‫را نیز داشته باشد‬
‫مثل) دانشگاه را در نظر بگیرید اشیائی که در آن وجود دارند عبارت است از دانشجو استاد و کارمند‬
‫این عناصر دارای ویژگی های مشترک نام ‪ ،‬نام خانوادگی‬
‫نام ‪ ،‬نام خانوادگی ‪ ،‬ش‪.‬ش ‪ ،‬ت‪.‬ت‬
‫‪ ،‬ش‪.‬ش ‪،‬ت‪.‬ت و‪ ...‬هستند‪ .‬که می توانیم این ویژگی های‬
‫مشترک را در قالب یک مفهوم به نام کالس اعضا قرار‬
‫اعضای دانشگاه‬
‫دهیم‪.‬همچنین هر یک از این عناصرویژگی هایخاص خود‬
‫دانشجو‬
‫استاد‬
‫کارمند‬
‫را نیز داشته باشند که در شکل روبرو مشخص شده است‪.‬‬
‫شماره پرسنلی‬
‫مدرک‬
‫ش‪ .‬د‬
‫‪ -3 ‬چند ریختی (‪ :)polymorphism‬این مفهوم بیشتر در وراثت ماربرد دارد و به معنای یک چیز‬
‫بودن و چند شکل داشتن است‪.‬‬
‫‪ ‬مثل) اثر انگشت که از والدین به ارث برده می شود یک ویژگی مشترک بین فرزندان و والدین است‪.‬‬
‫اما شکل آن متفاوت می باشد‪.‬‬
‫‪ ‬الگوریتم برنامه نویسی شئ گرا‪ -1:‬پیدا کردن اشیاء ‪ -2‬ایجاد کالس ها ‪ -3‬تعریف توابع مربوط به‬
‫هر کالس ‪ -4‬ایجاد اشیائی از کالس ‪ -5‬فراخوانی آن ها در برنامه اصلی‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫تعریف) مجموعه ای از متغیرها و توابعی است که بر روی این متغیر ها عمل می کند‪.‬به متغیر ها‬
‫اعضا داده و به توابع متد گقته می شود‪.‬‬
‫مثل) کالس مستطیل را در نظر بگیرید اعضای داده آن عبارتند از‪ :‬طول و عرض و متد های آن‬
‫عبارتند از محیط و مساحت‪.‬‬
‫‪class‬‬
‫نحوه تعریف کالس‪ :‬به صورت زیر می باشد‪.‬‬
‫}‬
‫متغیرهای خصوصی‪ :‬این متغیر ها فقط توسط اعضا‬
‫; متغیر ها و توابع خصوصی‬
‫قابل دستیابی هستند و سایر کالس ها و توابع نمی توانند‬
‫‪Private:‬‬
‫از ان ها استفاده کنند‪.‬‬
‫; متغیر ها و توابع خصوصی‬
‫متغیرهای عمومی‪ :‬در سراسر برنامه قابل دستیابی اند‪.‬‬
‫‪Publice:‬‬
‫متغیر های محافظت شده‪ :‬این نوع از متغیر ها در‬
‫; متغیر ها و توابع عمومی‬
‫وراثت مورد استفاده قرار می گیرند که در ادامه توضیح‬
‫‪Protected:‬‬
‫خواهیم داد‪.‬‬
‫; متغیر ها و توابع محافظت شده‬
‫;}‬
‫‪ ‬چند نکته در مورد متغیر ها‪:‬‬
‫‪ ‬نکته ‪ )1‬اگر نوع دستیابی مشخص نباشد به طورخودکار ‪ private:‬در نظر گرفته می شود‪.‬‬
‫‪ ‬نکته‪ )2‬هنگام تعریف کالس ها بهتر است متغیرهای خصوصی و توابع را عمومی تعریف‬
‫کنیم‪.‬‬
‫‪ ‬پس از تعریف کالس باید بدنه توابع مربوط به ان کالس را تعریف نمایید که به صورت زیر‬
‫می باشد‪.‬‬
‫(لیست پارامتر ها) نام تابع ‪ ::‬نام کالس نوع تابع‬
‫}‬
‫دستور ‪1‬‬
‫…‬
‫دستور‪n‬‬
‫{‬
‫نوع تابع‪ :‬نوع داده ای را مشخص می کند که باید تابع برگرداند اگر تابع هیچ مقداری را‬
‫برنگرداند نوع آن ‪ void‬خواهد بود همچنین نام تابع ازقوانین نام گزاری متغیر ها تبعیت می کند‪.‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫تعریف‪ :‬به یک نمونه از یک کالس ‪ object‬گفته می شود‪.‬‬
‫پس از تعریف متد ها باید یک ‪ object‬از کالس مورد نظر را ایجاد نماییم تا بتوانیم به اعضای آن‬
‫دسترسی داشته باشیم‪.‬‬
‫نحوه تعریف شئ یا ‪: object‬‬
‫‪ :‬نام شئ نام کالس‬
‫نحوه دسترسی به اعضای کالس‪:‬‬
‫نام شئ‬
‫‪( :‬پارامترها) نام متد‬
‫ مثال) مثال برنامه ای بنویسید که با استفاده از یک کالس شعاع دایره را از ورودی خوانده و محیط و‬
.‫مساحت آن را محاسبه نماید‬
‫ باید کالس برای دایره ایجاد نماییم و متدهایی برای خواندن شعاع از ورودی و چاپ محیط‬:‫ راهنمایی‬
.‫و مساحت بنویسیم‬
#include<iostream.h> void circle::input()
#include<conio.h>
{
:‫خروجی‬
please
enter r:5
class circle
cout<<"please
enter r:";
P31.4
{
G78.5cin>>r;
int r;
}
public:
/////////////////
void input();
void circle :: output()
void output();
{
};
cout<<"p"<<2*3.14*r<<endl;
////////////////
cout<<"g"<<3.14*r*r<<endl;
}
/////////////////
void main ()
{
circle cr;
cr.input();
cr.output();
getch();
}
‫ برنامه ای بنویسید که با استفاده از کالس ها محیط و مساحت یک مستطیل را محاسبه‬-1 
.‫کند‬
#include<iostream.h> int cuboid::ma()
#include<conio.h>
class cuboid
{
int len,wid;
public:
int input();
int output();
int mo();
int ma();
};////////
int cuboid::mo()
{(len+wid)*2;}
////////////////
{
len*wid;
:‫خروجی‬
} ////////////////
please enter length , width :5,4
int cuboid::input()
mohit=18
{ masahat=20
cout<<"please enter length , width :";
cin>>len>>wid;
}/////////////////
int cuboid :: output()
{
cout<<"mohit="<<mo()<<endl;
cout<<"masahat="<<ma()<<endl;
} /////////////////
int main ()
{
cuboid cu;
cu.input();
cu.output();
getch();
}
)+،-،×،÷(.‫ برنامه ای بنویسید که با استفاده از کالس ها اعمال یک ماشین حساب را انجام دهد‬-2 
#include<iostream.h>
#include<conio.h>
class calculator
{
int num1,num2;
char c;
public:
int input();
int output();
int mohasebe();
}; ////////////////
int calculator::input()
{
cout<<"please enter
number 1:";
cin>>num1;
cout<<"zarb="<<num1*num2;
cout<<"please enter number 2:";
break;
cin>>num2;
case '/':
cout<<"please character:";
cout<<"thagsim="<<num1/num2;
cin>>c;
break;
}/////////////////
:‫خروجی‬
}
int calculator::output()
please enternumber 1:2
please enter number 2:2
}
{
please
/////////////////
switch
(c) character:+
jam=4
int main ()
{
{
case '-':
calculator ca;
cout<<"menha="<<num1-num2;
ca.input();
break;
ca.output();
case '+':
getch();
cout<<"jam="<<num1+num2;
}
break;
case '*':
‫‪ -1 ‬الگوی تابع را قبل از ‪ main‬به صورت زیر تعریف می کنیم‪.‬‬
‫; (لیست پارامترها) نام تابع‬
‫‪ -2 ‬الگوی تابع را بعد از ‪ main‬به صورت زیر تعریف می کنیم‪.‬‬
‫; (لیست پارامترها) نام تابع‬
‫نوع تابع‬
‫نوع تابع‬
‫}‬
‫دستور‪1‬‬
‫…‬
‫دستور ‪n‬‬
‫}‬
‫نکته) اگر طول تابع زیاد نباشد داخل کالس تعریف می کنیم ولی اگر طول تابع زیاد باشد خارج از کالس‬
‫و جدا تعریف می کنیم تا خوانایی برنامه بیشتر شود‪.‬‬
‫‪ ‬تعریف) تابعی است هم نام با کالسی که در آن تعریف می شود که هنگام ایجاد اشیایی از کالس به آن‬
‫ها مقدار اولیه می دهد سازنده ها موجب کارایی بیشتر برنامه شده و از به وجود آمدن برخی از‬
‫خطاها جلوگیری می کنند‪.‬‬
‫‪ ‬نکته) سازنده هیچ مقداری را بر نمی گرداند و نوع آن نیز مشخص نمی باشد‪.‬‬
‫;)(‪#include<iostream.h> void output‬‬
‫‪ ‬مثال) )( ‪void main‬‬
‫{‬
‫{‬
‫;‪cout<<“x=“<<x<<endl‬‬
‫;‪test t‬‬
‫;‪cout<<“y=“<<y<<endl‬‬
‫;)(‪t.output‬‬
‫خروجی‪:‬‬
‫‪X=10‬‬
‫}‬
‫}‬
‫‪Y=20‬‬
‫;}‬
‫>‪#include<conio.h‬‬
‫‪class test‬‬
‫{‬
‫;‪int x,y‬‬
‫‪public:‬‬
‫};‪{x=10 , y=20‬‬
‫‪ ‬تعریف) مقدار اولیه متغیر های کالس را می توان در قسمت ‪ main‬برنامه تعیین نمود ‪ .‬در این‬
‫صورت باید از سازنده های پارامتردار استفاده نماییم که نحوه ی مقداردهی نیز به صورت زیر‬
‫خواهد بود‬
‫; (‪ ,...‬مقدار پارامتردوم و مقدار پارامتراول) نام شئ نام کالس ‪1-‬‬
‫;)‪( test t(10,20‬مثال‬
‫;(‪ ,...‬مقدار پارامتر دوم ‪ ,‬مقدارپارامتراول) نام کالس = نام شئ نام کالس ‪2-‬‬
‫;)‪( test t=test(10,20‬مثال‬
‫‪ ‬نکته) اگر سازنده فقط دارای یک پارامتر باشد مقداردهی آن را به صورت زیر می توان انجام داد‪.‬‬
‫; مقدار = نام شئ نام کالس‬
‫‪ ‬مثال)‬
‫>‪#include<iostream.h‬‬
‫>‪#include<conio.h‬‬
‫‪class test‬‬
‫;‪{int x,y‬‬
public:
test(int i,int j)
{x=I ;y=j;}
Void output()
{cout<<“x=“<<x<<endl;
cout<<“y=“<<y<<endl;}
X=10
};
Y=20
Void main()
{test t(10,20);
‫یا‬
test t=(10,20);
t.output();
};
:‫خروجی‬
‫‪ ‬تعریف) تابعی هم نام با کالسی است که در آن تعریف می شود و با عالمت ~ شروع می شود‪.‬‬
‫هنگامی که اشیاء کالس از بین رفتند تابع مخرب آن ها فراخوانی می شود تا فضای اشغال شده توسط‬
‫اشیاء آزاد شود و یا به عبارت ساده تر کار تابع مخرب آزاد سازی حافظه اشغال شده توسط اشیاء می‬
‫باشد‪.‬‬
‫>‪#include<iostream.h‬‬
‫)(‪void output‬‬
‫‪ ‬مثال)‬
‫{‬
‫;‪cout<<“x=“<<x<<endl‬‬
‫}‬
‫;}‬
‫)(‪void main‬‬
‫;‪{ test t‬‬
‫;)(‪t.output‬‬
‫;}‬
‫>‪#include<conio.h‬‬
‫‪class test‬‬
‫;‪{int x,y‬‬
‫‪public:‬‬
‫)(‪test‬‬
‫};‪{x=0‬‬
‫;)(‪~ test‬‬
‫‪ ‬مثال) برنامه ای بنویسید که با استفاده از کالس ‪ ،‬عملکرد ‪ 24‬ساعته یک ساعت دیجیتال را شبیه‬
‫سازی نماید‪ .‬برنامه باید زمان را در قالب زیر نمایش دهد‪.‬‬
‫>‪#include<iostream.h‬‬
‫>‪#include<conio.h‬‬
‫)( ‪int main‬‬
‫{‬
‫خروجی‪:‬‬
‫;‪int h,m,s,i‬‬
‫‪1:01:05‬‬
‫)‪for (h=1;h<=60;h++‬‬
‫)‪for (m=1;m<=60;m++‬‬
‫)‪for (s=1;s<=60;s++‬‬
‫)‪for (i=1;i<=1000;i++‬‬
‫;"‪cout<<h<<":"<<m<<":"<<s<<"\r‬‬
‫;)(‪getch‬‬
‫}‬
‫‪ ‬کالسی برای محاسبات کسری ایجاد نمایید سپس توابع الزم برای انجام چهارعمل اصلی بر‬
‫روی اعداد کسری را بنویسید برنامه باید نتایج را به صورت کسری نمایش دهد همچنین‬
‫قابلیت ساده سازی را در صورت ساده شدن داشته باشد‪.‬‬
‫ کد کاال وقیمت آن می‬، ‫ کالسی برای یک فروشگاه ایجاد نمایید که شامل سه کاال با مشخصات نام کاال‬
.‫باشد برای این سه کاال مقداردهی را انجام داده و در برنامه چاپ نمایید‬
)‫ راه حل اول‬
#include<iostream.h> {
#include<conio.h>
#include<stdio.h>
class store
{
char name[16];
int id,price;
public:
store(){};
~store(){};
void input()
cout<<endl<<“name:”;
gets(name);
cout<<“id:”;
cin>>id;
cout<<“price:”;
cin>>price;
}
Void output()
{
cout<<“---------------”<<endl;
Puts(name);
cout<<id<<endl;
Cout<<price;
}
};
Void main()
{
Store s;
For (int i=1;i<=3;i++)
{
‫;”‪cout<<“please enter info of goods number”<<i<<“:‬‬
‫;)(‪s.input‬‬
‫;)(‪s.output‬‬
‫خروجی‪:‬‬
‫}‬
‫‪please enter info of goods number1:‬‬
‫;}‬
‫‪name:book1‬‬
‫‪id:1‬‬
‫‪ ‬توضیح) برنامه فوق درست بوده اما از سازنده در ساده ترین حالت استفاده شده است‪ .‬در راه حل دوم‬
‫‪Price:1000‬‬
‫‪--------------------------‬متغیرها ارسال‬‫تابع )(‪ input‬را از برنامه حذف خواهیم نمود و مقادیر را از طریق سازنده به‬
‫خواهیم کرد‪.‬‬
‫‪book1‬‬
‫‪1‬‬
‫‪1000‬‬
‫‪please enter info of goods number2:‬‬
‫‪name:‬‬
‫…‪,‬‬
)‫ راه حل دوم‬
#include<iostream.h>
#include<string.h>
#include<stdio.h>
pofak namaki
class store
id:1
{
price:2000
char name[16]; --------------------------chips
int id,price;
id:2
public:
price:3000
store(char name1[16],int id1,int price1)
{
id=id1;
price=price1;
strcpy(name,name1);
}
~store(){}
void output()
{
:‫خروجی‬
puts(name);
cout<<"id="<<id<<endl;
cout<<"price="<<price<<endl;
cout<<"---------------------------"<<endl;
}
};
void main()
{
store s("pofak
namaki",1,2000);
s.output();
store s1("chips",2,3000);
s1.output();
}
‫‪ : cin -1‬این تابع برای خواندن یک مقدار از ورودی به کار می رود و خواندن تا زمان‬
‫‪‬‬
‫رسیدن به اولین ‪ space‬و یا ‪ Enter‬ادامه خواهد کرد‪.‬درکتابخانه ‪ iostream.h‬قرار‬
‫دارد‪.‬‬
‫‪ : gets() -2‬این تابع برای خواندن رشته ها به کار می رود وخواندن رشته تارسیدن‬
‫‪ enter‬ادامه پیدا خواهد کرد در کتابخانه ی ‪ stdio.h‬قرار دارد و نحوه استفاده از آن به‬
‫توابع ورودی‬
‫صورت زیر است‪.‬‬
‫;(نام متغیر رشته ای) ‪gets‬‬
‫نکته) تابع ‪ gets‬کاراکتر )‪ Null (/0‬را به طورخودکاربه انتهای رشته اضافه خواهد کرد‪.‬‬
‫‪ : cin.get -3‬این تابع نیز برای خواندن ورودی به کار می رود و نحوه استفاده از آن به‬
‫صورت زیر است‪( .‬تعداد کاراکتر هایی که باید خوانده شود ; نام متغیر رشته ای) ‪cin.get‬‬
‫مثال) خروجی تابع زیر چیست؟‬
‫)(‪Void main‬‬
‫;]‪{char s[10‬‬
‫‪Cin.get(s,5); computer‬‬
‫‪Cout<<s;} compu‬‬
‫‪ ‬توابع خروجی )‪ : (cout ,puts‬این توابع برای چاپ مقادیر در خروجی به کار می روند و تفاوت آن ها در این‬
‫است که در تابع ‪ cout‬پس از چاپ مکان نما در همان سطر باقی می ماند اما در ‪ puts‬پس از چاپ مکان نما‬
‫به سر سطر بعد منتقل می شود‪.‬‬
‫‪ ‬تابع )(‪ : strcpy‬این تابع برای کپی کردن یک رشته در رشته دیگر به کار می رود با فرض اینکه ‪ s1‬و ‪ s2‬دو‬
‫رشته باشند خواهیم داشت‪.‬‬
‫)‪strcpy(s1,s2‬‬
‫می توند متغیریا ثابت باشد‬
‫حتما باید متغیر باشد‬
‫در نتیجه محتوای ‪ s2‬به ‪ s1‬کپی می شود و محتوای قبلی ‪ s1‬از بین می رود‪.‬‬
.‫ کپی کند‬s1 ‫ را درون‬s2 ‫ را از ورودی خوانده و‬s2‫ و‬s1 ‫ مثال) برنامه ای بنویسید که دو رشته‬
#include<iostream.h>
}
#include<conio.h>
s1[i]=‘\0’;
#include<stdio.h>
cout<<“--------------------------------------------------”<<endl;
int main ()
puts(s1);
{
}
:‫خروجی‬
int i=0;
S1=mahmood
char s1[21],s2[21];
S2=heydari
------------------------------cout<<“s1=“;
heydari
gets(s1);
cout<<“s2=“;
gets(s2);
while(s2[i]!=‘\0’)
{
s1[i]=s2[i];
i++;
‫‪ ‬مثال) برنامه ای بنویسید که رشته را از ورودی خوانده و تشخیص دهد متقارن است یا نه؟‬
‫‪ ‬راه حل) برای حل مسئله فوق باید ابتدا و انتهای رشته ورودی را داشته باشیم ابتدای رشته کامال‬
‫مشخص است بنابراین باید اندیس انتهای رشته را به دست آوریم و سپس محتوای اندیس های ابتدا و‬
‫انتهای رشته را مقایسه نماییم در صورتی که تا انتهای مقایسه اختالفی وجود نداشته باشد رشته متقارن‬
‫است‪.‬‬
‫>‪#include<iostream.h‬‬
‫>‪#include<conio.h‬‬
‫>‪#include<stdio.h‬‬
‫)( ‪void main‬‬
‫;]‪{char s[21‬‬
‫;‪int I,j,k‬‬
‫‪//i=andise ebteda j=mohasebeye enteha k=negahdari enteha‬‬
‫‪int p==1‬‬
‫‪// motagharen ast ya na‬‬
‫;“=‪cout<<“s‬‬
‫;)‪gets(s‬‬
‫‪//mohasebeye andise entehaye reshteh‬‬
‫;‪j=0‬‬
‫)’‪while(s[j]!=‘\0‬‬
‫;‪j++‬‬
‫‪//mohasebeye inke reshte motagharen ast‬‬
for(i=0,k=j-1;i<=k;i++,k--)
if(s[i]!=s[k])
{
p=0;
break;
}
if(p==1)
S1=nan
cout<<“motagharenmotagharen
ast”)
ast
else
cout<<“motagharen nist”;
}
:‫خروجی‬
‫‪ ‬در برخی از مواقع الزم است که تابعی که متعلق به یک کالس نیست به اعضای آن کالس دسترسی داشته باشد‬
‫در این حالت باید آن تابع را به عنوان دوست کالس تعریف نماییم که برای این کار ابتدا الگوی تابع را داخل‬
‫کالس تعریف نموده با این شرط که در ابتدای الگو کلمه ی کلیدی ‪ friend‬را ذکر و سپس بدنه ی آن را خارج‬
‫از کالس تعریف می نماییم و در آخر نیز تابع را در برنامه اصلی فراخوانی می کنیم‪.‬‬
‫‪ ‬مثال) برنامه ای بنویسید که توسط یک تابع دوست جمع دو عضو کالس را انجام دهد‪.‬‬
‫‪Class test‬‬
‫)(‪void main‬‬
‫{‬
‫خروجی‪:‬‬
‫{‬
‫‪2‬‬
‫;‪int a,b‬‬
‫;‪test t‬‬
‫‪4‬‬
‫‪public:‬‬
‫;)(‪t.input‬‬
‫‪6‬‬
‫)(‪void input‬‬
‫;)‪sum (t‬‬
‫{‬
‫}‬
‫;‪cin>>a>>b‬‬
‫)‪void sum(test t1‬‬
‫}‬
‫{‬
‫;)‪friend void sum(test t1‬‬
‫;‪cout<<t1.a+t1.b‬‬
‫;}‬
‫}‬
‫ مثال) برنامه ای بنویسید که با استفاده از تابع دوست کالس کوچکترین مقدار بین دو داده را پیدا نموده‬
.‫و در برنامه اصلی چاپ نماید‬
#include<iostream.h>
class test
{
int a,b;
public:
void input()
{
cin>>a>>b;
}
friend int min(test t1);
};
////////////
void main()
{
test t;
t.input();
cout<<min(t);
}
/////////////////
int min(test t1)
{
:‫خروجی‬
if(t1.a<t1.b) return t1.a;
2
else return t1.b;
4
2 ‫یا‬
return t1.a<t1.b?t1.a:t1.b;
}
‫ نویسنده و سال انتشار) را‬، ‫ کد کتاب‬،‫ کتاب (نام کتاب‬10 ‫ مثال) برنامه ای بنویسید که مشخصات‬
‫خوانده و چاپ نماید و قابلیت جستوجوی یک کتاب براساس کد کتاب را خوانده ؟‬
#include<iostream.h>
#include<stdio.h>
class book
{
char name[30],author[30];
int id,year;
public:
void input()
{
cout<<"book name:";
gets(name);
cout<<"id:";
cin>>id;
cout<<"author:";
gets(author);
cout<<"year:";
cin>>year;
}
void output()
{
cout<<"book
name:"<<name<<endl;
cout<<"id:"<<id<<endl;
//
cout<<"author:"<<author<<endl;
cout<<"year:"<<year<<endl;
}
friend int search(int key);
};
book *b;
void main()
{
if(search(bid)!=-1)
int i,bid,n;
{
:‫خروجی‬
cout<<"enter number of book:";
enter number of book:1
cin>>n;
b[search(bid)].output();
enter a book info:
b=new book[n];
book name:hafez
}
id:45
//book b[2];
else cout<<"not found"; */
author:hafez
//i=0;
}
year:1391
for( i=0;i<n;i++)
/*int search(int key)
-------------book report-----------{
book name:hafez {
cout<<"enter a book info:";
id:45
for(int i=0;i<=1;i++)
author:hafez
b[i].input();
if(key==b[i].id)
year:1391
}
return i;
return -1;
cout<<"-------------book report------------"<<endl;
for( i=0;i<=1;i++)
}*/
b[i].output();
/*cout<<"enter id for search:";
cin>>bid;
‫‪ ‬یک لیست مرتب (آرایه) می باشد که عملیات درج و حذف از یک طرف آن انجام می گیرد یعنی به این صورت‬
‫که آخرین عنصر وارد شده اولین عنصری خواهد بود که خارج می شود که اصطالحا به آن ‪ Lifo‬گفته می شود‬
‫‪Lifo‬‬
‫‪ ‬شکل انتضاعی پشته به صورت زیر می باشد‪.‬‬
‫‪ ‬برای دسترسی به عناصر پشته از متغیری به نام ‪ top‬استفاده می شود‬
‫که مقدار اولیه آن برابر صفر می باشد زیرا در اول کار هیچ عنصری در‬
‫پشته درج نشده است‪.‬برای این که بتوانیم یک عنصر را در پشته درج نماییم‬
‫باید پشته پر نشده باشد همچنین برای آن که بتوانیم عنصری را در پشته بخوانیم‬
‫باید پشته خالی نباشد‪ .‬که این شرایط را به صورت زیر بیان خواهیم کرد‪.‬‬
‫‪Last in First out‬‬
‫‪//////////////////////‬‬
‫‪n‬‬
‫‪n-1‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪0‬‬
‫‪//////////////////////‬‬
‫پشته‬
‫‪-1‬‬
‫‪top‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫شرط پر بودن پشته‪top = n :‬‬
‫شرط خالی بودن پشته‪top=-1 :‬‬
‫بنابراین می توانیم درج و حذف یک عنصر از پشته را به صورت زیر پیاده سازی نماییم‬
‫درج یک عنصر در پشته‪:‬‬
‫نام تابع‬
‫عنصری است که در پشته درج میشود‬
‫)‪Void push(int item‬‬
‫{‬
‫)‪If (top==n‬‬
‫پشته پر است ;)(‪stack full‬‬
‫)(‪Void stock full‬‬
‫‪Else‬‬
‫{‬
‫{‬
‫;”)(‪Cout<<“stock is full‬‬
‫}‬
‫;‪s[top]=item s‬‬
‫;‪top++‬‬
‫درج ‪ item‬در ]‪ s[top‬و افزایش ‪ top‬برای درج عنصر بعدی‬
‫}‬
‫}‬
:‫ حذف یک عنصر از پشته‬
Void pop()
{
if (top==-1)
stack empty(); ‫پشته خالی است‬
Void stock empty()
Else
{
{
Cout<<“stock is empty()”;
}
top - - ;
item=s[top];
cout<<item;
‫ برای حذف عنصر بعدی‬top ‫حذف یک عنصراز پشته وچاپ آن و سپس کاهش‬
}
}
‫ مثال) کالسی برای پشته ایجاد نمایید سپس متدهایی را برای حذف یک عنصر از پشته و درج یک‬
.‫عنصر در آن بنویسید‬
#include<iostream.h>
class stack
{
int top,s[10];
public:
int item;
stack(){top=0;}
void push(int item)
{
if(top==10)
stackfull();
else
{
s[top]=item;
top++;
}
}//end push
void pop()
{
top--;
if(top==-1)
23
stackempty();
-4
else
Stack is empty!!!!
{
item=s[top];
cout<<endl<<item;
}
void stackempty()
{cout<<endl<<"Stack Is empty!!!!“
<<endl; }
:‫خروجی‬
};
///////////
void main()
{
stack st;
st.push(-4);
st.push(23);
}
st.pop();
}//end pop
st.pop();
void stackfull()
st.pop();
{
}//end main
cout<<"Stack Is Full!!!!"<<endl;
‫‪ ‬یک لیست مرتبی است که عمل درج در آن از یک طرف به نام انتهای صف انجام می شود همچنین عمل حذف‬
‫از آن از یک طرف به نام ابتدای صف انجام می شود به عبارت دیگر اولین عنصر وارد شده اولین عنصر‬
‫خارج شده می باشد که شکل آن به صورت زیر می باشد‪.‬‬
‫‪ rear‬اشاره به انتهای صف‬
‫برای درج یک عنصر‬
‫‪... N-1‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫‪0‬‬
‫‪ Front‬اشاره به ابتدای صف‬
‫برای حذف یک عنصر‬
‫‪ : Front=rear=-1‬مقدار اولیه‬
‫‪rear=n‬‬
‫‪ ‬شرط پر بودن صف‪:‬‬
‫‪ ‬شرط خالی بودن صف‪front=rear :‬‬
‫‪ ‬در ابتدای کار هیچ درج و یا حذفی انجام نشده است بنابراین ‪ front=rear=-1‬می باشد برای اضافه کردن یک‬
‫عنصر به صف باید بررسی نماییم که صف پر نباشد که زمانی صف پر می شود که ‪ rear=n‬باشد همچنین‬
‫برای حذف یک عنصر از صف باید بررسی نماییم که صف خالی نباشد که شرط خالی بودن صف این است که‬
‫‪ front=rear‬باشد که عمل درج و حذف به صورت زیر خواهد بود‪.‬‬
:‫ درج یک عنصر در صف‬
Void addq(int item)
{
if (rear==n)
qfull();
‫شرط پر بودن صف‬
Void qfull()
Else
{
{
Cout<<“quee is full”;
}
rear++;
q[rear]=item; ‫ در صف‬item ‫درج عنصر‬
}
}
:‫ حذف یک عنصر از صف‬
Void delq()
{
if (front==g)
gempty();
‫صف خالی است‬
Void gempty()
Else
{
{
Cout<<“quee is empty”;
}
front ++;
item=g[front];
cout<<item;
‫ از صف‬item ‫حذف عنصر‬
}
}
‫ مثال) کالسی برای یک صف ایجاد نمایید سپس مقدار های الزم برای حذف یک عنصر از صف و‬
.‫درج یک عنصر در آن را بنویسید‬
}
#include<iostream.h> }//end addq
void delq()
void qempty()
class quee
{
{
{
if(front==g[rear])
cout<<endl<<"quee Is empty!!!!“
int rear,front,g[10];
:‫خروجی‬
qempty();
<<endl;
public:
-4
else
}
int item;
23
};
quee(){front=rear=-1;} {Stack is empty!!!!
front++;
///////////
void addq(int item)
item=g[front];
void main()
{
cout<<endl<<item;
{
if(rear==10)
quee st;
qfull();
}
st.addq(-4);
else
}//end delq
st.addq(23);
{
void qfull()
st.delq();
rear++;
{
st.delq();
g[rear]=item;
cout<<"quee Is Full!!!!"<<endl; st.delq();}//endmain
}
‫‪ ‬همانطور که می دانیم وراثت یعنی این که یک شئ خصوصیات یک شئ دیگر را به ارث ببرد وهم چنین ویژگی‬
‫های خاص خود را نیز داشته باشد‬
‫‪ ‬نحوه تعریف یک کالس مشتق شده که قرار است برخی از خواص یک کالس دیگر را به ارث ببرد به صورت‬
‫زیر می باشد‪.‬‬
‫نام کالس والد نوع دستیابی ‪ :‬نام کالس ‪Class‬‬
‫}‬
‫اعضای متغیرهای خصوصی‬
‫‪Public:‬‬
‫اعضای متدهای عمومی‬
‫‪Protected:‬‬
‫اعضای متدهای محافظت شده‬
‫;}‬
‫‪ ‬نوع دستیابی می تواند به صورت ‪ private ،public‬و ‪ protected‬باشد که در ادامه بیان خواهند شد‪.‬‬
‫‪( Protectod ‬محافظت شده )‪ :‬نوع داده و متدهای محافظت شده اعضایی هستند که فقط در کالس‬
‫هایی که از این کالس مشتق شده اند قابل دستیابی هستنند‪.‬‬
‫‪ ‬مثال) کالس برای چند ضلعی ها ایجاد کنید به طوری که ویژگی های مشترک چند ضلعی ها در این‬
‫کالس قرار داشته باشند سپس کالس هایی برای چند ضلعی هایی مانند مستطیل و مثلث ایجاد کنید به‬
‫طوری که این کالس ها ویژگی های مشترک خود را از کالس چند ضلعی ها به ارث ببرند همچنین‬
‫متدها و ویژگی های خاص خود را نیز داشته باشند سپس برنامه ای برای از این کالس ها بنویسید ‪.‬‬
‫‪ ‬راه حل ) راه حل مسئله فوق را با شکل زیر می توان مدل سازی نمود‪.‬‬
‫کالس والد یا پایه‬
‫کالس مشتق شده‬
‫‪Poly gon‬‬
‫‪ =trian‬کالس‬
‫مثلث‬
‫ارتفاع×قاعده‬
‫‪1‬‬
‫‪2‬‬
‫کالس چند ضلعی ها‬
‫کالس مشتق شده‬
‫‪=rect‬‬
‫= مساحت =‪area‬‬
‫‪ ‬بنابراین می توانیم برنامه را به صورت زیر پیاده سازی نماییم‪.‬‬
‫پارامتر‪x=1‬‬
‫پارامتر‪y=2‬‬
‫کالس مستطیل‬
‫عرض×طول = مساحت =‪area‬‬
class polygon
class train:public polygon
{
{
protected:
public:
int x,y;
int area()
public:
{
void set_values(int a, int b) return(x*y)/2;
:‫خروجی‬
{x=a;y=b;}
}
masahat mostatil:200
};
};
masahat
mosallas:15
////////////////////////
/////////////////////
class rect:public polygon
void main()
{
{
public:
rect r;
‫ از کالس مستطیل‬r ‫ایجاد شئ‬
int area()
train t;
‫ از کالس مثلث‬t ‫ایجاد شئ‬
{
r.set_values(10,20);
‫مقداردهی طول و عرض مستطیل‬
return x*y;
cout<<"masahat mostatil:"<<r.area()<<endl;
}
t.set_values(5,6);
‫مقدار دهی قاعده و ارتفاع مثلث‬
};
cout<<"masahat mosallas:"<<t.area()<<endl;
}
‫‪ ‬نوع دستیابی ‪ : public‬اگر نوع دستیابی ‪ public‬باشد تمام اعضای عمومی کالس والد یا پایه‬
‫اعضای عمومی کالس مشتق خواهند شد (مانند این که اعضا ومتد ‪ public‬کالس پایه را در کالس‬
‫مشتق کپی کرده باشیم همچنین اعضا ومتدهای محافظت شده کالس والد همان اعضاو متدهای‬
‫محافظت شده ی کالس مشتق خواهند بود مانند مثال قبل‬
‫‪ ‬نوع دستابی ‪ :privete‬اگر نوع دستیابی ‪ privete‬باشد تمام اعضای عمومی ومحافظت شده کالس‬
‫والد به عنوان اعضای خصوصی کالس مشتق منظور می شود‪.‬‬
‫‪ ‬مثال برای نوع دستیابی ‪:private‬‬
‫‪class base‬‬
‫‪//classe valed‬‬
‫{‬
‫‪private:‬‬
‫;‪int n1,n2‬‬
‫‪public:‬‬
‫)‪void set_number(int x, int y‬‬
‫};‪{n1=x;n2=y‬‬
‫)(‪Void show‬‬
‫};‪{cout<<“n1=“<<n1<<“n2=“<<n2<<endl‬‬
‫‪};//end base‬‬
‫‪class drive d:private base‬‬
‫{‬
‫‪private:‬‬
‫;‪Int d‬‬
‫‪public:‬‬
‫)‪drived (int a‬‬
‫};‪{ d=a‬‬
‫خروجی‪:‬‬
‫)(‪void show-number‬‬
‫چون سه خط دستوری خطا دارد‬
‫};‪{cout<<“d=“<<d<<endl‬‬
‫این برنامه خروجی ندارد‬
‫;}‬
‫)(‪void main‬‬
‫{‬
‫;)‪drived dr(100‬‬
‫;)‪dr.set-number(10,20‬‬
‫این سه خط دستوری خطا دارد زیرا این متدها ‪ ،‬متد های‬
‫;)(‪dr.d=10; dr.show‬‬
‫خصوصی هستند و نمی توان مستقیما به آن ها دسترسی داشت‬
‫}‬
‫‪ ‬نوع دستیابی ‪ :protected‬همانند ‪ private‬می باشد‪.‬‬
‫‪ ‬اشاره گر(‪ :)pointer‬متغیری است که برای ذخیره آدرس داده ها در حافظه به کار می رود و نحوه تعریف آن‬
‫به صورت زیر می باشد‪.‬‬
‫; نام اشاره گر٭ نوع اشاره گر‬
‫;‪P‬٭ ‪(int‬مثال‬
‫‪P‬یک اشاره گر برای نگه داری آدرس متغیری از نوع ‪ int‬می باشد‪.‬‬
‫;‪F‬٭ ‪float‬‬
‫‪ ‬در مباحث مربوط به اشاره گرها ٭ به معنای محتوای جایی است که اشاره گر به آن اشاره می کند و & به‬
‫معنای آدرس هایی است که اشاره گر به آن اشاره می کند‪.‬‬
‫‪ ‬مثال) با فرض این که آدرس متغیر ‪ I‬در حافظه برابر ‪ 1000‬باشد خروجی دستورات زیر را بدست آورید‪.‬‬
‫)(‪void main‬‬
‫{‬
‫;‪int i=0,*p‬‬
‫;‪p= &i‬‬
‫آدرس متغیر ‪ i‬در اشاره گر ‪ p‬قرار می گیرد‬
‫;‪cout<<*p<<i<<p<<&i‬‬
‫‪*p=5‬‬
‫محتوای جایی که ‪ p‬به آن اشاره می کند برابر ‪ 5‬می شود‬
‫;‪cout<<*p<<i‬‬
‫}‬
‫‪ ‬نکته) آدرس ها در حافظه معموال به صورت هگزا دسیمال هستند‪.‬‬
‫‪ ‬نکته) اشاره گر ها از هر نوعی که باشند دو بایت فضا اشغال خواهند کرد‪.‬‬
‫‪ ‬مثال)‬
‫خروجی‪:‬‬
‫>‪#include<iostream.h‬‬
‫)(‪void main‬‬
‫{‬
‫‪4‬‬
‫;‪int *ip‬‬
‫‪4‬‬
‫;‪float *fp‬‬
‫‪4‬‬
‫;‪double *dp‬‬
‫;‪cout<<sizeof(ip)<<endl‬‬
‫;‪cout<<sizeof(fp)<<endl‬‬
‫;‪cout<<sizeof(dp)<<endl‬‬
‫}‬
‫‪ ‬عملیات محاسباتی که می توان بر روی اشاره گرها انجام داد عبارت اند از‪ :‬جمع ‪ ،‬تفریق ‪ ،‬افزایش (‪ )++‬و‬
‫کاهش(‪)- -‬‬
‫‪ ‬مثال) با فرض این که آدرس متغیر ‪ b‬در حافظه برابر ‪ 1000‬باشد خروجی دشتورات زیر را بدست آورید‪.‬‬
‫‪p‬‬
‫‪P++‬‬
‫‪1000‬‬
‫‪1002‬‬
‫‪20‬‬
‫‪80‬‬
‫‪b‬‬
‫‪d‬‬
‫‪ ++p‬خروجی‪:‬‬
‫‪*p++‬‬
‫اشاره گر‬
‫‪200x248f23e2800x248f23e4‬‬
‫‪1006 1004‬‬
‫آدرس‬
‫‪250x248f23e6‬‬
‫‪10‬‬
‫‪25‬‬
‫محتوا‪100x248f23e8‬‬
‫‪93590x248f23ea‬‬
‫‪a‬‬
‫‪c‬‬
‫متغیر‬
‫>‪#include<iostream.h‬‬
‫)(‪void main‬‬
‫{‬
‫;‪int a=10,c=25,d=80,b=20,*p‬‬
‫;‪p=&b‬‬
‫;‪cout<<*p<<p‬‬
‫;‪p++‬‬
‫;‪cout<<*p<<p<<endl‬‬
‫;‪++p‬‬
‫;‪cout<<*p<<p<<endl‬‬
‫;‪*p++‬‬
‫;‪cout<<*p<<p<<endl‬‬
‫;‪*++p‬‬
‫};‪cout<<*p<<p<<endl‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫‪‬‬
‫نکته) متغیر ها در حافظه از راست به چپ چیده می شوند‪.‬‬
‫نکته) دستورات ‪ *++p , *P++ , ++p ,P++‬معادل یکدیگر می باشد و ‪ p‬را یک واحد افزایش می‬
‫دهند‪.‬‬
‫نکته) ‪ ++*p‬یک واحد به محتوای جایی که ‪ p‬به آن اشاره می کند اضافه می کند‪.‬‬
‫مثال) خروجی برنامه زیر چیست؟‬
‫خروجی‪:‬‬
‫)(‪Void main‬‬
‫‪3‬‬
‫{‬
‫‪10‬‬
‫;}‪int *p,a[4]={8,-1,3,7‬‬
‫;]‪p=&a[0‬‬
‫;‪cout<<*(p+2)<<endl‬‬
‫;‪cout<<*p+2<<endl‬‬
‫}‬
‫‪ ‬مثال) با فرض این که آدرس شروع آرایه ‪ a‬در حافظه برابر ‪ 0XFEAE‬باشد خروجی برنامه زیر‬
‫چیست؟‬
‫)(‪Void main‬‬
‫{‬
‫;}‪int *p,*q,a[5]={2,16,-4,0,6‬‬
‫خروجی‪:‬‬
‫;]‪p=&a[0‬‬
‫‪3‬‬
‫;]‪q=&a[3‬‬
‫;‪cout<<q-p<<endl‬‬
‫}‬
‫‪ ‬اشاره گرها را می توان با استفاده از عملگرها مقایسه ای با هم مقایسه نمود‪.‬‬
‫‪ ‬عملگرهای مقایسه ای عبارت اند از‪!= ، == ، >= ، <= ، > ، < :‬‬
‫‪ ‬مثال) خروجی برنامه زیر چیست؟‬
‫خروجی‪:‬‬
‫‪ pi>pf‬خواهد بود (طبق نکته گفته شده در‬
‫مورد چینش متغیرها در حافظه)‬
‫)( ‪Void main‬‬
‫{‬
‫;‪int i,*pi‬‬
‫;‪float f,*pf‬‬
‫;‪pi=&i‬‬
‫‪pf=&f‬‬
‫)‪if(pi>pf‬‬
‫;”‪cout<<“pi>pf‬‬
‫‪else‬‬
‫;”‪cout<<”pi<pf‬‬
‫}‬
‫‪ ‬نکته) نوع هر متغیر با نوع اشاره گری که به آن اشارهمی کند باید یکسان باشد در غیر این صورت‬
‫خطای کامپایلری رخ می دهد برای حل این مشکل می توان از اشاره گری تهی )‪ (void‬استفاده کرد‬
‫اشاره گر تهی برای اشاره به هر نوع داده ای به کار می رود و نحوه تعریفآن به صورت زیر است‪.‬‬
‫; نام اشاره گر* ‪void‬‬
‫‪ ‬به عنوان مثال) اگر در برنامه قبل دستوری به صورت ‪ pf=&i‬وجود داشت برنامه با خطا مواجه می‬
‫شد زیرا ‪ pf‬از نوع ‪ float‬و ‪ i‬از نوع ‪ intger‬است که برای رفع این خطا باید ‪ pf‬را از نوع ‪void‬‬
‫تعریف کنیم‪.‬‬
‫‪ ‬اشاره گر به اشاره گر‪:‬اشاره گری که آدرس یک اشاره گر دیگر را در خود نگه داری کند اشاره گر به اشاره‬
‫گر نامیده می شود برای تعریف این نوع اشاره گر باید از دو نماد * استفاده شود‪.‬‬
‫)(‪Void main‬‬
‫{‬
‫خروجی‪:‬‬
‫;‪int i,*p,**q‬‬
‫‪*p=10 **q=10‬‬
‫;‪i=10‬‬
‫;‪p=&i‬‬
‫;‪q=&p‬‬
‫;‪cout<<*p<<**q‬‬
‫{‬
‫همانطور که تا کنون دیده ایم هنگام استفاده از آرایه ها باید تعداد عناصر ثابت بوده و از قبل مشخص باشد یعنی نمی‬
‫توان تعداد عناصر را به صورت پویا مشخص کرد برای حل این مشکل می توانیم از اشاره گرها استفاده نماییم‪.‬‬
‫‪ ‬برای تخصیص حافظه پویا از عملگر ‪ new‬و برای بازگرداندن آن به سیستم عامل از عملگر ‪ delete‬به‬
‫صورت زیر استفاده می شود‪.‬‬
‫; نوع داده ‪ = new‬نام اشاره گر‬
‫; ]تعداد عناصر[ نوع داده ‪ = new‬نام اشاره گر‬
‫; (نام اشاره گر) ‪delete‬‬
‫مثال) برنامه ای بنویسید که ‪ n‬عدد را از ورودی خوانده و عکس ترتیب ورودی چاپ نماید‪.‬‬
‫>‪#include<iostream.h‬‬
‫;‪cout<<"result is:"<<endl‬‬
‫خروجی‪:‬‬
‫>‪#include<stdio.h‬‬
‫)‪for(i=n-1;i>=0;i--‬‬
‫‪please enter number:3‬‬
‫)(‪void main‬‬
‫;"‪cout<<a[i]<<"\t‬‬
‫‪1‬‬
‫{‬
‫‪2‬‬
‫;)‪delete(a‬‬
‫‪3‬‬
‫;‪int n,*a,i‬‬
‫‪result is:‬‬
‫;"‪cout<<"please enter number:‬‬
‫‪3‬‬
‫‪2‬‬
‫‪1‬‬
‫;‪cin>>n‬‬
‫;]‪a=new int[n‬‬
‫)‪for(i=0;i<n;i++‬‬
‫;]‪cin>>a[i‬‬
‫‪ ‬اگر ‪ a‬یک اشاره گر آرایه ای و ‪ i‬اندیس آن باشد روابط زیر همواره برقرار هستند‪.‬‬
‫)‪a[i]=*(a+i‬‬
‫‪&a[i]=a+I‬‬
‫مثال) برنامه جستوجوی دودویی را با استفاده از اشاره گر بنویسید‪.‬‬
.‫ را شبیه سازی نماید‬strcpy ‫ نکته) برنامه ای بنویسید که تابع‬
#include<iostream.h>
p1++;
p2++;
#include<stdio.h>
}
#include<string.h>
*p1='\0';
void main()
cout<<"result:"<<endl;
{
cout<<"s1="<<s1<<endl;
char s1[20],s2[20],*p1,*p2;
:‫خروجی‬
cout<<"s2="<<s2<<endl;
enter s1:mahmood
cout<<"enter s1:";
}
enter s2:heydari
gets(s1);
result:
cout<<"enter s2:";
s1=heydari
s2=heydari
gets(s2);
p1=s1;
p2=s2;
while (*p2!='\0')//p2
{
*p1=*p2;
‫‪ ‬اگر ‪ a‬یک آرایه دو بعدی و ‪ i,j‬اندیس این آرایه باشند روابط زیر همواره برقرار هستند‪.‬‬
‫)‪a[i][j]=*(a[i]+j‬‬
‫‪&a[i][j]=a[i]+j‬‬
‫مثال) فرض کنید آرایه ای به صورت زیر داریم‪.‬‬
‫}”‪char a[4][10]={“ali”,”hassan”,”hossein”,”mohammad‬‬
‫”‪“\0‬‬
‫”‪“\0‬‬
‫”‪“i‬‬
‫”‪“l‬‬
‫”‪“a‬‬
‫]‪a[0‬‬
‫”‪“\0‬‬
‫”‪“n‬‬
‫”‪“a‬‬
‫”‪“s‬‬
‫”‪“s‬‬
‫”‪“a‬‬
‫”‪“h‬‬
‫]‪a[1‬‬
‫”‪“\0‬‬
‫”‪“n‬‬
‫”‪“i‬‬
‫”‪“a‬‬
‫”‪“s‬‬
‫”‪“s‬‬
‫”‪“o‬‬
‫”‪“h‬‬
‫]‪a[2‬‬
‫”‪“d‬‬
‫”‪“a‬‬
‫”‪“m‬‬
‫”‪“m‬‬
‫”‪“a‬‬
‫”‪“h‬‬
‫”‪“o‬‬
‫”‪“m‬‬
‫]‪a[3‬‬
‫همانطور که مالحظه می شود میزان حافظه ای که این آرایه اشغال می کند برابر ‪ 40‬بایت (‪ )4×10‬می باشد یعنی‬
‫از خانه های آرایه بال استفاده باقی می ماند هدف تعویض آرایه فوق با استفاده از اشاره گر می باشد که موجب‬
‫کاهش حافظه خواهد شد‪.‬‬
‫‪ ‬نحوه تعریف آرایه دو بعدی با استفاده از اشاره گرها‪:‬‬
‫;] تعداد سطرها[ نام اشاره گر * نوع داده‬
‫‪ ‬در این روش هر سطر یک اشاره گر است که آدرس شروع آن سطر را در خود نگه می دارد‪.‬‬
‫‪ ‬مثال)‬
‫}”‪char *a[4][10]={“ali”,”hassan”,”hossein”,”mohammad‬‬
‫”‪“\0‬‬
‫”‪“\0‬‬
‫”‪“i‬‬
‫”‪“l‬‬
‫”‪“a‬‬
‫]‪a[0‬‬
‫”‪“\0‬‬
‫”‪“n‬‬
‫”‪“a‬‬
‫”‪“s‬‬
‫”‪“s‬‬
‫”‪“a‬‬
‫”‪“h‬‬
‫]‪a[1‬‬
‫”‪“\0‬‬
‫”‪“n‬‬
‫”‪“i‬‬
‫”‪“a‬‬
‫”‪“s‬‬
‫”‪“s‬‬
‫”‪“o‬‬
‫”‪“h‬‬
‫]‪a[2‬‬
‫”‪“d‬‬
‫”‪“a‬‬
‫”‪“m‬‬
‫”‪“m‬‬
‫”‪“a‬‬
‫”‪“h‬‬
‫”‪“o‬‬
‫”‪“m‬‬
‫]‪a[3‬‬
‫‪=)4×2(+28=36‬میزان حافظه سطر ‪ +‬میزان حافظه اشاره گرها = میزان حافظه‬
‫ شکل کلی این تابع به صورت زیر می باشد‬
Char *strchr(char *s,char ch);
‫ آدرس آن را‬ch ‫ جستوجو می کند و در صورت برخورد به اولین کاراکتر‬s ‫ را داخل رشته‬ch ‫ این تابع کاراکتر‬
.‫بر می گرداند‬
#include <iostream.h>
‫ مثال) خروجی برنامه زیر چیست؟‬
:‫خروجی‬
#include <stdio.h>
ter student
#include <string.h>
Void main()
{ char *p;
p=strchr(“good computer student”,’t’);
if(p!=‘\0\’)
puts(p);
else
cout<<“not found”;
}
‫ شکل کلی این تابع به صورت زیر می باشد‬
Char *strstr(char *s1,char *s2);
‫ جستجو می کند و با برخورد به اولین رشته منطبق با آن آدرس شروع آن را بر‬s1 ‫ را درون‬s2 ‫ این تابع رشته‬
.‫می گرداند‬
#include <iostream.h>
‫ مثال) خروجی برنامه زیر چیست؟‬
:‫خروجی‬
#include <stdio.h>
computer student
#include <string.h>
void main()
{ char *p;
char *s1= "good computer student";
char *s2="com";
p=strstr(s1,s2);
if(p!='\0')
puts(p);
else cout<<"not found";
}