آموزش C++ قسمت ششم

1394/11/7 مصطفی دادخواه 3489

با عرض سلام خدمت دوستان گرامی . مصطفی دادخواه هستم با ششمین جلسه از آموزش برنامه نویسی C++ در خدمت شما عزیران

جلسه پیش در مورد عملگر ها صحبت کردیم . در مورد عدد نویسی در c++ و در آخر در مورد تبدیل اعداد به مبناهای مختلف صحبت کردیم

حالا این جلسه میخوام بگم که چه جوری از چیزهایی که در جلسه قبل گفته شد استفاده کنیم . لطفا به کد برنامه زیر دقت کنید .

#include
using namespace std;
void main(){
  int a;
  cin >> hex >> a;
  cout << "a = " << a << endl;
  cout << hex << 100 << endl;
  cout << oct << 20 << endl;
}

آموزش c++

نکته : اگر برنامه تون اجرا نشد هدر فایل iomanip.h رو به برنامتون اضافه کنید .

حالا میریم برای تفسیر برنامه :

در خط اول برنامه یک متغیری به نام a از نوع عدد صحیح تعریف کردیم . در خط دوم به کامپایلر گفتیم که عدد در مبنای 16 رو از کاربر بگیر و در a قرار بده.( من عدد 16c ) را وارد کردم در خط سوم نوشتیم که عدد a رو چاپ کن ( کامپایلر وقتی با این پیغام مواجه میشه میاد عدد رو در مبنای 10 چاپ میکنه ) .

در خط چهارم گفتم که عدد 100 رو در مبنای 16 روی صفحه خروجی نمایش بده و در آخر عدد 20 در مبنای 8 داره به شما نمایش داده میشه .

خب حالا اینا رو گفتم که بخوام عملگرهای بیتی انتقال رو بگم :

عملگر های بیتی انتقال عبارتند از عملگر بیتی انتقال به چپ و عملگر انتقال بیتی به راست که آنها را به شکل زیر نشان می دهند که باعث انتقال بیت های عملوند متغیر میشه .

آموزش c++

به مثال زیر توجه کنید .

