四则运算(2)

一.题目

要求:
1题目避免重复
2可定制(数量/打印方式)
3可以控制下列参数:是否有乘除法,是否有括号,数值范围,加减有无负数,除法有无余数,是否支持分数(真分数假分数),是否支持小数(精确到多少位),打印中每行的间隔。

二设计思路

解决思路:
1.避免重复:随机数函数+系统时间产生每一个随机数 ,将每一个式子存储 下来,每次产生式子的时候都检查一遍,若重复则重新 产生。 检查式子的时候用函数实现。
2.可定制:用for循环来控制数量,具体数量有用户输入;每行输出几个式子 由用户输入,并存储。
3.控制参数:在程序开始设计界面用来由用户输入要求,将要求存储下来。 参数集统一存储到一起。
(1)是否有乘除法:随机产生运算符号,将加减乘除存储,cs[0]存储
(2)是否有括号:用a[1]存储,为1时有括号,为0 时无括号。
(3)数值范围:用a[2]和啊[3]分别存储最大数和最小数,用a+rand()%b,来实现,操作数的随机生成。
(4)加减有无负数:用a[3]存储,用if语句判断存储的要求。
(5)除法有无余数:用a[4]存储,为1时有余数,为0时无余数。用函数 检查每一个式子是否有余数。
(6)是否支持小数(精确到多少位):用a[5]存储,为0时无小数,为n 时候,是n位小数。
(7)打印中每行的间隔:用a[6]存储,为0时无间隔,为n时,间隔n行。

要求较多,并且实现这些功能方法类似,故其中选择了部分功能实现。

三.源代码

// 四则运算2.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include<iostream.h>
#include<time.h>
#include<stdlib.h>
typedef struct
{
	int first;
	int second;
	char ope;
}equation;
//***********链表的数据结构***********//
typedef struct LNode
{
	int first_operand;
	int second_operand;
	char operat;
	struct LNode *next;
}LNode,*LinkList;
//**********链表初始化***********//
void InitList_L(LinkList &L)
{
	L=new LNode;
	L->next=NULL;
}
//**********链表数据的插入*************//
void InsertList_L(LinkList &L,equation N)
{
	LNode *temp,*head;
	head=L;
	temp=new LNode;

	temp->first_operand=N.first;
	temp->second_operand=N.second;
	temp->operat=N.ope;
	temp->next=NULL;

	while(head->next!=NULL)
	{
		head=head->next;
	}
	head->next=temp;

}
//*********用户要求的输入***********//
void require(int &num,int a[])
{
	cout<<"请输入四则运算的个数:";
	cin>>num;
	cout<<"请输入打印方式(列数):";
	cin>>a[0];
	cout<<"请输入数的最小值:";
	cin>>a[1];
	cout<<"请输入数的最大值:";
	cin>>a[2];
	cout<<"是否有乘除法(有(1)/无(0)):";
	cin>>a[3];
	cout<<"打印的时候行之间的间隔是多少行:";
	cin>>a[4];
}
//***********检查是否有重复的式子***********//
int repeat(LinkList L,equation N)//a是算式的个数,函数返回值是1的话有重复,返回值是0的话无重复
{
	int flag=0;//如果有重复的则flag=1,否则为0
	LNode *temp;
	temp=L->next;

	while(temp!=NULL)
	{
		if((temp->first_operand==N.first)&&(temp->second_operand==N.second)&&(temp->operat==N.ope))//如果有重复的话
		{
			flag=1;
		}
		temp=temp->next;
	}
	return flag;
}
//***********链表的输出***********//
void input_L(LinkList L,int m,int n)//m,是每行的列数,n是每行的间隔
{
	LNode *head;
	head=L->next;
	int temp=0;
	while(head!=NULL)
	{
		cout<<head->first_operand<<head->operat<<head->second_operand<<"=\t";//数据的输出
		temp++;
		head=head->next;
		if(temp%m==0)//打印方式(列数)
		{
			for(int i=0;i<n;i++)//间隔
			{
				cout<<endl;
			}
		}
	}
}
int main()
{
	int i,j,num,a[5];//num是式子的个数
	int c,b,temp;
	int flag1=1,flag2;//判断是否运行继续生成算式,flag2表示是否有重复的式子
	char op[4]={‘+‘,‘-‘,‘*‘,‘/‘};//运算符
	LinkList L;
	equation N;
	srand(time(NULL));
	for(i=0;i<5;i++)//对数组a初始化
	{
		a[i]=0;
	}
	while(flag1==1)
	{
		require(num,a);
		InitList_L(L);
		if(a[3]==0)//判断是否有乘除
		{
			op[2]=‘+‘;
			op[3]=‘-‘;
		}
		c=a[1];
		b=a[2]+1-a[1];
		for(i=0;i<num;i++)
		{
XH:			N.second=c+rand()%b;//式子的生成
			N.first=c+rand()%b;
			j=rand()%4;
			N.ope=op[j];

			if(N.ope==‘-‘)//如果是减法的话,则两个操作数调换位置
			{
				if(N.first<N.second)
				{
					temp=N.first;
					N.first=N.second;
					N.second=temp;
				}
			}
			flag2=repeat(L,N);
			InsertList_L(L,N);//数据进入链表当中
		        if(flag2==1)//判断是否有重复,若有则重新生成算式
			{
				goto XH;
			}
		}
		input_L(L,a[0],a[4]);
	        cout<<endl<<"是否继续(是(1)/否(0)):";//判断是否继续运行
		cin>>flag1;
		if(flag1==1)
		{
			system("cls");//清屏
		}
		else
		{
			cout<<"感谢您的使用!"<<endl;
		}
	}
	return 0;
}

