#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
#94
#class #constractor #سازنده
✅ در زبان ++C چه تفاوتی در صدا زدن سازنده ها به صورتی که در زیر هست وجود داره ؟
test a;
test a();
🔹فرض کنید یه کلاسی یه صورت زیر داریم :
class test
{
public:
a()
{
cout « "@Learncpp\n";
}
};
و داخل main مینویسیم :
test a;
test a();
این نحوه تعریف یه فرقی با هم دارن اونم اینه که test a; یه شی از نوع test میسازه اما test a(); پروتوتایپ تابع با نوع بازگشتی test میسازه و قابل فراخوانی هست.
@Learncpp
#95
☑️ آرایه ها
تمرین : برنامه ای بنویسید که تعدادی اعداد رو از ورودی بگیره و توی آرایه ذخیره کنه و سپس یک عدد رو بگیره و موقعیت عدد مورد نظر رو توی آرایه جستجو کنه و چاپش کنه؟
@Learncpp
☑️ آرایه ها
تمرین : برنامه ای بنویسید که تعدادی اعداد رو از ورودی بگیره و توی آرایه ذخیره کنه و سپس یک عدد رو بگیره و موقعیت عدد مورد نظر رو توی آرایه جستجو کنه و چاپش کنه؟
@Learncpp
#96
☑️ آرایه ها
جواب تمرین
#95
تمرین : برنامه ای بنویسید که تعدادی اعداد رو از ورودی بگیره و توی آرایه ذخیره کنه و سپس یک عدد رو بگیره و موقعیت عدد مورد نظر رو توی آرایه جستجو کنه و چاپش کنه؟
#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
int main()
{
int ar[10], n=0, index=0;
for (int i=0; i<10;i++)
{
cout<<"Enter any 10 interger values(" << i + 1 << ") : ";
cin>>ar[i];
system("cls");
}
cout<<"Enter the number you want to find : ";
cin>>n;
cout<<endl;
for(int i=0;i<10;i++)
{
index++;
if (ar[i]==n)
{
cout<<"location number "<<n<<" is in : "<<index<<endl;
}
}
cout<<endl;
return 0;
}
@Learncpp
#97
☑️ آرایه ها
تمرین : برنامه ای بنویسید که تعدادی عدد از ورودی بگیره سپس کوچکترین و بزرگترین عدد همچنین موقعیتشو داخل آرایه رو پیدا کرده و نمایشش بده ؟
@Learncpp
☑️ آرایه ها
تمرین : برنامه ای بنویسید که تعدادی عدد از ورودی بگیره سپس کوچکترین و بزرگترین عدد همچنین موقعیتشو داخل آرایه رو پیدا کرده و نمایشش بده ؟
@Learncpp