#include
using namespace std;
void main(){
  short int x = 0x594c;
  x = x <<2;
  cout <<"hex after shift is "<< hex <


خب اومدم متغیری رو تعریف کردم از نوع عدد صحیح کوچک و عدد 594c رو در مبنای 16 بهش دادم برای همین در ابتدا پیشوند 0x رو اضافه کردم. این عدد معادل عدد 22860 در مبنای دسیمال یا همون ده دهی خودمون هست .

در خط بعدی نوشتم که عدد x رو دو بیت به سمت چپ انتقال بده .

بیاید باهم ببینیم این عمل چطور اتفاق میفته .

برای این کار ابتدا عدد 594c رو در مبنای دو میبریم . اما چه جوری ؟

اصلا کاری نداره . کافیه 594c رو هر رقمش رو یک عدد جداگانه فرض کنید بعد بیاین اون عدد در مبنای 2 رو بدست بیارید و زیرش بنویسید . ببینید

آموزش c++

پس عدد 594c در مبنای 16 با عدد 0101100101001100 در مبنای 2 برابر خواهد بود .

خب گفتیم که دو بیت به سمت چپ انقال بدیم . پس برای این کار با دو تا 0 خوشگل اعدادمون رو از سمت راست به سمت چپ هل میدیم و اون دو رقم اخر سمت چپی رو از حافظمون میندازیم بیرون . یعنی در اول به تعداد رقم هایی که میخوایم اضافه کنیم به اول رقممون صفر اضافه میکنیم و در اخر هم به تعداد ارقامی که میخوایم انتقال بدیم عدد از ته پاک میکنیم . ( البته این اول و انتها که میگم با توجه به اینکه انتقال به چپ باشه یا انتقال به راست باشه متفاوته )

با تفاسیر بالا عدد جدیدمون برابر با 0110010100110000 میشه

خب این رو در مبنای 16 میبریم . دقیقا چه جور تبدیل به مبنای 2 کردیم حالا برعکسش . اول 4 رقم 4 رقم از عددمون جدا میکنیم . اگه یه کم فکر کنید دلیلش رو متوجه میشید که چرا 4 رقم .

آموزش c++

خب پس عدد 0110010100110000 در مبنای 16 برابر با 6530 میشود .

حالا اگه همین عدد 6530 رو در مبنای 10 ببریم میبینیم که عدد مون برابر با 25904 میشه .

خب به کجا رسیدیم ؟ فهمیدیم که اگه عدد 22860 رو دو بیت به سمت چپ منتقل کنیم برابر با عدد 25940 میشود .

و در خط های آخر کدمون نوشتیم که عدد مورد نظر رو به ترتیب در مبناهای 16 و 10 چاپ کن .

آموزش c++

خب کاربرد این کارها چیه ؟ خیلی کاربرد داره . مثلا یکی از کارهایی که میشه باهاش انجام داد برای رمز نگاری هست . که مثلا شما یه سری اطلاعات داری ولی نمیخوای از اطلاعات شما موقع رد و بدل اون کسی چیزی سر در بیاره . برای همین پیش خودت و گیرنده ای که قراره اطلاعات رو بگیره این قرار داد رو میندی که پس از دریافت اطلاعات برای رمزگشایی کد صورت گرفته بیا اطلاعات رو n بیت به فلان سمت انتقال بده و یک سری کارهای دیگه . البته رمزنگاری به این سادگی هایی که گفتم نیست و الگوریتم های خیلی پیچیدهای داره که خارج از بحثمون هست .


حالا بیاین این تغییر رو تو کدتون بدید .

#include
using namespace std;
void main()}
  short int x = 0x594c;
  x = x <<3;
  cout <<"hex after shift is "<< hex <

یعنی به جای اینکه دو بیت به چپ منتقل شه . سه بیت به چپ منتقل شه .

خب از مثال قبل تا دو بیت انتقال رو داریم . حالا همون رو یک بیت به سمت چپ انتقال میدیم . پس داریم

آموزش c++

خب حالا اگه ca60 رو به مبنای ده ببرید عدد 51808 بدست میاد . خروجی رو با هم میبینیم.

آموزش c++

بسم الله . چرا این طور شد ؟

51808 کجا و -13278 کجا

اما یکم فکر کنید و آموزش های جلسه های قبل رو خوب خونده باشید یادتون میاد چرا این جوری میشه هااااا.

یادتون میاد جلسه دوم گفتم که هر متغیری یه ظرفیتی داره و اون بازه ظرفیتش رو توی یه جدول براتون نوشتم ؟

یادتون میاد برای short int کران بالاش چند بود ؟ 32767 نه ؟ خب الان عددمون چند شده ؟ 51808

خب این یعنی چی ؟ یعنی این که حافظمون رو بیشتر از ظرفیتش پر کردیم . برای همین سر ریز کرده و یه مقدار منفی داره بهمون نشون میده .

بعد نکته دیگه ای که هست اینه که تولید این اعداد پاریز و سریز طبق یه قاعده خاصی انجام میشه . مثلا در short int شما اگه به -32768 یه عدد دیگه کم کنی خطای پا ریز رخ میده و عددی که بهت بر میگردونه 32767 هست یعنی کران بالای short int و . حالا اگه از عدد اولمون دو واحد کم کنی 32766 رو بر میگردونه . و هر چی جلوتر بری از عدد اول هرچی کم کنی . از اون ور کران بالا میاد یه واحد یه واحد کم میشه . دقیقا مثل یه سیکل ، چرخش داره . وقتی برسه به ته بازه ، میاد از سر بازه محاسبه میکنه عددو .

