شناخت سه عملگر منطقی &&، || و ! و ساخت جدول درستی هر کدام
درک مفهوم ارزیابی اتصال کوتاه (Short-circuit) و کاربردهای آن
پیادهسازی الگوریتم تشخیص وجود مثلث و تعیین نوع آن (متساویالاضلاع/متساویالساقین/قائمالزاویه/مختلفالاضلاع) با if تودرتو
حل معادله درجه دوم ax² + bx + c = 0 با محاسبه دلتا و استفاده از sqrt از <cmath>
تبدیل حروف بزرگ/کوچک با if تودرتو و کدهای ASCII
مقدمهای بر عملگرهای منطقی
در درس قبل یاد گرفتیم چطور یک شرط را بررسی کنیم: «آیا n > 0 است؟»، «آیا a == b است؟». اما در دنیای واقعی، معمولاً باید چند شرط را همزمان بررسی کنیم:
«اگر سن کاربر ۱۸ یا بیشتر بود و عضو ویژه بود، تخفیف بده.»
«اگر باران میبارید یا خیابان بسته بود، تاکسی بگیر.»
«اگر رمز وارد شده نه با رمز ذخیره شده برابر بود، خطا نشان بده.»
کلمههای کلیدی و، یا و نه در ریاضی به عملگرهای منطقی معروفاند. در C++ سه عملگر منطقی داریم:
عملگر
معادل فارسی
نام انگلیسی
مثال
&&
و (همزمان)
AND
(a > 0) && (b > 0)
||
یا (یکی کافی)
OR
(x == 1) || (x == 2)
!
نقیض (برعکس)
NOT
!(a == b)
توجه مهم: علامت && از دو علامت & پشت سر هم تشکیل شده، نه یک. به همین ترتیب || از دو | (pipe) تشکیل شده. اگر فقط یک & یا یک | بنویسید، در C++ معنای متفاوتی (عملگر بیتی) دارد که در درس پیشرفته توضیح داده میشود.
برای تایپ | روی کیبورد فارسی، معمولاً Shift + \ (بکاسلش) یا کلید بالای Enter استفاده میشود.
نکته: در C++ کلمات کلیدی and، or، not هم بهعنوان معادل &&، ||، ! قابل استفادهاند (با هدر <iso646.h> در C یا به طور پیشفرض در C++ مدرن). اما در کد صنعتی، نمادها رایجترند.
جدول درستی عملگر && (AND)
عملگر && (AND منطقی) زمانی true میشود که هر دو عملوند true باشند. در جدول زیر، A و B دو عبارت bool هستند:
A
B
A && B
false
false
false
false
true
false
true
false
false
true
true
true
یعنی کافی است یکی از دو شرط false باشد، کل عبارت && هم false میشود.
مثالها:
main.cppcpp
کاربرد معمول: برای بررسی «شیء در یک بازه» استفاده میشود: (x >= a) && (x <= b) یعنی «x در بازهٔ [a, b] است».
جدول درستی عملگر || (OR)
عملگر || (OR منطقی) زمانی true میشود که حداقل یکی از دو عملوند true باشد.
A
B
A || B
false
false
false
false
true
true
true
false
true
true
true
true
یعنی کافی است یکی از دو شرط true باشد، کل عبارت || هم true میشود.
مثالها:
main.cppcpp
کاربرد معمول: برای بررسی «عضویت در یک مجموعهٔ کوچک» استفاده میشود: (x == 1) || (x == 2) || (x == 3) یعنی «x یکی از ۱، ۲ یا ۳ است».
جدول درستی عملگر ! (NOT)
عملگر ! (NOT منطقی) یک عملگر یکتایی (Unary) است، یعنی فقط یک عملوند دارد. نقش آن برعکس کردن مقدار bool است: true را به false و false را به true تبدیل میکند.
A
!A
false
true
true
false
مثالها:
main.cppcpp
نکتهٔ مهم: برای خوانایی، از ! به طور مستقیم استفاده نکنید اگر میتوانید شرط معادل بنویسید. مثلاً به جای:
main.cppcpp
بهتر است بنویسید:
main.cppcpp
این دو عبارت کاملاً معادلاند. اما در مواردی مثل !(flag) که flag یک متغیر bool است، استفاده از ! طبیعی است.
قانون مورگان (De Morgan): این قانون خیلی مفید است:
!(A && B) معادل (!A) || (!B) است.
!(A || B) معادل (!A) && (!B) است.
یعنی برای «برعکس کردن» یک عبارت پیچیده، میتوانید عملگر را هم عوض کنید. این قانون در زمان سادهسازی شرطهای پیچیده به کمک میآید.
اولویت عملگرهای منطقی: ! > && > ||
در C++ اولویت عملگرهای منطقی به این ترتیب است (از بالا به پایین):
! (NOT) — بالاترین اولویت
&& (AND)
|| (OR) — پایینترین اولویت
یعنی در عبارت زیر:
main.cppcpp
معادل ((!a) && b) || c است. به این ترتیب:
اول !a محاسبه میشود.
سپس (!a) && b محاسبه میشود.
در نهایت با c با عملگر || ترکیب میشود.
توصیهٔ مهم: برای جلوگیری از اشتباه، همیشه از پرانتز استفاده کنید. حتی اگر اولویتها را میدانید، خوانندهٔ کد شما ممکن است نداند. این نسخهٔ کد بسیار خواناتر است:
main.cppcpp
یا حتی بهتر:
main.cppcpp
همچنین یادتان باشد که عملگرهای مقایسهای (<، >، == و غیره) اولویت بالاتری از && و || دارند. یعنی در عبارت:
main.cppcpp
اول a > 0 و b > 0 محاسبه میشوند، سپس && بین آنها اعمال میشود. پس نیازی به پرانتز اضافی نیست، اما برای خوانایی بهتر است بنویسید: (a > 0) && (b > 0).
ارزیابی اتصال کوتاه (Short-circuit Evaluation)
یکی از مهمترین ویژگیهای && و || در C++ این است که عملوندها را از چپ به راست ارزیابی میکنند و به محض اینکه نتیجهٔ نهایی معلوم شود، ارزیابی بقیه را متوقف میکنند.
برای &&: اگر عملوند چپ false باشد، نتیجهٔ کل عبارت قطعاً false خواهد بود (چون AND نیاز به هر دو true دارد). پس عملوند راست اصلاً ارزیابی نمیشود.
main.cppcpp
این الگو بسیار پرکاربرد است: «اگر مخرج صفر نبود، تقسیم را انجام بده».
برای ||: اگر عملوند چپ true باشد، نتیجهٔ کل عبارت قطعاً true خواهد بود. پس عملوند راست ارزیابی نمیشود.
main.cppcpp
کاربردهای عملی:
جلوگیری از تقسیم بر صفر:(b != 0) && (a / b > 1)
جلوگیری از دسترسی خارج از محدوده:(i >= 0 && i < n) && (arr[i] > 0)
بررسی ورودی معتبر قبل از پردازش:(input != null) && (input->isValid()) (در C++ با اشارهگر)
بهینهسازی: شرطهایی که به ندرت true میشوند را در سمت راست || بگذارید تا در اکثر مواقع اصلاً ارزیابی نشوند.
هشدار: از اثر جانبی (side effect) در عملوند راست && یا || استفاده نکنید، چون ممکن است اجرا نشود:
main.cppcpp
این میتواند باعث باگهای بسیار ظریف شود. همیشه اثر جانبی را در یک دستور جداگانه بنویسید.
مثال ۱: تشخیص وجود مثلث با &&
قضیهٔ کلاسیک هندسه: سه طول میتوانند اضلاع یک مثلث باشند اگر و فقط اگر مجموع هر دو ضلع، از ضلع سوم بزرگتر باشد. یعنی همزمان باید این سه شرط برقرار باشند:
a + b > c
a + c > b
b + c > a
با عملگر && میتوانیم این سه شرط را در یک عبارت ترکیب کنیم:
main.cppcpp
اگر کل این عبارت true باشد، یعنی مثلث میسازند.
نکتهٔ تاریخی: در نسخهٔ اصلی جزوه از کلمات کلیدی and به جای && استفاده شده بود. در C++ مدرن هر دو معتبرند، اما && رایجتر و در کد صنعتی استاندارد است.
سه ضلع a, b, c را بررسی میکند — آیا مثلث میسازند؟cpp
گاهی لازم است پس از بررسی یک شرط، در صورت برقراری آن، شرط دیگری هم بررسی شود. به این الگو if تودرتو (Nested if) میگویند:
main.cppcpp
مثال: تشخیص نمرهٔ قبولی همراه با وضعیت بورسیه:
main.cppcpp
قانون طلایی: اگر شرط ۲ فقط در صورت برقراری شرط ۱ معنی دارد (مثلاً تقسیم بر a فقط وقتی a != 0 باشد)، حتماً از if تودرتو استفاده کنید. این الگو به شما اجازه میدهد کارهای مربوط به یک حالت را در یک بلوک متمرکز نگه دارید.
نکتهٔ خوانایی: اگر بیش از دو سطح if تودرتو دارید، احتمالاً کد را میتوان سادهتر نوشت. در موارد پیچیده، بهتر است از else if (در ادامه همین درس توضیح داده میشود) یا تابع جدا استفاده کنید.
قانون کلیدی از صفحه ۱۶ جزوه: «هر if باید else داشته باشد، حتی اگر خالی باشد.» این قانون سختگیرانه نیست (یعنی اگر else نداشته باشید، برنامه خطا نمیدهد)، اما رعایت آن باعث میشود تمام مسیرهای ممکن برنامه را با دقت در نظر بگیرید و از باگهای منطقی جلوگیری کنید.
مثال ۲: تشخیص نوع مثلث با if تودرتو و else if
این مثال کلاسیک از ترکیب if، else if و else با عملگرهای منطقی است. الگوریتم:
ابتدا بررسی میکنیم آیا اصلاً مثلث تشکیل میشود یا نه (با شرط && از مثال قبل).
اگر بله:
اگر هر سه ضلع برابر بودند → متساویالاضلاع (a == b && b == c)
اگر حداقل دو ضلع برابر بودند → متساویالساقین (a == b || b == c || a == c)
اگر قانون فیثاغورث برقرار بود → قائمالزاویه
در غیر این صورت → مختلفالاضلاع
اگر خیر: «No Triangle» چاپ میکنیم.
ترتیب بررسیها مهم است! اول باید متساویالاضلاع را بررسی کنیم، چون در مثلث متساویالاضلاع هر سه ضلع برابرند و شرط «دو ضلع برابر» هم برقرار است. اگر اول متساویالساقین را بررسی میکردیم، مثلث متساویالاضلاع را اشتباهاً متساویالساقین تشخیص میدادیم.
همچنین برای قائمالزاویه بودن، باید هر سه حالت ممکن را بررسی کنیم: a² + b² == c² یا a² + c² == b² یا b² + c² == a².
متساویالاضلاع، متساویالساقین، قائمالزاویه یا مختلفالاضلاعcpp
یکی از سوالهای متداول مبتدیها این است: «چه وقتی از if تودرتو استفاده کنم و چه وقتی از else if؟»
قانون کلی:
else if (نردبان): وقتی میخواهید از بین چند حالت متقابل و مجزا یکی را انتخاب کنید. یعنی در هر زمان فقط یکی از شرطها میتواند true باشد. مثلاً دستهبندی نمره به A/B/C/D/F.
if تودرتو: وقتی شرط داخلی فقط در صورت برقراری شرط خارجی معنی دارد. یا وقتی میخواهید پس از تأیید یک شرط، حالتهای فرعی آن را بررسی کنید.
مثال مناسب برای else if: دستهبندی نمره.
main.cppcpp
چون نمره نمیتواند هم A و هم B باشد، حالتها متقابلاند و else if مناسب است.
مثال مناسب برای if تودرتو: تشخیص نوع مثلث.
main.cppcpp
چون بررسی «نوع مثلث» فقط وقتی isTriangle برقرار باشد معنی دارد، if تودرتو منطقی است.
در نسخهٔ اصلی جزوه (صفحه ۱۷) کدی وجود داشت که در آن به جای else if، دو if مجزا نوشته شده بود. این کد رفتار متفاوتی داشت:
نسخهٔ else if: فقط یکی از مسیرها اجرا میشود.
نسخهٔ if مجزا: هر دو ممکن است اجرا شوند (در صورت برقراری هر دو شرط).
دقیقتر بگوییم: در نردبان else if شرطها از بالا به پایین بررسی میشوند و به محض اینکه اولین شرطِ true پیدا شود، همان مسیر اجرا میشود و بقیهٔ نردبان اصلاً بررسی نمیشوند. در ifهای مجزا هر شرط جداگانه بررسی میشود و ممکن است چند مسیر پشت سر هم اجرا شوند.
این تفاوت به ظاهر کوچک اما در عمل بسیار مهم است.
نسخه اشتباه جزوه
کد دارای باگcpp
نسخه اصلاحشده و استاندارد
کد صحیحcpp
مثال ۳: حل معادله درجه دوم ax² + bx + c = 0
فرمول حل معادلهٔ درجه دو:
$$\Delta = b^2 - 4ac$$
سه حالت ممکن است:
اگر Δ = 0: یک ریشهٔ مضاعف واقعی — $x = \frac{-b}{2a}$
اگر Δ > 0: دو ریشهٔ متمایز واقعی — $x_{1,2} = \frac{-b \pm \sqrt{\Delta}}{2a}$
اگر Δ < 0: هیچ ریشهٔ واقعی (ریشهها مختلطاند).
برای محاسبهٔ $\sqrt{\Delta}$ از تابع sqrt در کتابخانهٔ <cmath> استفاده میکنیم.
اصلاحات نسبت به جزوه:
در نسخهٔ جزوه، متغیرها از نوع int بودند. این یعنی تقسیم -b / (2*a) بهصورت تقسیم صحیح انجام میشد و ریشههای اعشاری از بین میرفتند. راهحل: استفاده از double (یا cast کردن یکی از عملوندها به double).
در نسخهٔ جزوه، هدر <cmath> فراموش شده بود. بدون این هدر، تابع sqrt تعریف نشده است.
در نسخهٔ جزوه، main() بدون int نوشته شده بود که در C++ مدرن غیراستاندارد است.
محاسبه دلتا و تعیین تعداد ریشهها با if/else if/elsecpp
$خروجی برنامه
ورودی ۱: 1 -3 2
خروجی ۱:
Two real roots:
x1 = 2.0000
x2 = 1.0000
ورودی ۲: 1 2 1
خروجی ۲:
One real root: x = -1.0000
ورودی ۳: 1 0 1
خروجی ۳:
No real roots (complex).
تبدیل حروف بزرگ/کوچک با char و کد ASCII
در C++ نوع دادهٔ char در واقع یک عدد صحیح ۸ بیتی است که معمولاً بهعنوان کاراکتر تفسیر میشود. هر کاراکتر دارای یک کد ASCII منحصر به فرد است:
کاراکتر
کد ASCII
'0' تا '9'
۴۸ تا ۵۷
'A' تا 'Z'
۶۵ تا ۹۰
'a' تا 'z'
۹۷ تا ۱۲۲
' ' (فاصله)
۳۲
نکتهٔ کلیدی: فاصلهٔ بین حرف بزرگ و کوچک در جدول ASCII ثابت و برابر ۳۲ است. یعنی:
main.cppcpp
این یعنی برای تبدیل یک حرف بزرگ به کوچک، کافی است ۳۲ واحد به آن اضافه کنیم:
main.cppcpp
و برعکس، برای تبدیل حرف کوچک به بزرگ، ۳۲ واحد کم میکنیم:
main.cppcpp
نکته: در C++ مدرن، بهتر است از تابعهای کتابخانهای tolower و toupper (از هدر <cctype>) استفاده کنید. این توابع قابل حملترند و با کاراکترهای غیر ASCII هم کار میکنند. اما برای یادگیری منطق پایه، روش بالا مفید است.
برای تشخیص «آیا یک کاراکتر حرف بزرگ است یا کوچک؟» میتوانیم با کد ASCII مقایسه کنیم:
main.cppcpp
این الگو در مثال بعدی برای تبدیل حروف استفاده میشود.
مثال ۴: تشخیص و تبدیل حروف بزرگ/کوچک با if تودرتو
این برنامه یک کاراکتر از ورودی میگیرد و:
اگر حرف بزرگ بود، آن را به کوچک تبدیل میکند.
اگر حرف کوچک بود، آن را به بزرگ تبدیل میکند.
اگر نه حرف بزرگ و نه کوچک بود (مثلاً رقم یا علامت)، آن را دستنخورده باقی میگذارد.
اصلاحات نسبت به نسخهٔ اصلی جزوه:
تابع getch() (از <conio.h>) در کامپایلرهای مدرن استاندارد نیست. به جای آن از cin >> ch استفاده میکنیم.
در نسخهٔ جزوه، کلمهٔ elseif (بدون فاصله) نوشته شده بود. شکل صحیح else if (با فاصله) است.
در نسخهٔ جزوه، int main و return 0 فراموش شده بود.
در نسخهٔ جزوه از کلمات کلیدی and به جای && استفاده شده بود. در اینجا از && استفاده میکنیم چون در کد صنعتی رایجتر است.
یک کاراکتر میگیرد و برعکس میکند (بزرگ→کوچک و کوچک→بزرگ)cpp
$خروجی برنامه
ورودی ۱: H
خروجی ۱: Lowercase: h
ورودی ۲: w
خروجی ۲: Uppercase: W
ورودی ۳: 5
خروجی ۳: Not a letter: 5
در حال باز کردن ویرایشگر…
فلوچارت: خواندن a, b, c → تشخیص نوع مثلث → چاپ
این الگوریتم ترکیبی از مثالهای ۱ و ۲ این درس است. ابتدا بررسی میکنیم آیا سه عدد مثلث میسازند یا نه، سپس در صورت مثبت بودن، نوع مثلث را مشخص میکنیم. این یک نمونهٔ عالی از استفادهٔ if تودرتو با else if است.
flow.svg
جمعبندی و نکات پیشرفته
در این درس با عملگرهای منطقی و if تودرتو آشنا شدیم. نکات کلیدی:
۱. سه عملگر منطقی:
&& (AND): هر دو شرط باید true باشند.
|| (OR): کافی است یکی true باشد.
! (NOT): برعکس میکند.
۲. اولویت:! > && > ||. همیشه از پرانتز استفاده کنید.
۳. ارزیابی اتصال کوتاه:
در A && B، اگر A false باشد، B ارزیابی نمیشود.
در A || B، اگر A true باشد، B ارزیابی نمیشود.
از این ویژگی برای جلوگیری از خطاهای تقسیم بر صفر یا خارج از محدوده استفاده کنید.
۴. if تودرتو: وقتی شرط داخلی فقط در صورت برقراری شرط خارجی معنی دارد.
۵. else if ladder: وقتی چند حالت متقابل دارید (مثل دستهبندی نمره).
۶. قانون مورگان:!(A && B) ≡ (!A) || (!B) و !(A || B) ≡ (!A) && (!B).
۷. معادله درجه دو: همیشه delta = b² - 4ac را حساب کنید، سپس سه حالت (دلتا مثبت/صفر/منفی) را با if/else if/else بررسی کنید. برای sqrt از <cmath> استفاده کنید و برای دقت اعشاری، متغیرها را double تعریف کنید.
۸. کاراکتر و ASCII:char در واقع یک عدد صحیح ۸ بیتی است. فاصلهٔ بین حرف بزرگ و کوچک برابر ۳۲ است.
۹. اصلاح جزوه:
and/or/not به جای &&/||/! در C++ مجاز اما در کد صنعتی نادر است.
getch() از <conio.h> در کامپایلرهای مدرن غیراستاندارد است؛ از cin >> ch استفاده کنید.
elseif (بدون فاصله) اشتباه است؛ صحیح else if.
در معادلهٔ درجه دو، حتماً از double استفاده کنید تا تقسیم اعشاری انجام شود.
در درس بعدی با دستور switch و حلقهٔ for آشنا میشویم — ابزارهایی برای مواقعی که چندین حالت مجزا یا تکرار دارید.
برنامهای بنویسید که یک سال میلادی را بگیرد و تعیین کند آیا کبیسه است یا نه. قانون: اگر سال بر ۴ بخشپذیر بود و بر ۱۰۰ بخشپذیر نبود، کبیسه است. یا اگر بر ۴۰۰ بخشپذیر بود، کبیسه است. (از && و || استفاده کنید.)
برنامهای بنویسید که سه عدد a, b, c را بگیرد و بزرگترین آنها را با استفاده از if تودرتو پیدا کند (بدون استفاده از تابع max).
نمایش راهنما
اول a را با b مقایسه کنید. اگر a > b بود، سپس a را با c مقایسه کنید. در غیر این صورت b را با c مقایسه کنید.
03
تمرین•حل کامل دارد
برنامهای بنویسید که سه ضلع مثلث را بگیرد و محیط آن را چاپ کند. اما اول با && بررسی کنید آیا اعداد مثبت هستند و آیا مثلث میسازند. اگر نه، پیام «Invalid» چاپ کنید.
نمایش راهنما
دو شرط با && ترکیب کنید: (a > 0 && b > 0 && c > 0) و (a+b > c && a+c > b && b+c > a).
04
تمرین•حل کامل دارد
برنامهای بنویسید که یک کاراکتر از ورودی بگیرد و تعیین کند آیا آن کاراکتر یک رقم ('0' تا '9')، یک حرف بزرگ ('A' تا 'Z')، یک حرف کوچک ('a' تا 'z') یا چیزی دیگر است. (از else if ladder استفاده کنید.)
نمایش راهنما
برای هر دسته، یک شرط با && بنویسید: (ch >= '0' && ch <= '9')، (ch >= 'A' && ch <= 'Z')، و الی آخر.
05
تمرین•حل کامل دارد
برنامهای بنویسید که سه عدد a, b, c را بگیرد و معادله درجه دوم ax² + bx + c = 0 را حل کند. اگر a = 0 بود، پیام «Not quadratic» چاپ کند. در غیر این صورت دلتا را محاسبه کرده و سه حالت (دو ریشه، یک ریشه مضاعف، بدون ریشه واقعی) را با if/else if/else بررسی کند. برای sqrt از <cmath> استفاده کنید و خروجی را با ۴ رقم اعشار چاپ کنید.
نمایش راهنما
دلتا = b*b - 4*a*c. برای دقت اعشاری، همه را double تعریف کنید. از #include <iomanip> و setprecision(4) برای چاپ استفاده کنید.
// نکات-کلیدی۶
01سه عملگر منطقی C++: && (AND، هر دو)، || (OR، یکی کافی)، ! (NOT، برعکس).
02اولویت عملگرهای منطقی: ! (بالاترین) > && > || (پایینترین). همیشه از پرانتز استفاده کنید.
03ارزیابی اتصال کوتاه (Short-circuit): در A && B اگر A false باشد، B ارزیابی نمیشود؛ در A || B اگر A true باشد، B ارزیابی نمیشود.
04if تودرتو برای زمانی که شرط داخلی فقط در صورت برقراری شرط خارجی معنی دارد؛ else if ladder برای حالتهای متقابل و مجزا.
05برای حل معادله درجه دوم، دلتا (Δ = b²-4ac) را محاسبه کنید و سه حالت (مثبت/صفر/منفی) را با if/else if/else بررسی کنید. همیشه از double و <cmath> استفاده کنید.
06کاراکتر در C++ عدد صحیح ۸ بیتی است. فاصله بین حرف بزرگ و کوچک در ASCII برابر ۳۲ است، پس ch ± 32 تبدیل میکند. برای تشخیص نوع کاراکتر، از مقایسه با بازه (ch >= 'A' && ch <= 'Z') استفاده کنید.
گام بعدی پیشنهادی
دستور switch و case
ساختار تمیز برای انتخاب چندحالته — از ماشینحساب تا کلیدهای جهتنما
نام درس، موضوع یا کلمه کلیدی را بنویسید و با Enter به آن بروید
bool ok =(n >0)&&(n <100);// n بین 0 و 100bool teen =(age >=13)&&(age <=19);// نوجوانbool leap =(year %4==0)&&(year %100!=0);// سال کبیسه ساده
bool weekend =(day ==6)||(day ==7);// شنبه یا یکشنبهbool hot =(temp >35)||(humidity >80);// دما بالا یا رطوبت بالاbool invalid =(n <0)||(n >100);// خارج از بازه
if(n !=0&&10/ n >1){...}// ↑ اگر n == 0 باشد، این قسمت false میشود// و 10/n اصلاً محاسبه نمیشود → خطای تقسیم بر صفر رخ نمیدهد!
if(i >= n || i <0|| arr[i]==5){...}// ↑ اگر i خارج از محدوده باشد، این قسمت true میشود// و arr[i] اصلاً دسترسی نمیشود → خطای خارج از محدوده رخ نمیدهد
if(flag &&(count++>10)){...}// ↑ اگر flag == false باشد، count++ اجرا نمیشود!
(a + b > c)&&(a + c > b)&&(b + c > a)
1#include<iostream>2usingnamespace std;34intmain(){5int a =0, b =0, c =0;6 cout <<"Enter three sides: ";7 cin >> a >> b >> c;89if((a + b > c)&&(a + c > b)&&(b + c > a)){10 cout <<"Yes"<< endl;11}else{12 cout <<"No"<< endl;13}1415return0;16}17
if(شرط ۱){if(شرط ۲){// وقتی هم شرط ۱ و هم شرط ۲ برقرارند}else{// وقتی شرط ۱ برقرار ولی شرط ۲ نه}}else{// وقتی شرط ۱ اصلاً برقرار نیست}
1#include<iostream>2usingnamespace std;34intmain(){5int a =0, b =0, c =0;6 cout <<"Enter three sides: ";7 cin >> a >> b >> c;89// ۱. اول بررسی میکنیم آیا اصلاً مثلث میسازند10if((a + b > c)&&(a + c > b)&&(b + c > a)){1112// ۲. حالا نوع مثلث را مشخص میکنیم13if(a == b && b == c){14 cout <<"Equilateral (متساویالاضلاع)"<< endl;15}elseif(a == b || b == c || a == c){16 cout <<"Isosceles (متساویالساقین)"<< endl;17}elseif(a*a + b*b == c*c ||18 a*a + c*c == b*b ||19 b*b + c*c == a*a){20 cout <<"Right (قائمالزاویه)"<< endl;21}else{22 cout <<"Scalene (مختلفالاضلاع)"<< endl;23}2425}else{26 cout <<"Not a triangle"<< endl;27}2829return0;30}31
if(isTriangle){// اول: آیا اصلاً مثلث است؟if(equilateral){...}// حالا نوعش را بررسی کنelseif(isosceles){...}else{...}}else{ cout <<"Not a triangle";}
1// ✗ رفتار اشتباه: دو if مجزا به جای else if2#include<iostream>3usingnamespace std;45intmain(){6int x =10;7if(x >0){8 x -=20;// x اکنون -10 میشود9}10if(x <0){// این if جدا از قبلی است!11 x +=20;// x اکنون دوباره 10 میشود12}13 cout << x << endl;// خروجی: 10 (ناخواسته!)14return0;15}16
1// ✓ صحیح: else if به جای if دوم2#include<iostream>3usingnamespace std;45intmain(){6int x =10;7if(x >0){8 x -=20;// x اکنون -10 میشود9}elseif(x <=0){// این فقط در صورتی اجرا میشود که شرط اول false بوده10 x +=20;11}12 cout << x << endl;// خروجی: -10 (انتظار ما)13return0;14}15
1#include<iostream>2#include<cmath>3#include<iomanip>4usingnamespace std;56intmain(){7double a =0, b =0, c =0;8 cout <<"Enter coefficients a, b, c: ";9 cin >> a >> b >> c;1011// اگر a == 0، معادله درجه دو نیست12if(a ==0){13 cout <<"Not a quadratic equation (a = 0)"<< endl;14return0;15}1617double delta = b * b -4* a * c;18 cout << fixed <<setprecision(4);1920if(delta ==0){21double x =-b /(2* a);22 cout <<"One real root: x = "<< x << endl;23}elseif(delta >0){24double x1 =(-b +sqrt(delta))/(2* a);25double x2 =(-b -sqrt(delta))/(2* a);26 cout <<"Two real roots:"<< endl;27 cout <<"x1 = "<< x1 << endl;28 cout <<"x2 = "<< x2 << endl;29}else{30 cout <<"No real roots (complex)."<< endl;31}3233return0;34}35
int d ='a'-'A';// d = 32
char upper ='H';char lower = upper +32;// یا: char lower = upper + ('a' - 'A');// lower اکنون 'h' است
char lower ='h';char upper = lower -32;// upper اکنون 'H' است
if(ch >='A'&& ch <='Z'){// ch حرف بزرگ است}if(ch >='a'&& ch <='z'){// ch حرف کوچک است}
1#include<iostream>2usingnamespace std;34intmain(){5char ch =0;6 cout <<"Enter a character: ";7 cin >> ch;89if(ch >='A'&& ch <='Z'){10// حرف بزرگ → کوچک11 ch = ch +('a'-'A');12 cout <<"Lowercase: "<< ch << endl;13}elseif(ch >='a'&& ch <='z'){14// حرف کوچک → بزرگ15 ch = ch -('a'-'A');16 cout <<"Uppercase: "<< ch << endl;17}else{18// نه حرف بزرگ و نه کوچک (مثلاً رقم یا علامت)19 cout <<"Not a letter: "<< ch << endl;20}2122return0;23}24
flow.svg100%
Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.