الگوریتم نویسی

الگوریتم نویسی

آموزش الگوریتم نویسی در زبان های برنامه نویسی

در ادامه بخش اول آموزش الگوریتم در برنامه نویسی، میخواهیم تعدادی مثال های پیچیده تر را تفسیر و حل کنیم.

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

مثال1: برنامه ای بنویسید که عددی را از ورودی دریافت و مشخص کند که آیا “اول” است یا خیر؟

حل: میدانیم که اعداد اول اعدادی هستند که فقط بر خودشان و 1 بخش پذیر هستند. کوچکترین اعداد اول، 2-3-5-7 هستند. در ادامه،میدانیم که تمام اعداد بزرگتر از 10 که بر هیچ کدام از اعداد 2-3-5-7 بخش پذیر نباشند، حتما اول هستند. بنابراین برای نوشتن الگوریتم فوق، ابتدا باید بررسی کنیم که آیا عدد وارد شده کوچکتر از 10 است و اگر بله، آیا یکی از اعداد 2-3-5-7 هست یا خیر و اگر عدد بزرگتر از 10 باشد، میبایست بررسی کنیم که آیا عدد وارد شده بر “حداقل” یکی از اعداد 2-3-5-7 بخش پذیر است یا خیر.

1- شروع

2- آیا عدد وارد شده از 10 کوچکتر است و آیا عدد وارد شده یکی از اعداد 2-3-5-7 است؟ اگر بله، چاپ کن “عدد اول است” و اگر خیر، برو به مرحله 3

3- آیا عدد وارد شده از 10 بزرگتر است؟ اگر بله برو به مرحله 4

4- آیا باقیمانده تقسیم عدد مورد نظر بر یکی از اعداد 2 یا 3 یا 5 یا 7 برابر با صفر نیست؟ اگر بله، چاپ کن “اول است” و اگر خیر چاپ کن “اول نیست”

حال میخواهیم الگوریتم فوق را به زبان C++ تبدیل کنیم:


int x;
cin >> x;
if (x < 10)
{
    if (x == 2 || x == 3 || x == 5 || x ==7)
    {
        cout << "Aval ast";
    }
    else
    {
        cout << "Aval nist";
    }
}
else
{
    if (x % 2 != 0 || x % 3 != 0 || x % 5 != 0 || x % 7 != 0)
    {
        cout << "Aval Ast";
    }
    else
    {
        cout << "Aval nist";
    }
}

یادآوری: علامت % تشان دهنده “باقی مانده تقسیم”
علامت || برابر با کلمه “یا”
علامت == نشان دهنده “مساوی”
و علامت != نشان دهنده “نامساوی” در زبان C++ هستند

رسم فلوچارت الگوریتم فوق به صورت زیر خواهد شد:

الگوریتم نویسی


مثال2: برنامه ای بنویسید که تا موقعی که کلید f فشرده نشود، از ورودی کاراکتر دریافت کند و آنها را بشمارد.

حل: برای تکرار دستوراتی به تعداد زیاد و مشخص، معمولا از حلقه for استفاده میکنیم و برای تکرار به دفعات نامشخص، معمولاً از حلقه while استفاده میکنیم. در این مثال میبایست انجام دستور “دریافت کاراکتر از ورودی” را داخل یک حلقه while بگذاریم و شرط آن را طوری تعریف کنیم که به محض دریافت کاراکتر f، برنامه از حلقه خارج شود. همچنین یک متغیر برای شمارش دفعات تکرار (که همان تعداد کاراکترها است) باید وجود داشته باشد.
حل این مثال با زبان C++ به صورت زیر است:


int count = 0;
char c;
while (c != ‘f’)
{
    c = cin.get();
    count = count + 1;
}
cout << count;

*جهت آشنایی با دستور cin.get میتوانید مقاله ورودی و خروجی در C++ را مطالعه کنید.

رسم فلوچارت مثال فوق به صورت زیر خواهد بود:

فلوچارت


مثال3: برنامه ای بنویسید که عناصر یک جدول ضرب 10×10 را که هم بر 5 و هم بر 7 بخش پذیر هستند چاپ کند.

