حلقه های For و While!

Mili+

New Member
با سلام و وقت بخیر :rose:

هفته پیش استاد یه مبحثی رُ توضیح داد و یه مسئله مطرح کرد که من چون نبودم رسما متوجه موضوع نمیشم!

سوال این بود:

برنامه ای بنویسید که 100 عدد از ورودی بگیرد و اگر عدد وارد شده عدد اول بود ، آنها را با هم جمع کند!

اینکه برنامه تو هر عدد نیاز داره تا نصف اون عدد رُ چک کنه تا ببینه عدد اول هست یا نه درسته؟
بعد اگه بخوام حلقشو ایجاد کنم کدش برام چون کامل توضیح نداده روشن نیست!

میشه لطفا یه توضیحی در این مورد بدید؟!



ممنون :rose:
 

the_king

مدیرکل انجمن
با سلام و وقت بخیر :rose:

هفته پیش استاد یه مبحثی رُ توضیح داد و یه مسئله مطرح کرد که من چون نبودم رسما متوجه موضوع نمیشم!

سوال این بود:

برنامه ای بنویسید که 100 عدد از ورودی بگیرد و اگر عدد وارد شده عدد اول بود ، آنها را با هم جمع کند!

اینکه برنامه تو هر عدد نیاز داره تا نصف اون عدد رُ چک کنه تا ببینه عدد اول هست یا نه درسته؟
بعد اگه بخوام حلقشو ایجاد کنم کدش برام چون کامل توضیح نداده روشن نیست!

میشه لطفا یه توضیحی در این مورد بدید؟!



ممنون :rose:

ابتدا کد رو برای یک عدد بنویسید، بعدا میشه اون رو داخل یک حلقه 100 بار تکرار کرد تا برای 100 عدد عمل کنه.
اگر عدد مورد نظر n باشه، بخشپذیری n را بر اعداد 2 الی n / 2 بررسی می کنیم. عدد اول ئه، اگر بر هیچکدوم بخشپذیر نباشه.
حتی یک نمونه بخشپذیری هم برای اثبات اینکه اول نیست کفایت می کنه. نشانه بخشپذیری معمولا عملگر % ئه که باقیمانده تقسیم صحیح (بدون اعشار) خواهد بود.
هر عددی وقتی بر عدد دیگری بخشپذیر ئه که باقیمانده تقسیم اش صفر باشه.

هر بخش از مساله رو جداگانه کد نویسی می کنیم. یک عدد n داریم که از ورودی دریافت میشه :
کد:
    int n;
    cin >> n;
که باید بخشپذیری اش بر اعداد 2 الی n / 2 بررسی بشه، به => توجه کنید، از > استفاده نشد، چون خود n / 2 هم باید در بررسی شرکت کنه :
کد:
    for (int i = 2; i <= n / 2; i++)
اگر بخشپذیر بود (باقیمانده تقسیم صفر بود) عدد n را به صفر تبدیل می کنیم :
کد:
        if ((n % i) == 0)
            n = 0;
این حلقه ادامه می یابد، تا زمانی که یا از n / 2 هم بگذرد (که ثابت میشه عدد اول است)، یا بر عددی بخشپذیر باشد (که اول نیست و آنرا صفر می کنیم)
پس از پایان حلقه عدد n یا اول است یا صفر است.
کد:
    int n;
    cin >> n;
    for (int i = 2; i <= n / 2; i++)
        if ((n % i) == 0)
            n = 0;

یک متغیر sum برای جمع کردن اعداد اول اضافه می کنیم :
کد:
[COLOR="#A9A9A9"]    int n[/COLOR], sum = 0;
[COLOR="#A9A9A9"]    cin >> n;
    for (int i = 2; i <= n / 2; i++)
        if ((n % i) == 0)
            n = 0;
[/COLOR]    sum += n;

و یک حلقه برای تکرار روتین برای 100 عدد :
کد:
[COLOR="#A9A9A9"]    int n, sum = 0;[/COLOR]
    for (int j = 0; j < 100; j++)
    {
[COLOR="#A9A9A9"]        cin >> n;
        for (int i = 2; i <= n / 2; i++)
            if ((n % i) == 0)
                n = 0;
        sum += n;        
[/COLOR]    }    
    cout << sum;
 

Mili+