四.运行结果截图

 

五、PSP0级 记录表

周活动总结表

姓名:于海洋                    日期:2015/3/10


日期       任务


听课


编写程序


阅读课本


准备考试


日总计


周日


周一


周二


100


100


周三


36


23


59


周四


40


2


42


周五


100


32


132


周六


82


82


周总结


200


190


25


415

                   

阶段时间和效率                                            周数(上一次周活动表的周数+1):

不包括上一周在内的累计时间


总计


平均


最大


最小

以前各周的累计时间


总计


200


190


25


415


平均


200


190


25


415


最大


200


190


25


415


最小


200


190


25


415

                    

时间记录表:

学生:       于海洋                                             日期:      2015/3/11

教师:       王建民                                             课程:          PSP


日期


开始时间


结束时间


中断时间


净时间


活动


备注


3/11


14:30


14:53


23


看书


数据结构


14:53


15:29


36


编程


四则运算2


3/12


16:20


16:32


12


编程


四则运算2


16:32


16:34


2


看书


数据结构


16:34


17:02


28


编程


四则运算2


3/13


18:20


18:52


32


编程


四则运算2


3/14


9:30


10:52


82


编程


四则运算2

                    

缺陷记录日志:

学生       于海洋

日期        3/14

教员       王建民

程序号


日期


编号


类型


引入阶段


排除阶段


修复时间


修复缺陷


3/14


1


1


编码


编译


1min


描述:链表节点类型LNode声明变量的时候类型声明错误


2


2


编码


编译


1min


描述:在使用函数的时候,参数传递编写错误


3


3


设计


编译


3min


描述:逻辑错误,查看是否有重复的时候,在while循环里的判断条件错误,不是temp->next!=NULL而是temp!=NULL。


4


3


设计


编译


2min


描述:逻辑错误,应该是先判断是否有重复然后在往链表中插入数据


5


3


设计


编译


3min


描述:逻辑错误,应该是先判断是否有重复然后在往链表中插入数据


6


4


设计


编译


1min


描述:结果中有负数,二年级的学生还没有学过负数。在生成算式的时候需要检查一遍,当时减法的时候,若第一操作数小于第二操作数则交换两个数,使大数减去小数。

时间: 2024-10-28 01:49:37

四则运算(2)的相关文章

自动生成小学四则运算题目(C语言)

这个简易四则运算是我在百度上找的博主叫53余雅诗的一篇c语言代码,网址为http://www.cnblogs.com/ys1101/p/4368103.html,功能是可以选择加减乘除进行简易的四则运算,判断对错.我在VS2017上编译没有bug,因为功能只有整数运算,所以我在此基础上加了真分数的四则运算以及统计得分等,最后成功运行程序.我把我的源代码放在github上,地址为https://github.com/xiaofancheng/helloworld.

四则运算题目生成程序

