C语言集中上机报告Word下载.docx
《C语言集中上机报告Word下载.docx》由会员分享,可在线阅读,更多相关《C语言集中上机报告Word下载.docx(25页珍藏版)》请在冰豆网上搜索。
voidadd();
(3)显示所有试题。
voidshow(void)
(4)修改题库。
voidmodify(void)
(5)删除试题。
voiddel(void)
(6)退出并保存。
voidsave()
该程序主要的设计思想就是处理一系列的链表。
包括链表的新建、查询、删除、保存等。
还有一些基本的算法。
二总体方案设计
首先,采用了模块化的编程思想,把每一个功能都单独写到各个函数中。
具体来说,本程序有一个主函数main,显示菜单的函数menu,增加题库的函数,抽取试题的函数,输入用户答案的函数,查看标准答案的函数,用户打分的函数共N个函数。
这个程序主要解决的关键性问题就是使用文件操作来对试题进行各种管理,包括增加数据、查看数据等。
本程序的整体框图如下:
三详细设计
1.主函数部分:
通过调用menu函数,返回一个整数,然后用多重选择switch来选择相关的操作。
2.菜单函数部分:
通过输入选择的序号返回主函数相应的整数。
3.把文件读入链表部分:
首先打开文件,如果文件为空,则提示题库为空,否则就通过fscanf把文件中的信息输出到链表。
4.录入试题部分:
malloc开辟空间,输入相关资料,因为定义的head为全局变量,所以函数不需要传递参数,通过head即可完成传递。
5.显示所有试题部分:
从head开始,通过循环逐个显示,指导head->
next==NULL。
6.用户选题、答题、评分部分:
用户选题通过rand()函数产生一个随机数,这个随机数作为选题的标准。
选题后有就是用户答题,通过输入答题选项与正确选项比较,若答题正确,则给与相应的分数,否则不给分。
7.修改试题部分:
先输入要修改题目的代号,通过循环寻找该题目,找到题目后重新输入该节点对应的各个字符串。
8.删除试题部分:
跟修改试题一样,也是先通过循环找到该题目,然后将只向该题目的节点只向下一个。
9.退出保存部分:
通过选择询问用户是否保存,这里的保存是指对录入试题的保存,如果保存,则将链表中的函数写到文件中。
四程序的调试及运行结果说明
程序运行一开始:
因为这里还没有创建文件,所以提示题库为空,下面是从运行结果标记复制来的调试结果:
题库为空~!
/********************************/
/****1.试题录入****/
/****2.试题抽取****/
/****3.show所有试题****/
/****4.修改试题****/
/****5.删除题目*****
/****6.答题*****
/****7.评分*****
/****0.退出****/
请选择:
1
请输入题目编号:
请输入题目:
1+1=?
请输入选项A:
请输入选项B:
2
请输入选项C:
3
请输入选项D:
4
请输入标准答案:
B
()
A:
1B:
C:
3D:
请输入要选择的题目数N:
6
题1:
请输入你的答案:
A
你输入的答案是:
7
你所得的分数如下:
0.000000
请输入你要查找题目的编号:
你要修改的题目信息如下:
编号题目备选答案A备选答案B备选答案C备选答案D
标准答案
11+1=?
1234
请输入一个题目编号:
请输入新的题目:
2+2=?
请输入新的备选答案A:
请输入新的备选答案B:
请输入新的备选答案C:
请输入新的备选答案D:
请输入新的标准答案:
D
你修改后的题目信息如下:
5
你要删除的题目信息如下:
11+1=?
12
34
0
要保存吗?
Y/N
Y
保存成功~!
!
Pressanykeytocontinue.
五课程设计总结
该程序目前基本上达到了题目的要求,实现了试题的录入,试题的抽取,答题并判卷。
并且还增加了几个功能,比如试题的删除,试题的修改查询,进一步设想是想实现程序的排序功能,比如按照题目编号进行排序,还可以实现权限的访问,通过设置密码来实现对录入试题或查询答案的权限控制。
六后记
通过这一周的上机实验,使我对c语言有了更进一步的认识,想要学好它,必须注重实践。
这道题达到了题目的要求,功能齐全。
程序中运行时输入的数据排列整齐,具有很好的美感。
每一步骤严密性很好,连接紧凑,输入输出间隔清晰。
不足之处:
就是修改函数不够完善。
可以再设计一个菜单用于显示修改函数这部分。
可以实现要修改哪个数据,就直接找到该数据进行修改。
如果再加一个菜单函数,程序将变得很复杂,如果出错,就不易于修改。
但总的来说,自己还是受益匪浅。
首先,该程序涉及到的知识很多,自己在编写程序时对各个知识又做了进一步的复习付诸于实践,自己的基本知识变得更加牢固了。
其次,在编写过程中锻炼了自己的动手能力,以及如何运用所学的知识来解决在编程中遇到的问题。
在实际应用中,我们会遇到很多的问题,譬如像编写这个程序时,我刚开始遇到了前所未有的问题,在书中乃至一些的资料中都无法找到的问题。
通过自己亲身实践,以及不断地摸索,不断地询问,才能有效地解决问题。
这次编程过程中遇到了一些问题,比如一开始不会生成随机数,但是通过网络等手段的查询,让我又学会了一些其他库函数的使用,更加深入的了解了C语言。
这次编程还遇到的一个问题就是缓冲区的问题,一开始会出现一些错误,比如scanf输入后系统会保留一个换行,所以下次如果输入字符的时候它会自动输入刚才的换行,这让我又初步了解到了C语言中缓冲区的问题。
在这里我要感谢网上的一切给与我帮助的网友,以及指导老师和同学的帮助。
七附录
/*****************************************************************/
/*C题目二十四:
单项选择题标准化考试系统(限最多2人完成)
(一)功能要求:
(1)用文件保存试题库。
(每个试题包括题干、4个备选答案、标准答案)
(2)试题录入:
可随时增加试题到试题库中
(3)试题抽取:
每次从试题库中可以随机抽出N道题(N由键盘输入)
(4)答题:
用户可实现输入自己的答案
(5)自动判卷:
系统可根据用户答案与标准答案的对比实现判卷并给出成绩。
(二)其它要求:
(1)只能使用C/C++语言,源程序要有适当的注释,使程序容易阅读
(2)至少采用文本菜单界面(如果能采用图形菜单界面更好)
(3)学生可自动增加新功能模块(视情况可另外加分)
(4)写出课程设计报告,具体要求见相关说明文档
*/
/***************************************************************/
#include<
stdio.h>
malloc.h>
/*新建链表所用头文件*/
conio.h>
/*清屏函数所用头文件*/
stdlib.h>
/*求随机数所用的头文件*/
string.h>
#defineLENsizeof(structinfo)/*定义结构体长度*/
#defineN300
structoption/*定义四个选项*/
{
chara[50];
charb[50];
charc[50];
chard[50];
};
/*定义结构体,包括题目编号,题目,四个选项,正确答案,只向下个节点的指针*/
structinfo
charnum[10];
charstem[100];
structoptionop;
charranswer[2];
structinfo*next;
}inf[N];
typedefstructinfoINF;
INF*head=NULL;
/*定义全局变量head利于操作*/
charmenu();
voidopen();
voidsave();
voidadd();
voidQUIT();
voidanw();
/*自定义函数声明部分*/
voidshow();
voiddel();
voidmodify();
INF*choose();
voidmain()
chara;
intquit=0;
open();
/*文件信息录入链表*/
while(!
quit)
{
a=menu();
/*调用菜单函数*/
switch(a)/*通过多重选择决定操作*/
{
case'
1'
:
add();
break;
/*录入试题部分*/
2'
anw();
/*用户抽提并答题部分*/
3'
show();
/*显示所有题目*/
4'
modify();
/*修改题目*/
5'
del();
/*删除题目*/
0'
QUIT();
quit=1;
/*退出,并选择是否保存*/
default:
printf("
输入错误,重试:
\n"
);
}
}
}
/****************************************************************/
charmenu()
printf("
/********************************/\n"
/****1.试题录入****/\n"
/****2.试题抽取****/\n"
/****3.show所有试题****/\n"
/****4.修改试题****/\n"
/****5.删除题目*****\n"
/****6.答题****/\n"
/****7.评分*****\n"
/****0.退出****/\n"
\n\n请选择\n"
a=getchar();
return(a);
/******************************************************************/
voidshow()
INF*p=NULL;
for(p=head->
next;
p!
=NULL;
p=p->
next)
printf("
%s\t%s\tA.%s\tB.%s\tC.%s\tD%s\n"
p->
num,p->
stem,p->
op.a,p->
op.b,p->
op.c,p->
op.d);
/********************************************************************/
voiddel()
charnum[2];
输入你要删除的题目编号\n"
gets(num);
if(head==NULL)
目前试题库为空~\n"
return;
else
for(p=head;
p->
next!
if(!
strcmp(p->
next->
num,num))
printf("
你要删除的信息如下:
printf("
p->
next=p->
/*通过只想下一个节点实现删除*/
/***********************************************************************/
voidsave()
FILE*fp;
char*filename="
test.txt"
;
\n记录为空\n"
elsep=head->
if((fp=fopen(filename,"
a"
))==NULL)/*通过a打开可以实现追加功能*/
\n\n打开文件错误~!
while(p!
=NULL)
fprintf(fp,"
%s\t%s\tA.%s\tB.%s\tC.%s\tD%s\t%s\n"
op.d,p->
ranswer);
p=p->
fclose(fp);
for(;
head->
)/*此处为释放链表内存部分*/
p=head->
head->
next=head->
free(p);
free(head);
/*******************************************************************/
voidQUIT()
Y/N\n"
do{
getchar();
/*吸收一个回车键*/
a=getchar();
if('
Y'
==a||'
y'
==a)/*若满足条件则运行保存函数*/
save();
return;
elseif('
N'
n'
==a)
else
输入有误,重试:
}while
(1);
voidopen()/*将文件信息系输出到链表*/
INF*p1=NULL,*p2=NULL,*temp=NULL;
if((fp=fopen("
"
r"
))==NULL)
head=(INF*)malloc(sizeof(INF));
/*开辟一块内存*/
head->
next=NULL;
temp=p2=head;
feof(fp))/*循环知道文件结束*/
p1=(INF*)malloc(LEN);
temp=p2;
p2->
next=p1;
p2=p1;
fscanf(fp,"
%s\t%s\t%s\t%s\t%s\t%s\t%s\t"
&
p1->
num,p1->
stem,p1->
op.a,p1->
op.b,p1->
op.c,p1->
op.d,p1->
temp->
voidadd()/*录入试题函数*/
INF*p1=NULL,*p2=NULL;
p1=(INF*)malloc(sizeof(INF));
getchar();
输入题号:
gets(p1->
num);
输入题目:
stem);
输入选项A:
op.a);
输入选项B:
op.b);
输入选项C:
op.c);
输入选项D:
输入正确答案的选项: