C语言集中上机报告

C语言集中上机报告

院 系: 班 级: 姓 名: 合 作 者: 指导教师:

2009 年 6 月 13 日 单项选择题标准化考试系统

目录

一 概述 ------------------------------------------ 3

1. 课程设计的目的 ----------------------------- 3

2. 课题设计的要求 ----------------------------- 3

3. 课题设计的主要设计思想 --------------------- 3

二 总体方案设计 ---------------------------------- 4

三 详细设计 -------------------------------------- 6

四 程序的调试及运行结果说明 ---------------------- 7

五 课程设计总结 --------------------------------- 11

六 后记 ----------------------------------------- 12

七 附录 ----------------------------------------- 13 参考文献 ---------------------------------------- 23

一 概述

1. 课程设计的目的

生成一个单项选择题的考试系统,可以随时增加题库,用户可抽取试题,答题,还可以自动判卷打分,这就是这个程序的目的。

2. 课题设计的要求

这个程序所需要的基本知识有文件的读写,链表的输出、插入、删除等操作,结构体的相关知识、指针与函数相关知识等相关知识。在这个程序中涉及到一个不常用的库函数:随机抽取,关于这部分知识会在需要时查阅相关资料进行学习。同时,本题目还要求必须有菜单界面(文本或图形)、只能用C/C++语言,源程序有适当注释。

3. 课题设计的主要设计思想

整个程序都是以文件方式进行的。

首先,将文件中的信息输出到链表

void open(void)

然后,实现每个步骤的功能。

(1) 使用目录显示所能进行的操作,返回一个char型数据。

char menu(void)

(2) 录入试题。

void add();

(3) 显示所有试题。

void show(void)

(4) 修改题库。

void modify(void)

(5) 删除试题。

void del(void)

(6)退出并保存。

void save()

该程序主要的设计思想就是处理一系列的链表。包括链表的新建、查询、删除、保存等。还有一些基本的算法。

二 总体方案设计

首先,采用了模块化的编程思想,把每一个功能都单独写到各个函数中。具体来说,本程序有一个主函数main,显示菜单的函数menu,增加题库的函数,抽取试题的函数,输入用户答案的函数,查看标准答案的函数,用户打分的函数共N个函数。

这个程序主要解决的关键性问题就是使用文件操作来对试题进行各种管理,包括增加数据、查看数据等。

本程序的整体框图如下:

C语言集中上机报告

三 详细设计

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+1=?

请输入选项A:

1

请输入选项B:

2

请输入选项C:

3

请输入选项D:

4

请输入标准答案:

B

/********************************/

/**** 1.试题录入 ****/ /**** 2.试题抽取 ****/ /**** 3.show所有试题 ****/ /**** 4.修改试题 ****/ /**** 5.删除题目 ***** /**** 6.答题 ***** /**** 7.评分 ***** /**** 0.退出 ****/ /********************************/ 请选择:3

1+1=?( )

A:1 B:2

C:3 D:4

/********************************/ /**** 1.试题录入 ****/ /**** 2.试题抽取 ****/ /**** 3.show所有试题 ****/ /**** 4.修改试题 ****/ /**** 5.删除题目 ***** /**** 6.答题 ***** /**** 7.评分 ***** /**** 0.退出 ****/ /********************************/ 请选择:2

请输入要选择的题目数N:

1

/********************************/ /**** 1.试题录入 ****/ /**** 2.试题抽取 ****/ /**** 3.show所有试题 ****/ /**** 4.修改试题 ****/ /**** 5.删除题目 ***** /**** 6.答题 ***** /**** 7.评分 *****

/**** 0.退出 ****/ /********************************/ 请选择:6

题1:1+1=?( )

A:1 B:2

C:3 D:4

请输入你的答案:

A

你输入的答案是:

A

/********************************/ /**** 1.试题录入 ****/ /**** 2.试题抽取 ****/ /**** 3.show所有试题 ****/ /**** 4.修改试题 ****/ /**** 5.删除题目 ***** /**** 6.答题 ***** /**** 7.评分 ***** /**** 0.退出 ****/ /********************************/ 请选择:7

你所得的分数如下:

0.000000

