
一、课程设计时间
20010~11第2学期第15周,共计1周,20学时。
二、课程设计内容
用C语言编写软件完成以下任务:
1在程序界面录入题库,试题具有加、减、乘、除等运算功能;
2 随机抽题并验证结果。
3 统计测验成绩(可以包括:测试题总数、正确数量、正确率等)。
三、课程设计要求
1. 程序质量:
●贯彻结构化程序设计思想。
●用户界面友好,功能明确,操作方便;可以加以其它功能或修饰。
●用户界面中的菜单至少应包括“题库录入”、“随机抽题”、“统计测
验成绩”、“退出”4项。
●代码应适当缩进,并给出必要的注释,以增强程序的可读性。
2. 课程设计说明书:
课程结束后,上交课程设计说明书和源程序。课程设计说明书的格式和内容参见提供的模板。
四、指导教师和学生签字
指导教师:________ 学生签名:________
五、成绩
六、教师评语目录
一、需求分析 (1)
二、设计分析 (1)
三、主要界面截图 (5)
四、技术要点 (6)
五、个人总结 (8)
六、参考文献 (9)
七、源程序 (9)一、需求分析
经过对程序设计题目的分析可知,整个程序的设计实现大致分为三个模块,其中每一个模块对应一个函数,他们的功能分别是:题库录入,随机抽题,成绩统计,其中题库录入和成绩统计严格按照题目的要求,随机抽题函数则可被成绩统计函数所调用。
1、题库录入主要实现程序运行时学生可以自己向题
库存储题目,每存完一题时系统提示是否继续,学
生可自己选择。
2、随机抽题主要实现程序运行时学生可以从自己输
入的题库中抽题,并验证是否正确。
3、成绩统计运行该函数时由电脑从题库中随机出题,
并验证是否正确,测验结束后统计正确数,并输出
正确率。
二、设计分析
1、程序总体结构图(传统流程图或N-S框图)
图1程序总体结构图
2、主要功能模块框图(传统流程图或N-S框图)
(1)题目读取
(2)题目保存
(3)题库录入
(4)随机抽题
(5)成绩统计
三、主要界面截图
图1 程序主界面
图2 程序应用界面
四、技术要点
本程序主要由五个自定义函数和一个主函数组成,其
1、结构体的应用
typedef struct problem{
int a;
char op;
int b;
}problem;
problem* prob=NULL;
int problemNumber=0;
2、文件操作
包括了文件的写入和读取两个方面。文件的写入操作,用于保存录入题目,文件的读取操作用于从题库中抽取试题。
文件的写入
void saveToFile(){ //保存试题到文件中
FILE *fp;
int i=0;
if((fp=fopen("D:\\\\problems.txt
printf("读取题目文件失败\\n");
}
for(i=0;i fprintf(fp," %d%c%d } } 文件的读取 void readFile(){ FILE *fp; if((fp=fopen("D:\\\\problems.txt printf("读取题目文件失败\\n"); } prob=(problem*)malloc(100*sizeof(problem)); //初始化结构体,用于存储题目。初始容量为100题 problemNumber=0; //记录题目数为零 while (!feof(fp)) { fscanf(fp,"%d%c%d problemNumber++; //题目数加1 if(problemNumber%100==0){ //结构体初始时,只能存储100题,每当题目多余100的整数倍后,空间重新增加以下 prob=(problem*)realloc(prob,(problemNumber+100)*sizeof(problem)); } } fclose(fp); } 五、个人总结 经过这次为期一周的课程设计,对以前学习的C语言知识进行了巩固,感到了以前自己掌握的知识的匮乏,重新学习到了一些新的C语言编程语句,也强化了自己的逻辑思维,在用模块化编程的过程当中,我有了一个编程的大体思路,先从大体上分析程序所要实现的体功能,对整个程序有一个宏观上的思路,然后再据具体的功能,选用恰当的,简单的语句把所需要的子程序编辑出来,最后用一些衔接语句把整个程序联系起来,最终实现其功能。期间通过跟同学们探讨,向老师请教,终于把程序完成了。经过一周的努力,我学会了把理论应用到实际中去,也明白了互相帮助的重要性,这次课程设计是个挑战,更是个锻炼,对我们今后的学习、工作和生活都有很大帮助,我有信心面对困难并最终取得成功。 六、参考文献 (参考的书籍或互联网资源) 1 谭浩强.C程序设计.北京:清华大学出版社,2005 2 刘成等.C语言程序设计实验指导与习题集.北京:中国铁道出版社,2006 七、源程序 #include  #include  typedef struct  problem{ int a; //左操作数 char op; //操作符 int b; //右操作数 }problem; problem* prob=NULL; //结构体数组,保存题目信息 int  problemNumber=0; //记录题目总数void readFile(){ FILE *fp; if((fp=fopen("D:\\\\problems.txt printf("读取题目文件失败\\n"); } prob=(problem*)malloc(100*sizeof(problem)); //初始化结构体,用于存储题目。初始容量为100题 problemNumber=0; //记录题目数为零 while (!feof(fp)) { fscanf(fp,"%d%c%d problemNumber++; //题目数加1 if(problemNumber%100==0){ //结构体初始时,只能存储100题,每当题目多余100的整数倍后,空间重新增加以下 prob=(problem*)realloc(prob,(problemNumber+100)*sizeof(proble m)); } } fclose(fp); } void saveToFile(){ //保存试题到文件中 FILE *fp; int i=0; if((fp=fopen("D:\\\\problems.txt printf("读取题目文件失败\\n"); } for(i=0;i fprintf(fp," %d%c%d } fclose(fp); } void addProblem(){ int flag=1; while(flag!=0){ printf("输入题目:"); scanf("%d%c%d if(prob[problemNumber].op=='/'&&prob[problemNumber].b==0){//检测除法时,除数不能为0 printf("除数不能为零!!!\\n"); flag=1; continue; } if(prob[problemNumber].op=='-'&&prob[problemNumber].b>prob[pr oblemNumber].a){//检测减法时,结果不能为负数 printf("减法结果不能为负数!!!\\n"); flag=1; continue; } problemNumber++; printf("是否继续?(按‘0’退出,其他数字键继续):");scanf("%d } } //随机测试一题 int randomTest(){ int pChoice; //记录随机产生题目号 int answer; //储存测试者的答案 int correctAnswer;//储存正确答案 pChoice=rand()%problemNumber; printf("%d%c%d= scanf("%d if(prob[pChoice].op=='+'){//加法运算 correctAnswer=prob[pChoice].a+prob[pChoice].b; }else if(prob[pChoice].op=='-'){//减法运算 correctAnswer=prob[pChoice].a-prob[pChoice].b; }else if(prob[pChoice].op=='*'){//乘法运算 correctAnswer=prob[pChoice].a*prob[pChoice].b; }else if(prob[pChoice].op=='/'){//除法运算correctAnswer=prob[pChoice].a/prob[pChoice].b; }else{ printf("题目有误!\\n"); return -1; } if(correctAnswer==answer){ printf("回答正确!\\n"); return 1; }else{ printf("您的答案不正确哦! %d%c%d=%d\\n return 0; } } void test(){ //测试函数,每次测试10题 int flag=1; int count=0; int correct=0; //记录回答正确的题目数 int result; //记录每次测试的结果 while(flag!=0){ result=randomTest(); if(result==1) //回答正确,correct加1 correct++; if(result!=-1) count++;//回答的题目总数加1printf("是否继续?(按‘0’退出,其他数字键继续):"); scanf("%d } printf("\\n您回答了%d题,回答正确%d题,正确率为%0.2f%%\\n } void main(){ int choice=0; srand((unsigned)time(0)); readFile(); //将试题从文件中读出 printf("\\n******************小学生实用CAI教学软件**********************************\\n\\n\\n"); do{ printf("\\n ******************1:题库录入*********************\\n"); printf("\\n ******************2:随机抽题*********************\\n"); printf("\\n ******************3:统计测验成绩******************\\n"); printf("\\n ******************4:退出**************************\\n"); printf("\\n请输入您要选择的操作序号,按回车键确认:"); printf("请选择:"); scanf("%d switch(choice) {case 1: addProblem(); break; case 2: randomTest(); break; case 3: test(); break; case 4: saveToFile(); //将试题写入文件中 free(prob); exit(0); default:break; } }while (1); }
