结对项目 四则运算 更新版

功能:由随机数决定出题为10个以内的数字,并确定是否出现括号(仅限一对),顺序输出表达式,并用栈的方式进行计算,判断正误。其他功能有待进一步实现。

头文件

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <math.h>

栈的结构体

typedef struct stack
{
    double * e;
    int zd;
}bds_stack;

声明函数

void InitStack(bds_stack ** s,int n);
int Push_stack(bds_stack * s,double t);
void Pop_stack(bds_stack * s,double * t);
double Opt_num();
void Cal(int n);
void yxj_table();

定义全局变量

int yxj[7][7];
bds_stack * dz,* tz;

主函数

int main()
{
    int num;
    int c = 0,p,s;
    double r,ans,r1,r2,r3;
    int * d,* t;
    int p1,p2;       //存储出现括号的下标
int m,n,f;       //分别记录数组d、t的下标
int i,j,k;
    yxj_table();     //初始化优先级数组
    scanf("%d",&num);
    srand(time(NULL));       //随机数种子
    for(i = 0;i < num;i++)
    {
        m = 0;n = 0;f = 0;
        while(c == 1||c == 0)
        {
            c = rand()%10;  //数字字符
        }
        s = rand()%2;     //是否出现括号
        if(s == 1)         //确定字符总数
        {
            p = c + 1;
        }
        else
        {
            p = c - 1;
        }
        printf("%d %d %d\n",c,p,s);
        d = (int * )malloc(sizeof(int)*c);
        t = (int * )malloc(sizeof(int)*p);
        InitStack(&dz,c);
        InitStack(&tz,p);
        Push_stack(tz,0);       //0为‘#’
        for(j = 0;j < c;j++)
        {
            d[j] = rand()%100;             //数字为两位数
        }
        if(s == 1)
        {
            p1 = rand()%(p-2)+1;
            p2 = rand()%(p-p1-1)+1+p1+1;
            p1--; p2--;                    //下标
            t[p1] = 5;
            t[p2] = 6;
        }
        for(j = 0;j < p;j++)
        {
            if(s == 1)
            {
                if(j == p1||j == p2)
                    continue;
            }
            t[j] = rand()%4+1;
        }
        j = 0;
        if(t[n] == 5)
        {
            printf("(");
            Push_stack(tz,t[n]);
            n++;
            j++;
        }
        for(;j < (c+p);)              //输出表达式
        {
            if(f == 0)
            {
                printf("%d",d[m]);
                Push_stack(dz,d[m]);
                m++; j++;
                if(t[n] == 6)
                {
                    printf(")");
                    while(yxj[(int)tz->e[tz->zd-1]][t[n]] != 2)
                    {
                        if(yxj[(int)tz->e[tz->zd-1]][t[n]] == 1)
                        {
                            r = Opt_num();
                            Push_stack(dz,r);
                        }
                        else
                        {
                            printf("出错!\n");
                            return 1;
                        }
                    }
                    Pop_stack(tz,&r);
                    n++; j++;
                }
                f = 1;
            }
            else
            {
                if(t[n] == 1)
                {
                    printf("+");
                    Cal(t[n]);
                }
                if(t[n] == 2)
                {
                    printf("-");
                    Cal(t[n]);
                }
                if(t[n] == 3)
                {
                    printf("*");
                    Cal(t[n]);
                }
                if(t[n] == 4)
                {
                    printf("/");
                    Cal(t[n]);
                }
                n++;j++;
                if(t[n] == 5)
                {
                    printf("(");
                    Push_stack(tz,t[n]);
                    n++; j++;
                }
                f = 0;
            }
        }
        printf(" =  ?\n");
        while((yxj[(int)(tz->e[tz->zd-1])][0]) != 2)
        {
            r = Opt_num();
            Push_stack(dz,r);
        }
        scanf("%lf",&ans);
        if(ceil(fabs(r-ans)) == 0)
        {
            printf("right!!\n");
        }
        else
        {
            printf("false!!\n");
        }
    }
    return 0;
}

