ورود

View Full Version : مشکل این کد در چیست؟



erf4n
جمعه 08 تیر 1386, 01:36 صبح
با سلام !! احتیاج به کمک دوستان دارم می خواستم بدونم که اشکال برنامه پایینی چیه؟
void Erix_mm(float a,float b)
{
int x,y,k,m;
x=a;
y=b;
m=x/100;
k=m*100;
if(x<y)
{
while(k<(y-100))
{
k=100+k;
printf("\nyour next step must calculate with point: %

7f",k);
}
}

else if(x>y)
{
m=y/100;
k=m*100;
while(k<(x-100))
{
k=100+k;
printf("\nyour next step must calculate with point: %

7d",k);
}
}
هدف از این برنامه این هست که یک عدد مثلا 1895 تا 2389 رو بگیره و 100 تا 100 تا بهش اضافه کنه اما به صورت 1900و2000و2100و2200و2300 یعنی بازه محدود و جواب به صورت رند بدونه خرده ریزه!!کد هم به زبان سی هستش در خط اول یعنی تبدیل ها عمدا از نوع فلوت در اینتجر استفاده شده حالا نمی دونم چرا با وجود محاسبات که جواب درست در میاد در عمل خروجی هائی مثل
2354.061
2354.161
2354.261
2354.361
2354.462
2354.562
2354.662
2354.762
2354.862
2354.962
2355.062
2355.162
2355.262
2355.362
اگه ممکنه کمکم کنید!!

someCoder
جمعه 08 تیر 1386, 02:32 صبح
اگر منظورت رو درست فهمیده باشم، مشکلت درست ذخیره نشدن اعداد اعشاری هست.
ماهیت اعداد اعشاری همینه که دقیق نیستند. بذار برات یه مثال بزنم تا بهتر متوجه بشی.
فرض کن میخوای عدد (1/3) رو در مبنای 3 نمایش بدی. جواب این میشه: 0.1
حالا همین عدد رو در مبنای 10 نمایش میدیم، میشه: 0.3333333333333333333333
خوب، پس میبینی که هر عدد اعشاری رو نمیشه تو هر مبنایی درست نشون داد. حالا عددی که تو مبنای 10 میشه نمایش داد، الزاما در مبنای 2 همون جوری ذخیره نمیشه و ممکنه گرد بشه.
راه حل این مشکل هم اینه که از float استفاده نکنی! اگر هم میخوای اعشاری باشه، خودت یه نوع جدید برای اعشار درست کن که توش دو تا int داشته باشه، یکی برای قسمت صحیح و یکی برای اعشاری و از اون استفاده کن.

erf4n
یک شنبه 10 تیر 1386, 00:47 صبح
منظورم اینه که کد بالا رو نوشتم تا مثلا وقتی عدد 1890 تا 2356 داده میشه به صورت رند اعدادو با بازه 100تائی اضافه کنه و دیگه یکان و دهگان رو نشمره جواب اعداد مثال بالا باید بشه 1900-2000-2100-2200-2300 یعنی از 2300 بیشتر نشه و از 1900 کمتر نشه(این کد توی توپوگرافی لازم میشه)
اگه لازم هست بازم توضیح بدم

emad_67
یک شنبه 10 تیر 1386, 07:24 صبح
فکر میکنم مشکل از اون خط هایی هست که printf دارند من اون خط ها رو با cout نوشتم و درست جواب داد


#include<iostream.h>
void Erix_mm(float a,float b)
{
int x,y,k,m;
x=a;
y=b;
m=x/100;
k=m*100;
if(x<y)
{
while(k<(y-100))
{
k=100+k;
cout<<"your next step must calculate with point:"<<k<<endl;
}
}
else if(x>y)
{
m=y/100;
k=m*100;
while(k<(x-100))
{
k=100+k;
cout<<"nyour next step must calculate with point"<<k<<endl;
}
}
}
void main()
{
float a=1890;
float b=2356;
Erix_mm(a,b);
}

alireza643
یک شنبه 10 تیر 1386, 07:34 صبح
شما دوتا عدد داری یک Min و یک Max برای کاری که میخواهی بکنی من پیشنهاد میکنم که اول بخش یکان و دهگان رو از اعدادت پاک کنی برای این کار کافیه مقدار باقی مانده اعداد رو تو تقسیم به 100 به دست بیاری یعنی مثلا A = Min % 100 حالا عدد A رو از Min کم کن تا بخش بکان و دهگان حذف بشه. بعد تو یه حلقه به مقدار عدد اضافه کن این طوری هم کار میکنه هم نیازی نیست خودت دائم اعداد رو چک کنی.


Void Erix_mm(float A, float B)
{
int Temp;
int Min = A;
int Max = B;
Temp = Min % 100;
Min = Min - Temp;
Temp = Max % 100;
Max = Max - Temp;
for(int i = Min; i < Max; i += 100)
{
Min += 100;
}
}

البته تو این تابع شما باید از قبل Min,Max رو حساب کنید که کار راحتیه و بهتره تو یه تابع دیگه انجام بشه ولی این کد کاری که شما میخواهید روانجام میده. وقتی عملگر % هست استفاده از \ و ریختن جواب تو یه عدد صحیح برای حذف قسمت اعشاری کار مناسبی نیست.
امید وارم به دردتون بخوره. موفق باشید.