برای روشن کردن ترمینال، کلیک کن یا هر کلیدی را بزن

پرش به محتوای اصلی
>_
درس ۸متوسط

عملگر‌های منطقی و if تودرتو

ترکیب شرط‌ها با &&، || و ! و ساختار‌بندی تصمیمات پیچیده

معمولی
مبانی و مقدمات•صفحات ۱۶-۱۷•۲۵ دقیقه•۳٬۸۲۲ کلمهزمان مطالعه: ۰ دقیقه
فهرست این درس
// اهداف۵
  • شناخت سه عملگر منطقی &&، || و ! و ساخت جدول درستی هر کدام
  • درک مفهوم ارزیابی اتصال کوتاه (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 هستند:

ABA && B
falsefalsefalse
falsetruefalse
truefalsefalse
truetruetrue

یعنی کافی است یکی از دو شرط false باشد، کل عبارت && هم false می‌شود.

مثال‌ها:

main.cppcpp

کاربرد معمول: برای بررسی «شیء در یک بازه» استفاده می‌شود: (x >= a) && (x <= b) یعنی «x در بازهٔ [a, b] است».

جدول درستی عملگر || (OR)

عملگر || (OR منطقی) زمانی true می‌شود که حداقل یکی از دو عملوند true باشد.

ABA || B
falsefalsefalse
falsetruetrue
truefalsetrue
truetruetrue

یعنی کافی است یکی از دو شرط true باشد، کل عبارت || هم true می‌شود.

مثال‌ها:

main.cppcpp

کاربرد معمول: برای بررسی «عضویت در یک مجموعهٔ کوچک» استفاده می‌شود: (x == 1) || (x == 2) || (x == 3) یعنی «x یکی از ۱، ۲ یا ۳ است».

جدول درستی عملگر ! (NOT)

عملگر ! (NOT منطقی) یک عملگر یکتایی (Unary) است، یعنی فقط یک عملوند دارد. نقش آن برعکس کردن مقدار bool است: true را به false و false را به true تبدیل می‌کند.

A!A
falsetrue
truefalse

مثال‌ها:

main.cppcpp

نکتهٔ مهم: برای خوانایی، از ! به طور مستقیم استفاده نکنید اگر می‌توانید شرط معادل بنویسید. مثلاً به جای:

main.cppcpp

بهتر است بنویسید:

main.cppcpp

این دو عبارت کاملاً معادل‌اند. اما در مواردی مثل !(flag) که flag یک متغیر bool است، استفاده از ! طبیعی است.

قانون مورگان (De Morgan): این قانون خیلی مفید است:

  • !(A && B) معادل (!A) || (!B) است.
  • !(A || B) معادل (!A) && (!B) است.

یعنی برای «برعکس کردن» یک عبارت پیچیده، می‌توانید عملگر را هم عوض کنید. این قانون در زمان ساده‌سازی شرط‌های پیچیده به کمک می‌آید.

اولویت عملگر‌های منطقی: ! > && > ||

در ⁦C++⁩ اولویت عملگر‌های منطقی به این ترتیب است (از بالا به پایین):

  1. ! (NOT) — بالاترین اولویت
  2. && (AND)
  3. || (OR) — پایین‌ترین اولویت

یعنی در عبارت زیر:

main.cppcpp

معادل ((!a) && b) || c است. به این ترتیب:

  1. اول !a محاسبه می‌شود.
  2. سپس (!a) && b محاسبه می‌شود.
  3. در نهایت با 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

کاربرد‌های عملی:

  1. جلوگیری از تقسیم بر صفر: (b != 0) && (a / b > 1)
  2. جلوگیری از دسترسی خارج از محدوده: (i >= 0 && i < n) && (arr[i] > 0)
  3. بررسی ورودی معتبر قبل از پردازش: (input != null) && (input->isValid()) (در ⁦C++⁩ با اشاره‌گر)
  4. بهینه‌سازی: شرط‌هایی که به ندرت true می‌شوند را در سمت راست || بگذارید تا در اکثر مواقع اصلاً ارزیابی نشوند.

هشدار: از اثر جانبی (side effect) در عملوند راست && یا || استفاده نکنید، چون ممکن است اجرا نشود:

main.cppcpp

این می‌تواند باعث باگ‌های بسیار ظریف شود. همیشه اثر جانبی را در یک دستور جداگانه بنویسید.

مثال ۱: تشخیص وجود مثلث با &&

قضیهٔ کلاسیک هندسه: سه طول می‌توانند اضلاع یک مثلث باشند اگر و فقط اگر مجموع هر دو ضلع، از ضلع سوم بزرگ‌تر باشد. یعنی همزمان باید این سه شرط برقرار باشند:

  1. a + b > c
  2. a + c > b
  3. b + c > a

با عملگر && می‌توانیم این سه شرط را در یک عبارت ترکیب کنیم:

main.cppcpp

اگر کل این عبارت true باشد، یعنی مثلث می‌سازند.

نکتهٔ تاریخی: در نسخهٔ اصلی جزوه از کلمات کلیدی and به جای && استفاده شده بود. در ⁦C++⁩ مدرن هر دو معتبرند، اما && رایج‌تر و در کد صنعتی استاندارد است.

سه ضلع a, b, c را بررسی می‌کند — آیا مثلث می‌سازند؟cpp
خروجی برنامه
ورودی ۱: 3 4 5
خروجی ۱: Yes

ورودی ۲: 1 2 10
خروجی ۲: No (چون 1+2 > 10 نیست)
در حال باز کردن ویرایشگر…

if تودرتو و ساختار کلی آن

گاهی لازم است پس از بررسی یک شرط، در صورت برقراری آن، شرط دیگری هم بررسی شود. به این الگو if تودرتو (Nested if) می‌گویند:

main.cppcpp

مثال: تشخیص نمرهٔ قبولی همراه با وضعیت بورسیه:

main.cppcpp

قانون طلایی: اگر شرط ۲ فقط در صورت برقراری شرط ۱ معنی دارد (مثلاً تقسیم بر a فقط وقتی a != 0 باشد)، حتماً از if تودرتو استفاده کنید. این الگو به شما اجازه می‌دهد کار‌های مربوط به یک حالت را در یک بلوک متمرکز نگه دارید.

نکتهٔ خوانایی: اگر بیش از دو سطح if تودرتو دارید، احتمالاً کد را می‌توان ساده‌تر نوشت. در موارد پیچیده، بهتر است از else if (در ادامه همین درس توضیح داده می‌شود) یا تابع جدا استفاده کنید.

قانون کلیدی از صفحه ۱۶ جزوه: «هر if باید else داشته باشد، حتی اگر خالی باشد.» این قانون سخت‌گیرانه نیست (یعنی اگر else نداشته باشید، برنامه خطا نمی‌دهد)، اما رعایت آن باعث می‌شود تمام مسیر‌های ممکن برنامه را با دقت در نظر بگیرید و از باگ‌های منطقی جلوگیری کنید.

مثال ۲: تشخیص نوع مثلث با if تودرتو و else if

این مثال کلاسیک از ترکیب if، else if و else با عملگر‌های منطقی است. الگوریتم:

  1. ابتدا بررسی می‌کنیم آیا اصلاً مثلث تشکیل می‌شود یا نه (با شرط && از مثال قبل).
  2. اگر بله:
    • اگر هر سه ضلع برابر بودند → متساوی‌الاضلاع (a == b && b == c)
    • اگر حداقل دو ضلع برابر بودند → متساوی‌الساقین (a == b || b == c || a == c)
    • اگر قانون فیثاغورث برقرار بود → قائم‌الزاویه
    • در غیر این صورت → مختلف‌الاضلاع
  3. اگر خیر: «No Triangle» چاپ می‌کنیم.

ترتیب بررسی‌ها مهم است! اول باید متساوی‌الاضلاع را بررسی کنیم، چون در مثلث متساوی‌الاضلاع هر سه ضلع برابرند و شرط «دو ضلع برابر» هم برقرار است. اگر اول متساوی‌الساقین را بررسی می‌کردیم، مثلث متساوی‌الاضلاع را اشتباهاً متساوی‌الساقین تشخیص می‌دادیم.

همچنین برای قائم‌الزاویه بودن، باید هر سه حالت ممکن را بررسی کنیم: a² + b² == c² یا a² + c² == b² یا b² + c² == a².

متساوی‌الاضلاع، متساوی‌الساقین، قائم‌الزاویه یا مختلف‌الاضلاعcpp
خروجی برنامه
ورودی ۱: 3 3 3
خروجی ۱: Equilateral (متساوی‌الاضلاع)

ورودی ۲: 3 3 4
خروجی ۲: Isosceles (متساوی‌الساقین)

ورودی ۳: 3 4 5
خروجی ۳: Right (قائم‌الزاویه)

ورودی ۴: 3 4 6
خروجی ۴: Scalene (مختلف‌الاضلاع)

ورودی ۵: 1 2 10
خروجی ۵: Not a triangle

if تودرتو در برابر نردبان else if

یکی از سوال‌های متداول مبتدی‌ها این است: «چه وقتی از 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$$

سه حالت ممکن است:

  1. اگر Δ = 0: یک ریشهٔ مضاعف واقعی — $x = \frac{-b}{2a}$
  2. اگر Δ > 0: دو ریشهٔ متمایز واقعی — $x_{1,2} = \frac{-b \pm \sqrt{\Delta}}{2a}$
  3. اگر Δ < 0: هیچ ریشهٔ واقعی (ریشه‌ها مختلط‌اند).

برای محاسبهٔ $\sqrt{\Delta}$ از تابع sqrt در کتابخانهٔ <cmath> استفاده می‌کنیم.

اصلاحات نسبت به جزوه:

  1. در نسخهٔ جزوه، متغیر‌ها از نوع int بودند. این یعنی تقسیم -b / (2*a) به‌صورت تقسیم صحیح انجام می‌شد و ریشه‌های اعشاری از بین می‌رفتند. راه‌حل: استفاده از double (یا cast کردن یکی از عملوند‌ها به double).
  2. در نسخهٔ جزوه، هدر <cmath> فراموش شده بود. بدون این هدر، تابع sqrt تعریف نشده است.
  3. در نسخهٔ جزوه، 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 تودرتو

این برنامه یک کاراکتر از ورودی می‌گیرد و:

  • اگر حرف بزرگ بود، آن را به کوچک تبدیل می‌کند.
  • اگر حرف کوچک بود، آن را به بزرگ تبدیل می‌کند.
  • اگر نه حرف بزرگ و نه کوچک بود (مثلاً رقم یا علامت)، آن را دست‌نخورده باقی می‌گذارد.

اصلاحات نسبت به نسخهٔ اصلی جزوه:

  1. تابع getch() (از <conio.h>) در کامپایلر‌های مدرن استاندارد نیست. به جای آن از cin >> ch استفاده می‌کنیم.
  2. در نسخهٔ جزوه، کلمهٔ elseif (بدون فاصله) نوشته شده بود. شکل صحیح else if (با فاصله) است.
  3. در نسخهٔ جزوه، int main و return 0 فراموش شده بود.
  4. در نسخهٔ جزوه از کلمات کلیدی 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 آشنا می‌شویم — ابزارهایی برای مواقعی که چندین حالت مجزا یا تکرار دارید.

مرور سریع مطالب

۱۵ بخش در این درس

تمرین‌ها

01
تمرین•حل کامل دارد

برنامه‌ای بنویسید که یک سال میلادی را بگیرد و تعیین کند آیا کبیسه است یا نه. قانون: اگر سال بر ۴ بخش‌پذیر بود و بر ۱۰۰ بخش‌پذیر نبود، کبیسه است. یا اگر بر ۴۰۰ بخش‌پذیر بود، کبیسه است. (از && و || استفاده کنید.)

نمایش راهنما
فرمول: (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0).
02
تمرین•حل کامل دارد

برنامه‌ای بنویسید که سه عدد 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 به آن بروید