PDA

View Full Version : سوال: مشکلی با حلقه ها



حسین فلاحی
شنبه 01 آبان 1389, 19:24 عصر
سلام این کد کجاش مشکل داره.

وقتی که حرفی وارد می کنم مثل a,b,... حلقه while پایان ناپذیر می شه و پایان پیدا نمی کنه.



#include <iostream>
using namespace std;

int main()
{
int arr[20];
int number;
for( int i =0 ; i < 20; i++)
{
entering: cout << "please put a number between 10 & 100 : ";
cin >> number;

while ( number < 10 || number > 100)
{
cout << "invalid number .. " <<endl;
cout<<"please put a number between 10 & 100: ";
cin >> number;
}

for(int j = 0 ; j < i ; j++)
{
if (number == arr[j] )
{
cout <<"Duplicated number .." <<endl;
goto entering ; // because should check the new number is a valid number...

}
}

// now the number is between 10 and 100 and also is not duplicate
arr[i] = number;
cout << "number added successfully" << endl;
}

Pouri_sb
شنبه 01 آبان 1389, 21:28 عصر
سلام این کد کجاش مشکل داره.

وقتی که حرفی وارد می کنم مثل a,b,... حلقه while پایان ناپذیر می شه و پایان پیدا نمی کنه.


فکر کنم اگه غیر این می شد جای سوال داشت، شما گفتین تا زمانیکه عددی بین 10 و 100 وارد نکرده از کاربر در خواست عدد کنه، وقتی شما یه حرف وارد می کنین کد اسکیشو که معادل یه عدده ذخیره میکنه

حسین فلاحی
یک شنبه 02 آبان 1389, 08:11 صبح
از نظر تئوری باید همین طور بشه که فرمودین. اگه حروفی که کد اسکی بین 10 و 100 دارن ذخیره بشن و بقیه رو خطا بده و عدد دیگه ای درخواست کنه.

اما در عمل این طور نیست. براش هیچ فرقی نمی کنه چه شما A وارد کنین چه z ،حلقه while رو بی نهایت تکرار می کنه و اجازه وارد کردن عدد رو بهتون نمی ده.
با تشکر از شما

پی نوشت: تشکر از مدیران عزیز بابت تغییر عنوان

Salar Ashgi
یک شنبه 02 آبان 1389, 14:29 عصر
مشکل سر نذاشتن آکولاد بسته بود ./


#include <iostream>
#include <conio>


int main()
{
int arr[20];
int number;
for( int i =0 ; i < 20; i++)
{
entering: cout << "please put a number between 10 & 100 : ";
cin >> number;

while ( number < 10 || number > 100)
{
cout << "invalid number .. " <<endl;
cout<<"please put a number between 10 & 100: ";
cin >> number;
}

for(int j = 0 ; j < i ; j++)
{
if (number == arr[j] )
{
cout <<"Duplicated number .." <<endl;
goto entering ; // because should check the new number is a valid number...

}
}

// now the number is between 10 and 100 and also is not duplicate
arr[i] = number;
cout << "number added successfully" << endl;
getch();
}
}


در ضمن ، ساختار goto خیلی وقته که منسوخ شده است و استفاده از آن در کدها بیشتر دلیلی بر ضعف
برنامه است ./

Mahmood_M
یک شنبه 02 آبان 1389, 15:16 عصر
نیازی به حلقه ی While نیست ، میتونید از continue استفاده کنید :
if (number > 100 || number < 10)
{
cout << "Invalid number ..." << endl;
continue;
}
continue باعث میشه که حلقه ی for اول دوباره اجرا بشه ، یعنی از روی کدهای بعد از continue می پره و حلقه برای بار بعدی اجرا میشه ...

حسین فلاحی
یک شنبه 02 آبان 1389, 16:22 عصر
تشکر
یک مشکلی پیش می آد که آرایه نباید خالی بمونه. که می شه یکی از i کم کرد قبل از continue.

تشکر مشکلم حل شد.
اما واقعا واقعا چرا اون اتفاق می افتاد؟! اینکه آقای ashgi گفتند به خاطر } هست ، نیست. اینجا فقط یک اشتباه تایپی بود.

چرا باید حلقه while در صورت ورود حرف بی نهایت تکرار بشه .

Salar Ashgi
سه شنبه 04 آبان 1389, 09:42 صبح
اما واقعا واقعا چرا اون اتفاق می افتاد؟! اینکه آقای ashgi گفتند به خاطر } هست ، نیست. اینجا فقط یک اشتباه تایپی بود.

خوب ، اون نظری هم که ما میدیم بر اساس این کد ارسال شده شما در تاپیک هست ؛


چرا باید حلقه while در صورت ورود حرف بی نهایت تکرار بشه .

اولا این ساختار وحشتناک goto باید از برنامه تون حذف بشه ؛
ثانیا شرط هایی که گذاشته اید ، ممکن است نادرست باشند ./

حسین فلاحی
سه شنبه 04 آبان 1389, 10:07 صبح
وقتی while تنها رو اجرا کردم باز هم همون اتفاق افتاد. بعدش while رو برداشتم و از یک if استفاده کردم با یک خروجی . باز هم مشکلی پیش اومد و برنامه بعد از اجرای اون بدون دلیل خارج می شد.

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

البته من هنوز فرصت نکردم که بیشتر روش آزمایش کنم. اینها رو خیلی سرسری متوجه شدم.

پی نوشت: جناب ashgi اینقدر سخت نگیرین! من کدها رو از قسمت اصلی جدا کردم و مشخصه که یک قسمت هست و ناقصه یعنی return و آکولاد بسته نیاز داره.

Pouri_sb
پنج شنبه 06 آبان 1389, 10:55 صبح
سلام کد شما رو بررسی کردیم(من و دوستام :دی) آخر سر به یه نتیجه جالب رسیدیم. کد زیر رو در نظر بگیرید:

#include "stdafx.h"
#include "iostream"
#include "conio.h"
using namespace std;

int main()
{
int num=0;
for(int i=0;i<5;i++)
{
cout<<"\n enter a number: \n";
cin>>num;
cout<<num;
}
getche();
return 0;
}
در این کد هم با وارد کردن کارکتر دستور cin کار نمی کند :دی

mohsensaghafi
پنج شنبه 13 آبان 1389, 02:11 صبح
سلام دوستان.
خسته نباشید.
موضوع داره جالب می شه. من اول گفتم شاید بخاطر استفاده از visual studio 2010 باشه که این مشکل پیش میاد. با visual studio 6 هم چک کردم همین مشکل بود. حتی turbo c رو هم چک کردم. تابع scanf هم همین شکلی کار می کرد.
واسه خودم هم جای سوال هست که چرا اینطوری شده؟!