/********************************/ /**** 1.试题录入 ****/ /**** 2.试题抽取 ****/ /**** 3.show所有试题 ****/ /**** 4.修改试题 ****/ /**** 5.删除题目 ***** /**** 6.答题 ***** /**** 7.评分 ***** /**** 0.退出 ****/ /********************************/ 请选择:4

请输入你要查找题目的编号:

1

你要修改的题目信息如下:

编号 题目 备选答案A 备选答案B 备选答案C 备选答案D 标准答案

1 1+1=? 1 2 3 4 B

请输入一个题目编号:

1

请输入新的题目:

2+2=?

请输入新的备选答案A:

1

请输入新的备选答案B:

2

请输入新的备选答案C:

3

请输入新的备选答案D:

4

请输入新的标准答案:

D

你修改后的题目信息如下:

编号 题目 备选答案A 备选答案B

1 1+1=? 1 2 3 4 B

/********************************/

/**** 1.试题录入 ****/

/**** 2.试题抽取 ****/

/**** 3.show所有试题 ****/

/**** 4.修改试题 ****/

/**** 5.删除题目 *****

/**** 6.答题 *****

/**** 7.评分 *****

/**** 0.退出 ****/ 备选答案C 备选答案D

/********************************/

请选择:5

请输入你要查找题目的编号:

1

你要删除的题目信息如下:

11+1=?

1 2

3 4

/********************************/

/**** 1.试题录入 ****/

/**** 2.试题抽取 ****/

/**** 3.show所有试题 ****/

/**** 4.修改试题 ****/

/**** 5.删除题目 *****

/**** 6.答题 *****

/**** 7.评分 *****

/**** 0.退出 ****/

/********************************/

请选择: 0

要保存吗? Y/N

Y

保存成功~!

!

Press any key to continue.

五 课程设计总结

该程序目前基本上达到了题目的要求,实现了试题的录入,试题的抽取,答题并判卷。并且还增加了几个功能,比如试题的删除,试题的修改查询,进一步设想是想实现程序的排序功能,比如按照题目编号进行排序,还可以实现权限的访问,通过设置密码来实现对录入试题或查询答案的权限控制。

六 后记

通过这一周的上机实验,使我对c语言有了更进一步的认识,想要学好它,必须注重实践。这道题达到了题目的要求,功能齐全。程序中运行时输入的数据排列整齐,具有很好的美感。每一步骤严密性很好,连接紧凑,输入输出间隔清晰。不足之处:就是修改函数不够完善。

可以再设计一个菜单用于显示修改函数这部分。可以实现要修改哪个数据,就直接找到该数据进行修改。

如果再加一个菜单函数,程序将变得很复杂,如果出错,就不易于修改。 但总的来说,自己还是受益匪浅。

首先,该程序涉及到的知识很多,自己在编写程序时对各个知识又做了进一步的复习付诸于实践,自己的基本知识变得更加牢固了。

其次,在编写过程中锻炼了自己的动手能力,以及如何运用所学的知识来解决在编程中遇到的问题。在实际应用中,我们会遇到很多的问题,譬如像编写这个程序时,我刚开始遇到了前所未有的问题,在书中乃至一些的资料中都无法找到的问题。通过自己亲身实践,以及不断地摸索,不断地询问,才能有效地解决问题。

这次编程过程中遇到了一些问题,比如一开始不会生成随机数,但是通过网络等手段的查询,让我又学会了一些其他库函数的使用,更加深入的了解了C语言。

这次编程还遇到的一个问题就是缓冲区的问题,一开始会出现一些错误,比如scanf输入后系统会保留一个换行,所以下次如果输入字符的时候它会自动输入刚才的换行,这让我又初步了解到了C语言中缓冲区的问题。

在这里我要感谢网上的一切给与我帮助的网友,以及指导老师和同学的帮助。

七 附录