New Member
اگر عدد مورد نظر n باشه، بخشپذیری n را بر اعداد 2 الی n / 2 بررسی می کنیم. عدد اول ئه، اگر بر هیچکدوم بخشپذیر نباشه.
حتی یک نمونه بخشپذیری هم برای اثبات اینکه اول نیست کفایت می کنه. نشانه بخشپذیری معمولا عملگر % ئه که باقیمانده تقسیم صحیح (بدون اعشار) خواهد بود.
متوجه نشدم این قسمتُ کامل!!!
اگه عدد n باشه، بخشپذیریش به 2 و چی بررسی میشه؟؟
اول از همه به عدد 2 تقسیم میشه که ببینیم عدد صحیح بدست میاد یا خیر!!
بعد به چی تقسیم میشه؟ n/2 همون عدد وارد شده تقسیم بر 2 نیست؟؟
میخوام عددُ تا نصف خودش تقسیم کنیم!!!!


این حلقه ادامه می یابد، تا زمانی که یا از n / 2 هم بگذرد (که ثابت میشه عدد اول است)، یا بر عددی بخشپذیر باشد (که اول نیست و آنرا صفر می کنیم)
پس از پایان حلقه عدد n یا اول است یا صفر است.
این قسمت رُ هم متوجه نشدم
البته پس از پایان حلقه رُ متوجه شدم، ولی قسمت اولشو نه!!


و یک حلقه برای تکرار روتین برای 100 عدد :
بعد از این مرحله آخر نباید j که به حلقه تکرار دادیم تو
int n, sum = 0;

اضافه شه؟؟؟؟
 

Mili+

New Member
و یه درخواست دیگه

این مکان نما تا چند لحظه پیش خوب بود، الان هم پر رنگ تر شده و هم وقتی Enter میزدم نوشته هامو یه خط میاورد پایین تو برنامه اما الان نوشته ها رُ جا بجا نمیکنه!!!
فقط به سمت پایین میاد بدون هیچ خاصیتی (جایی کُد اشتباه بنویسم اگه بخوام اضافه کنم نمیشه، باید کُدمو تو تکست ویندوز ادیت کنم بیارم تو borland )




139880834248441.jpg
 

the_king

مدیرکل انجمن
متوجه نشدم این قسمتُ کامل!!!
اگه عدد n باشه، بخشپذیریش به 2 و چی بررسی میشه؟؟
بخشپذیری به 2 الی n / 2 بررسی میشه، یعنی بخشپذیری اش به 2 و 3 و 4 و 5 و ... و n / 2 بررسی میشه. بزرگترین عددی که بخشپذیری بهش بررسی میشه n / 2 است،
یعنی عدد تقسیم بر 2
فرضا عدد 101 را در نظر بگیرید، n / 2 اش می شود 50 (خرده اعشاری اش نادیده گرفته می شود). 101 اول است، اگر به هیچکدام از اعداد 2 و 3 و 4 و 5 و ... و 48 و 49 و 50 بخشپذیر نباشد.

اول از همه به عدد 2 تقسیم میشه که ببینیم عدد صحیح بدست میاد یا خیر!!
بعد به چی تقسیم میشه؟ n/2 همون عدد وارد شده تقسیم بر 2 نیست؟؟
بله، n / 2 همون عدد وارد شده تقسیم بر 2 است، بدون در نظر گرفتن اعشار حاصل از تقسیم.


این قسمت رُ هم متوجه نشدم
البته پس از پایان حلقه رُ متوجه شدم، ولی قسمت اولشو نه!!
شرط این حلقه را ببینید :
کد:
for (int i = 2; i <= n / 2; i++)
شرط این حلقه i <= n / 2 است. مادامی که i از n / 2 کوچکتر یا مساوی باشد حلقه ادامه پیدا می کند و مقدار i هم در هر مرحله افزایش می یابد.
یعنی تا زمانی ادامه پیدا می کند که i که از 2 شروع شده و هر بار یک واحد افزایش می یابد (++i) از n / 2 بزرگتر نشده باشد.
به محض اینکه i از n / 2 بزرگتر شد، شرط اجرای حلقه نقض می شود و از حلقه خارج می گردد.
حالا چه زمانی i از n / 2 بزرگتر می شود، در دو حالت :
حالت اول این است که i که از عدد 2 شروع می کند مدام افزایش یابد و به n / 2 برسد و n بر آن هم بخشپذیر نباشد و بخواهد برای عدد بعدی 1 + n / 2 اقدام کند.
حالت دوم این است که n در یک مرحله از اجرای حلقه بر i (که حالا یک عددی بین 2 الی n / 2 است) پخشپذیر باشد، در اینصورت شرط زیر برقرار است :
کد:
if ((n % i) == 0)
چون باقیمانده تقسیم صفر می شود و برقراری شرط در ادامه n را صفر می کند :
کد:
            n = 0;
