程序设计题:小学 100 以内正整数加减运算
1 问题描述
设计并实现“小学 100 以内整数加减运算”系统,程序要求如下:
(1)随机出 10 道题,这 10 道题目不能重复,如果是减法运算,要求被减数大于减数。
(2)这些题目,可以选择以下两种方式中的一种给出:
a.选择题,要求随机生成 4 个选项,正确答案包含其中;
b.填空题,可以让用户从键盘输入答案。 (3)用户每次答题,能根据答案计算是否得分,并计入总分。 (4)答题完毕,系统给出总用时。
(5)根据答题情况,能将用户的错误作答题目及答案保存,可以提供用户查看错题功能
2 功能要求
代码要能提供以下几个基本功能。
(1)提供菜单选项,让用户登录,答题。
(2)提供菜单选项,让用户查阅答题情况,答题期间不能查阅。
(3)提供菜单选项,错题再答,如果错题答对了,应从错题集中删除。
(4)提供菜单选项,可以选择生成题目到文本文件,同时生成所对应的答案到相应的
文本文件,以便线下测试。
选做要求: (1)在运算中添加括号,比如 5-(95-93),系统也能正确算出答案。 (2)在菜单选项中,增加帮助功能,提供系统使用说明,模拟答题功能。
3 其他要求
(1)界面美观,交互方便。
(2)注释详细:每个变量都要求有注释说明用途;函数有注释说明功能,对参数、返回值也要以注释的形式说明用途;关键的语句段要求有注释解释。
(3)程序的层次清晰,可读性强。
(4)变量、函数命名符合规范。
(5)如有可能,可使用 MFC 等开发工具,实现彩色或图形操作界面。
4 开发环境
可以选择 TC2.0、TC3.0、VC++6.0 等开发环境,或者与老师讨论,选择自己熟悉的开发工具与平台。
#define _CRT_SECURE_NO_WARNINGS //在VS中使用 避免出现scanf printf不安全的警告
/*********头文件************/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<windows.h>
/*********宏定义************/
#define TITLE_NUM 10 //每次测试的出题量
#define MAX_NUM 100 //出的题目数字范围 x + y = z x - y = z 0<=x,y,z <= MAX_NUM
/*********题目结构体************/
typedef struct _Title
{
int opt_num1;//操作数1
int opt_num2;//操作数2
int opt_ch;//操作符0代表+ 1代表-
int style;//0代表选择题 1代表填空题
int correct_ans;//如果是选择保存的是正确选项 如果是填空保存正确答案
int user_ans;//记录用户的答案
int choice[4];//随机生成的4个答案 不重复 其中一个为正确答案
}Title;
/********主菜单*********/
/*choice记录用户的选择*/
/*返回值:返回用户的选择*/
int Main_Menu()
{
int choice;
system("cls");//清空屏幕输出
printf("1:登录答题\n");
printf("2:查阅答题\n");
printf("3:错题再答\n");
printf("4:打印试卷\n");
printf("0:退出系统\n");
printf("请输入选项:");
scanf("%d", &choice);//获取选择
while (choice < 0 || choice>4)//判断输入的选择是否在0--4之间 不是的话重新输入
{
printf("请重新输入选项:");
scanf("%d", &choice);
}
return choice;//返回选择
}
/**********生成选择题*********/
/*参数1 Title title[]:已经答过的题目数组,记录新生成的题目*/
/*参数2 int n: 已答题的数量,即数组当前长度*/
void Creat_Choice_Title(Title title[], int n)
{
int i, j;//循环迭代使用
title[n].style = 0;//题目类型为选择题
do
{
title[n].opt_num1 = rand() % MAX_NUM;//随机生成操作数1
title[n].opt_num2 = rand() % MAX_NUM;//随机生成操作数2
title[n].opt_ch = rand() % 2;//随机生成操作符
switch (title[n].opt_ch)//根据操作符 生成正确答案等
{
case 0://加法的情况
if (title[n].opt_num1 + title[n].opt_num2 <= MAX_NUM)//确保结果在100以内
{
title[n].correct_ans = title[n].opt_num1 + title[n].opt_num2;//得到正确答案
for (i = 0; i < 4; i++)//随机生成4个选项
{
title[n].choice[i] = rand() % MAX_NUM;
while (title[n].choice[i] == title[n].correct_ans)//确保随机生成的选项与答案不重复
{
title[n].choice[i] = rand() % MAX_NUM;//重复就重新生成
}
for (j = 0; j < i; j++)//确保和之前已经生成的选项不重复
{
if (title[n].choice[i] == title[n].choice[j])//重复也重新生成
{
i--;
break;
}
}
}
title[n].correct_ans = rand() % 4;//随机选择一个选项作为正确答案
title[n].choice[title[n].correct_ans] = title[n].opt_num1 + title[n].opt_num2;//把答案放在正确选项的位置
return;
}
break;
case 1://减法的情况
if (title[n].opt_num1 - title[n].opt_num2 >= 0)//确保答案大于0
{
title[n].correct_ans = title[n].opt_num1 - title[n].opt_num2;//获取正确答案
for (i = 0; i < 4; i++)//随机生成4个选项
{
title[n].choice[i] = rand() % MAX_NUM;
while (title[n].choice[i] == title[n].correct_ans)//确保随机生成的选项与答案不重复
{
title[n].choice[i]