/*****************************************************************/ /*C题目二十四:单项选择题标准化考试系统(限最多2人完成)

(一) 功能要求:

(1) 用文件保存试题库。(每个试题包括题干、4个备选答案、标准答案)

(2) 试题录入:可随时增加试题到试题库中

(3) 试题抽取:每次从试题库中可以随机抽出N道题(N由键盘输入)

(4) 答题:用户可实现输入自己的答案

(5) 自动判卷:系统可根据用户答案与标准答案的对比实现判卷并给出成绩。

(二)其它要求:

(1) 只能使用C/C++语言,源程序要有适当的注释,使程序容易阅读

(2) 至少采用文本菜单界面(如果能采用图形菜单界面更好)

(3) 学生可自动增加新功能模块(视情况可另外加分)

(4)写出课程设计报告,具体要求见相关说明文档

*/

/***************************************************************/ #include <stdio.h>

#include <malloc.h> /*新建链表所用头文件*/

#include <conio.h> /*清屏函数所用头文件*/

#include <stdlib.h> /* 求随机数所用的头文件*/

#include <string.h>

#define LEN sizeof(struct info) /*定义结构体长度*/ #define N 300

/***************************************************************/ struct option /*定义四个选项*/ {

char a[50]; char b[50];

};

C语言集中上机报告

char c[50]; char d[50];

{ char num[10]; char stem[100];

struct option op; char ranswer[2]; struct info *next;

}inf[N];

typedef struct info INF;

INF * head=NULL; /*定义全局变量head利于操作*/ /***************************************************************/

char menu();

void open();

void save();

void add();

void QUIT();

void anw(); /*自定义函数声明部分*/ void show();

void del();

void modify();

INF * choose();

/***************************************************************/ void main()

{

open(); /*文件信息录入链表*/ while(!quit) char a; int quit=0;

} { } a=menu(); /*调用菜单函数*/ switch(a) /*通过多重选择决定操作*/ { case '1':add();break; /*录入试题部分*/ case '2':anw();break; /*用户抽提并答题部分*/ case '3':show();break; /*显示所有题目*/ case '4':modify();break; /*修改题目*/ case '5':del();break; /*删除题目*/ case '0':QUIT();quit=1;break; /*退出,并选择是否保存*/ default:printf("输入错误,重试:\n"); }

/****************************************************************/

char menu()

{

} char a; printf("/********************************/\n"); printf("/**** 1.试题录入 ****/\n"); printf("/**** 2.试题抽取 ****/\n"); printf("/**** 3.show所有试题 ****/\n"); printf("/**** 4.修改试题 ****/\n"); printf("/**** 5.删除题目 *****\n"); printf("/**** 6.答题 ****/\n"); printf("/**** 7.评分 *****\n"); printf("/**** 0.退出 ****/\n"); printf("/********************************/\n"); printf("\n\n请选择\n"); a=getchar(); return(a);

/******************************************************************/

void show()

{

INF *p=NULL; for(p=head->next;p!=NULL;p=p->next) printf("%s\t %s\t A.%s\t B.%s\t C.%s\t D%s\n",p->num,p->stem,p->op.a,p->op.b,p->op.c,p->op.d);

}

/********************************************************************/

void del()

{

printf("输入你要删除的题目编号\n"); gets(num); if(head==NULL) { } else for(p=head;p->next!=NULL;p=p->next) if( !strcmp(p->next->num,num) ) printf("你要删除的信息如下:\n"); %s\t A.%s\t B.%s\t C.%s\t printf("目前试题库为空~\n"); return; INF *p=NULL; char num[2]; printf("%s\t

D%s\n",p->next->num,p->next->stem,p->next->op.a,p->next->op.b,p->next->op.c,p->next->op.d);

}

p->next=p->next->next; /*通过只想下一个节点实现删除*/

/***********************************************************************/

void save()

{

INF *p=NULL; FILE *fp; char *filename="test.txt"; if(head==NULL) { } else p=head->next; if( (fp=fopen(filename,"a")) ==NULL) /*通过a打开可以实现追加功能*/ { } while(p!=NULL) { fprintf(fp,"%s\t %s\t A.%s\t B.%s\t C.%s\t printf("\n\n 打开文件错误~!!\n"); return; printf("\n记录为空\n"); return; D%s\t %s\n",p->num,p->stem,p->op.a,p->op.b,p->op.c,p->op.d,p->ranswer);

for(;head->next!=NULL;) /*此处为释放链表内存部分*/ { } free(head); p=head->next; head->next=head->next->next; free(p); } printf("保存成功~!\n"); fclose(fp); p=p->next;

}

/*******************************************************************/

void QUIT()

{

}

/*******************************************************************/

void open() /*将文件信息系输出到链表*/ {

FILE *fp; INF *p1=NULL,*p2=NULL,*temp=NULL; if( (fp=fopen("test.txt","r"))==NULL) { printf(" 题库为空~!\n"); return; char a; printf("要保存吗? Y/N\n"); do{ getchar(); /*吸收一个回车键*/ a=getchar(); if('Y'==a||'y'==a) /*若满足条件则运行保存函数*/ { } else if('N'==a||'n'==a) return; save(); return; else printf("输入有误,重试:\n"); }while(1);

} head=(INF*)malloc(sizeof(INF)); /*开辟一块内存*/ head->next=NULL; temp=p2=head; while(! 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->ranswer);

}

/*******************************************************************/

void add() /*录入试题函数*/

{

INF *p1=NULL,*p2=NULL; p1= (INF *)malloc( sizeof(INF) ); getchar(); printf("输入题号:\n"); } temp->next=NULL; fclose(fp);

gets(p1->num);

printf("输入题目:\n"); gets(p1->stem); printf("输入选项A:\n"); gets(p1->op.a); printf("输入选项B:\n"); gets(p1->op.b); printf("输入选项C:\n");

}