初始化优先级表

void yxj_table()
{
    int i,j;
    yxj[0][0] = 2;
    yxj[0][6] = 3;  yxj[5][0] = 3;
    for(i = 0,j = 1;j <= 5;j++)
    {
        yxj[i][j] = 0;
    }
    yxj[6][0] = 1;
    for(i = 1;i <= 4 ;i++)
    {
        for(j = 0;j <= 2;j++)
        {
            yxj[i][j] = 1;
        }
    }
    for(i = 5,j = 1;j <= 4;j++)
        yxj[i][j] = 0;
    for(i = 6,j = 1;j <= 4;j++)
        yxj[i][j] = 1;
    for(i = 1;i <= 2;i++)
    {
        for(j = 3;j <= 5;j++)
        {
            yxj[i][j] = 0;
        }
    }
    for(i = 3;i <= 4;i++)
    {
        for(j = 3;j <= 4;j++)
        {
            yxj[i][j] = 1;
        }
    }
    yxj[3][5] = 0; yxj[4][5] = 0;
    for(j = 6,i = 1;i <= 4;i++)
    {
        yxj[i][j] = 1;
    }
    yxj[5][6] = 2;
    yxj[5][5] = 3;  yxj[6][5] = 3; yxj[6][6] = 3;
}

初始化栈

void InitStack(bds_stack ** s,int n)
{
    *s = (bds_stack*)malloc(sizeof(bds_stack));
    (*s)->e = (double*)malloc(sizeof(double)*n);
    (*s)->zd = 0;
}

入栈

int Push_stack(bds_stack * s,double t)
{
    int q;
    s->e[s->zd] = t;
    q = s->zd;
    s->zd++;
    return q;
}

出栈

void Pop_stack(bds_stack * s,double * t)
{
    (*t) = s->e[--(s->zd)];
}

字符出栈计算

double Opt_num()
{
    double num1,num2,opt;
    Pop_stack(dz,&num2);
    Pop_stack(tz,&opt);
    Pop_stack(dz,&num1);
    if(opt == 1)
    {
        return num1 + num2;
    }
    if(opt == 2)
    {
        return num1 - num2;
    }
    if(opt == 3)
    {
        return num1 * num2;
    }
    if(opt == 4)
    {
        return num1 / num2;
    }
    return 0;
}

优先级比较

void Cal(int n)
{
    double r;
    int k;
    while(yxj[(int)(tz->e[tz->zd-1])][n] != 0)
    {
        if(yxj[(int)(tz->e[tz->zd-1])][n] == 1)
        {
            r = Opt_num();
            Push_stack(dz,r);
        }
        else
        {
            printf("出错!\n");
        }
    }
    Push_stack(tz,(double)n);
}

SSH://[email protected]:huhuupup/compute.git

时间: 2024-10-13 10:51:46

结对项目 四则运算 更新版的相关文章

结对项目--四则运算生成器(Java) 刘彦享+龙俊健

结对项目--四则运算生成器(Java) GitHub地址 合作者 刘彦享(3118005010) 龙俊健(3118005011) https://github.com/LYX708194/calculate 一.项目简介 说明 自然数:0, 1, 2, -. 真分数:1/2, 1/3, 2/3, 1/4, 1'1/2, -. 运算符:+, ?, ×, ÷. 括号:(, ). 等号:=. 分隔符:空格(用于四则运算符和等号前后). 算术表达式: e = n | e1 + e2 | e1 ? e2

结对项目——四则运算(GUI)

目录 1.仓库地址 2.开始前PSP展示 3.接口的设计 4.计算模块接口的设计与实现过程 5.计算模块接口部分的性能改进 6.计算模块部分单元测试展示 7.计算模块部分异常处理说明 8.界面模块的详细设计过程 9.界面模块与计算模块的对接 10.结对过程 11.结对编程优缺点 12.实际的PSP 1. 仓库地址:https://git.coding.net/jiapwy/newfouroperation.git 队友:胡雅馨 队友的博客地址:http://www.cnblogs.com/huy