صفر شدن n به پایان یافتن حلقه منجر می شود، چرا؟ چون وقتی n صفر باشد، n / 2 هم می شود صفر. مقدار i از 2 شروع شده و هر چقدر هم که کوچک باشد، از 2 کوچکتر نیست،
پس شرط حلقه که i <= n / 2 بود برقرار نیست.
این حلقه ادامه می یابد، تا زمانی که یا از n / 2 هم بگذرد (که ثابت میشه عدد اول است)، یا بر عددی بخشپذیر باشد (که اول نیست و آنرا صفر می کنیم)

بعد از این مرحله آخر نباید j که به حلقه تکرار دادیم تو
int n, sum = 0;
اضافه شه؟؟؟؟
بستگی داره که کجا تعریف بشه، متغیر j باید حتما قبل از استفاده تعریف بشه و فقط یکبار تعریف بشه و این تعریف شدن j جایی صورت می گیره که قبلش int بیاد.
اون j باید به اون سطر int که شما اشاره کردید اضافه بشه اگر داخل حلقه int j = 0 نوشته نشه، بجاش نوشته بشه j = 0 که تعریف نوع متغیر همراهش نیست.
اگر داخل حلقه for یا جای دیگری درست قبل از اولین استفاده از j نوع متغیر int نوشته بشه، تعریف متغیر صورت گرفته و نباید جای دیگری برایش تعریف نوشته بشه.
چون من داخل حلقه for متغیر j را تعریف کرده بودم، دیگر در اون سطر جایی برای تعریف j نبود. اگر بخواهید در اون سطر کنار n و sum متغیر j را تعریف کنید، می توانید،
به شرطی که در حلقه for عبارت int j = 0 را به j = 0 تغییر دهید.

و یه درخواست دیگه

این مکان نما تا چند لحظه پیش خوب بود، الان هم پر رنگ تر شده و هم وقتی Enter میزدم نوشته هامو یه خط میاورد پایین تو برنامه اما الان نوشته ها رُ جا بجا نمیکنه!!!
فقط به سمت پایین میاد بدون هیچ خاصیتی (جایی کُد اشتباه بنویسم اگه بخوام اضافه کنم نمیشه، باید کُدمو تو تکست ویندوز ادیت کنم بیارم تو borland )


مشاهده پیوست 104021

ویرایشگر در محیط متنی دو وضعیت کلی و رایج داره، Insert و Overwrite که در اغلب ویرایشگر های متنی هست، حتی ویرایشگر های خیلی قدیمی.
پیشفرض وضعیت Insert است که شما و بقیه بهش عادت دارند و کاراکتر به متن قبلی اضافه می شه و متن قبلی رو پاک نمی کنه.
وضعیت Overwrite حالتی داره که کاراکتر روی متن قبلی قرار می گیره و متن قبلی عملا پاک میشه. کلید تغییر وضعیت اش معمولا Ins / Insert ئه.
دست تون روی کلید Insert یا Ins صفحه کلید خورده و وضعیت ویرایشگر رو از Insert به Overwrite تغییر داده اید. مجددا اون کلید را فشار دهید.
 

Mili+

New Member
بخشپذیری به 2 الی n / 2 بررسی میشه، یعنی بخشپذیری اش به 2 و 3 و 4 و 5 و ... و n / 2 بررسی میشه. بزرگترین عددی که بخشپذیری بهش بررسی میشه n / 2 است،
یعنی عدد تقسیم بر 2
فرضا عدد 101 را در نظر بگیرید، n / 2 اش می شود 50 (خرده اعشاری اش نادیده گرفته می شود). 101 اول است، اگر به هیچکدام از اعداد 2 و 3 و 4 و 5 و ... و 48 و 49 و 50 بخشپذیر نباشد.