خب فکر نمیکنم دیگه نکته ای در مورد عملگر انتقال بیتی مونده باشه . میرم سر عملگر بعدی یعنی عملگر های منطقی بیتی

این عملگر ها مثل عملگر های منطقی که گفتیم هستش . الان توضیح میدم

آموزش c++

مثلا اگر a=10 و b =15 باشد مقدار c = a&b به صورت زیر محاسبه میشه

آموزش c++

خب در ابتدا a و b رو در مبنای 2 میبریم. سپس بیت به بیت a و b رو متناظرا با هم مقایسه میکنیم . گفتیم در and زمانی عبارت ما درست میشه که هر دو عبارت درست باشند . اینجا هم همین طوریه. اینجا دو بیتی که 1 باشند درست محسوب میشه و در حافظه قرار میگیرند. خب حالا عددی که در مبنای 2 بدست آمده که در c ذخیره شده رو به مبنای 10 ببریم میبینیم که عدد حاصل 10 خواهد بود . یعنی حاصل a&b عدد 10 خواهد شد .

حالا همه این ها رو گفتم که با این ابزار ها یه کم وارد دنیای برنامه نویسی بشیم . برای همین لازم میدونم که قبل از هرچی بیام ساختار های کنترلی رو براتون توضیح بدم :

دوستان ببینید تا این جایی که ما کد زدیم ، وقتی میخواستیم یه برنامه رو اجرا کنیم ، دستورات پشت سر هم خط به خط اجرا میشدن که به این کار اجرای ترتیبی میگن .اما در سی ++ این امکان برای ما هست که ترتیب اجرای برنامه روبا استفاده از ساختار کنترلی در دست بگیریم . در برنامه نویسی ساخت یافته هر برنامه از 3 ساختار کنترلی به نام ساختار ترتیب ، ساختار انتخاب و ساختار تکرار تشکیل میشه از اونجا که این 3 ساختار نحوه و ترتیب اجرای برنامه رو کنترل میکنند به اینها ساختار های کنترلی میگن . من تا الان ساختار ترتیب رو بهتون گفتم که همون اجرای ترتیبی کدها پشت سر هم هست . پس بیایم باهم بررسی ساختار انتخاب رو شروع کنیم

اما اولین عضو از خانواده انتخاب رو که امشب میخوام بگم کسی نیست جــــــــــزززززز جنااااااببب

if

خب از جناب if دعوت به عمل میارم بیان تو کانال و خودشون رو معرفی کنن .

با سلام خدمت دوستان گرامی if هستم یک ساختار انتخاب

من از سال 1980 وظیفه چک کردن شرط های موجود در دستورات رو دارم و این جوری کار میکنم

if (شرط مورد نظر  ){

دستور 1 ;

دستور 2;

.

.

.

;دستور  nام

}

خب دوستان بهتره بیش از این جناب if رو خسته نکنیم و بگذاریم نصفه شبی به خانواده بزرگشون که بعدا با هاشون آشنا میشیم برسن .

جناب if از شما بابت حضور گرمتون در آموزش امشب تشکر میکنم .

اما حالا خودمون با نوشن برنامه ای کارکرد آقای if رو دربرناممون ببینیم .

میخوام یه برنامه ای بنویسم که نمره یک درسی رو دریافت کنه . اگه نمره بالاتر یا مساوی 50 بود. به کاربر بگه که شما درس رو پاس کردید .

#include

using namespace std;

