اطلاعیه

Collapse
No announcement yet.

کمک در رابطه ببا علت کار نکردن عمل تقسیم در ک

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    کمک در رابطه ببا علت کار نکردن عمل تقسیم در ک

    سلام خدمت همه عزیزان

    یه مشکل کوچیک برام پیش اومده بود نتونستم حلش کنم گفتم از اساتید یه کمکی بگیرم ، و اونم این که توی این برنامه که قسمتی از یه برنامه اصلیه این عمل تقسیم کار نمیکنه! البته لازم به ذکره که احتال میدم به علت آشنائی کم بنده با زبان سی هستش و کامپایلر کدویژن ، از دوستان اگه کسی علت و نقص برنامه رو میدونه لطفا راهنمائیم کنه ممنون.

    برنامه به این شکله که توسط چند تا کلید یه مقدار عدید بین 0تا9999 تنظیم میشه (که تنظیات روی LCD هم نمایش داده میشه)بعد می خوام این مقدار رشته ای تنظیم شده رو به عدد صحیح تبدیل کنم (تا اینجاش برنامه مشکلی نداره) ولی بعدش می خوام که این عدید تنظیم شده رو روش یه تعداد عملیات ریاضی انجام بدم ولی متاسفانه عمل نمیکنه!
    و یه مشکلی هم که دارم اینه که آیا دستوری هستش که عدد رو گرد کنه منظورم اینه که بعد اعمال ریاضی اگه ممیز دار بود ممیز رو گرد کنه و حذف کنه


    #include <mega32.h>
    #include <delay.h>
    #asm
    .equ __lcd_port=0x1B ;PORTA
    #endasm
    #include <lcd.h>
    #include <stdlib.h>

    #define set PIND.0
    #define up PIND.1
    #define down PIND.2
    #define shift PIND.3



    unsigned char t=0x00,p=0x00;
    ///////////////////////////////////************************************///////////////////////////////////

    void set_counter()
    {
    unsigned char pointer=1;
    unsigned long int num=0;
    unsigned char str_num[]="00000";
    float s;




    /////////////////////////////////////این قسمت مربوط به تنظیم اعداد 0 تا 9999 هستش ////////////////////////////////////
    lcd_clear();
    lcd_gotoxy(1,0);
    lcd_putsf("Type Frequency"
    lcd_gotoxy(4,1);
    lcd_putsf("0000 KHz"

    lcd_gotoxy(4,1);
    _lcd_ready();
    _lcd_write_data(0x0f);




    while(set==0);
    while(1)
    {

    if(up==0)
    {
    if(str_num[pointer]!='9&#039 str_num[pointer]++;
    lcd_putchar(str_num[pointer]);
    lcd_gotoxy(pointer+3,1);
    while(up==0);
    }

    if(down==0)
    {
    if(str_num[pointer]!='0&#039 str_num[pointer]--;
    lcd_putchar(str_num[pointer]);
    lcd_gotoxy(pointer+3,1);
    while(down==0);
    }

    if(shift==0)
    {
    pointer++;
    if(pointer==5)pointer=1;
    lcd_gotoxy(pointer+3,1);
    while(shift==0);
    }

    if(set==0) goto exit;
    }


    /////////////////////////////////////پایان قسمت مربوط به تنظیم اعداد 0 تا 9999 هستش ////////////////////////////////////


    /////////////////////////////////////////مشکل من تو این قسمته///////////////////////////////


    الان اون عدد تنظیم شدهتو بالا تو str_num ذخیره شده توسط دستور num=atoi(str_num); تبدلش می کنم به عدد چون رشته هستش،الان می خوام روی اون T یه اعمال ریاضی انجام بدم ولی وقتی از تقسیم استفاده میکنم خروجی 0میشه!
    تو این t ایراد کار از کجاس؟نوع متغیر رو هم flot تعریف کردم چون ممکنه خوذجی اعشاری باشه ولی کلا خروجی 0میشه!!!
    و اگه این مشکل حل شد بعد اون یه دستور می خوام اضافه کنم که اگه خروجی اعشاری بود گردش کنه آیا همچین دستوری هست؟اگه نیست آیا روشی برای این کار هست؟

    exit:
    num=atoi(str_num);
    t=num;
    s=256-(((1/(1000*t))*0.5)/0.125)

    if(t>0)p=0x01;
    else p=0x00;


    while(set==0);

    _lcd_ready() ;
    _lcd_write_data(0x0c);


    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_putsf("&&&&&&&amp ;"

    s=1/2; -------------------------------->>>>>>>>>>این پارامتر رو همین جوری دادم که ببینم اصلا کار میکنه یا نه ولی خروجی این تقسیم رو 0میده؟؟!!! نوع پرامتر رو هم فلوت تعریف کردم ولی کار نمیکنه!
    ltoa(s,str_num);
    lcd_gotoxy(0,1);
    lcd_puts(str_num);
    lcd_gotoxy(5,1);
    lcd_putsf("&&&&&"
    }


    ممنون.

    #2
    پاسخ : کمک در رابطه ببا علت کار نکردن عمل تقسیم در ک

    با سلام
    دوست عزیز من زیاد نتونستم از کدتون سر در بیارم
    ببین اون متغیری که به عملیات ریاضی جواب نمیده مشکل از نوع متغیر نیست!
    برای این کار هم یه پروژه جدید باز کن و با تعریفی که برای این متغیر در نظر گرفتی فقط یه تقسیم ساده رو انجام بده و جواب رو توی یکی از پورت ها بخون ببین درست کار میکنه، اگه درست کار کرد که ایراد از برنامه است اگر هم کار نکرد باید نوع متغیر رو عوض کنی!!!
    این چیزی بود که به ذهنم رسید.
    ضمنا اگه اصل فایل رو بزاری شاید راحتتر بتونیم راهنمایی کنیم چون اینجوری یه کم شلخته است

    دیدگاه


      #3
      پاسخ : کمک در رابطه ببا علت کار نکردن عمل تقسیم در ک

      دوست عزیز یکم بهم ریختگیه برنامه به خاطر فارسی بودن اشتباه سایته که چپ راست برنامه رو بهم میریزه! ولی این کارم کردم به تابع از نوع فلوت تعریف کردم و یه تقسیم ساده 1/2 که جواب میشه 0.5 رو انجام دادم ولی خروجی رو صفر میده!!!!!!!!!!!!!!!!!!!!

      دیدگاه


        #4
        پاسخ : کمک در رابطه ببا علت کار نکردن عمل تقسیم در ک

        من مشکلمو حل کردم ،آ‌مدیریت تاپیک رو ببنده.

        دیدگاه


          #5
          پاسخ : کمک در رابطه ببا علت کار نکردن عمل تقسیم در ک

          نوشته اصلی توسط ATA_Elc
          من مشکلمو حل کردم ،آ‌مدیریت تاپیک رو ببنده.
          خسته نباشین. حداقل میگفتین چه جوری واسه آیندگان.
          اما برای خالی نبودن عریضه این توضیحاتو میدم:
          در زبان سی هنگام محاسبات ریاضی (مثل تقسیم) نتیجه عملیات از نوع متغیری انتخاب میشه که بالاترین دقت رو داره مثلا در عبارت a / b اگه a از نوع int و b از نوع float باشه نتیجه از نوع float میشه. اما در عملیات تقسیم عموما به این موضوع ساده دقت نمیکنن و فکر میکنن که برنامه کار نمیکنه یا تقسیم انجام نمیشه در حالیکه خودشون خواستن اینجوری بشه مثلا اگه a=3 , b=4 باشه نتیجه از نظر اکثر ما باید بشه 0.75 در حالیکه چون هر دو عدد int هستند نتیجه هم بصورت int در نظر گرفته میشه و در نتیجه نمیشه که عدد ممیز شناور 0.75 داخل اون ریخت و نتیجه 0 گزارش میشه.
          برای حل کردن این مشکل دو راه داریم :
          1- تبدیل یکی از دو متغیر بصورت موقت به float یا double با تغییر نوع (type cast)مثلا

          (float) a/b

          2- در مورد اعداد ثابت نشانه ممیز یا همون نقطه رو به عدد اضافه کنید مثلا برای تقسیم اعشاری 3/4 بنویسید 3.0/4 3/4.0 یا ....

          دیدگاه

          لطفا صبر کنید...
          X