#79☑️ آرایه ها
مثال) برنامه ای به زبان C++ بنویسید که تعداد 5 عدد را از کاربر دریافت کرده و حاصلجمع آنها را در خروجی نمایش دهد .
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{int num[5];
int sum=0,count;
for(count=0;count<5;count++)
{cout<<"Enter number "<<count+1<<" :";
cin>>num[count];
sum += num[count];
}
cout<<"\nSum of numbers is "<<sum;
return 0;
}
در برنامه بالا آرایه ای بنام num با طول 5 تعریف شده که از یک حلقه تکرار for برای مقدار دادن به عناصر آن استفاده می کنیم و در درون حلقه، مقدار هر عنصر از آرایه را با متغیر sum که دارای مقدار اولیه صفر است جمع می کنیم. دقت کنید که حلقه for باید حتما از صفر شروع شود چون اندیس اولین عنصر آرایه صفر است. در نهایت و با خروج از حلقه حاصلجمع عناصر آرایه که در متغیر sum ریخته شده است را چاپ می کنیم.
@Learncpp
#80☑️ آرایه ها
🔹آرایه ها به توابع :
آرایه ها را نیز همانند متغیر های معمولی میتوان به توابع ارسال نمود.
به صورت پیشفرض آرایه ها شبیه متغیر های ارجاع با آدرس به توابع ارسال میشوند.
برای ارسال يک آرايه به عنوان آرگومان به يک تابع ، کافيست نام آرايه را بدون علامت براکت ([]) به کار ببريد . به عنوان مثال اگر آرايه ای با نام x به صورت زير تعريف شده باشد :
int x[24];برای ارسال آن به تابع modifyArray کافيست تابع را به صورت زير:
modifyArray(x,24);فراخوانی کنيد . دستور فوق آرايه و طول آن را به تابع modifyArray ارسال می کند
@Learncpp
#81☑️ آرایه ها
مثال) تابعی بنوسید که آرایه a و عدد n که طول آرایه است را بگیرد و مجموع عناصر آرایه را به عنوان خروجی بفرستد.
#include <iostream>
using namespace std;
//*******
int sum(int a[],int n)
{int s=0;
for (int i=0;i<n;i++)
s += a[i];
return s;
}
/*******
int main ()
{ int a [4]={11,33,55,77};int size=4;
cout<<sum(a,size)<<endl;
return 0;
}
@Learncpp
#82☑️ آرایه ها
🔹الگوريتم جستجوي دودويي :
در روش جستجوي دودويي به يک آرايۀ مرتب نياز است.
هنگام جستجو آرايه از وسط به دو بخش بالايي و پاييني تقسيم ميشود. مقدار مورد جستجو با آخرين عنصر بخش پاييني مقايسه ميشود اگر اين عنصر کوچکتر از مقدار جستجو بود، مورد جستجو در بخش پاييني وجود ندارد و بايد در بخش بالايي به دنبال آن گشت , دوباره بخش بالايي به دو بخش تقسيم ميگردد و گامهاي بالا تکرار ميشود. سرانجام محدودۀ جستجو به يک عنصر محدود ميشود که يا آن عنصر با مورد جستجو برابر است و عنصر مذکور يافت شده و يا اين که آن عنصر با مورد جستجو برابر نيست و لذا مورد جستجو در آرايه وجود ندارد.
@Learncpp
This media is not supported in your browser
VIEW IN TELEGRAM
جستجوی دودویی (Animation)
@Learncpp
@Learncpp
#83☑️ آرایه ها
مثال) تابعي که در زير آمده از روش جستجوي دودويي براي يافتن مقدار درون آرايه استفاده ميکند:
#include <iostream>
#include <conio.h>
using namespace std;
int index(int,int[],int);
int main()
{ int a[]={22,33,44,55,66,77,88};cout<<"index(44,a,7) = "<<index(44,a,7)<<endl;
cout<<"index(60,a,7) = "<<index(60,a,7)<<endl;
}
int index(int x, int a[], int n)
{ int lo=0,hi=n-1,i;
while(lo<=hi)
{ i=(lo+hi)/2; //average of lo and hi
if(a[i]==x)
return i;
if (a[i] < x)
lo=i+1; //continue search in a[i+1..hi]
else
hi=i-1; //continue search in a[0..i-1]
}
return n; // x was not found in a[0..n-1]
}
@Learncpp
#84☑️ آرایه ها
🔹مرتب سازی حبابی ( Bubble Sort) :
در بسیاری موارد ما نیاز داریم تا دادههای خود را بر اساس نزولی یا صعودی بودن مرتب بنماییم در این روش آرایه چندین مرتبه پیمایش میشود و در هرمرتبه بزرگترین عنصر به ته آرایه منتقل میشودو سپس محدوده مرتب سازی برای عنصر بعدی یک واحد کاسته میشود.و در پایان این پیمایش ها آرایه ها مرتب میشوند.
از ابتداي آرايه شروع ميكنيم. در صورتي كه عنصراولي از دومي بزرگتر بود، جاي آنها را عوض ميكنيم. حالاعنصر دومي را با سومي و همينطور تا به پايان آرايه بريم. در اين حالت، بزرگترين عنصر در انتهاي آرايه قرار گرفته است. حالا همين كار را براي عناصر باقيمانده انجام ميدهيم. در مرحلهاي كه هيچ دو عنصري جابهجا نشوند يا اينكه ليست عناصر بزرگتر به ابتداي آرايه برسد، آرايه مرتب شده است.
@Learncpp
This media is not supported in your browser
VIEW IN TELEGRAM
مرتب سازی حبابی (Animation)
@Learncpp
@Learncpp
#85☑️ آرایه ها
🔹مرتب سازی حبابی ( Bubble Sort) :
فرض کنید میخواهیم n داده به صورت صعودی مرتب شوند. عنصر اول را با با عنصر دوم مقایسه کرده، و در صورتی که عنصر اول بزرگتر باشد باشد جای عنصر اول و دوم را عوض میکنیم. همین کار را با عناصر دوم و سوم انجام میدهیم و همینطور عناصر سوم و چهارم ، الی آخر. وقتی این کار تمام شد بزرگترین عنصر بین دادهها به آخر لیست میرسد . حالا یک بار دیگر از اول این کار را انجام میدهیم اما این بار تا عنصر (n -۱)ام ادامه میدهیم (عنصر nام در مرحله اول در جای خودش قرار گرفته). باز هم این کار را تا عنصر (n - ۲)ام تکرار میکنیم ، و بازهم .... تا اینکه بالاخره دادهها مرتب میشوند. مثلا:
۰ - ۰) ۵ ۶ ۴ ۲
۱ - ۱) ۵ ۶ ۴ ۲
۱ - ۲) ۵ ۴ ۶ ۲
۱ - ۳) ۵ ۴ ۲ ۶
۲ - ۱) ۴ ۵ ۲ ۶
۲ - ۲) ۴ ۲ ۵ ۶
۳ - ۱) ۲ ۴ ۵ ۶
مرحله اول سه مقایسه ، مرحله دوم دو مقایسه و مرحله سوم یک مقایسه داره ، که روی هم میشوند شش مقایسه. در کل این روش n (n - ۱) / ۲ مقایسه لازم داره. اما نه همیشه. به مثال زیر توجه کنید:
۰ - ۰) ۰ ۷ ۱ ۳ ۵ ۴
۱ - ۱) ۰ ۱ ۷ ۳ ۵ ۴
۱ - ۲) ۰ ۱ ۷ ۳ ۵ ۴
۱ - ۳) ۰ ۱ ۳ ۷ ۵ ۴
۱ - ۴) ۰ ۱ ۳ ۵ ۷ ۴
۱ - ۵) ۰ ۱ ۳ ۵ ۴ ۷
۲ - ۱) ۰ ۱ ۳ ۵ ۴ ۷
۲ - ۲) ۰ ۱ ۳ ۵ ۴ ۷
۲ - ۳) ۰ ۱ ۳ ۵ ۴ ۷
۲ - ۴) ۰ ۱ ۳ ۴ ۵ ۷
۳ - ۱) ۰ ۱ ۳ ۴ ۵ ۷
۳ - ۲) ۰ ۱ ۳ ۴ ۵ ۷
۳ - ۳) ۰ ۱ ۳ ۴ ۵ ۷
۴ - ۱) ۰ ۱ ۳ ۴ ۵ ۷
۴ - ۲) ۰ ۱ ۳ ۴ ۵ ۷
۵ - ۱) ۰ ۱ ۳ ۴ ۵ ۷
همونطور که میبینید انتهای مرحله ۲ دادهها مرتب هستن. تشخیص این مساله هم کار سختی نیست: اگه به مرحلهای رسیدیم که هیچ جابجایی در اون رخ نداد نتیجه میشه که دادهها مرتب هستن (مرحله سوم). پس بعد از مرحله ۳ مطمئن میشیم که داده هامون مرتب شدن و نیازی به مراحل ۴ و ۵ نیست.
@Learncpp
#86☑️ آرایه ها
مثال) برنامه ای بنویسید که ابتدا یک تابع با نام swap برای جابه جایی دو متغیر اعشاری و یک تابع برای چاپ عناصر یک آرایه داشته باشد سپس یک تابع با نام sort بنویسید که آرایه a و عدد n را به عنوان ورودی بگیرد و عناصر آرایه a را به روش مرتب سازی حبابی (به کمک تابع swap )به صورت صعودی مرتب نماید.
#include <iostream>
using namespace std;
/********/
void swap(float &x,float&y )
{float temp=x;
x=y;
y=temp;
}
void sort(float a[],int n)
{for (int i=1;i<n;i++)
for (int j=0;j<n-i;j++)
if (a[j]>a[j+1])
swap(a[j],a[j+1]);
}
void print(float a[],int n)
{for (int i=0;i<n;i++)
cout<<a[i]<<" ";
}
/*********/
int main ()
{ float a[]={55.2,32.65,12.8,78.5,46.3,9.75,4.33,1.2};cout<<"before sort : ";
print(a,8);
sort(a,8);
cout<<"after sort : " ;
print(a,8);
return 0;
}
@Learncpp
#87☑️ آرایه ها
🔹آرایه چند بعدی :
آرایه چند بعدی دارای چند سطر و چند ستون می باشد. اولین بعد آرایه بیانگر سطرها و دومین بعد آن بیانگر ستونهاست. همانطور که در شکل پایین می بینید به ترتیب از اولین سطر شروع کرده و تا انتهای ستونهای آن سطر را اندیس گذاری کرده و سپس به سطر بعد رفته و به اندیس گذاری تا آخرین ستون سطر مربوطه پرداخته و این عمل را تا انتها برای اندیس گذاری تکرار کرده . سمت راست شکل هم کاملا گویاست که عناصر آرایه به چه ترتیبی در حافظه کامپیوتر قرار می گیرند.
@Learncpp
#88☑️ آرایه ها
🔹آرایه های دو بعدی :
در آرایه های دو بعدی با دو اندیس میتوان به هر عنصر از آن دست یافت و آرایه های دو بعدی به صورت زیر تعریف میشوند:
type ArrayName [ArraySize] [ArraySize];
نوع (type) یکی از انواع دادهای قابل استفاده در سی پلاس پلاس است. MyArray نام آرایه است که از قوانین نامگذاری متغیر ها پیروی میکند ArraySize اندازه طول آرایه است که با یک عدد صحیح مشخص میشود.
🔺نکته : اندازه عنصر دوم آرایه دو بعدی باید ثابت باشد.
مثلاً آرایه زیر یک آرایه دو بعدی به اسم integers تعریف می کند.
int integers[2][2];برای مقدار دهی و دسترسی به عنصر هر آرایه از روشهای زیر میتوان استفاده کرد:
int integers[2][2]={{1,2},{3,4}};int a[2][2]={1,2,3,4};🔺اندیس های آرایه دو بعدی از صفر شروع میشوند و برای دسترسی به خونه های این آرایه باید از دو اندیس استفاده کنیم.
برای دسترسی به عناصر از روش زیر پیروی میکنیم:
integers [0] [0]
integers [0] [1]
integers [1] [0]
integers [1] [1]
و الی آخر..
@Learncpp
#89☑️ آرایه ها
مثال) برنامه ای بنویسید که جدول ضرب 8 در 8 را در یک آرایه دو بعدی بریزد و نمایش دهد.
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{int a[9][9];
for(int i=0;i<9;i++)
{for(int j=0;j<9;j++)
{a[i][j]=i*j ;
cout<<a[i][j]<<"\t";
}
cout<<endl;
}
return 0;
}
@Learncpp
#90☑️ آرایه ها
مثال) برنامه ای بنویسید که m و n را از ورودی بگیرد و آرایه ای به طول و عرض n و m بسازد و آن را از ورودی گرفته، سپس عناصر سطرهای آرایه را در شماره سطر ضرب کند و دوباره آن را چاپ کند.
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{int a[10][5],b[10][5];
for(int i=0;i<10; i++) //دریافت آرایه
{for(int j=0;j<5;j++)
{cin>>a[i][j] ;
}
}
for(int i=0;i<10;i++) //ضرب در i
{for(int j=0;j<5;j++)
{b[i][j]=i*a[i][j];
}
}
for(int i=0;i<10;i++) //چاپ آرایه
{for(int j=0;j<5;j++)
{cout<<b[i][j]<<"\t";
}
cout<<endl;
}
return 0;
}
@Learncpp
#91☑️ آرایه ها
جستجوی خطی :
در برخی موارد لازم است بدانیم آیا یک عنصر خاص در آرایه وجود دارد یا خیر
سادهترین راه بررسی کردن تمام عناصر از اول آرایه است تا ببینم داده مورد نظر ما وجود دارد یا خیر. یعنی از ابتدا داده مورد نظر رو با تک تک عناصر آرایه برسی میکنیم تا زمانی که به داده مورد نظر یا به انتها برسیم.
@Learncpp
This media is not supported in your browser
VIEW IN TELEGRAM
جستجوی خطی (Animation)
@Learncpp
@Learncpp
#92☑️ آرایه ها
مثال) برنامه ای بنویسید که مقداری را از ورودی گرفته و داخل آرایه جستجو شود اگر پیدا شد اندیس آن در غیر اینصورت طول آن به خروجی برود.
#include <iostream>
using namespace std;
/********
int index(int x,int a[] ,int n)
{for(int i=0;i<n;i++)
{if(a[i]==x)
return I;//if found
return n; //if not found
}
}
//*******
int main ()
{ int a[5]={44,33,65,45,21};cout<<index(65,a,7)<<endl;
cout<<index(546,a,7)<<endl;
return 0;
}
در قطعه کد بالا تابعی برای جستجو نوشته شد و در این تابع اگر مقدار مورد نظر یافت شد که اندیس آن برگردانده میشود اگر خیر طول آرایه برگردانده میشود.
@Learncpp
#93#struct #ساختار #object #شی
#class #variable #متغییر
✅ چرا توی کلاسها برای صدا زدن توابع باید به صورت class.funct() صدا زده بشه ولی توی struct فقط اسم تابع صدا زده میشه ؟
🔹در جوابش فرض کنیم ما یک struct داریم به نام course و یک کلاس داریم به اسم unit , خب تفاوتی که دارن در نحوه تعریفشونه یعنی course a; با unit b; ??? وقتی ما course a; رو تعریف کردیم کامپایلر course رو به عنوان یک نوع (type) در نظر میگیره و a رو ب عنوان یک متغییر پس برای دسترسی به داده های struct نیازی به نقطه (.) نیست ولی وقتی ما تعریف میکنیم unit b; کامپایلر unit رو به عنوان یک کلاس در نظر میگیره و b روی به عنوان یک شی و برای صدا زدن توابع عضو کلاس باید با نقطه (.) بهشون دسترسی پیدا کنیم .
برای درک مطلب کد زیر رو در نظر بگیریم :
#include "stdafx.h"
#include<iostream>
using namespace std;
struct course
{int a = 0;
int b = 0;
int c = 0;
};
class unit
{public:
void set()
{cout << "@Learncpp\n";
}
};
void set(course &v, int _a, int _b, int _c)
{v.a = _a;
v.b = _b;
v.c = _c;
}
int main()
{course c1;//c1 یک متغیر است
unit u1;//u1 یک شی است
set(c1, 1, 2, 3);
c1.set(c1, 1, 2, 3);//error
cout << c1.a << " " << c1.b << " " << c1.c << endl;
u1.set(); //***//
cout << endl;
system("pause");return 0;
}
@Learncpp