| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1084 人关注过本帖
标题:练习题6
只看楼主 加入收藏
ansic
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:恍惚窈冥
等 级:城市猎人
帖 子:1543
专家分:5367
注 册:2011-2-15
收藏
得分:5 
学习!!!

善人者,不善人之师;不善人者,善人之资。不贵其师,不爱其资,虽智大迷。
2011-07-03 11:21
枯叶蝴蝶
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:48
专家分:133
注 册:2011-6-17
收藏
得分:5 
来看看
2011-07-03 13:03
weiwei555
Rank: 5Rank: 5
来 自:中国
等 级:职业侠客
帖 子:179
专家分:323
注 册:2011-3-4
收藏
得分:5 
我也试试看……
程序代码:
#include <stdio.h>
main()
{
    static float sum;
    float x;
    char k;
    scanf("%f",&sum);
    while(520)
      {
            scanf("%c",&k);
            if(k=='\n') break;
            scanf("%f",&x);
            switch(k)
               {
                   case '+': sum+=x;break;
                   case '-': sum-=x;break;
                   case '*': sum*=x;break;
                   case '/': sum/=x;break;
                }
       }
    printf("%.6f\n",sum);
}

2011-07-03 13:08
zanzan1986
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:140
注 册:2011-2-22
收藏
得分:15 
#ifndef TREE_H
#define TREE_H
#include "str.h"

typedef struct inBinaryTree *pBinaryTree;
typedef struct inBinaryTree                  //二叉树的数据
{
    char *ch;
    struct inBinaryTree *L,*R;
}BinaryTree;

pBinaryTree MakeTree(char *a,pBinaryTree L = NULL, pBinaryTree R = NULL)           //建一棵树
{
    pBinaryTree p = (struct inBinaryTree*)malloc(sizeof(inBinaryTree));
    p->ch = a;
    p->L = L;
    p->R = R;
    return p;
}

typedef struct inStackNode                  //堆数据区
{
    pBinaryTree root;               //二叉树指针
    struct inStackNode *link;
}StackNode,*pStackNode;

typedef struct inStack              //堆栈
{
    pStackNode top;
}Stack,*pStack;

void Push(pStack stack, pBinaryTree a)                //进栈函数
{   //pBinaryTree a为二叉树指针

    pStackNode p = (struct inStackNode*)malloc(sizeof(inStackNode));
    p->root = a;
              if(stack->top)
    {
        p->link = stack->top;
        stack->top = p;
    }
    else
    {
        p->link = NULL;
        stack->top = p;
    }
}

pBinaryTree Pop(pStack stack)                //出栈
{
    pBinaryTree p = NULL;
    if(stack->top)
    {
                 p = stack->top->root;
       pStackNode next = stack->top->link;
       free(stack->top);
       stack->top = next;
    }
    return p;
}

pBinaryTree Top(pStack stack)                //栈的顶部
{
    if(stack->top) return stack->top->root;
    return NULL;
}

void Free(pBinaryTree p)              //释放二叉树
{
    free(p->ch);
    free(p);
}

void OutPut(pBinaryTree ch)           
{
      printf("%s ",ch->ch);
}

void PostOrder(void (*Visit) (pBinaryTree p),pBinaryTree root)           //后序遍历
{
    if(root)
    {
       PostOrder(Visit,root->L);
       PostOrder(Visit,root->R);
       Visit(root);
    }
}

void InOrder(void (*Visit) (pBinaryTree p),pBinaryTree root)           //中序遍历
{
    if(root)
    {
       InOrder(Visit,root->L);
       Visit(root);
       InOrder(Visit,root->R);
    }
}

void Delete(pBinaryTree p)            //释放全部二叉树
{
    PostOrder(Free,p);
    p = NULL;
}

pBinaryTree CreateTree(char a[],int n)                 //建立二叉树         成功
{                                           //a是放入表达式字符的数组
    pBinaryTree l,r;   //二叉树指针
    Stack nu;
    register i = 0;
    nu.top = NULL;
    char *ch = (char*)calloc(n,sizeof(char));       //字符栈
    char off = 'a';
    int top = n-1;
    while(i < n)
    {
        if(a[i] == ' '){ i++;  continue; }
        if(a[i] == '(') ch[--top] = a[i++];
        else if(a[i] == ')')            
        {
            if(Top(&nu)) r = Pop(&nu);
            else {printf("括号内没有操作数!\n"); abort(); }
            if(Top(&nu))l = Pop(&nu);
            else { printf("括号内没有操作数!\n"); abort(); }
            Push(&nu,MakeTree(ToNumber(&ch[top++]),l,r));   //建立分枝
            if(ch[top++] != '('){printf("%c no to stack's %d without charcrate '('\n",ch[top],top); abort();}
            i++;
        }
        else if(off)
        {
             int j = i;
             if(a[i] == '+' || a[i] == '-')  if(IsChar(a[++i])){ printf("出现双符号!!\n"); abort();}
             if(IsNumber(a[i]))
             {
                 while(++i < n && IsNumber(a[i]));
             }
             Push(&nu,MakeTree(ToNumber(&a[j],i-j)));
             off = off ^ 'a';
        }
        else if(IsChar(a[i]))                //运算符
        {
            if(top < n-1 && ch[top] != '(')      //不为空
            {
                if(ch[top] == '*' || ch[top] == '/')
                {
                    r = Pop(&nu); l = Pop(&nu);
                    Push(&nu,MakeTree(ToNumber(&ch[top]),l,r));   //建立分枝
                    ch[top] = a[i++];
                }
                else if(a[i] == '*' || a[i] == '/')
                {
                    char cha = a[i];
                    l = Pop(&nu);
                    int j = i+1;
                    while(i < n && IsNumber(a[++i]));
                    r = MakeTree(ToNumber(&a[j],i-j));
                    Push(&nu,MakeTree(ToNumber(&cha),l,r));
                }
                else
                {
                    r = Pop(&nu); l = Pop(&nu);
                    Push(&nu,MakeTree(ToNumber(&ch[top]),l,r));
                    ch[top] = a[i++];      //入栈
                }
            }
            else ch[--top] = a[i++];
            off = off ^ 'a';
        }
        else {printf("unkonw charcrate!\n");  abort();}                   //注意这里I增加
    }   
 
    if(top != n-1)
    {
       if(Top(&nu)) r = Pop(&nu);
       else {printf("括号内没有操作数!\n"); abort(); }
       if(Top(&nu))l = Pop(&nu);
       else { printf("括号内没有操作数!\n"); abort(); }
        Push(&nu,MakeTree(ToNumber(&ch[top]),l,r));
    }
    free(ch);
    return Pop(&nu);
}