بله، n / 2 همون عدد وارد شده تقسیم بر 2 است، بدون در نظر گرفتن اعشار حاصل از تقسیم.

متوجه شدم کاملا
ممنون :rose:





شرط این حلقه را ببینید :
کد:
for (int i = 2; i <= n / 2; i++)
شرط این حلقه i <= n / 2 است. مادامی که i از n / 2 کوچکتر یا مساوی باشد حلقه ادامه پیدا می کند و مقدار i هم در هر مرحله افزایش می یابد.
یعنی تا زمانی ادامه پیدا می کند که i که از 2 شروع شده و هر بار یک واحد افزایش می یابد (++i) از n / 2 بزرگتر نشده باشد.
به محض اینکه i از n / 2 بزرگتر شد، شرط اجرای حلقه نقض می شود و از حلقه خارج می گردد.
حالا چه زمانی i از n / 2 بزرگتر می شود، در دو حالت :
حالت اول این است که i که از عدد 2 شروع می کند مدام افزایش یابد و به n / 2 برسد و n بر آن هم بخشپذیر نباشد و بخواهد برای عدد بعدی 1 + n / 2 اقدام کند.
حالت دوم این است که n در یک مرحله از اجرای حلقه بر i (که حالا یک عددی بین 2 الی n / 2 است) پخشپذیر باشد، در اینصورت شرط زیر برقرار است :
کد:
if ((n % i) == 0)
چون باقیمانده تقسیم صفر می شود و برقراری شرط در ادامه n را صفر می کند :
کد:
            n = 0;
صفر شدن n به پایان یافتن حلقه منجر می شود، چرا؟ چون وقتی n صفر باشد، n / 2 هم می شود صفر. مقدار i از 2 شروع شده و هر چقدر هم که کوچک باشد، از 2 کوچکتر نیست،
پس شرط حلقه که i <= n / 2 بود برقرار نیست.

یخورده گیج کننده بود برام، اما با توصیحاتتون تقریبا متوجه شدم
ممنون از توصیحات کاملتون
:rose::rose:


بستگی داره که کجا تعریف بشه، متغیر j باید حتما قبل از استفاده تعریف بشه و فقط یکبار تعریف بشه و این تعریف شدن j جایی صورت می گیره که قبلش int بیاد.
اون j باید به اون سطر int که شما اشاره کردید اضافه بشه اگر داخل حلقه int j = 0 نوشته نشه، بجاش نوشته بشه j = 0 که تعریف نوع متغیر همراهش نیست.
اگر داخل حلقه for یا جای دیگری درست قبل از اولین استفاده از j نوع متغیر int نوشته بشه، تعریف متغیر صورت گرفته و نباید جای دیگری برایش تعریف نوشته بشه.
چون من داخل حلقه for متغیر j را تعریف کرده بودم، دیگر در اون سطر جایی برای تعریف j نبود. اگر بخواهید در اون سطر کنار n و sum متغیر j را تعریف کنید، می توانید،
به شرطی که در حلقه for عبارت int j = 0 را به j = 0 تغییر دهید.

در اینصورتی که شما میگید i هم تو حلقه for بوده و تو int تعریف شده!
پس اونم باید به صورت i = 2 نوشته بشه و int اولش برداشته شه تو حلقه for
درسته؟




ویرایشگر در محیط متنی دو وضعیت کلی و رایج داره، Insert و Overwrite که در اغلب ویرایشگر های متنی هست، حتی ویرایشگر های خیلی قدیمی.
پیشفرض وضعیت Insert است که شما و بقیه بهش عادت دارند و کاراکتر به متن قبلی اضافه می شه و متن قبلی رو پاک نمی کنه.
وضعیت Overwrite حالتی داره که کاراکتر روی متن قبلی قرار می گیره و متن قبلی عملا پاک میشه. کلید تغییر وضعیت اش معمولا Ins / Insert ئه.
دست تون روی کلید Insert یا Ins صفحه کلید خورده و وضعیت ویرایشگر رو از Insert به Overwrite تغییر داده اید. مجددا اون کلید را فشار دهید.


ممنون از راهنماییتون :rose:
 

جدیدترین ارسال ها

بالا