gets(p1->op.c); printf("输入选项D:\n"); gets(p1->op.d); printf("输入正确答案的选项:\n"); gets(p1->ranswer); p1->next=NULL; if(NULL==head) { } else { } for(p2=head;p2->next!=NULL;p2=p2->next); p2->next=p1; head=(INF *)malloc(sizeof(INF)); head->next=p1;

/******************************************************************/

void modify() /*修改试题函数*/ {

printf("输入你要修改的题目编号\n"); gets(num); if(head==NULL) /*寻找修改题目所在位置*/ { } else printf("目前试题库为空~\n"); return; INF *p=NULL; char num[2];

for(p=head;p->next!=NULL;p=p->next) if( !strcmp(p->next->num,num) ) printf("你要删除的信息如下:\n"); %s\t A.%s\t B.%s\t C.%s\t printf("%s\t

D%s\n",p->next->num,p->next->stem,p->next->op.a,p->next->op.b,p->next->op.c,p->next->op.d);

printf("输入题号:\n");

gets(p->num);

printf("输入题目:\n"); gets(p->stem); printf("输入选项A:\n"); gets(p->op.a); printf("输入选项B:\n"); gets(p->op.b); printf("输入选项C:\n"); gets(p->op.c); printf("输入选项D:\n"); gets(p->op.d); printf("输入正确答案的选项:\n"); gets(p->ranswer); printf("修改后的信息如下:\n"); printf("%s\t %s\t A.%s\t B.%s\t C.%s\t D%s\n",p->next->num,p->next->stem,p->next->op.a,p->next->op.b,p->next->op.c,p->next->op.d);

}

/************************************************************************/

INF *choose()// 抽取1个题目。

{

char x[2]; INF *p=NULL,*p1=NULL;

}

while(!p1) { } return p1; strcpy(x,(rand()%6+1+'0')); /*使用rand()产生一个随机数*/ for(p=head->next;p!=NULL;p=p->next /*将该随机数对6取余缩小范围*/ if(!strcmp(p->num,x)) p1=p;

/********************************************************************/

void anw()

{

printf("%s\t %s\t %s\t %s\t %s\t %s\n",p->num,p->stem,p->op.a,p->op.b,p->opINF *p=NULL; int i; char a[2]; printf("请输入你要回答的问题数量:\n"); scanf("%d",&i); while(i) { p=choose(); /*choose()函数实现题目的选择*/ .c,p->op.d);

} } printf("请输入正确答案:\n"); gets(a); if(strcmp(a,p->ranswer)) /*此处实现判卷过程*/ printf("恭喜你~做对了!\n"); else printf("做错了~~\n"); i--;

参考文献

1) 谭浩强,C程序设计(第三版),清华大学出版社,20xx年2月

2) 甘玲等,解析C程序设计,去哪个华大学出版社,20xx年8月

3) Deitel,C HOW TO PROGRAM,清华大学出版社,20xx年9月

相关推荐