تمرینات منزل - مرجع پروژه و کتاب
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";
}