PDA

View Full Version : رفتار دور از انتظار يه برنامه



shahmohammadi
سه شنبه 20 اردیبهشت 1390, 01:33 صبح
برنامه زير به ازاي ورودي مثل
123 45
رفتار غير قابل انتظاري رو نشون مي ده.
وقتي حلقه رو برمي دارم اين اتفاق نمي افته.
#include <iostream.h>
#include <conio.h>

void main()
{
int a;
for(int i=0;i<10;i++)
{
cin>>a;
cout<<a<<'\n';
}
getch();
}
مي خواستم بدونم علتش چي مي تونه باشه.

Aras_rood
سه شنبه 20 اردیبهشت 1390, 01:54 صبح
من اجرا کردم برنامه رو مشکلی نداشت می شه بگید چه رفتار عجیبی نشون می ده که بتونیم کمکتون کنیم

shahmohammadi
سه شنبه 20 اردیبهشت 1390, 02:02 صبح
قسمت دوم ورودي رو كه مي ديم نبايد چاپ شه ولي چاپ مي شه.
مثلا در 123 45
فقط بايد 123 چاپ شه در حالي كه عبارت زير چاپ مي شه.123
45

shahmohammadi
سه شنبه 20 اردیبهشت 1390, 02:17 صبح
جالبه الان تو همون گام اول حلقه هر ده تا رو تو يه خط دادم برنامه بعدش همه رو چاپ كرد. يا برنامه زير شايد كمك كنه كه خوب متوجه بشيد:
#include <iostream.h>
#include <conio.h>
void main()
{
int a;
cin>>a;
cout<<a<<'\n';
cin>>a;
cout<<a;
getch();
}
حالا تو يه خط دو تا ورودي بدين و نتيجه رو ببينين.

shahmohammadi
سه شنبه 20 اردیبهشت 1390, 10:55 صبح
از اين برنامه من به اين نتيجه رسيدم كه وقتي براي cinي كه مي خواد به يه متغير مقدار بده دو تا مقدار بديم در فراخواني بعديش به جاي اين كه دوباره از ورودي بگيره اون مقدار دوم رو تو متغير قرار مي ده.
موفق باشيد.

tdkhakpur
سه شنبه 20 اردیبهشت 1390, 22:01 عصر
من به اين نتيجه رسيدم كه وقتي براي cinي كه مي خواد به يه متغير مقدار بده دو تا مقدار بديم در فراخواني بعديش به جاي اين كه دوباره از ورودي بگيره اون مقدار دوم رو تو متغير قرار مي ده.


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


#include <iostream.h>
#include <conio.h>
void main()
{
int a;
for( int i=0; i<2; i++)
{
cin>>a;
cout<<a;
cin.sync();
}
getch();
}

shahmohammadi
سه شنبه 20 اردیبهشت 1390, 22:54 عصر
دستور scanf هم اين رفتار رو داره. مي دونيد با كدوم تابع مي شه بافرشو پاك كرد.
ممنون.

tdkhakpur
چهارشنبه 21 اردیبهشت 1390, 02:43 صبح
دستور scanf هم اين رفتار رو داره. مي دونيد با كدوم تابع مي شه بافرشو پاك كرد


fflush(stdin);