void main(){

  int grade; // this is a varible for student grade

  cout << "Enter your grade : ";

  cin >> grade;

  if (grade >= 50)

    cout << "You passed this course"<

خب در خط اول متغیری تعریف کردم از نوع صحیح به نام grade

جلوش هم نوشتم

// this is a varible for student grade


اما این دیگه چیه ؟

به این عبارت یک عبارت توضیحی میگن . کامپایلر با مواجه شدن با این اصلا هیچ عکس العملی نشون نمیده و عین ... از جلوش رد میشه . اصلا نمیخونتش . اما خب این به چه درد میخوره ؟

این کامنت گذاری یا استفاده از عبارت توضیحی باعث میشه که خودتون بعدا خواستید ( حالا از یک ثانیه بعد تا n سال بعد ( وقتی به برنامتون دوباره رجوع کردید یا خواستید به کسی نشونش بدید خودتون میفهمید یا اون شخص میفهمه که مثلا grade قراره چیکار بکنه و ...

سوال : آیا لازمه که توضیحات خط های توضیحمون حتما انگلیسی باشه و قواعد زبان توش رعایت بشه ؟

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

سوال بعدی : توضیحات واسه برنامم خیلی زیاده توی یک خط جا نمیشه . چیکار کنم ؟

جواب : ما برای توضیحات کوتاه قبل از جملممون // میگذاریم . اما برای اون هایی که خیلی طولانین در اول جملمون از */ و دراخر هم از /* استفاده میکنیم که به کامپایلر بفهونیم که این خط ها توضیحی هستند .

/* Bande Mostafa Dadkhah hastam

Man modarese C++ dar channel persian developers hastam

be site ma sar bezanid www.ilikephp.ir */


الان کامپایلر هیچ ایرادی از شما نمیگیره چون میفهمه که این خط ها توضیحی هستند.

برگردیم به کدمون در خط دوم عبارت Enter your grade چاپ میشه

در خط سوم کاربر به grade مقدار میده .

در خط بعدی گفتیم اگه grade ای که کاربر وارد کرد بیشتر یا مساوی 50 بود عبارت


You passed this course

در خروجی به نمایش گذاشته بشه . حالا اگه grade

کمتر از 50 باشه چی ؟

هیچی برنامه به انتهای خودش میرسه و دستور داخل بلاک if اجرا نمیشه .

آها راستی گفتم بلاک . من تو این مثال اصلا بلاک نگذاشتم اما آقای if زمانی که خودشون رو اومدن معرفی کردن بلاک داشتن با دستورات متعدد . قضیه چیه ؟

باید بهتون بگم قضیه اینه که کامپایلر سی++ همیشه برای ساختار های کنترلی مون حالا چه انتخاب چه تکرار .

هرچی که از این به بعد معرفی میکنم خط بعد از اون ساختار رو جزو اون ساختار میدونه . در این مثال چون بعد از if یک دستور بیشتر نداشتیم اومد اون رو اجرا کرد .

حالا اگه اون قسمت از برنامم این جوری میبود چی ؟

if (grade >= 50)

    cout << "You passed this course"<

در جواب باید بگم که اگه برناممون این جور میبود باز کامپایلر

cout « "You passed this course"«endl;

رو به عنوان دستور برای if میشناسه . و چه شرط if برقرار باشه ( grade>=50 ) چه برقرار نباشه دستور

cout « "you can choose next course" « endl;

چاپ میشه. برای همین آقای if اول که خودش رو معرفی کرد با بلاک تعریف کرد که

دردسر توضیحش رو نکشه . حالا اگه ماهم بخوایم دستور

cout « "you can choose next course" « endl;

با برقرای شرط if اجرا بشه و باید بین دو آکلاد باشه یعنی این جوری

if (grade >= 50){

    cout << "You passed this course"<

خب بگذارید ببینم میتونم عضو بعدی از خانواده if رو بیارم .

نه مثل اینکه همشون رفتن خوابیدن .

انگار روز سختی رو پشت سر گذاشتن . پس ماهم اذیتشون نمیکنیم میگذاریم استراحت کنن.

دیگه دیر وقت هم شده . پس آموزش رو به اتمام میرسونم و آخر هفته ی خوبی رو برای تک تکتون آرزو میکنم . از اینکه وقت گذاشتید متشکرم . خدا نگهدار

آیکن دانلود دانلود PDF قسمت ششم آموزش C++

قسمت بعدی قسمت هفتم آموزش C++