یادداشت های برنامه نویس آماتور | Amateur programmer notes
61 subscribers
92 photos
10 videos
34 files
88 links
اندازه ی آرزو هات مهم نیست
مهم اینه تو چقد میبینیش
آرزو هاتو بزرگ ببین


</create> by <ashkan\>
Download Telegram
#بیشتر_بدانید :
struct S1 {
bool a;
int b;
char c[100];
};

struct S2 {
char c[100];
int b;
bool a;
};

سرعت تغییر/دسترسی متغیر عضو هر شی از نوع S1 از هرشی از نوع S2 بیشتر است
#بیشتر_بدانید
در این پست قصد دارم یه چیزی به دانش کسانی که اطلاع ندارن اضافه کنم که شاید یه روزی یه جایی بدردشون بخوره

حتما دیگه همتون با فایل ها آشنایی دارید
fstream outfile("filename",ios::out|ios::binary)
شاید تا حالا سوال براتون پیش اومده باشه که ios::out|ios::binary چه شکلی کار میکنه
این بار این رو میخوام به کسایی که نمیدونن خیلی خلاصه یاد بدم

اول باینری:
باید با باینری و عمل گر هاش آشنایی داشته باشین وگرنه با دیدن این کد ها به چیزی پی نمی برین (پس برید یاد بگیرید)
یه مثال
5 = 00000101

خب حالا چرا از اینios::out|ios::binary به جای bool استفاده میشه
برای استفاده بهتر اگه مثلا تعداد bool های توی یه کلاستون بیش از سه چهارتا بود بهتره به جای اینکه bool های جدا تعریف کنین یا آرایه از bool ها تعریف کنین یه متغیر تعریف کنین و بیت هاش رو به عنوان یه bool در نظر بگیرید(دلیلش هم حافظه هست وگرنه اگه میخواین به همون روش عمل کنین | عمل کنین . اشکالی نداره😄)

اعداد ضرب در دو که برای دو دویی بدردمون میخوره
1 و2 و4 و8 و16 و32 و64 و128 و256 و 512 و1024 و2048 و4096 و 8192 و ...
که اعداد معادل فقط یه بیت 1 هستن

مثلا برای مثال پایین من یه متغیر char در نظر میگرم چون تعداد bool هایی که در نظر دارم کمتر از 7 تا هست
class MyClass
{
public:
char My_Class_Flags=0;
};

حالا چند تا فلگ براش در نظر میگیرم
small = بیت اول
medium = بیت دوم
big = بیت سوم
cold = بیت چهارم
hot = بیت پنجم

حالا بیایین کلاسی که با همین ها با استفاده از bool کار میکنه رو بهتون نشون بدم
class MyClass
{
public:
bool small,medium,big,cold,hot;
};
😕

بریم همون با فلگ کار کنیم مثلا بهش خاصیت cold , medium رو بصورت همزمان بهش بدیم

int main()
{
MyClass a;
a.My_Class_Flags|=2;
a.My_Class_Flags|=8;
if(a.My_Class_Flags&1)
cout«"It's Small!"«endl;
if(a.My_Class_Flags&2)
cout«"It's Medium!"«endl;
if(a.My_Class_Flags&4)
cout«"It's Big!"«endl;
if(a.My_Class_Flags&8)
cout«"It's Cold!"«endl;
if(a.My_Class_Flags&16)
cout«"It's Hot!"«endl;
return 0;
}
به همین راحتی

حالا بیایید کار رو یخورده آسون تر کنیم

میدونم همتون بهتر از من کار enum رو بلد هستید😀😉

حالا تنها کاری که باید انجام بدیم اینه که مقادیر رو به enum بدیم تا اسم داشته باشن و خوانایی کد بالاتر بره

مثلا این شکلی

enum MyClassFeature
{
small = 1,medium=2,big=4,cold =8,hot = 16
};

حالا بیایین کد قبلیمون رو قشنگترش کنیم😊
int main()
{
MyClass a;
a.My_Class_Flags|=MyClassFeature::medium;
a.My_Class_Flags|=MyClassFeature::cold;
if(a.My_Class_Flags&MyClassFeature::small)
cout«"It's Small!"«endl;
if(a.My_Class_Flags&MyClassFeature::medium)
cout«"It's Medium!"«endl;
if(a.My_Class_Flags&MyClassFeature::big)
cout«"It's Big!"«endl;
if(a.My_Class_Flags&MyClassFeature::cold)
cout«"It's Cold!"«endl;
if(a.My_Class_Flags&MyClassFeature::hot)
cout«"It's Hot!"«endl;
return 0;
}

به همین راحتی

حالا سوال پیش میاد ما باید همه ی اون عدد ها رو بلد باشیم
جواب مسلما نه هست
استفاده از اعداد در مبنای 16 بهتر هست و خب همه حرفه ای ها اون رو اینجور مواقع ترجیح میدن

این شکل صحیح ترش
enum MyClassFeature
{
small = 0x01,medium=0x02,big=0x04,cold =0x08,hot = 0x10
};

حالا میتونیم یه تابع هم تعریف کنیم برای چک کردن مثلا:

class MyClass
{
public:
char My_Class_Flags=0;
bool isit(MyClassFeature in)
{
return My_Class_Flags&in;
}
};

حالا همون کدمون یخورده خوشگل ترش😜

int main()
{
MyClass a;
a.My_Class_Flags|=MyClassFeature::medium|MyClassFeature::cold;//مثل همون فایل
if(a.isit(MyClassFeature::small))
cout«"It's Small!"«endl;
if(a.isit(MyClassFeature::medium))
cout«"It's Medium!"«endl;
if(a.isit(MyClassFeature::big))
cout«"It's Big!"«endl;
if(a.isit(MyClassFeature::cold))
cout«"It's Cold!"«endl;
if(a.isit(MyClassFeature::hot))
cout«"It's Hot!"«endl;
return 0;
}
درست مثل iosشد
میتونین ویژگی های بیشتر هم کنارش بذارین و مقادیر مثال رو به دلخواه خودتون تغییر بدید
#بیشتر_بدانید

در این پست قصد دارم یه چیزی به دانش کسانی که اطلاع ندارن اضافه کنم که شاید یه روزی یه جایی بدردشون بخوره

کدی به شکل زیر داریم:
int main()
{
MyArray myarray;
myarray.a0 = 10;
myarray.a[1] = 20;
cout«myarray.a[0]«endl«myarray.a1«endl;
myarray.a1=100;
myarray.a[0]=50;
cout«myarray.a[1]«endl«myarray.a0«endl;
return 0;
}
و خروجی
10
20
100
50

نکته اصلی در کد بالا اینه که a0 با a[0] هیچ فرقی نداره
دستکاری تو یکیش معادل دستکاری تو اون یکی هست
همینطور a1 با a[1]

یه روش:
struct MyArray{
int a[2];
int & a0 = a[0];
int &a1=a[1];
};

و یه روش دیگر با استفاده از union:
struct MyArray
{
union{
struct{int a0,a1;};
int a[2];
};
};
به همین راحتی اعضای آرایه و اعضای متغیر همه با هم از یک حافظه استفاده میکنن و نکته اصلی که من دنبالش بودم همین بود .(اشتراک اعضای یک آرایه با متغیر های مختلف)