در این پروژه میخواهیم برنامهای بنویسیم که بر اساس سن کاربر قیمت بلیت ورودش را نمایش دهد و حین انجام این پروژه با ساختار شرط در زبان آشنا میشویم.
#include <iostream>
using namespace std;
int main() {
int age;
cin >> age;
if (age < 0) {
cout << "Age has to be a positive number" << endl;
} else if (age <= 12) {
cout << "0$ - You get a free pass!" << endl;
} else if (age <= 18) {
cout << "6$ - You get 50% discount" << endl;
} else {
cout << "12$" << endl;
}
}
-100
Age has to be a positive number
5
0$ - You get a free pass!
13
6$ - You get 50% discount
33
12$
شرطها برای واکنشهایی که برنامه ما نسبت به پارامترهای ورودی یا اتفاقاتی که به آن مربوط میشوند مثل کلیک موس روی یک دکمه کاربرد دارند و پس از این، ما در بسیاری از مثالها از آنها استفاده خواهیم کرد.
اول یک متغیر عددی به اسم age تعریف میکنیم و بعد با استفاده از cin مقدارش آن را از کاربر دریافت میکنیم.
int age;
cin >> age;
بعد با استفاده از شرط (if) بررسی میکنیم مقدار سن چقدر هست.
if (age <= 12) {
cout << "0$ - You get a free pass!" << endl;
}
مثلا در بالا شرط بررسی میکند که اگر سن کاربر کوچکتر یا مساوی ۱۲ بود، پرینت کند بلیت رایگان است.
میتوانیم به همین شکل یک شرط دیگر هم اضافه کنیم تا اگر سن کاربر بزرگتر از ۱۲ بود برایش بنویسیم که مثلا باید ۱۲$ پول بدهد:
if (age > 12) {
cout << "12$" << endl;
}
حالا مثلا فرض کنید ما تصمیم میگیریم پیام متفاوتی برای افرادی که دقیقا ۱۲ سال دارند پرینت کنیم. اگر به برنامهای که نوشته شده نگاه کنیم میبینیم که با دو شرطی که در بالا راجع بهشون صحبت کردیم٬ شرط بزرگتر مساوی ۱۲ (دقیقا ۱۲ سال یا بزرگتر) که باید پول پرداخت کنند و کوچکتر از ۱۲ (۱۱ و پایین تر) که ورودی رایگان دریافت میکنند را بررسی کردیم. حالا اگر بخواهیم کار متفاوتی برای افرادی که دقیقا ۱۲ سال دارند انجام بدهیم٬ میتوانیم با تبدیل “بزرگتر مساوی” به “بزرگتر” در شرط اول کاری کنیم که این شرط حالت “دقیقا ۱۲ سال” را بررسی نکند و یک شرط جدا برای برابری سن با ۱۲ بنویسیم. مثل زیر:
#include <iostream>
using namespace std;
int main() {
int age;
cin >> age;
if (age < 12) {
cout << "0$ - You get a free pass!" << endl;
}
if (age > 12) {
cout << "12$" << endl;
}
if (age == 12) {
cout << "0$ - Take advantage of these last free passes" << endl;
}
}
این برنامه به کسانی که کوچکتر از ۱۲ سال دارند ورودی رایگان میدهد – به کسانی که دقیقا ۱۲ سال دارند ورودی رایگان داده و میگوید که از این آخرین ورودیهای رایگان خوب استفاده کنند (!) – و به کسانی که بزرگتر از ۱۲ سال دارند میگوید که باید پول بدهند.
اگر به شرط آخر دقت کنید از دو تا کارکتر = برای بررسی مساوی بودن سن با ۱۲ استفاده کردیم دلیل این مساله درواقع این هست که قبلا از = برای assign کردن مقادیر و تغییر دادن مقدار متغیرها استفاده کرده بودیم.
int age = 19;
age = 20;
چون از تک = برای کار با متغیرها مثل نمونه بالا استفاده میشود == برای بررسی تساوی انتخاب شده.
برگردیم به کد اولی که نوشته بودیم.
#include <iostream>
using namespace std;
int main() {
int age;
cin >> age;
if (age <= 12) {
cout << "0$ - You get a free pass!" << endl;
}
if (age > 12) {
cout << "12$" << endl;
}
}
اگر به مثال بالا دقت کنید، شرط دوم دقیقا خلاف شرط اول بیان شده (دقیقا خلاف و عکس “سن بزرگتر از ۱۲ است”٬ “سن بزرگتر مساوی ۱۲” میشود). توی این حالت میتوانیم به جای نوشتن شرط دوم از else استفاده کنیم:
#include <iostream>
using namespace std;
int main() {
int age;
cin >> age;
if (age <= 12) {
cout << "0$ - You get a free pass!" << endl;
} else {
cout << "12$" << endl;
}
}
یعنی ابتدا شرط اول بررسی میشود و بعد اگر این شرط برقرار نبود (در غیر این صورت) کدی که در قسمت else نوشتید اجرا میشود. نتیجتا خروجی این دو برنامه یکسان خواهد بود.
اگر الان برنامه را اجرا کنیم خروجی درستی میگیریم، مثلا برای کاربران
۱۰ ساله
0$ - You get a free pass!
۱۲ ساله
0$ - You get a free pass!
۲۰ ساله
12$
پرینت میشود
که دقیقا خروجی هایی هستند که انتظارشان را داشتیم اما اگر کاربر سن خودش را منفی ۱۰۰ وارد کند خروجی برنامه چه خواهد بود؟
0$ - You get a free pass!
خروجی ما خواهد بود که احتمالا چیزی که از برنامه ما انتظار میرود این نیست و چون نمیتوان همیشه مطمئن بود یوزر حتما مقادیری که باید را وارد میکند باید برنامهمان را به شکلی تغییر بدهیم که این مشکل حل شود.
یک راه حل میتواند استفاده از متغیرهای unsigned
باشد
#include <iostream>
using namespace std;
int main() {
unsigned int age;
cin >> age;
if (age <= 12) {
cout << "0$ - You get a free pass!" << endl;
} else {
cout << "12$" << endl;
}
}
همه دیتا تایپهای عددی که در مقاله قبل دیدیم مثل int
هم نوع signed
دارند که قابلیت پشتیبانی از اعداد منفی را دارد هم مدل unsigned
که sign یا علامت مثبت و منفی نمیپذیرد یعنی درواقع اعداد منفی را نمیپذیرد و فقط مقدار مثبت نگه میدارد. در این مثال استفاده از متغیرهای unsigned
مشکل ما را حل می کند چون وقتی عدد منفی کاربر به یک عدد مثبت تبدیل میشود تا در متغیر ما جا بگیرد به یک عدد خیلی بزرگ مثبت تبدیل میشود (راجع به دلیل این مساله در مقاله دیگری صحبت خواهیم کرد) که به هر حال بزرگتر از ۱۲ خواهد بود و کاربر نمیتواند ورودی رایگان دریافت کند.
اما شاید راه حل بهتر این باشد که به کاربر یک پیام ارور نشان بدهیم و بگوییم که عددی که به عنوان سن وارد کرده مشکل دارد و درست نیست٬ برای این کار میتوانیم یک شرط به کد خودمان اضافه کنیم:
#include <iostream>
using namespace std;
int main() {
int age;
cin >> age;
if (age < 0) {
cout << "Age has to be a positive number" << endl;
}
if (age <= 12) {
cout << "0$ - You get a free pass!" << endl;
} else {
cout << "12$" << endl;
}
}
برای بررسی منفی بودن سن از “کوچکتر از صفر” استفاده میکنیم (هر عدد منفی قطعا کوچکتر از صفر است)
اما خب مشکل اینجاست که الان هر دو این شرط ها اجرا میشوند٬ یعنی اگر سن عددی منفی باشد خروجی برنامه این شکلی میشود:
-100
Age has to be a positive number
0$ - You get a free pass!
برای حل این مساله هم میتوانیم شرط دوم را داخل else شرط اول بزاریم (اگر سن کوچکتر از ۰ بود که ارور را پرینت میکنیم اگر نبود بررسی میکنیم که آیا سن کاربر کوچکتر مساوی ۱۲ هست یا خیر و به او قیمت درست را بر مبنای سن او میگوییم):
#include <iostream>
using namespace std;
int main() {
int age;
cin >> age;
if (age < 0) {
cout << "Age has to be a positive number" << endl;
} else {
if (age <= 12) {
cout << "0$ - You get a free pass!" << endl;
} else {
cout << "12$" << endl;
}
}
}
الان خروجی برنامه درست شده و به شکل زیر درمیآید:
-100
Age has to be a positive number
اما داشتن چند if و else تو در تو، کد را پیچیده و خواندنش را سخت میکند، برای همین یک شکل نوشتار و syntax خاص برای این شکل شرطهایی که وقتی شرط اول غلط است باید بررسی شوند در نظر گرفته شده:
#include <iostream>
using namespace std;
int main() {
int age;
cin >> age;
if (age < 0) {
cout << "Age has to be a positive number" << endl;
} else if (age <= 12) {
cout << "0$ - You get a free pass!" << endl;
} else {
cout << "12$" << endl;
}
}
درواقع اگر سن کوچکتر از ۰ باشد (منفی باشد) پیغام خطا به کاربر نمایش داده میشود در غیر این صورت اگر سن کوچکتر ۱۲ باشد ورودی رایگان ارائه و اگر هیچ کدام از این حالات رخ ندهد(عدد مثبت و بزرگتر از ۱۲ باشد) قیمت بلیت نمایش داده میشود.
محدودیتی در تعداد else if ها وجود ندارد و میتوان چندین شرط را به همین شکل بررسی کرد.
#include <iostream>
using namespace std;
int main() {
int age;
cin >> age;
if (age < 0) {
cout << "Age has to be a positive number" << endl;
} else if (age <= 12) {
cout << "0$ - You get a free pass!" << endl;
} else if (age <= 18) {
cout << "6$ - You get 50% discount" << endl;
} else {
cout << "12$" << endl;
}
}
در مثال بالا اگر کاربر بین ۱۲ تا ۱۸ سال داشته باشد ۵۰ درصد تخفیف دریافت میکند.
در این مقاله در رابطه با شرط ها در زبان صحبت کردیم و توانستیم با استفاده از آن یک برنامه بنویسیم که بر اساس سن کاربر قیمت بلیت را به او اعلام میکند.
#include <iostream>
using namespace std;
int main() {
int age;
cin >> age;
if (age < 0) {
cout << "Age has to be a positive number" << endl;
} else if (age <= 12) {
cout << "0$ - You get a free pass!" << endl;
} else if (age <= 18) {
cout << "6$ - You get 50% discount" << endl;
} else {
cout << "12$" << endl;
}
}
-100
Age has to be a positive number
5
0$ - You get a free pass!
13
6$ - You get 50% discount
33
12$