حل: جهت الگوریتم نویسی برای این مثال، برای شبیه سازی یک جدول ضرب از دو حلقه تو در تو for با دفعات تکرار 10، استفاده میکنیم.
بدین ترتیب در حلقه درونی، عملیات ضرب را انجام میدهیم که موجب تولید هر کدام از عناصر جدول ضرب 10 در 10 خواهد شد.
همزمان با تولید هر عنصر، می‌بایست آن عنصر را چک کنیم، اگر بر 5 و 7 بخش پذیر باشد باید آن را در خروجی چاپ کنیم تا به آنچه در صورت مساله خواسته شده برسیم.


for (int i=1; i<=10; i++)
{
    for (int j=1; j<=10; j++)
    {
        int num = i*j;
        if (num % 5 == 0 && num % 7 == 0)
        {
            cout << num << endl;
        }
    }
}

رسم فلوچارت الگوریتم فوق به صورت زیر خواهد بود:
فلوچارت الگوریتم


مثال4: برنامه ای بنویسید که یک عدد را از ورودی خوانده و مجموع فاکتوریل ارقام آن را در خروجی چاپ کند.

حل: برای حل این مساله، اولین مرحله دریافت یک عدد صحیح از ورودی توسط دستور cin است. سپس میبایست راهی پیدا کنیم تا ارقام عدد مورد نظر را از از یکدیگر جدا کنیم و فاکتوریل هر کدام را محاسبه کنیم و در نهایت آنها را با هم جمع کنیم. برای جداسازی ارقام یک عدد، در C++ به اینصورت عمل میکنیم که باقیمانده تقسیم عدد مورد نظر بر 10 را میگیریم که میشود یکان آن. سپس برای گرفتن دهگان، یکبار عدد را بر 10 تقسیم میکنیم و سپس مجدداً باقیمانده تقسیم بر 10 را میگیریم. و به همین ترتیب تا انتها تمام ارقام را جداسازی میکنیم.
از آنجاییکه ما نمیدانیم که عددی که کاربر وارد میکند چندرقمی است، میبایست از یک حلقه while با تعداد تکرار نامشخص استفاده کنیم.
کد این برنامه به زبان C++ به صورت زیر خواهد بود:


int n;
int s=0;
cin >> n;
while (n>0)
{
    int f = 1;
    int k = n % 10;
    for (int i = 1; i <= k; i++)
    {
        f = f * i;
    }
    s = s + f;
    n = n / 10;
}
cout << s;

و فلوچارت این الگوریتم نیز به صورت زیر است:
فلوچارت سی پلاس


مثال5: برنامه ای بنویسید که عددی را از مبنای 10 (دسیمال) از ورودی گرفته و به مبنای 2 (باینری) تبدیل کند.

حل: اعداد دسیمال یا همان اعداد مبنای 10 اعداد صحیحی هستند مانند عدد 24 و اعداد باینری یا اعداد مبنای 2، تبدیل شده اعداد صحیح به صورت صفر و یک هستند. برای مثال معادل باینری عدد 24 برابر است با 11000
برای تبدیل یک عدد بر مبنای 10 به مبنای 2، آن عدد را n بار بر 2 تقسیم میکنیم و در پایان باقیمانده های تقسیم را از انتها به ابتدا مینویسیم. عملیات تقسیم تا جایی ادامه پیدا میکند که خارج قسمت کوچکتر از 2 شود و قابل تقسیم نباشد. در این مساله، برای ذخیره کردن باقیمانده های تقسیم از یک آرایه (با مقدار حداکثر فرضی 30) استفاده کرده ایم.


int num;
int i;
int A[30];
cin >> num;
while (num > 0)
{
    A[i] = num % 2;
    num = num / 2;
    i = i + 1;
}
A[i] = 1;
while (i >= 0)
{
    cout << A[i];
    i = i - 1;
}

فلوچارت:
الگوریتم نویسی


لینک های مفید:

آموزش الگوریتم بخش اول

کاهش پینگ چیست و چگونه پینگ را بررسی کنیم

خواندن و نوشتن در فایل به زبان C++

سفارش پروژه های برنامه نویسی

 

انجام پروژه های برنامه نویسی دانشجویی پذیرفته میشود
لینک کانال تلگرام : http://t.me/cproject

 

الگوریتم نویسی در برنامه نویسی (بخش دوم)

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

18 + هشت =