int Number(pBinaryTree root)             //运算函数
{
    if(IsChar(*root->ch)&&root->L&&root->R)
    {
        switch(*root->ch)
        {
              case '+': return Number(root->L) + Number(root->R);
                                  case '-': return Number(root->L) - Number(root->R);
              case '*': return Number(root->L) * Number(root->R);
              case '/': return Number(root->L) / Number(root->R);
        }

    }
    else return Numbers(root->ch,strlen(root->ch));
}
2011-07-03 14:49
zanzan1986
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:100
专家分:140
注 册:2011-2-22
收藏
得分:0 
我用二叉树写的表达式运支持这样的表达式:-1--5*(6+3)/8
2011-07-03 14:50
小乙哥
Rank: 2
等 级:论坛游民
帖 子:15
专家分:27
注 册:2011-5-30
收藏
得分:20 
如果是用字符串的话,就要去掉空格,并且寻找字符串,把左操作数和右操作数复制到一个数组中,把所有的符号复制到一个数组中,这样就可以实现计算了,下面是代码:
程序代码:
# include<stdio.h>
# include<string.h>
# include<ctype.h>
# include<stdlib.h>
# include<math.h>

int main(void)
{
    //变量名取得挺无奈的,大家就将就一下
    char i[256];
    char j[30];
    char o = 0;
    unsigned int a = 0;
    unsigned int b = 0;
    size_t c = 0;
    unsigned int d = 0;
    double m = 0.0;
    double n = 0.0;

    printf("请输入计算:\n");

    while(strcmp(fgets(i, 256, stdin), "quit\n") != 0) //如果输入quit则退出计算
    {
        c = strlen(i);
        i[--c] = '\0'; //覆盖换行符

        for(b = 0, a = 0; a <= c; a++)
            if(*(i + a) != ' ')
                *(i + b++) = *(i + a); //去掉空格并将字符存回本身
            c = strlen(i); //重新计算字符长度
            a = 0;

            if(i[a] == '=') //检查开头是不是=号,如果是,就把上次的结果当作左操作数
                a++;
            else
            {
                d = 0;
                if(i[a] == '+' || i[a] == '-')
                    *(j + d++) = *(i + a++); //把正负号都复制到j
                for( ; isdigit(*(i + a)); a++) 
                    *(j + d++) = *(i + a); //把正负号后面的数字复制到j

                if(*(i + a) == '.') //有小数刚把小数点和后面的数字都复制到j
                {
                    *(j + d++) = *(i + a++);
                    for( ; isdigit(*(i + a)); a++)
                        *(j + d++) = *(i + a);
                }
                *(j + d) = '\0'; //复制完第一个操作数的字符串

                if(d > 0)
                    m = atof(j); //把第一个操作数转换成double类型
            }
    for(; a < c; )
    {
        o = *(i + a++); //运算符都存在o里面
        d = 0;

        if(i[a] == '+' || i[a] == '-') //上面的是左操作数,这是右操作数,同上一样
                *(j + d++) = *(i + a++); 
            for( ; isdigit(*(i + a)); a++) 
                *(j + d++) = *(i + a); 

            if(*(i + a) == '.') 
                *(j + d++) = *(i + a++);
                for( ; isdigit(*(i + a)); a++)
                    *(j + d++) = *(i + a);

            *(j + d) = '\0'; //复制完第二个操作数的字符串

            n = atof(j); //转换成double类型

            switch(o)
            {
            case '+':
                m = m + n;
                break;
            case '-':
                m = m - n;
                break;
            case '*':
                m = m*n;
                break;
            case '/':
                if(n == 0)
                    printf("除数不能为0!\n");
                else
                    m = m/n;
                break;
            case '%':
                if(n == 0)
                    printf("除数不能为0!\n");
                else
                    m =(double)((long)m % (long)n);
                break;
            case '^':
                m = pow(m, n);
                break;
            default:
                printf("你输入错误!\n");
                break;
            }
    }
            printf("= %f\n", m);
    }

    return 0;
}
2011-07-03 14:56
yangfanconan
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:10
帖 子:397
专家分:541
注 册:2009-9-22
收藏
得分:0 
没有优先级。。。。元素之间有空格。
想法一。空格截取元素。
想法二。符号截取数值元素。
想法三。万能IF语句法。。
想法四。。。到底是无限元素还是有限元素。。。
2011-07-03 15:20
周1992
Rank: 2
等 级:论坛游民
帖 子:70
专家分:60
注 册:2011-3-18
收藏
得分:0 
回复 7楼 oszc
为什么要用这么复杂呢?
2011-07-03 17:16
快速回复:练习题6
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031753 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved