长春大学
在linux系统下用C语言实现
小学算术运算测试程序
XX大学软件学院
小学算术运算测试程序
1、题目与要求
我计划编写的题目是:小学算术运算测试程序。制作一个可供小学数算的程序:10 以内加减法,能根据输入题数出题,判断题是否正确,最后计算分数。并用 make 工程管理器编译,编写 makefile 文件。
2、内容及主要任务
小学算术运算测试程序: 要求完成 10 以内的加减运算。能根据用户 输入的想要练 习的题目数自行出题。用户输入答案后可以判断正误,并能给出算对及算错的题目数,最后 计算出分数。同时,对于用户算错的题目会发出报警声,提示用户注意,同时给出正确结果。做完一次测试后用户可决定是否继续进行下一次测试。
3、题目设计意义
通过本课题的毕业设计, 熟悉了关于 linux 下 C 语言的系统软件程序设计, 可以比较 深入的了解和掌握 WINSOCK 控件基本属性、方法和事件,理解 网络聊天通信的概念,输控 制协议(TCP)进行数据交流,初步掌握网络聊天通信程序的设计方法。 并
长春大学
能巩固和扩展大 学期间的学习内容,进行项目的设计开发训练,更好的适应社会的需求。随着计算机网络技术的快速发展,人们的交流方式越来越多,传统的通信方式在速度 和可靠性方面已经很难满足人们的需要,即时通信系统已成为人们的新宠。同时,即时通信 系统对现代企业也有着重大意义,它为诸企业开拓了网络应用的新领域。自从它诞生以来,以实时交互、资费低廉等优点,受到广大个人用户的喜爱,已经成为网络生活中不可或缺的 一部分。本着学以致用的原则,本人开发了这套多点聊天系统,以满足网络用户的通讯需求。 该系统具有操作简单、界面友好、功能专一等特点。本报告就系统的开发过程做了详细的介绍,并对系统的原理、总体设计等方面做了深入细致的讨论。
4、主要内容
本程序共分为五个模块:出题模块、答题模块、检查计分模块、评分模块和评价模块; 下面分别对这五个模块的算法做一下介绍。
(1)出题模块:
一个答题系统自然而然首先就是要有题目且能够根据条件出题; 在本模块 中,首先设了一个含有 15 个指针的指针数组,指针数组里的每个指针都指向了相应题号的 1 选择题,这样就实现了对题目的储存;然后用 scanf 函数来实现从键盘上输入题号,用 if 语句控制输题的范围;题号不在 1--15 的范围内就提示选题出错;在输入题号的过程中输 入相同题号是在所难免的;但 是在答题系统中输入相同题号显然没有意义,所以另外设了 一个静态一维数组来储存已输过的题号; 且数组的第一个元素初始化为 0, 然后每输入一个 题号就赋给这个数组,同时用 for 语句来使当前的题号一一与储存在一维数组中已输过的 题号进行比较,如题号有相同,就提示重答,重答的功能是通过对出题模块函数的递归调用 来实现的, 如题号没有相同, 就通过输入的题号借助指针数组里的指针找到与题
长春大学
号对应的选 择题, puts 函数来实现对选择题的输出; 用 最后用 return 语句将其他模块返回来每道题 的小分数返回到主函数中(在主函 数中调用出题模块函数)。
(2)答题模块:
出完题后自然是从键盘上输入答案了,在本模块中,提示输入答案后,用 scanf 函数来实现使从键盘上输入的一个答案选项(A、B、C、D) 赋给一个用来记录答案的 字符变量;用 return 语句将这个变量返回到出题模块中。
(3)检查计分模块:
输入答案选项后,就要判断答案的正确性和计分了, 在本模块中, 要设 一个字符数组来储存每道题的正确答案; if 语句来控制在答题模块中输入的答案是否为 用 A、B、C、D 中的某一个;若不是,就提示选的答案不在答案范围内,若是,根据在出题模块 中输的题号使在答题模块中输入的答案选项与储存正确答案数组中的相应答案选项相比较, 若相同,就提示答案正确, 与此同时用变量记录下这道题所得的小分, 否则,就提示答案错误 并给出当前题目的正确答案, 不计分; return 语句将得分返回到出题系统中(在出题 模 用 块函数中调用检查计分模块函数)。
(4)评分模块:
做完题后,就要根据做题的对错个数来评分;在本模块中,首先就要提示题 目全做完, switch 语句根据总小分来选择性地选出 11 个不同的分数中的一个分数, 用 并且 打印出该分数 (在主函数中调用评分模块函数) 。
长春大学
(5)评价模块:
最后一步就是要根据不同的总得分段来给出不同的评语, 在本模块中用 if 语句根据不同的总分数段来打印出不同的评语(在主函数中调 用评价模块函数) 。 主函数将这五个模块直接地或间接地联系在一起, 使它们构成本程序, 现在就来介绍主 函数的算法。主函数对出题模块函数、评价模块函数进行了调用;首先提示开始答题,为了 要答 10 次题, 就要设一个 for 语句来控制对出题模块函数调用的次数,即需要答一定次数 的题, 与此同时用一个变量来累加由出题模块函数返回来每道题的小分数; 接下来分别对评 分模块函数和评价模块函数进行调用。 以上就是对本程序算法的介绍。
5、程序结构及主要过程
(1)本程序共包含了顺序结构、选择结构、循环结构三种在 C 程序中的主要结构,其中 穿插了数组(一维数组、字符数组)、指针 (指针数组)、函数调用(递归调用)等知识,该程 序覆盖了本学期所学的除结构体外的大部分知识。
(2)本程序结构和过程思路如下:为了要答题,首先要有题目,设一个指针数组来实现;把相应的题目调出,应用指针的功能实现;调出题目后,就要给用户答题了,用一个输入函数实现;再经过系统的判断,用一个字符数组储存正确答案结合判断语句实现;最后累加计分,用循环结构实现。
(3)总之,该程序的总体结构和过程很好的体现了现在所提倡的对一个程序结构模块化的思想。
6、程序模块功能说明
长春大学
本程序一共有五个模块,它们分别是:出题模块(question_out()),答 题 模 块 (answer()),检查计分模块(check()),评分模块(count()),评价模块 (assessment()),现在就来分别介绍这五个模块的功能。
(1)出题模块(question_out()):这一模块主要负责对题目的储存和调出这两个功能。
(2)答题模块(answer()):这一模块主要负责将用户端的答案通过键盘输入到系统。
(3)检查计分模块(check()):这一模块主要负责检查判断用户所提供的答案是否正确并 根据它来记录每题所的总分。
(4)评分模块(count()):这一模块主要负责统计总得分并打印。
(5)评价模块(assessment()) :这一模块主要负责根据给出的总得分打印相应的评语。
总之这五个模块都有着各自的功能且互相联系,五者在程序中缺一不可。
7、makefile 介绍
(1)Makefile 文件介绍 Makefile 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile 定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile 就像一个Shell 脚本一 样,其中也可以执行操作系统的命令。
(2)makefile 主要功能 Make 工具最主要也是最基本的功能就是通过 makefile文
长春大学
件来描述源程序之间的相互关 系并自动维护编译工作。而 makefile文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并连接生成可执行文件,并要求定义源文件之间的依赖关系。 makefile 文 件是许多编译器--包括 Windows NT下的编译器--维护编译信息的常用方法,只是在集成开发环境中,用户通过友好的界面修改makefil 文件而已。
(3)自动化编译 Makefile 带来的好处就是——“自动化编译” ,一旦写好,只需要一个make 命令,整个工程完全自动编译,极大的提高了软件开发的效率。make 是一个命令工具,是一个解释 makefile 中指令的命令工具,一般来说,大多数的IDE 都有这个命令,比如:Delphi的make,Visual C++的 nmake,Linux下GNU 的make。可见,makefile 都成为了一种在工程方面的编 译方法。
8、makefile 规则
makefile 中的规则是这样的:
TARGET … : DEPENDENCIES … COMMAND … 目标(TARGET)程序产生的文件,如可执行文件和目标文件;目标也可以是要执行的 动作,如“clean” 。 依赖
(DEPENDENCIES)是用来产生目标的输入文件,一个目标通常依赖于多个文件。 命令(COMMAND)是 make 执行的动作,一个可以有多个命令,每个占一行。注意:每 个命令行的起始字符必须为 TAB 字符!有依赖关系规则中的命令通常在依赖文件变化时负责产生 target 文件,make 执行这 些命令更新或产生 target。规则可以没有依赖关系,如包含 target “clean”的规则。 规则解释如何和何时重做该规则中的文件,make 根据依赖关系执行产生或更新目标; 规则也说明如何和何时执行动作。有的规则看起来很复杂,但都符合上述模式。 makefile 中的规则描述如何生成特定的文件,即规则的目标。
长春大学
规则列出了目标的依赖 文件,指定生成或更新目标的命令。规则的次序是不重要的,除非是确定缺省目标:缺省目 标是第一个 makefile 中的第一个规则; 如果第一个规则有多个目标,第一个目标是缺省的。有两个例外:以’.’开头的目标不是缺省目标;模式规则对缺省目标没有影响。通常我们 所写的地一个规则是编译整个或 makefile 中指定的所有程序。
9、Makefile 文件
main:main.o input.o chuti.o
gcc main.o input.o chuti.o -o main
main.o:main.c myhead.h
gcc -c main.c
input.o:main.c
gcc -c input.c
chuti.o:main.c
gcc -c chuti.c
10、源程序
长春大学
#include #include void function( ){
int index,itest_total,N=200;
int iflag,num1,num2,itotal,iarrsum[200],iarranswer[200],iarrop[4]; itotal=0;
printf(\"请输入题数:\\n\");
scanf(\"%d\
for(index=0;index{iflag=rand()%4+1;
switch(iflag)
{
case 1:
长春大学
num1=rand()%10;
num2=rand()%10;
iarrsum[index]=num1+num2;
printf(\"%d+%d=\\n\
break;
case 2:
num1=rand()%10;
num2=rand()%10;
iarrsum[index]=num1-num2;
printf(\"%d-%d=\\n\
break;
case 3:
num1=rand()%10;
长春大学
num2=rand()%10;
iarrsum[index]=num1*num2;
printf(\"%d*%d=\\n\
break;
case 4:
num1=rand()%10;
num2=rand()%10;
4 iarrsum[index]=num1/num2;
printf(\"%d/%d=\\n\
break;
default:
break;
}
长春大学
}
printf(\"依次输入每题的答案:\\n\"); for(index=0;index{scanf(\"%d\
getchar();
if(iarranswer[index]==iarrsum[index])
itotal++;
}
}
printf(\"正确率:%f%%\\n\
}
int main()
{
长春大学
char flag; //开始有一轮测试,以后根据用户的输入开始新一轮测试或结束测试;
do{
function();
printf(\"请输入'Y'表示开始新一轮测试,其他字母表示结束测试:\\n\"); scanf(\"%c\
}while(flag!= 'Y');
return 0; }
11、结果分析
这是一个小学数算测试程序,要求完成 10 以内的加减运算。能根据用户输入的想要练习的题目数自行出题。用户输入答案后可以判断正误,并能给出算对及算错的题目数,最后计算出分数。同时,对于用户算错的题目会发出报警声,提示用户注意,同时给出正确 结果 做完一次测试后用户可决定是否继续进行下一次测试。该程序基本实现了以上功能,且计算结果合理正确,满足实验要求。