课程设计题目

小学生数学测试系统设计

姓名

 

学号

 

专业班级

 

课程设计目的

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");
    }
}

小学生数学考试自动系统java 小学生数学测验系统_i++

 

 

 

目录

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”

【输出】输出评语和总成绩。

【保存】保存当前成绩到“试卷”文件中。

【退出】退出小学生数学测试系统设计系统。

小学生数学考试自动系统java 小学生数学测验系统_主函数_02

2主函数

程序采用结构化,模块化设计。主函数是程序的入口,各模块相互独立,并且可以 分块调试,均由主函数控制调用。

小学生数学考试自动系统java 小学生数学测验系统_#include_03

3出题函数

主要完成对数字的随机抽取以及随机进行四则运算。

小学生数学考试自动系统java 小学生数学测验系统_小学生数学考试自动系统java_04

 

3、 计分检查函数

小学生数学考试自动系统java 小学生数学测验系统_小学生数学考试自动系统java_05

5、评判函数

 

小学生数学考试自动系统java 小学生数学测验系统_i++_06

 

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、调试分析

以下为程序运行的界面

 

小学生数学考试自动系统java 小学生数学测验系统_小学生数学考试自动系统java_07

 

 

  

此时的程序答题有4次机会,且全部回答错误后,没有显示正确答案。故程序此时有问题。

 

小学生数学考试自动系统java 小学生数学测验系统_小学生数学考试自动系统java_08

 

 

此时答题机会只有一次,不符合要求,仍需调试。需要修改检查函数的部分参数。

 

小学生数学考试自动系统java 小学生数学测验系统_主函数_09

 

  回答机会只有一次,且给出的答案也不对。

 

小学生数学考试自动系统java 小学生数学测验系统_#include_10

 

 

此时每次回答正确,均会显示正确答案,仍不符合要求。

 

小学生数学考试自动系统java 小学生数学测验系统_i++_11

 

 

此时虽会显示正确答案,但有4次机会。不符合要求。且不能保存。

小学生数学考试自动系统java 小学生数学测验系统_i++_12

 

  

此时回答错误直接给出正确答案,没有给答题者改正的机会。但不能实现保存功能。因此还需要添加fprintf函数和文件指针。

 

小学生数学考试自动系统java 小学生数学测验系统_小学生数学考试自动系统java_13

 

此次调试解决了回答次数和正确答案显示的问题。但不能实现保存功能。

 

 

小学生数学考试自动系统java 小学生数学测验系统_小学生数学考试自动系统java_14

 

 

小学生数学考试自动系统java 小学生数学测验系统_小学生数学考试自动系统java_15

 

 

 

小学生数学考试自动系统java 小学生数学测验系统_小学生数学考试自动系统java_16

 

 

试卷可以自动保存在文本里。

 

 

小学生数学考试自动系统java 小学生数学测验系统_i++_17

 

 

小学生数学考试自动系统java 小学生数学测验系统_主函数_18

 

  

  文本内容和程序执行完成后的内容一致,调试完成。

 

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");
 }
}