四则运算3
程序员文章站
2022-05-06 11:46:06
...
我和秦冰超一组。秦冰超的博客地址 http://www.cnblogs.com/qinxian0/
设计思路:1.将题目的难度属性放在数组中,并赋予初值。
2.定义四则运算的数据结构。
3.利用链表判断题目是否重复。
4.调用jisuan.h中的answer判断答案是否正确
5.利用rand%4函数表示运算符。0+,1-,2*,3/
#include<iostream>
#include "stdlib.h"
#include "time.h"
#include "jisuan.h"
#include "iomanip"
using namespace std;
//判断回答是否正确
bool YorN(jisuan &Q, int answer)
{
if (Q.yunsuanfu == 0)//yunsaunfu为运算符0+,1-,2*,3/
{
Q.answer = Q.num1 + Q.num2;
}
else if (Q.yunsuanfu == 1)
{
Q.answer = Q.num1 - Q.num2;
}
else if (Q.yunsuanfu == 2)
{
Q.answer = Q.num1*Q.num2;
}
else
Q.answer = Q.num1 / Q.num2;
if (answer == Q.answer)
return true;
else
return false;
}
//生成算术题
void Build(jisuan &Q)
{
if (tideshuxing[2] == 1)//有乘除
Q.yunsuanfu = rand() % 4;
else//没有乘除
Q.yunsuanfu = rand() % 2;
Q.num1 = rand() % (tideshuxing[4] - tideshuxing[3] + 1) + tideshuxing[3];//生成在取值范围间的随机数
Q.num2 = rand() % (tideshuxing[4] - tideshuxing[3] + 1) + tideshuxing[3];
}
//输出函数
void Display1(LinkC C, jisuan &Q)
{
int temp, count = 0; //count记录重新生成题目的次数
for (int i = 1; i <= tideshuxing[1]; i++)
{
cout << "(" << i << ")";
if (tideshuxing[2] == 1)
Q.yunsuanfu = rand() % 4;
else
Q.yunsuanfu = rand() % 2;
Q.num1 = rand() % (tideshuxing[4] - tideshuxing[3] + 1) + tideshuxing[3];
Q.num2 = rand() % (tideshuxing[4] - tideshuxing[3] + 1) + tideshuxing[3];
RB: Build(Q); //检查是否有重复的题目
switch (Q.yunsuanfu)
{
case 0:
if (ExistQues(C, Q))//调用jisuan.h中的ExistQues
{
count++;
goto RB;
}
cout << Q.num1 << "+" << Q.num2 << "=" << setw(5);
break;
case 1:
if ((tideshuxing[5] == 0) && (Q.num1<Q.num2))//若为负数,则交换
{
temp = Q.num1;
Q.num1 = Q.num2;
Q.num2 = temp;
}
if (ExistQues(C, Q))
{
count++;
goto RB;
}
cout << Q.num1 << "-" << Q.num2 << "=" << setw(5); break;
case 2:
if (ExistQues(C, Q))
{
count++;
goto RB;
}
cout << Q.num1 << "*" << Q.num2 << "=" << setw(5); break;
case 3:
while (Q.num2 == 0)
Q.num2 = rand() % (tideshuxing[4] - tideshuxing[3] + 1) + tideshuxing[3];
if (!tideshuxing[6])
{
while ((Q.num1%Q.num2) != 0 || Q.num2 == 0)
{ //重新生成
Q.num1 = rand() % (tideshuxing[4] - tideshuxing[3] + 1) + tideshuxing[3];
Q.num2 = rand() % (tideshuxing[4] - tideshuxing[3] + 1) + tideshuxing[3];
}
}
if (ExistQues(C, Q))
{
count++;
goto RB;
}
cout << Q.num1 << "/" << Q.num2 << "=" << setw(5); break;
}
InsertQues(C, Q);
if (i%tideshuxing[2] == 0) //一行打印完规定列数,换行
for (int j = 0; j <= tideshuxing[3]; j++)
cout << endl;
}
cout << endl << endl;
}
//回答题目函数
void Display2(LinkC C, jisuan &Q)
{
int temp, count = 0, answer = 0, right = 0; //count记录重新生成题目的次数
for (int i = 1; i <= tideshuxing[1]; i++)
{
cout << "(" << i << ")";
if (tideshuxing[2] == 1)
Q.yunsuanfu = rand() % 4;
else
Q.yunsuanfu = rand() % 2;
Q.num1 = rand() % (tideshuxing[4] - tideshuxing[3] + 1) + tideshuxing[3];
Q.num2 = rand() % (tideshuxing[4] - tideshuxing[3] + 1) + tideshuxing[3];
RB: Build(Q); //检查是否有出过的题目
switch (Q.yunsuanfu)
{
case 0:
if (ExistQues(C, Q))
{
count++;
goto RB;
}
cout << Q.num1 << "+" << Q.num2 << "=";
cin >> answer;
if (YorN(Q, answer))
{
cout << "\t正确";
right++;
}
else
cout << "\t错误";
break;
case 1:
if ((tideshuxing[5] == 0) && (Q.num1<Q.num2))//若为负数,则交换
{
temp = Q.num1;
Q.num1 = Q.num2;
Q.num2 = temp;
}
if (ExistQues(C, Q))
{
count++;
goto RB;
}
cout << Q.num1 << "-" << Q.num2 << "=";
cin >> answer;
if (YorN(Q, answer))
{
cout << "\t正确";
right++;
}
else
cout << "\t错误";
break;
case 2:
if (ExistQues(C, Q))
{
count++;
goto RB;
}
cout << Q.num1 << "*" << Q.num2 << "=";
cin >> answer;
if (YorN(Q, answer))
{
cout << "\t正确";
right++;
}
cout << "\t错误";
break;
case 3:
while (Q.num2 == 0)//被除数不能为0
Q.num2 = rand() % (tideshuxing[4] - tideshuxing[3] + 1) + tideshuxing[3];
if (!tideshuxing[6])
{
while ((Q.num1%Q.num2) != 0 || Q.num2 == 0) //重新生成
{
Q.num1 = rand() % (tideshuxing[4] - tideshuxing[3] + 1) + tideshuxing[3];
Q.num2 = rand() % (tideshuxing[4] - tideshuxing[3] + 1) + tideshuxing[3];
}
}
if (ExistQues(C, Q))
{
count++;
goto RB;
}
cout << Q.num1 << "/" << Q.num2 << "=";
cin >> answer;
if (YorN(Q, answer))
{
cout << "\t正确";
right++;
}
cout << "\t错误";
break;
}
InsertQues(C, Q);
cout << endl;
}
cout << "共回答正确" << right << "道题。";
cout << endl << endl;
}
//判断难度
void YesOrNo(int tideshuxing)
{
if (tideshuxing)
cout << "是";
else
cout << "否";
}
//判断输入是否正确
void Reset(int i)
{
do
{
cout << "请重新设置(是1/否0):";
cin >> tideshuxing[i];
}
while (tideshuxing[i] != 0 && tideshuxing[i] != 1);
}
//设置题目难度
void SetLevel()
{
system("cls");
char move2;
cout << "\t/*************设置题目难度*************/" << endl;
cout << "\t 0.是否有乘除法("; YesOrNo(tideshuxing[2]); cout << ")" << endl;
cout << "\t 1.数值范围(" << tideshuxing[3] << "~" << tideshuxing[4] << ")" << endl;
cout << "\t 2.是否有负数("; YesOrNo(tideshuxing[5]); cout << ")" << endl;
cout << "\t 3.是否有余数("; YesOrNo(tideshuxing[6]); cout << ")" << endl;
cout << "\t 4.返回主菜单" << endl;
cout << "\t/**************************************/" << endl;
cout << "请选择后续操作(0~4):";
cin >> move2;
while (move2<'0' || move2>'4')
{
cout << "错误!请正确输入操作序号(0~4):";
cin >> move2;
}
switch (move2)
{
case '0':Reset(4); break;
case '1':
reset1 : cout << "新的数值下限:";
cin >> tideshuxing[3];
cout << "新的数值上限:";
cin >> tideshuxing[4];
if (tideshuxing[3] >= tideshuxing[4])
{
cout << "出错!请重新输入数值范围!" << endl;
goto reset1;
}
break;
case '2':Reset(7); break;
case '3':Reset(8); break;
case '4':break;
}
}
//主页面
void MainMenu(LinkC &C, jisuan &Q)
{
char move, save;
cout << "\t 0.输入出题数量" << endl;
cout << "\t 1.设置题目难度" << endl;
cout << "\t 2.开始出题" << endl;
cout << "\t 3.开始答题" << endl;
cout << "\t 4.退出系统" << endl;
cout << "请选择后续操作(0~4):";
cin >> move;
while (move<'0' || move>'4')
{
cout << "错误!请正确输入操作序号(0~4):";
cin >> move;
}
switch (move)
{
case '2':Display1(C, Q); break;
case '0':
reset4 : cout << "请设置出题数量:";
cin >> tideshuxing[1];
if (tideshuxing[1] <= 0)
{
cout << "出错!请重新输入!" << endl;
goto reset4;
}
break;
case '1':SetLevel(); break;
case '3':Display2(C, Q); break;
case '4':
cout << "是否保存出题记录(是1/否0):";
cin >> save;
while (save != '1'&&save != '0')
{
cout << "出错!请正确输入(是1/否0):";
cin >> save;
}
if (save == '1')
WriteQues(C);//调用jisuan.h中的WriteQues
cout << "感谢您的使用,再见!" << endl;
tideshuxing[0] = 0; break;
}
}
int main(int argc, char* argv[])
{
srand((unsigned)time(NULL)); //srand()函数产生一个以当前时间开始的随机种子
LinkC Cacu;
jisuan ques;
InitList(Cacu);
ReadQues(Cacu);
while (tideshuxing[0])
{
system("cls");
MainMenu(Cacu, ques);
system("pause");
}
return 0;
}
//jisuan.h
#include<iostream>
#include <fstream>
using namespace std;
int tideshuxing[10] = { 1, 30, 0, 0, 5, 0, 0, 0 };
//将题的属性放在数组中,并赋予初值。0退出、1出题数量、2乘除、3数值范围下限、4数值范围上限、5负数、6余数、7出过的题目数
//四则算术题的数据结构
typedef struct
{
int num1;
int num2;
int yunsuanfu;
int answer;
}jisuan;
typedef struct CNode //结点
{
jisuan ques;
struct CNode * next;
}CNode, *LinkC;
//题目初始化
void InitList(LinkC &C)
{
C = new CNode;
C->next = NULL;
}
//添加题目信息
void InsertQues(LinkC &C, jisuan Q)
{//尾插入
LinkC tail, temp;
tail = C;
while (tail&&tail->next != NULL)
tail = tail->next;
temp = new CNode;
temp->ques = Q;
temp->next = NULL;
tail->next = temp;
tail = temp;
tideshuxing[9]++;
}
//判断题目存在
int ExistQues(LinkC C, jisuan Q)
{
LinkC temp;
temp = C->next;
while (temp)
{
if ((temp->ques.num1 == Q.num1) && (temp->ques.num2 == Q.num2) && (temp->ques.yunsuanfu == Q.yunsuanfu))
return 1; //当两个数字和算符与链表中的一样,则存在
else
temp = temp->next;
}
return 0;
}
//读取出过的问题
void ReadQues(LinkC &C)
{
LinkC temp;
ifstream infile("question.txt");
for (int i = 0; i<10; i++) //读取参数表
infile >> tideshuxing[i];
for (int i = 0; i<tideshuxing[9]; i++) //读取出过的题目
{
temp = new CNode;
infile >> temp->ques.num1;
infile >> temp->ques.num2;
infile >> temp->ques.yunsuanfu;
temp->next = NULL;
}
}
//保存到txt
void WriteQues(LinkC C)
{
LinkC temp;
ofstream outfile("question.txt");
if (!outfile)
{
cout << "文件存储失败!" << endl;
exit(0);
}
for (int i = 0; i<10; i++)
outfile << tideshuxing[i] << " ";
for (temp = C->next; temp; temp = temp->next)
{
outfile << temp->ques.num1 << " ";
outfile << temp->ques.num2 << " ";
outfile << temp->ques.yunsuanfu << " ";
}
}
项目计划总结:
项目计划总结:
日期 | 开始时间 | 中断事件 | 中断事件 | 净时间 | 活动 |
3/14 | 14:00 | 15:50 | 10分钟 | 100分钟 | 上课 |
16:30 | 17:30 | 0 | 60分钟 | 写作业 | |
3/15 | 13:00 | 14:30 | 0 | 90分钟 | 写作业 |
3/16 | 15:00 | 16:00 | 0 | 60分钟 | 写作业 |
3/17 | 15:00 | 16:00 | 0 | 60分钟 | 写作业 |
3/18 | 14:00 | 15:00 | 0 | 60分钟 | 写作业 |
日期&&任务 | 听课 | 编写程序 | 阅读相关书籍 | 网上查找资料 | 日总结 |
周一 | 2H | 2H | 0H | 0.5H | 4.5H |
周二 | 1H | 0.5H | 0.5H | 2H | |
周三 | 2H | 1H | 0.5H | 3.5H | |
周四 | 2H | 0H | 0H | 0H | 2H |
周五 | 3H | 1H | 1H | 5H | |
周六 | 4H | 2H | 2H | 8H | |
周日 | 0H | 0H | 0H | 0H | |
周总结 | 4H | 12H | 4.5H | 4.5H | 25H |
缺陷记录日志:在这次结对编程汇中,我没有很好地适应结对训练,在开发中,对数据结构这一部分不是很熟悉。
上一篇: js实现开关灯效果
推荐阅读
-
设计一个算法:用不多于3n/2的平均比较次数,在数组A[1,...,n]中找出最大值和最小值的元素
-
【剑指offer】面试题3 数组中的重复元素
-
【剑指offer题目3】数组中重复的数字
-
3种高效的Tags标签系统数据库设计方案分享_MySQL
-
array_search()函数,第3个参数,有什么功用
-
yii2 随笔(七)依赖注入——(3)yii2的依赖注入
-
thinkPHP3表关联查询
-
详解css3+javascript实现翻页的实例代码
-
vue-cli3+ 打包部署到服务器后,svg在iphone上无法正常显示 -- 工作笔记
-
CSS3实现全景图特效_html/css_WEB-ITnose