ساخت ماشین حساب [CPP]

قسمت 6 از دوره C++

معرفی

نوشتن برنامه با استفاده از switch

نوشتن حلقه

جمع بندی

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

در این مقاله قصد داریم یک ماشین حساب دارای ۴ عمل اصلی با مفاهیمی که تا کنون یاد گرفته‌ایم بنویسیم و با switch-case در هم آشنا شویم.

#include <iostream>

using namespace std;

int main() {
    double a, b;
    char op;
    while (true) {
        cout << "Enter the operator ";
        cin >> op;
        if (op == 'e' || op == 'q') {
            break;
        }
        cout << "Enter the first number ";
        cin >> a;
        cout << "Enter the second number ";
        cin >> b;

        switch (op) {
            case '+':
            case 'a':
                cout << a + b << endl;
                break;
            case '-':
            case 's':
                cout << a - b << endl;
                break;
            case '*':
            case 'm':
                cout << a * b << endl;
                break;
            case '/':
            case 'd':
                cout << a / b << endl;
                break;
            default:
                cout << "Sorry, this operator is not supported" << endl;
                break;
        }
    }
}
Enter the operator +
Enter the first number 10.5
Enter the second number 3.5
14
Enter the operator +
Enter the first number 38.3
Enter the second number 3.7
42

بر اساس مفاهیمی که تا کنون با آن‌ها آشنا شدیم می‌توانیم یک برنامه بنویسیم که دو متغیر double به عنوان اعداد دو طرف عملیات و یک متغیر از نوع char که خود عملیات (+ – * /) را نشان می‌دهد را از کاربر دریافت کند.

#include <iostream>

using namespace std;

int main() {
    double a, b;
    char op;
    cout << "Enter the operator ";
    cin >> op;
    cout << "Enter the first number ";
    cin >> a;
    cout << "Enter the second number ";
    cin >> b;
}

حالا می‌توانیم از شرط ها استفاده کنیم تا اگر کاربر به طور مثال عملیات جمع را وارد کرده به او خروجی مناسب را برگردانیم و پرینت کنیم:

if (op == '+') {
    cout << a + b << endl;
}

دقت کنید که کارکتر + بین دو ‘ یا single quotation قرار گرفته که نشان می‌دهد یک کارکتر است. (از ” برای string ها و از ‘ برای کارکترها استفاده می‌کنیم.)

if (op == '+') {
    cout << a + b << endl;
} else if (op == '-') {
    cout << a - b << endl;
} else if (op == '*') {
    cout << a * b << endl;
} else if (op == '/') {
    cout << a / b << endl;
}

پس کد بالا با استفاده از if که قبلا با آن آشنا شده بودیم ۴ عمل اصلی را بررسی و اجرا می‌کند. اما برای بررسی حالات و مقادیر ممکن برای یک متغیر یک ساختار و syntax مجزا در زبان  وجود دارد به نام سوییچ که به شکل زیر نوشته می‌شود.

switch (op) {
    case '+':
        cout << a + b << endl;
        break;
    case '-':
        cout << a - b << endl;
        break;
    case '*':
        cout << a * b << endl;
        break;
    case '/':
        cout << a / b << endl;
        break;
}

در پرانتز switch متغیری که می‌خواهیم حالات یا case های مختلف آن‌ را بررسی کنیم را قرار می‌دهیم و درون سوییچ case های مختلف با مقادیری که می‌خواهیم قرار می‌دهیم پس فقط زمانی که قصد بررسی برابر بودن مقادیری با یک متغیر را داریم می‌توانیم از سوییچ استفاده کنیم.
آخر هر case هم با break بسته می‌شود تا مشخص کنیم که قصد داشتیم این case تا این خط اجرا شود؛ درواقع اگر این break قرار داده نشود هر case که درست باشد تا نزدیک ترین break اجرا می‌شود البته می‌توان از این مساله استفاده کرد و مثلا برای هر بخش دو case تعریف کرد.

switch (op) {
    case '+':
    case 'a':
        cout << a + b << endl;
        break;
    case '-':
    case 's':
        cout << a - b << endl;
        break;
    case '*':
    case 'm':
        cout << a * b << endl;
        break;
    case '/':
    case 'd':
        cout << a / b << endl;
        break;
}

