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

نام تاپیک: کمک در نوشتن عبارت محاسباتی

  1. #1

    کمک در نوشتن عبارت محاسباتی

    سلام
    میخواستم ببینم چه طور میتونم برنامه ی یک عبارت محاسباتی رو به زبان C (نه C++‎) بنویسم
    فکر میکنم باید از پشته استفاده کنم اما نمیدونم چه طوری
    مثلن این:

    1+2.5*3=8.5

  2. #2

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

    اگه منظورت اینه که پشته رو فقط با کلاس بلدی بنویسی ، باید بگم که تو سی میتونی پشته رو با استراکت تعریف کنی:

    struct stack
    {
    const int maxsize;
    int saray[maxsize];
    int top=-1;
    }

    void push(struct*s , int data)
    {
    if( s->top < s->maxsize )
    {
    s->top ++;
    s-> saray[top]=data;
    }

    int pop(struct*s )
    {
    if(s>=0)
    return (s->saray[--top] );
    return -1;
    }

  3. #3

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

    مراجعه کنید به بحث کار با عبارات میانوندی ، پیشوندی و پسوندی در کتاب ساختمان داده ها توسط پشته.

    شما برای این کار ابتدا باید عبارت infix مورد نظر رو به postfix تبدیل کنید و بعد postfix رو با ارزیابی به infix

    تبدیل می کنید تا نتیجه ، محاسبه شود .

    موفق باشید .






  4. #4
    کاربر تازه وارد
    تاریخ عضویت
    تیر 1387
    محل زندگی
    اصفهان
    سن
    36
    پست
    37

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

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

  5. #5

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

    براي اين كار اگر پرانتز باز ديديم در آرايه جواب يك خانه رد كرده و انديس آن خانه را در استك ، push مي‌كنيم اگر عملوند ديديم آن را در رشته جواب مي نويسيم اگر عملگر ديديم آخرين انديس كه در استك، push نموده بوديم را از استك pop كرده و در آن انديس در رشته جواب عمگرمان را مينويسيم اگر پرانتز بسته نيز ديديم از آن ميگذريم.
    البته براي اين كار يك الگوريتم بهتر نيز هست كه اگر خواستيد براتون مي‌ذارم. در ضمن اگر در نوشتن كدش به مشكلي برخورد كرديد بگيد تا كدشم براتون بذارم.

  6. #6
    کاربر تازه وارد
    تاریخ عضویت
    تیر 1387
    محل زندگی
    اصفهان
    سن
    36
    پست
    37

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

    نقل قول نوشته شده توسط victoria مشاهده تاپیک
    براي اين كار اگر پرانتز باز ديديم در آرايه جواب يك خانه رد كرده و انديس آن خانه را در استك ، push مي‌كنيم اگر عملوند ديديم آن را در رشته جواب مي نويسيم اگر عملگر ديديم آخرين انديس كه در استك، push نموده بوديم را از استك pop كرده و در آن انديس در رشته جواب عمگرمان را مينويسيم اگر پرانتز بسته نيز ديديم از آن ميگذريم.
    البته براي اين كار يك الگوريتم بهتر نيز هست كه اگر خواستيد براتون مي‌ذارم. در ضمن اگر در نوشتن كدش به مشكلي برخورد كرديد بگيد تا كدشم براتون بذارم.
    ممنون ، گفتید در صورتی که به عملگر رسیدم ، از استک اندیس را برداشته و در آرایه جواب در اندیسی که از استک برداشتیم قرارش میدیم. خوب در صورتی که از پرانتز استفاده نکردیم .
    چه جوری عمل کنیم در زیر با استفاده از برنامه ای که یکی از دوستان گذاشتم چند عدد بدون پرانتز را تست کردم . ولی نتیجه ای نگرفتم
     1+2*9*9+2-2==>  ++1*2*99-22  
    6+3*2==>+6*32
    9+2+3 ==> +9+23

  7. #7

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

    براي محاسبه اين عبارات بايد قبل از شروع به كار عبارتتان را پرانتزگذاي كنيد.و بعد الگوريتم را پياده سازي كنيد.

  8. #8

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

    با سلام من برنامه ا ی را که یک رشته ی محاسباتی بگیره و آن را محاسبه کند را نوشتم ولی اجرا نمی شه (عملگر توان و جذر هم نذاشتم ) لطفا کمک کنید
    برنامه:
    #include<stdio.h>
    #include<conio.h>
    #define m 21
    struct stack{
    int mytop;
    float items[m];
    }
    void push(stack *s,char);
    void pop(stack *s,char *);
    void push(stack *s,float);
    void pop(stack *s,float *);
    int empty(stack *s);
    void popAndtest(stack *s,char *x,int *underflow);
    void topAndtest(stack *s,char *x,int *underflow);
    int isOperand(char);
    void convert(char[],char[]);
    int pred(char,char);
    int isDigit(char);
    float evaluate(char []);
    float operate(char,float,float);
    int main()
    {
    char infix[m],postfix[m];
    int i;
    clrscr();
    printf(
    "enter an infix expression:");
    gets(infix);
    convert(infix,postfix);
    printf(
    "Evaluation of expression is:%.2f",evaluate(postfix));
    printf(
    "postfix expression is:");
    for(i=0;postfix[i];i++)
    printf(
    "%c",postfix[i]);
    getch();
    return 0;
    }
    //*****************************
    void convert(char infix[],char postfix[])
    {
    char symbol,topsymbol;
    int underflow,i,j=0;
    stack s;
    s.mytop=-1;
    for(i=0;infix[i],i++)
    {
    symbol = infix[i];
    if(isOperand(symbol))
    postfix[j++] = symbol;
    elseif(symbol == '(')
    push(&s,symbol);
    elseif(symbol == ')')
    {
    pop(&s,&topsymbol);
    while(topsymbol != '(')
    {
    postfix[j++] = topsymbol;
    pop(&s,&topsymbol);
    }
    //end of while
    }//end of else if
    else
    {
    topAndtest(&s, &topsymbol, &underflow);
    //if op1 >op2 then true
    if(empty(&s)||(!pred(topsymbol,symbol)))
    push(&s,symbol);
    else
    {
    popAndtest(&s,&topsymbol,&underflow);
    while(pred(topsymbol,symbol) && !underflow)
    {
    postfix[j++] == topsymbol;
    popAndtest(&s,&topsymbol,&underflow);
    }
    push(&s,symbol);
    }
    //end of else
    }//end of else
    }//end of for
    while(!empty(&s))_
    {
    pop(&s,&topsymbol);
    postfix[j++]==topsymbol;
    }
    postfix[j] =
    '\o';
    }
    //************************************
    int isOperand(char symbol)
    {
    if(symbol >='0' && symbol <= '9')
    return 1;
    return 0;
    }
    //************************************
    void push(stack *s,char x)
    {
    s -> items[++(s -> mytop)]=x;
    }
    //************************************
    void pop(stack *s,char *x)
    {
    *x=s ->items[(s -> mytop)--];
    }
    //************************************
    void popAndtest(stack *s,char *x,int *underflow)
    {
    if(empty(s))
    *underflow=1;
    else
    {
    *x= s -> items[(s -> mytop)--];
    *underflow=0;
    }
    }
    //*************************************
    void topAndtest(stack *s,char *x,int *underflow)
    {
    if(empty(S))
    *underflow=1;
    else
    {
    *x=s -> items[s ->mytop];
    *underflow=0;
    }
    }
    //**************************************
    int empty(stack *s)
    {
    if(s -> mytop == -1)
    return 1;
    else
    return 0;
    }
    //**************************************
    int pred(char op1,char op2)
    {
    int i,p1,p2;
    /* ( + - * / % */
    staticchar op[] = {'(','+','-','*','/','%','\0'};
    staticint isp[] = {0,12,12,13,13,13};
    for(i=0;op[i];i++)
    if(op[i]==op1)
    {
    p1=i;
    break;
    }
    for(i=0;op[i];i++)
    if(op[i]==op2)
    {
    p=i;
    break;
    }
    if(isp[p1]> = isp[p2])
    return 1;
    return 0;
    }
    //********************************
    float evaluate(char postfix[])
    {
    float value,operand1,operand2;
    char symbol;
    stack s;
    s.mytop = -1;
    int i;
    for(i=0;postfix[i];i++)
    {
    symbol=postfix[i];
    if(isdigit(symbol))
    push(&s,(
    float)(symbol - '0'));
    else
    {
    pop(&s,&operand2);
    pop(&s,&operand1);
    value=operate(symbol,operand1,operand2);
    push(&s,value);
    }
    //end of else
    }//end of for
    pop(&s,&value);
    return value;
    }
    //***********************************
    int isdigit(char symbol)
    {
    return (symbol >= '0' && symbol <= '9');
    }
    //***********************************
    float operate(char symbol, float operand1,float operand2)
    {
    switch(symbol)
    {
    case'+':
    return operand1 + operand2;
    case'-':
    return operand1 - operand2;
    case'*':
    return operand1 * operand2;
    case'/':
    return operand1 / operand2;
    case'%':
    return operand1 % operand2;
    }
    }
    //*************************************
    void push(stack *s,float x)
    {
    s -> items[++(s -> mytop)]=x;
    }
    //*************************************
    void pop(stack *s,float *x)
    {
    *x= s -> items[(s -> mytop)--];
    }








    

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

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