a.需求分析 看了大家对于本课程的目标和规划,很多同学都希望能提高自己的实践能力,没有捷径可走,就是练习.练习再练习!那么就从第一个个人项目开始吧,用一周的时间完成一个基于控制台的四则运算程序,实现一个自动生成小学四则运算题目的命令行程序 从<构建之法>第一章的 "程序" 例子出发,像阿超那样,花二十分钟写一个能自动生成小学四则运算题目的命令行 "软件",满足以下需求: 除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 =

四则运算题目生成程序(基于控制台)

题目描述: 能自动生成小学四则运算题目的命令行 "软件",满足以下需求: 除了整数以外,还要支持真分数的四则运算,真分数的运算,例如:1/6 + 1/8 = 7/24 运算符为 +, ?, ×, ÷ 并且要求能处理用户的输入,并判断对错,打分统计正确率 要求能处理用户输入的真分数, 如 1/2, 5/12 等 使用 -n 参数控制生成题目的个数,例如执行下面命令将生成10个题目 功能设计: 1.  通过随机数的生成,实现+, ?, ×, ÷的确定 2.  +, ?, ×, ÷分别赋予整

第一周 结对编程四则运算

项目需求:程序随机生成四则运算计算题,并在用户填写答案后判断答案正误. 结对成员:李峤 任务分配:算法思想及采用的主要函数由李峤负责. 部分代码输入及结果测试由本人负责. 大体分成两个模块 :1.随机生成四则运算计算题 2.判断录入答案正误 主要代码如下: 1 #include<stdio.h> 2 #include<string.h> 3 #include<time.h> 4 #include<stdlib.h> 5 int main() 6 { 7 ch

判断随机生成的四则运算结果

功能:1.随机生成一个四则运算 2.用户输入式子结果后判断是否正确(结果取整) #include<stdio.h> #include<string.h> #include<stdlib.h> #include<stack> using namespace std; int n,t,n1; struct ZX { char a; bool b;//if b=0 括号 if b=1 数字 } ; stack<ZX>s1; void atersz(ZX

四则运算作业初步_064121陶源

这个四则运算的功能很有限,只能进行两个数的加减乘除四种运算,能显示最简分数结果,但没法将能化为整数的分数变成整数,比如6/3,最后会显示成2/1. 代码类型是C++,技巧上,参考了网上的operator重载操作符这个技巧,自己本不知道这个知识点. 分数化简的过程自己也是参考了其他资源,然后自己仔细阅读并理解,在旁边用例子注释. 编译平台是在Mac OS系统的Xcode上编译的,第一次在非vc++平台上编译. 代码:                                        

二柱子四则运算3

二柱子四则运算3 可怜的二柱子……又一次被坑了…… 老师又在上次的“二柱子四则运算2”的基础上增添了要求,如下: 1.学生写的程序必须能判定用户的输入答案是否正确.直到题目结束,告诉用户做对了几道题. 2.程序必须能处理四种运算的混合模式. 注意:连续的减法和除法,应该遵守左结合的规定. 连续除法要打括号,否则会引起歧义. 一.实验思路 二.实验源代码 三.实验总结和反思 最后,附上我和我的小伙伴的工作照……没有正脸.老师们不要介意啦啦啦~~~~ 小伙伴博客内容页:http://www.cnbl

软件工程第一次作业,小学生四则运算的出题程序

一.背景 阿超有个儿子上小学二年级,老师每天让家长给孩子出30道加减法题,虽然不多,但是每天都做也算是个负担,阿超作为一个老牌程序员当然想用计算机来解决这个小问题,目前对于这个问题对于任何语言都不是问题,比如: C/C++.C#.Java.Python.VB.JavaScript.Perl…… 具体要求如下: 能自动生成小学四则运算题目(注意是给小学生用的,要是结果出现负数的话他们会迷茫的!) 除了整数外,还要支持真分数的四则运算 请大家用任何一种自己擅长的语言来编写这段程序,并把程序的介绍和自

软件工程之四则运算--Github

由于现在配置问题,然后借用同学电脑将代码上传至Github,网址为:https://github.com/be821/RealFour 参考相关Github文档: 1. http://my.oschina.net/u/1050949/blog/194536?fromerr=IBt08Hdf 2. http://www.linuxidc.com/Linux/2013-06/85372p3.htm 3. http://blog.csdn.net/yanzi1225627/article/detail

四则运算封装

form1 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; namespace 四则运算 { public partial class Form1