در این کد اگر کاربر + یا a را برای add وارد کند برنامه عملکرد یکسانی خواهد داشت.
می‌توانیم یک حالت default هم در نظر بگیریم یعنی وقتی که هیچ‌کدام از case ها اتفاق نیفتاده به نوعی مشابه else آخری که در شرط‌ها داشتیم.

switch (op) {
    case '+':
    case 'a':
        cout << a + b << endl;
        break;
    case '-':
    case 's':
        cout << a - b << endl;
        break;
    case '*':
    case 'm':
        cout << a * b << endl;
        break;
    case '/':
    case 'd':
        cout << a / b << endl;
        break;
    default:
        cout << "Sorry, this operator is not supported" << endl;
        break;
}

در این کد اگر کاربر هیچ‌کدام از عملیات‌های تعریف شده را وارد نکند یک پیغام با این موضوع که عملگر وارد شده پشتیبانی نمی‌شود دریافت می‌کند.

#include <iostream>

using namespace std;

int main() {
    double a, b;
    char op;
    cout << "Enter the operator ";
    cin >> op;
    cout << "Enter the first number ";
    cin >> a;
    cout << "Enter the second number ";
    cin >> b;

    switch (op) {
        case '+':
        case 'a':
            cout << a + b << endl;
            break;
        case '-':
        case 's':
            cout << a - b << endl;
            break;
        case '*':
        case 'm':
            cout << a * b << endl;
            break;
        case '/':
        case 'd':
            cout << a / b << endl;
            break;
        default:
            cout << "Sorry, this operator is not supported" << endl;
            break;
    }
}
Enter the operator a
Enter the first number 2
Enter the second number 3
5

قطعه کد بالا کد نهایی است که به درستی کاری که باید را انجام می‌دهد اما یک مشکل کوچک دارد و آن این است که پس از انجام یک محاسبه بسته می‌شود و ما معمولا انتظار نداریم پس از این که یک عملیات با ماشین حسابمان انجام دادیم آن خاموش یا بسته شود پس ما هم در برنامه‌ای که می‌نویسیم می‌توانیم از یک حلقه استفاده کنیم تا کد ما برای همیشه ادامه پیدا کند.

برای انجام این کار ما کد را از بخش قبل از دریافت ورودی از کاربر وارد یک حلقه نامتناهی می‌کنیم که می‌تواند به صورت

while (true) {
}

یا

for (;;) {
}

نوشته شود. مورد اول که مشخصا یک حلقه است که تا زمانی که مقدار شرط آن درست و برقرار باشد به اجرا ادامه می‌دهد که چون این مقدار همواره برابر true یا درست است این حلقه هیچوقت متوقف نمی‌شود (انگار نوشته باشیم: while (1 == 1))
مورد دوم هم که یک for بدون شرط و initializer و step است، به نوعی قرار دادی‌است و هیچ تفاوتی هم با مورد اول ندارد! هر کدام را که بیشتر می‌پسندید استفاده کنید.

#include <iostream>

using namespace std;

int main() {
    double a, b;
    char op;
    while (true) {
        cout << "Enter the operator ";
        cin >> op;
        cout << "Enter the first number ";
        cin >> a;
        cout << "Enter the second number ";
        cin >> b;

        switch (op) {
            case '+':
            case 'a':
                cout << a + b << endl;
                break;
            case '-':
            case 's':
                cout << a - b << endl;
                break;
            case '*':
            case 'm':
                cout << a * b << endl;
                break;
            case '/':
            case 'd':
                cout << a / b << endl;
                break;
            default:
                cout << "Sorry, this operator is not supported" << endl;
                break;
        }
    }
}

اما احتمالا می‌توانید حدس بزنید که این کد یک مشکل کوچک دارد؛ اگر یادتان باشد در مقاله قبل در این مورد صحبت کردیم که حلقه‌ها نامتناهی معمولا خوب نیستند و باید از آن‌ها جلوگیری کنیم که راه ساده‌ای هم دارد. همان break که در سوییچ از آن استفاده کردیم در حلقه‌ها به کمکان می‌آید تا هر زمان که خواستیم (فارق از شرط خود حلقه) حلقه را بشکانیم و از آن خارج شویم.
می‌توانیم وقتی که از کاربر عملیات را می‌پرسیم چک کنیم اگر عملیات e (برای exit) بود حلقه را بشکانیم و برنامه را تمام کنیم.

#include <iostream>

using namespace std;

int main() {
    double a, b;
    char op;
    while (true) {
        cout << "Enter the operator ";
        cin >> op;
        if (op == 'e') {
            break;
        }
        cout << "Enter the first number ";
        cin >> a;
        cout << "Enter the second number ";
        cin >> b;

        switch (op) {
            case '+':
            case 'a':
                cout << a + b << endl;
                break;
            case '-':
            case 's':
                cout << a - b << endl;
                break;
            case '*':
            case 'm':
                cout << a * b << endl;
                break;
            case '/':
            case 'd':
                cout << a / b << endl;
                break;
            default:
                cout << "Sorry, this operator is not supported" << endl;
                break;
        }
    }
}

این برنامه به خوبی کار می‌کند و کاربر هر زمان که بخواهد می‌تواند با وارد کردن e به جای عملیات آن را ببندد
اما شاید دیده باشید که بعضی برنامه ها چند کلید را برای انجام یک کار می‌پذیرند مثلا شاید ما بخواهیم علاوه بر e با کارکتر q (برای quit) هم برنامه‌مان بسته شود. پس می‌توانیم در شرطی که می‌نویسیم بیان کنیم که اگر مقدار op کارکتر e یا q است حلقه را بشکان و برنامه را ببند. “یا” در زبان  با || نمایش داده می‌شود.

دقت کنید که نمی‌توانید بنویسید اگر op با ‘q’ یا ‘e’ برابر است

if (op == 'e' || 'q') {   ❌
}

چرا که کامپیوتر توانایی درک منظور شما از “یا” در این جمله را ندارد و باید هر بار جداگانه بگویید چه شرطی و مقداری را با چه شرط دیگری را می‌خواهید “یا” کنید.
پس باید بنویسید:

if (op == 'e' || op == 'q') {   ✅
}

برنامه نهایی ما به شکل زیر در می‌آید.

#include <iostream>

using namespace std;

int main() {
    double a, b;
    char op;
    while (true) {
        cout << "Enter the operator ";
        cin >> op;
        if (op == 'e' || op == 'q') {
            break;
        }
        cout << "Enter the first number ";
        cin >> a;
        cout << "Enter the second number ";
        cin >> b;

        switch (op) {
            case '+':
            case 'a':
                cout << a + b << endl;
                break;
            case '-':
            case 's':
                cout << a - b << endl;
                break;
            case '*':
            case 'm':
                cout << a * b << endl;
                break;
            case '/':
            case 'd':
                cout << a / b << endl;
                break;
            default:
                cout << "Sorry, this operator is not supported" << endl;
                break;
        }
    }
}
Enter the operator +
Enter the first number 10.5
Enter the second number 3.5
14
Enter the operator +
Enter the first number 38.3
Enter the second number 3.7
42
Enter the operator q
program ends here

در این مقاله در رابطه با اوپراتور or (یا)، break و سوییچ در زبان سی‌پلاس‌پلاس  صحبت کردیم و با آن‌ها یک ماشین حساب دارای ۴ عمل اصلی نوشتیم.

#include <iostream>

using namespace std;

int main() {
    double a, b;
    char op;
    while (true) {
        cout << "Enter the operator ";
        cin >> op;
        if (op == 'e' || op == 'q') {
            break;
        }
        cout << "Enter the first number ";
        cin >> a;
        cout << "Enter the second number ";
        cin >> b;

        switch (op) {
            case '+':
            case 'a':
                cout << a + b << endl;
                break;
            case '-':
            case 's':
                cout << a - b << endl;
                break;
            case '*':
            case 'm':
                cout << a * b << endl;
                break;
            case '/':
            case 'd':
                cout << a / b << endl;
                break;
            default:
                cout << "Sorry, this operator is not supported" << endl;
                break;
        }
    }
}
Enter the operator +
Enter the first number 10.5
Enter the second number 3.5
14
Enter the operator +
Enter the first number 38.3
Enter the second number 3.7
42
Enter the operator q

وارد شوید تا پیشرفت خود را ثبت کنید

وارد شوید تا پروژه‌هایی که تکمیل می‌کنید را علامت گذاری کنید و فرایند یادگیری خود را ثبت کنید

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

برای نوشتن نظر٬ اول باید وارد شوید

مرحله بعد

معرفی

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

از شکیبایی شما متشکریم.