نمایش نتایج 1 تا 5 از 5

نام تاپیک: مشکل این کد در چیست؟

  1. #1

    مشکل این کد در چیست؟

    با سلام !! احتیاج به کمک دوستان دارم می خواستم بدونم که اشکال برنامه پایینی چیه؟
    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
    اگه ممکنه کمکم کنید!!

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

  3. #3
    منظورم اینه که کد بالا رو نوشتم تا مثلا وقتی عدد 1890 تا 2356 داده میشه به صورت رند اعدادو با بازه 100تائی اضافه کنه و دیگه یکان و دهگان رو نشمره جواب اعداد مثال بالا باید بشه 1900-2000-2100-2200-2300 یعنی از 2300 بیشتر نشه و از 1900 کمتر نشه(این کد توی توپوگرافی لازم میشه)
    اگه لازم هست بازم توضیح بدم

  4. #4
    کاربر دائمی
    تاریخ عضویت
    اسفند 1385
    محل زندگی
    تهران
    پست
    1,486
    فکر میکنم مشکل از اون خط هایی هست که 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);
    }

  5. #5
    کاربر دائمی آواتار alireza643
    تاریخ عضویت
    شهریور 1384
    محل زندگی
    روی زمین
    پست
    368
    شما دوتا عدد داری یک 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 رو حساب کنید که کار راحتیه و بهتره تو یه تابع دیگه انجام بشه ولی این کد کاری که شما میخواهید روانجام میده. وقتی عملگر % هست استفاده از \ و ریختن جواب تو یه عدد صحیح برای حذف قسمت اعشاری کار مناسبی نیست.
    امید وارم به دردتون بخوره. موفق باشید.

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •