PDA

View Full Version : سوال: مشکل در اجرای حلقه for



mohammad-seifi
یک شنبه 11 اسفند 1387, 09:34 صبح
من کد زیر را برای اینکه به کاربر پیغام دهد اگه می خوای ادامه بدی حرف y و اگه می خوای ادامه ندی حرف n را وارد کن اما اگه کاربر هر حرف دیگه ای را وارد کرد دو باره همین پیغام ظاهر شود .

کد :
for(; ;)
{
System.out.printf("%s\n","Do You Want to Continue: n(No) y(yes):");
c = (char)System.in.read();
if(c=='n' || c=='N' || c=='y' || c=='Y' ) break;
}

اما وقتی کاربر حرفی غیر از n یا y را وارد میکند سه بار پیغام

Do You Want to Continue: n(No) y(yes)

ظاهر می شود در حالی که باید یه بار ظاهر شود.
من این مشکل را در c هم داشتم اما اونجا دوبار تکرار می شد.

unhandled_event
یک شنبه 11 اسفند 1387, 15:47 عصر
سلام


شاید مشکل شما اینه که در command prompt ویندوز ، که در جاوای تحت ویندوز System.in بصورت پیش فرض اون رو قرار داره ، با هر بار وارد کردن یک کاراکتر و زدن enter سه کاراکتر به کنسول فرستاده میشه که یکی کاراکتری که واقعا وارد شده و دوتای بعدی کاراکتر های CR/LF هستند که CR کاراکتر شماره 10 و LF کاراکتر شماره 13 یا همون enter هستند. کنسول به همین خاطر فکر میکنه که کاربر 2 کاراکتر دیگه هم وارد کرده و 2 دفعه لوپ رو رد میکنه پس پیغام هم 2 بار بیشتر ظاهر میشه. برای رفع این مشکل شما باید 2 کاراکتر رو خودتون رد کنید. System.in.read یک حالت خاص داره که آرایه ای از byte بعنوان ورودی میگیره و ورودی کاربر رو در اون آرایه قرار میده.

بنابراین کد رو به این صورت اصلاح کنید :




char c= 0;
byte[] b= new byte[3];
for(; ;)
{
System.out.printf("%s\n","Do You Want to Continue: n(No) y(yes):");
try {
System.in.read(b);
c=(char)b[0];
} catch (Exception e) {
e.printStackTrace();
}
if(c=='n' || c=='N' || c=='y' || c=='Y' ) break;

}

mohammad-seifi
دوشنبه 12 اسفند 1387, 09:11 صبح
سلام


شاید مشکل شما اینه که در command prompt ویندوز ، که در جاوای تحت ویندوز System.in بصورت پیش فرض اون رو قرار داره ، با هر بار وارد کردن یک کاراکتر و زدن enter سه کاراکتر به کنسول فرستاده میشه که یکی کاراکتری که واقعا وارد شده و دوتای بعدی کاراکتر های CR/LF هستند که CR کاراکتر شماره 10 و LF کاراکتر شماره 13 یا همون enter هستند. کنسول به همین خاطر فکر میکنه که کاربر 2 کاراکتر دیگه هم وارد کرده و 2 دفعه لوپ رو رد میکنه پس پیغام هم 2 بار بیشتر ظاهر میشه. برای رفع این مشکل شما باید 2 کاراکتر رو خودتون رد کنید. System.in.read یک حالت خاص داره که آرایه ای از byte بعنوان ورودی میگیره و ورودی کاربر رو در اون آرایه قرار میده.

بنابراین کد رو به این صورت اصلاح کنید :




char c= 0;
byte[] b= new byte[3];
for(; ;)
{
System.out.printf("%s\n","Do You Want to Continue: n(No) y(yes):");
try {
System.in.read(b);
c=(char)b[0];
} catch (Exception e) {
e.printStackTrace();
}
if(c=='n' || c=='N' || c=='y' || c=='Y' ) break;


}


خیلی ممنون اما من در ++c , c با استفاده از تابع gets(s) داده وارد میکردم به صورت رشته وبا تابع atoi(s) آن را به صحیح تبدیل می کردم که دوبار اجرا می شد از شی cin هم که استفاده می کردم باز هم دوبار تکرار می شد .
قبلا از لطف شما متشکرم

admis2010
شنبه 12 تیر 1389, 15:11 عصر
این مدل برنامه نویسی برای این کار خیلی بده
شما باید یه حلقه ی while بزنید که تا وقتی که کاربر گزینه ی مورد نظر شما را وارد نکرده اجرا شود و تمامی فعالیت های خود را درون آن بنویسید

admis2010
شنبه 12 تیر 1389, 15:13 عصر
برای گرفتن string در جاوا فکر کنم باید به این صورت باشه

BufferedReader in=new BufferedReader(new InputeStreamReader(System.in)) ;

String s = in.readLine() ;

billguess
دوشنبه 14 تیر 1389, 22:38 عصر
من کد زیر را برای اینکه به کاربر پیغام دهد اگه می خوای ادامه بدی حرف y و اگه می خوای ادامه ندی حرف n را وارد کن اما اگه کاربر هر حرف دیگه ای را وارد کرد دو باره همین پیغام ظاهر شود .

کد :
for(; ;)
{
System.out.printf("%s\n","Do You Want to Continue: n(No) y(yes):");
c = (char)System.in.read();
if(c=='n' || c=='N' || c=='y' || c=='Y' ) break;
}

اما وقتی کاربر حرفی غیر از n یا y را وارد میکند سه بار پیغام

Do You Want to Continue: n(No) y(yes)

ظاهر می شود در حالی که باید یه بار ظاهر شود.
من این مشکل را در c هم داشتم اما اونجا دوبار تکرار می شد.



ضمن عرض سلام به شما دوست عزیز
علی رغم اینکه فکر نکنم دیگه خودتون برای دیدن این تاپیک تشریف بیارید اما اگه کس دیگری دید و دنبال را حل بود باید عرض کنم که می شه این مشکل رو از راههای زیادی حل کرد ولی یکی از ساده ترینشون اینکه شرط خودتون رو به این شکل اصلاح کنید


if(c=='n' || c=='N' || c=='y' || c=='Y' )
break;
else
System.in.skip(3);

در ضمن این تکرار رو هم گردن مایکرو سافت ندازید اگر تو همون سی هم atoi(s)رو حذف می کردید ممکن بود باز هم سه بار تکرار بشه ممکن هم بود تکرار نشه در کل یکی از راههای حل عدم تکرار به فرض استفاده از همون بدنه اضافه کردن آن دو خط بود