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

نام تاپیک: مشکل در برنامه ی محاسبه فاکتوریل

  1. #1

    Exclamation مشکل در برنامه ی محاسبه فاکتوریل

    سلام و خسته نباشید

    من یه برنامه برای محاسبه فاکتوریل اعداد یک رقمی نوشتم

    برای همه ی اعداد جواب میده فقط فاکتوریل 9 رو اشتباه جواب میده یعنی چون جواب فاکتوریل 9 میشه 362880 که یه عدد 6 رقمی هستش رو اشتباها یه عدد 5 رقمی می نویسه

    من کد برنامه رو می ذارم خواهش می کنم کمکم کنید و بهم بگید که چیکارش کنم. خیلی براش زحمت کشیدم اگه راه حلش رو می دونید تورو خدا ازم دریغ نکنید.

    با سپاس فراوان

    page 110,100
    title 'fact.asm'
    ;--------------------------------------
    stacksg segment stack 'stack'
    dw 32h dup(0)
    stacksg ends
    ;-----------------------------------------
    ; 2-define data segment
    ; ----------------------------------
    datasg segment 'data'
    fact dw ?
    string db 6 dup(' '),"$"
    datasg ends
    ;-----------------------------------------
    ; 3-define code segment
    ; ----------------------------------
    codesg segment 'code'
    assume ss:stacksg,ds:datasg,cs:codesg
    main proc far
    mov ax,datasg
    mov ds,ax
    ;----------------------------------------------
    mov ah,1h
    int 21h
    mov ah,0
    sub ax,30h
    mov fact,1
    mov bx,ax
    mov ax,1
    while: cmp fact,bx
    jnle end_while
    mul fact
    inc fact
    jmp while
    end_while:

    ;-------------------------------------
    lea bx,string
    add bx,5
    mov cx,10
    divloop: mov dx,0
    div cx
    add dl,30h
    mov [bx],dl
    dec bx
    cmp ax,0
    jne divloop
    lea dx,string
    mov ah,9h
    int 21h
    ;mov dx,fact
    ;mov ah,2h
    ;int 21h
    ;--------------------------------------
    mov ax,4c00h
    int 21h
    main endp
    codesg ends
    end main

  2. #2

    نقل قول: مشکل در برنامه ی محاسبه فاکتوریل (فوری)

    سلام
    متغیر fact رو یه متیر 16 بیتی یا دو بایتی در نظر گرفتید که همین باعث مشکل میشه، چون متغیر های دو بایتی میتونن حداکثر عدد 65535 رو داشته باشن. چون !9 بیشتر از 65535 هستش از این روش نمیتونید استفاده بکنید. میتونید از روش آرایه ای استفاده بکنید

  3. #3

    نقل قول: مشکل در برنامه ی محاسبه فاکتوریل (فوری)

    سلام

    خیلی ممنون از پاسخت

    ولی میشه یکم بیشتر توضیح بدی؟؟

    یعنی برای ساختن آرایه باید چیکار کنم؟ آخه ما تو اسمبلی آرایه رو هنوز نخوندیم ...

  4. #4

    نقل قول: مشکل در برنامه ی محاسبه فاکتوریل (فوری)

    روش ساخت آرایه:
    arrayName dw n dup(value)

    arrayName اسم آرایه است، dw نوع آرایه رو تعیین میکنه و میتونه سایر مواردی مثل db و ... باشه، n طول آرایه رو مشخص میکنه، dup کلمه کلیدیه، value هم مقدار پیش فرض درایه های آرایه است برای مثال 1، 2، ?، 'S'، '$' و ...

  5. #5

    نقل قول: مشکل در برنامه ی محاسبه فاکتوریل (فوری)

    ممنون از کدی که گذاشتین
    من این کد رو در جایی که متغیر fact رو تعریف کردم گذاشتم
    به این صورت
    fact dw 32h dup(0)


    که fact اسم آرایه هستش
    ولی بازم جواب نمیده ، البته نمی دونم کد رو درست نوشتم یا نه؟ و اینکه آیا در جای مناسبی نوشتم یا نه؟

  6. #6

    نقل قول: مشکل در برنامه ی محاسبه فاکتوریل (فوری)

    1.
    fact dw 32h dup(0)

    نمیدونم میشه طول آرایه رو بر حسب hex داد یا نه. تو یه برنامه دیگه امتحان کن ببین میشه یا نه؟ نتیجه رو به منم بگی ممنون میشم

    2. انتظار نداشته باش فقط با آرایه کردن از برنامت جواب بگیری! باید یه سری تغییرات توش ایجاد بکنی. یه توضیح کوچیک میدم بقیش با خودت. فرض کن میخوای 45 رو در 78 ضرب بکنی. عدد 78 رو به صورت آرایه فرض کن، یعنی 8 و 7. اول از همه اون عددی که میخوای ضرب بشه رو به تمام درایه ها ضرب کن، یعنی 8*45 و 7*45 که میشه 360 و 315. حالا شروع کن عمل 10 بر یک رو از درایه راست انجام بده که میشه 0 و 351. دوباره این کار رو انجام میدیم و نتیجه میشه 0 و 1 و 35 (به درایه ها 1 دونه اضافه میشه). باز دوباره 10 بر یک میکنی که میشه 0 و 1 و 5 و 3. اگه دقت کرده باشی تو مرحله آخر تعداد درایه میشه به تعداد رقم حاصل ضرب. اگر این درایه ها رو پیش هم بچینی میشه عددت که تو این مثالی که زدم میشه 3510 که همون نتیجه ضرب 45*78 هستش

  7. #7

    نقل قول: مشکل در برنامه ی محاسبه فاکتوریل (فوری)

    سلام

    ممنون از راهنمائیت

    من هر کاری می کنم درست نمیشه که نمیشه!

    میشه کمکم کنی و بگی که کجای برنامه ام رو باید تغییر بدم؟ دیگه کلافه شدم از بس تغییرش دادم و درست نشد.

    خواهش می کنم اگه امکانش هست کمکم کن...

  8. #8

    نقل قول: مشکل در برنامه ی محاسبه فاکتوریل (فوری)

    اینو باید تغییر بدی
    mov fact,1
    mov bx,ax
    mov ax,1
    while: cmp fact,bx
    jnle end_while
    mul fact
    inc fact
    jmp while
    end_while:

    بخش چاپ رو هم باید تغییر بدی. البته فعلاً اون تیکه ی بالا رو درست بکن بعد برو سراغ تیکه چاپ. این کد رو یه نگاهی بنداز:
    int fact[6]={0,0,0,0,0,1};
    for(int i=2;i<n;i++)
    {
    for(int j=0;j<6;j++)
    fact[j]*=i;
    for(int j=5;j>0;j--)
    {
    fact[j-1]+=fact/10;
    fact[j]%=10;
    }
    }
    for(int i=0;i<6;i++)
    cout<<fact[i];

    6 که طول آرایه است، تعداد ارقام عدد !n رو تعیین میکنه

  9. #9

    نقل قول: مشکل در برنامه ی محاسبه فاکتوریل

    من کد برنامه رو می ذارم خواهش می کنم کمکم کنید و بهم بگید که چیکارش کنم. خیلی براش زحمت کشیدم اگه راه حلش رو می دونید تورو خدا ازم دریغ نکنید.
    راستش این روزا حالی نیست... اما پستت رو خوندم بعد دیدم قسم دادی نشد بی تفاوت رد شم،انشاالله دیگه سر چیزای کوچیک قسم ندی کسی رو

    من یه برنامه برای محاسبه فاکتوریل اعداد یک رقمی نوشتم

    برای همه ی اعداد جواب میده فقط فاکتوریل 9 رو اشتباه جواب میده یعنی چون جواب فاکتوریل 9 میشه 362880 که یه عدد 6 رقمی هستش رو اشتباها یه عدد 5 رقمی می نویسه
    آرایه یه این صورت که برای هر کاراکتر یک بایت و حافظه زیادی هدر میشه و روش خوبی نیست
    برای شما چون فقط یک رقمی میخواین حساب کنید یک دابل ورد کافیه
    برنامه شما قسمت محاسبه فاکتوریل نتیجش درسته اما در نمایش دادنش اشتباه میکنید
    وقتی ضرب میکنید حاصل ضرب دو عدد 16 بیتی 32 بیتی میشه که در dx:ax ریخته میشه
    حالا شما در محاسبه فاکتوریل dx = 0
    بعد برای نمایش یک شرط بزار اگر dx != 0 یعنی عدد 32 بیتی شده (dx:ax) پس با تقسیم بر 10 عدد هارو جدا کنید و نمایش بدین
    در غیر اینصورت فقط ax رو تبدیل و نمایش بدین
    موفق باشی
    سلام، دوستان من خیلی وقت است در سایت برنامه نویس فعالیت ندارم پس لطف کنید پیام خصوصی ندین، در صورتی که با اینجانب کاری داشتین از طریق ایمیل xman_1365_x@yahoo.com می تونید با من مکاتبه کنید. موفق باشید.

  10. #10

    نقل قول: مشکل در برنامه ی محاسبه فاکتوریل

    تا الان بیدار بودم گفتم براتون بنویسم، از این کد استفاده کنید.

    define value:
    x dd 362880
    code:
    push -1

    mov dx,x+2
    mov ax,x
    again:
    mov bx,10
    div bx
    push dx
    xor dx,dx
    cmp ax,0
    jne again

    display:
    pop dx
    cmp dx,-1
    je endshow
    add dx,30h
    je endsho
    mov ah,2
    int 21h
    jmp display

    endshow:

    موفق باشی
    سلام، دوستان من خیلی وقت است در سایت برنامه نویس فعالیت ندارم پس لطف کنید پیام خصوصی ندین، در صورتی که با اینجانب کاری داشتین از طریق ایمیل xman_1365_x@yahoo.com می تونید با من مکاتبه کنید. موفق باشید.

  11. #11

    نقل قول: مشکل در برنامه ی محاسبه فاکتوریل

    سلام

    دوستان ممنون ، مشکلم کل شد....

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

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