课程设计题目 | 小学生数学测试系统设计 | |||||||
姓名 |
| 学号 |
| 专业班级 |
| |||
课程设计目的 | 1、培养学生综合运用所学的知识,通过上机实践,提高分析和解决问题的能力。 2、通过实践训练,提高学生在理论计算、结构设计、查阅设计资料、运用标准与规范编程能力。 | |||||||
课程设计环境 | 硬件:装有Windows操作系统的计算机 软件:Visual C++6.0 | |||||||
课程设计任务和要求 | 面向小学生随机选择两个整数形成四则运算算式要求学生解答,最后生成作答试卷保存到文本文件。 1、电脑随机出10道题,每题10分,程序结束时显示学生得分; 2、每道题学生有三次机会输入答案,当学生输入错误答案时,提醒学生重新输入,如果三次机会结束则给出正确答案; 3、对于每道题,学生第一次输入正确答案得10分,第二次输入正确答案得7分,第三次输入正确答案得5分,否则不得分; 4、总成绩90以上显示“SMART”,80-90显示“GOOD”,70-80显示“OK”,60-70显示“PASS”,60以下“TRY AGAIN”。 | |||||||
参考 文献 | 1) 刘欣亮,李敏 主编.C语言程序设计.第二版.北京:电子工业出版社,2018. 2)谭浩强主编.C程序设计学习辅导.第五版.北京:清华大学出版社,2017. 3) 张卫国,朱宁洪 主编.C语言程序设计实践教程.西安:西安电子科技大学出版社,2019. | |||||||
时 间 进 度 安 排 | ||||||||
序号 | 起止日期 | 工 作 内 容 | ||||||
1 | 5.11-5.15 | 学习结构体、结构体数组的知识,学习文件的概念、文件的打开、关闭以及各种读写操作的知识。 | ||||||
2 | 5.18-5.22 | 学生熟悉题目背景,查阅资料;学生进行功能模块设计、实现算法的程序设计。 | ||||||
3 | 5.25-5.29 | 编码、测试、综合调试程序、程序验收。 | ||||||
4 | 5.30-6.07 | 根据设计内容形成课程设计文档,撰写课程设计报告. | ||||||
5 | 6.08 | 上交课程设计报告。 |
代码如下:
#include <stdio.h>
#include <stdlib.h> //生成随机数用
#include <time.h> //利用时间生成种子int a, b, c; //两个整数和结果
void formula(); //随机生成1道题
int calculateScore(int a, int b, int c); //计算得分
void printScore(int score); //打分int main() {
int n = 10; // 10道题
int i;
int score = 0; //设置学生初始得分为零 for (i = 0; i < n; i++) {
formula();
score += calculateScore(a, b, c);
}
printScore(score); printf("\nscore = %d\n", score); //根据情况注释掉
return 0; // formula();
}
void formula() {
int sign; srand(time(NULL)); //生成种子
a = rand() % 10;
b = rand() % 10;
sign = rand() % 4; printf("%d ", a);
switch (sign) {
case 0:
c = a + b;
printf("+");
break;
case 1:
c = a - b;
printf("-");
break;
case 2:
c = a * b;
printf("*");
break;
case 3:
c = a / b;
printf("/");
break;
default:
break;
}
printf(" %d = ?\n", b);
}
int calculateScore(int a, int b, int c) {
int i = 3, answer; for (i = 0; i < 3; i++) {
scanf("%d", &answer);
if (answer == c)
break;
printf("You are error!\n");
}
switch (i) {
case 0:
return 10;
case 1:
return 7;
case 2:
return 5;
default:
return 0;
}
}
void printScore(int score) {
if (score >= 90) {
printf("SMART\n");
} else if (score >= 80) {
printf("GOOD\n");
} else if (score >= 70) {
printf("OK\n");
} else if (score >= 60) {
printf("PASS\n");
} else {
printf("TRY AGAIN\n");
}
}
目录
1、设计题目
2、设计目的
3、问题描述
4需求分析
5功能介绍
6、运行环境
7、概要设计
8详细设计
9、调试分析
10、总结
附录:源程序清单
1、 设计题目
小学生数学测试系统设计
2、 设计目的
1、培养学生综合运用所学的知识,通过上机实践,提高分析和解决问题的能力。
2、通过实践训练,提高学生在理论计算、结构设计、查阅设计资料、运用标准与规范编程能力。
3、问题描述
本系统对加、减、乘、除测试以选择题、填空题和计算题的形式分别对用户进行测试,借此来进一步提高数学能力,节省传统测试的一系列不必要的开支和麻烦。
4需求分析
面向小学生随机选择两个整数形成四则运算算式要求学生解答,最后生成作答试卷保存到文本文件。
1、电脑随机出10道题,每题10分,程序结束时显示学生得分;
2、每道题学生有三次机会输入答案,当学生输入错误答案时,提醒学生重新输入,如果三次机会结束则给出正确答案;
3、对于每道题,学生第一次输入正确答案得10分,第二次输入正确答案得7分,第三次输入正确答案得5分,否则不得分;
4、总成绩90以上显示“SMART”,80-90显示“GOOD”,70-80显示“OK”,60-70显示“PASS”,60以下“TRY AGAIN”。
5功能介绍
1、出题:电脑随机出题。
2、答题:用户答题,每个用户有三次机会。如果三次都没有回答正确,则系统显示正确答案。
3、评分:系统根据用户的答题情况,自动对其打分,并根据其成绩将其归类。
6、运行环境
Microsoft VC++6.0及以上
7、概要设计
1、总体设计思路
【新建】建立一个新的题库,题为两位数以内加减法,并给出答案,十道题后结束,并给出评语。
【题库】建立题库,并给出答案。
【输入】每个学生有三次输入机会,并判断对错
【评分】根据评分细则,学生第一次输入正确答案得10分,第二次输入正确答案得7分,第三次输入正确答案得5分
【评语】将各题分数相加,总成绩90以上显示“SMART”,80-90显示“GOOD”,70-80显示“OK”,60-70显示“PASS”,60以下“TRY AGAIN”
【输出】输出评语和总成绩。
【保存】保存当前成绩到“试卷”文件中。
【退出】退出小学生数学测试系统设计系统。
2主函数
程序采用结构化,模块化设计。主函数是程序的入口,各模块相互独立,并且可以 分块调试,均由主函数控制调用。
3出题函数
主要完成对数字的随机抽取以及随机进行四则运算。
3、 计分检查函数
5、评判函数
6、保存函数
保存当前成绩到“试卷”文件中。
FILE *fpt;
fprintf(fpt,"%d",);
fclose(fpt,char*format,char*arg-list);
8详细设计
1、预编译部分
#include <stdio.h>
#include <stdlib.h> //生成随机数用
#include <time.h> //利用时间生成种子
4、 出题函数
随机出题,是试卷的题库。
void formula()
{
int sign;
srand(time(NULL)); //生成种子
a = rand() % 50;
b = rand() % 50;
sign = rand() % 3;
printf("%d ", a);
switch (sign)
{
case 0:
c = a + b;
printf("+");
fprintf(fpt,"%d+%d=?\n",a,b);
break;
case 1:
c = a - b;
printf("-");
fprintf(fpt,"%d-%d=?\n",a,b);
break;
case 2:
c = a * b;
printf("*");
fprintf(fpt,"%d*%d=?\n",a,b);
break;
case 3:
c = a / b;
printf("/");
fprintf(fpt,"%d/%d=?\n",a,b);
break;
default:
break;
}
printf(" %d = ?\n", b);
}
5、 计分检查函数
实现检查和打分的功能,模拟评卷人。
int calculateScore(int a, int b, int c)
{
int i = 3, answer;
for (i = 0; i < 3; i++)
{
scanf("%d", &answer);
if (answer == c)
{
fprintf(fpt,"%d\n",c);
break;
}
if(answer!=c)
printf("You are error!\n");
fprintf(fpt,"%d\n",answer);
fprintf(fpt,"You are error!\n");
}
if(i==3)
{
printf("正确答案是%d\n",c);
fprintf(fpt,"正确答案是%d\n",c);
}
switch (i)
{
case 0:
return 10;
case 1:
return 7;
case 2:
return 5;
default:
return 0;
}
}
4、评判函数
根据所得的分数,选出优劣之分。
void printScore(int score)
{
if (score >= 90)
{
printf("SMART\n");
fprintf(fpt,"SMART");
}
else if (score >= 80)
{
printf("GOOD\n");
fprintf(fpt,"GOOD");
}
else if (score >= 70)
{
printf("OK\n");
fprintf(fpt,"OK");
}
else if (score >= 60)
{
printf("PASS\n");
fprintf(fpt,"PASS");
}
else
{
printf("TRY AGAIN\n");
fprintf(fpt,"TRY AGAIN");
}
}
5、主函数
程序采用结构化,模块化设计。主函数是程序的入口,各模块相互独立,并且可以 分块调试,均由主函数控制调用。
int main()
{
int n = 10; // 10道题
int i;
int score = 0; //设置学生初始得分为零
fpt = fopen("试卷.txt","w");
for (i = 0; i < n; i++)
{
formula();
score += calculateScore(a, b, c);
}
printScore(score);
printf("\nscore = %d\n", score); //根据情况注释掉
fprintf(fpt,"总成绩为%d",score);
fclose(fpt);
return 0;
// formula();
}
9、调试分析
以下为程序运行的界面
此时的程序答题有4次机会,且全部回答错误后,没有显示正确答案。故程序此时有问题。
此时答题机会只有一次,不符合要求,仍需调试。需要修改检查函数的部分参数。
回答机会只有一次,且给出的答案也不对。
此时每次回答正确,均会显示正确答案,仍不符合要求。
此时虽会显示正确答案,但有4次机会。不符合要求。且不能保存。
此时回答错误直接给出正确答案,没有给答题者改正的机会。但不能实现保存功能。因此还需要添加fprintf函数和文件指针。
此次调试解决了回答次数和正确答案显示的问题。但不能实现保存功能。
试卷可以自动保存在文本里。
文本内容和程序执行完成后的内容一致,调试完成。
10、总结
C语言是计算机程序设计的重要理论基础,在我们以后的学习和工作中都有着十分重要的.地位。要学好这种语言,仅仅学习课本上的知识是不够的,还要经常自己动手,有较强的实践能力。
只有多动手,经常编写程序,才能发现我们学习上的漏洞和自己的不足,并在实践中解决这些问题,不断提高自己转化知识的能力。在我们小组有解决不了的问题时,我们会主动查阅相关的资料,或向其他同学询问,这不仅丰富了我们的知识,还增进了我们同学之间的友谊。课时不注重对文件的运用,所以在这方面有较大的困难。我先将书本认认真真地看了一-遍,又做了一下课后习题来验证和增进自己的理解,终于,经过我们的不懈努力,我们小组的程序有了突破。
课程设计到此算是基本结束,在程序设计中 暴露出的我自身的问题却是非常明显。
首先,基础掌握不牢固。许多基本语法尚没有熟练掌握,在设计过程中仍需 请教其它同学,更要重新研究课本,设计效率低。 其次,经典算法掌握不牢。在编写程序的时候常常会停下来求助于书本,查 看各种算法。 再次,程序量过大的时候,头绪理不清。杂乱无章,无系统性,不便调试和 阅览,自己也易于出错。比如说少加分号,大括号,忘了先定义后使用的原则。 回顾这几天,我感慨颇多,的确,自从拿到题目到完成整个编程,从理论到实践,
可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了 很多在书本上所没有学到过的知识。通过这次课程设计使我们懂得了理论与实际 相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践 相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动 手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这 毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自 己的不足之处,对一些前面学过的知识理解得不够深刻,掌握得不够牢固,比如 说结构体,指针,文件,函数…通过这次课程设计之后,我们把前面所学过的知识又重新温故了一遍。
这次课程设计终于顺利完成了,在设计中遇到了很多编程问题,最后在老师的辛勤指导下。最后,对给过我帮助的所有同学和指导老师再次表示忠心的感谢!
附录:源程序清单
#include <stdio.h>
#include <stdlib.h> //生成随机数用
#include <time.h> //利用时间生成种子
int a, b, c; //两个整数和结果
void formula(); //随机生成1道题
int calculateScore(int a, int b, int c); //计算得分
void printScore(int score); //打分
FILE *fpt;
//主函数
int main()
{
int n = 10; // 10道题
int i;
int score = 0; //设置学生初始得分为零
fpt = fopen("试卷.txt","w");
for (i = 0; i < n; i++)
{
formula();
score += calculateScore(a, b, c);
}
printScore(score);
printf("\nscore = %d\n", score); //根据情况注释掉
fprintf(fpt,"总成绩为%d",score);
fclose(fpt);
return 0;
// formula();
}
//出题函数
void formula()
{
int sign;
srand(time(NULL)); //生成种子
a = rand() % 50;
b = rand() % 50;
sign = rand() % 3;
printf("%d ", a);
switch (sign)
{
case 0:
c = a + b;
printf("+");
fprintf(fpt,"%d+%d=?\n",a,b);
break;
case 1:
c = a - b;
printf("-");
fprintf(fpt,"%d-%d=?\n",a,b);
break;
case 2:
c = a * b;
printf("*");
fprintf(fpt,"%d*%d=?\n",a,b);
break;
case 3:
c = a / b;
printf("/");
fprintf(fpt,"%d/%d=?\n",a,b);
break;
default:
break;
}
printf(" %d = ?\n", b);
}
//计分检查函数
int calculateScore(int a, int b, int c)
{
int i = 3, answer;
for (i = 0; i < 3; i++)
{
scanf("%d", &answer);
if (answer == c)
{
fprintf(fpt,"%d\n",c);
break;
}
if(answer!=c)
printf("You are error!\n");
fprintf(fpt,"%d\n",answer);
fprintf(fpt,"You are error!\n");
}
if(i==3)
{
printf("正确答案是%d\n",c);
fprintf(fpt,"正确答案是%d\n",c);
}
switch (i)
{
case 0:
return 10;
case 1:
return 7;
case 2:
return 5;
default:
return 0;
}
}
//评判函数
void printScore(int score)
{
if (score >= 90)
{
printf("SMART\n");
fprintf(fpt,"SMART");
}
else if (score >= 80)
{
printf("GOOD\n");
fprintf(fpt,"GOOD");
}
else if (score >= 70)
{
printf("OK\n");
fprintf(fpt,"OK");
}
else if (score >= 60)
{
printf("PASS\n");
fprintf(fpt,"PASS");
}
else
{
printf("TRY AGAIN\n");
fprintf(fpt,"TRY AGAIN");
}
}