结对项目-四则运算出题程序(GUI版)

目录: 一.致搭档(含项目地址) 二.PSP(planning) 三.结对编程中对接口的设计 四.计算模块接口的设计与实现过程 五.计算模块接口部分的性能改进 六.计算模块部分单元测试展示 七.计算模块部分异常处理说明 八.界面模块的详细设计过程 九.界面模块与计算模块的对接 十.结对过程的描述 十一.结对编程的优缺点 十二.PSP(actual) 一.致搭档:     队友:李庭娟(我很喜欢把这位队友叫娟子,感觉很亲切) 首先非常非常感谢这位结对搭档--娟子,从最初组队到如今合作,始终非常信任

结对项目——四则运算题目生成器

一.GitHub项目地址 : https://github.com/OurPrograming/Exercises 结对项目成员:软三 陈纪禧(3118005043).软三 程伟杰(3118005045) 二.PSP预计时间: PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划  60 · Estimate · 估计这个任务需要多少时间 60 Development 开发 1680 · Analysis ·

结对项目-四则运算

项目:四则运算 结对伙伴:杜桥 功能:四则运算随机出题,并判断答案是否正确(只实现了正整数运算): 实现:用c#实现,用random.Next()完成随机部分,然后通过判断来检查答案是否正确: Https:https://git.coding.net/li_yuhuan/CalculateTest.git SSH:[email protected]:li_yuhuan/CalculateTest.git 代码: int v1; int v2; int a; char op; char[] ops

结对项目-四则运算 “软件”之升级版

随笔缘由:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2213 githup缘由:https://github.com/tianshizhao/tianshizhao 一.基本要求 从个人项目出发,将程序改造成一个单机带用户界面(不是控制台)的程序,这个程序最基本要达到: 自动生成题目,单个题目最多不能超过4个运算符,操作数小于100. 用户可以输入答案 若用户输入答案正确,则提示正确:若答案错误,则提示错误,并要提示正确答案是

结对项目--四则运算图形化最终版

四则运算器图形化最终版 (然而被我做成了奇怪的东西 组员:13070030张博文 13070033刘云峰 一.概念阶段 最初是想试试用android做个计算器app,无奈从零学起着实太赶,而且这个计划在试用了无比卡顿占内存的android studio后就彻底搁浅了. 然后就被路人谣传说MFC好用,无奈从零学起着实太赶,而且这个计划在无人指导的摸黑下也顺手搁浅了. 最终便沦为了EasyX旧传统,好歹有点基础,但果然还是不太甘心. 以及因为当初想做app,所以抠了iphone计算器的图想当UI,结

结对项目第一周总结

结对项目——四则运算 阶段性总结 一.需求分析(第一周达成): 能够生成n道四则运算题,n可由使用者输入来控制 支持整数 支持分数 生成题目中含有括号 可以判断正误,如果错误会输出正确答案 统计正确率 扩展需求: 生成题目后存入文件 完成题目后从文件读入并进行判断 支持题目去重 支持繁體中文,简体中文,English 二.设计思路(同时输出UML类图): 以下是程序主体设计思路,各步骤具体操作详情请见注释: 由于本周可用的准备时间较长,我们选择直接进行真分数的操作.在java语言中并没有一个专门

结对编程项目——四则运算

1. 结对编程项目---四则运算 (10分) 基本功能要求: 1) 实现一个带有用户界面的四则运算.2) 生成的题目不能重复.3) 支持负数,例如-1,-1/2,-3‘4/5等.(达成) 需要支持的基本设定参数 1) 题目的数量  2) 数值的范围  3) 题目中最多几个运算符(目前没有达成)  4) 题目中或运算过程中有无有分数(比如进行整数除法的时候不能除尽) 5) 题目中是否有乘除法  6) 题目中是否有括号 (目前没有达成) 7) 题目中或运算过程中有无负数         学习感受: