C-链表实现,保存文件,评估-单项选择题系统课程设计---ShinePans
课程设计
单项选择题标准化考试系
所属专业:软件project软件三班
完毕人:潘尚
一.设计计划.
1.能够用菜单明白的指导用户操作.
2.操作完毕能够返回主菜单.
3.将输入的题目保存至C盘的文本文件里,以便日后读取.
4.若没有题目,提示用户输入题目,建立文本文档于C盘根文件夹.
5.答题为随机抽取题目进行回答.
6.若输入小写答案选项如abcd,将其转换为大写字母再推断.
7.系统在用户答完题目后能够进行正确率, 答对个数的统计.
二.程序模块设计.
1.模块一:菜单操作模块
该模块实现程序的菜单操作.
算法
(1)在屏幕上呈现美观的菜单..
(2)提示用户输入.
(3)待用户输入选项,swich语句推断,输入错误则又一次输入.
2.模块二:题目装入内存模块
函数开辟内存空间将试题文件里题目装入内存中.
算法:
(1)寻找回车符号,推断题目数量.
(2)开辟内存空间。将题目信息装入内存.
(3)关闭文件返回题目总数.
3.模块三:答题模块
在屏幕上输出题目让用户输入答案。推断用户输入答案是否正确.
算法:
(1)接受用户输入题目数,推断是否小于总共题目或者小于0.
(2)置随机数.
(3)将题目装入内存.
(4)输出题目,等待用户输入答案.
(5)推断输入.
4.模块四:加入试题模块
打开储存试题的文件进行试题信息输入.
算法:
打开文件,开辟内存空间,推断用户输入,写入文件.
四:流程图绘制
1.菜单流程图
2.装入内存
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hpbmVwYW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
3.答题模块
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc2hpbmVwYW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
{
五.问题.
文件读写时文件指针的移位:
当用fgetc()函数遍历文件时文件指针是顺序移动的,当遇到回车符时才会推断出文件在第几行。
而当读取文件信息的时候文件指针的位置应该在行首,这是就要用到fseek()函数将文件指针移位。
并且还要恢复文件指针的位置。用于继续推断当前是文件的第几行。
六.源码.
#include<stdio.h>
#include<stdlib.h>
#defineLEN sizeof(struct test)
structtest
{
char que[81];
char answer1[81];
char answer2[81];
char answer3[81];
char answer4[81];
char ture;
struct test*next;
};
struct test *head;//全局变量储存第一个结构体的指针
int zts(int m)//将第m道题装入内存,输入-1时将返回总题数
FILE *fp;
structtest *p1=NULL;
charch,ch1[5];
inti,n=0,wz,py;
if((fp=fopen("c:\\test.txt","r"))==NULL)//仅仅读方式打开文件
{
printf("文件打开失败请检查C盘下的test.txt文件。\n");
exit(0);
}
do
{
py=1;
ch=fgetc(fp);
for(i=0;ch!='\n'&&ch!=-1;i++)//循环推断回车符个数
{
py++;
ch=fgetc(fp);
}
n++; //储存行数的变量
if(n==m)//假设当前行数与传入參数相等
{
if(p1==NULL)//推断是否是第一次开辟内存空间
{
p1=(struct test *)malloc(LEN);
head=p1;
p1->next=NULL;
}
else
{
p1->next=p1;
p1=(struct test *)malloc(LEN);
p1->next=NULL;
}
wz=ftell(fp);//记录指针当前位置
fseek(fp,(wz-py-1),0);//调整指针位置到行首
fscanf(fp,"%s%s%s%s%s%s",&p1->que,&p1->answer1,&p1->answer2,&p1->answer3,&p1->answer4,&ch1);
fseek(fp,wz+1,0);//调整指针位置到行末
p1->ture=ch1[0];
break;//将数据装入内存后跳出循环
}
}while(!feof(fp));//文件结束跳出循环
fclose(fp);
returnn;//返回题目总数n
}
void exe1()
{
charchange(char word);
voidmain();
voidexe2();
intn,m=0,tm,i,t=0,f=0;
charans[2];
structtest *p1;
system("cls");
printf("请输入要答题数:");
scanf("%d",&n);
tm=zts(-1);
if(0>n||n>tm)
{
printf("答题数应小于总数!");
exe1();
}
for(i=0;i<n;i++)//n为用户要答题数
{
do
{
m=rand();//置随机数
}while(!(0<m&&m<=tm));//推断产生的随机数是否符合要求
zts(m);
p1=head;//将zts开辟的结构体首地址赋给p1
printf("\n第%d题:\n",i+1);
printf("%s\n%s\n%s\n%s\n%s\n请输入答案:",p1->que,p1->answer1,p1->answer2,p1->answer3,p1->answer4);
scanf("%s",&ans);
if(change(ans[0])==p1->ture) /*因为用户可能没有转换大写和小写,故此处加入了大写转换的函数*/
{
printf("恭喜你答对了。\n\n");
t++; /*回答正确的题目数的统计*/
}
else
{
printf("对不起,你答错了。。。\n正确答案是:%c\n\n",p1->ture);
f++;//回答错误统计
}
}
p1=head;
do
{
head=p1->next;
free(p1);
p1=head;
}while(p1!=NULL);//释放结构体占用内存
printf("*******************************\n");
printf("\n已完毕測试!\n共做%d道题:%d错误,%d正确。
\n正确率:%5.2f%%\n\n",n,f,t,(float)t/n*100);
printf("*******************************\n");
printf("\n\n1.继续答题;2.加入题目。3.返回主菜单;\n请选择:");
i=0;
scanf("%d",&i);
if(i==1)
exe1();//继续答题
else
if(i==2)
exe2();//加入题目
else
main();//返回主菜单
}
void exe2() //实现用户自主输入题目
{
char change(char word);
void main();
system("cls");
int n;
FILE *fp;
if((fp=fopen("c:\\test.txt","a"))==NULL)
{
printf("文件打开失败请检查C盘下的test.txt文件。
\n");
exit(0);
}
struct test*p1=NULL;
p1=(struct test*)malloc(LEN);//开辟内存空间
do
{
printf("请输入题目:");
scanf("%s",&p1->que);
}while(p1->que[0]=='\0');
do
{
printf("请输入选项A:");
scanf("%s",&p1->answer1);
}while(p1->answer1=='\0');
do
{
printf("请输入选项B:");
scanf("%s",&p1->answer2);
}while(p1->answer2=='\0');
do
{
printf("请输入选项C:");
scanf("%s",&p1->answer3);
}while(p1->answer3=='\0');
do
{
printf("请输入选项D:");
scanf("%s",&p1->answer4);
}while(p1->answer4=='\0');
printf("请输入答案:");
do
{
scanf("%c",&p1->ture);
p1->ture=change(p1->ture);
}while(p1->ture!='A'&&p1->ture!='B'&&p1->ture!='C'&&p1->ture!='D');
printf("\n确认输入题目?\n1.是。
2.否。\n");
scanf("%d",&n);
if(n==1)
{
fputc('\n',fp);
fputs(p1->que,fp);
fputc(' ',fp);
fputs("A.",fp);
fputs(p1->answer1,fp);
fputc(' ',fp);
fputs("B.",fp);
fputs(p1->answer2,fp);
fputc(' ',fp);
fputs("C.",fp);
fputs(p1->answer3,fp);
fputc(' ',fp);
fputs("D.",fp);
fputs(p1->answer4,fp);
fputc(' ',fp);
fputc(p1->ture,fp);
fclose(fp);
printf("保存成功!");
system("cls");
free(p1);
printf("是否继续加入?\n1.继续加入 2.返回主菜单\n");
scanf("%d",&n);
if(n==1)
exe2();
else
main();
}
else
{
free(p1);
exe2();
}
}
void main()
{
voidchange(char word);
leap: system("cls");
//调用dos命令
int n;
puts("┌────────────────────────────────────────┐\n");
puts("│****欢迎使用单项选择题标准化考试系统****|\n");
puts("│─────────────1.開始答题。───────────────│\n");
puts("│─────────────2.加入试题。───────────────│\n");
puts("│─────────────3.帮助说明。───────────────│\n");
puts("│─────────────4.版权信息。───────────────│\n");
puts("│─────────────5.退出系统。
───────────────│\n");
puts("│****************************************│\n");
puts("│ ^-^ │\n");
puts("│ ┌──────────────┐ │\n");
puts("│ │ copyright@潘尚 │ │\n");
puts("│ │ 1.01 │ │\n");
puts("│ │ │ │\n");
scanf("%d",&n);
switch(n)
{
case1:exe1();break;
case2:exe2();break;
case3:
system("cls");
printf("这是一款自我检測的答题系统,试题保存在c盘根文件夹的test.txt文本文件里,可自行加入试题.\n\n可直接打开c盘文件自行加入题目\n\n\n注意格式:题目 选项A. B. C. D. 答案\n\n\n");getchar();
puts("输入不论什么值回到主菜单");getchar();goto leap;
case4:
system("cls");
printf("版权全部:潘尚。联系:574273250@qq.com\n\nedition:1.01
\n\n 来自华中科技大学文华学院软件三班 \n\n");getchar();
puts("输入不论什么值回到主菜单");getchar();goto leap;
case5:printf("\n欢迎再次使用,再见^-^\n");getchar();
}while(n!=7);
}
char change(char word) /*转换为大写字母*/
{
if((word>='a')&&(word<='z'))
word-=32;
return(word);
}
七.測试.
|
|
|
|
|
C-链表实现,保存文件,评估-单项选择题系统课程设计---ShinePans的更多相关文章
- 第2-1-1章 FastDFS分布式文件服务背景及系统架构介绍
目录 1 背景 1.1 为什么需要分布式文件服务 1.1.1 单机时代 1.1.2 独立文件服务器 1.1.3 分布式文件系统 1.2 什么是FastDFS 2 系统架构 2.1 Tracker集群 ...
- 12.JAVA之GUI编程打开与保存文件
功能:java图形用户界面开发,练习打开保存文件 代码如下: import java.awt.FileDialog; import java.awt.Frame; import java.awt.Me ...
- vim保存文件时,生成.un~文件
在用vim保存文件时,文件夹下生成.un~文件 怎么删除这些文件呢 在网上搜索的答案: http://stackoverflow.com/questions/15660669/what-is-a-un ...
- android 保存文件的各种目录列表
一般的,我们可以通过context和Environment来获取要保存文件的目录 ($rootDir) +- /data -> Environment.getDataDirectory() | ...
- 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)
1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...
- C#项目打开/保存文件夹/指定类型文件,获取路径
C#项目打开/保存文件夹/指定类型文件,获取路径 转:http://q1q2q363.xiaoxiang.blog.163.com/blog/static/1106963682011722424325 ...
- FileOutputStream保存文件
//保存文件,根据传入的路径,存放在SD卡目录下public boolean saveToPath(String title, String pageName) { Bitmap b = getCha ...
- Qt snippet — 打开文件&保存文件
打开文件: void Notepad::on_actionOpen_triggered() { QString fileName = QFileDialog::getOpenFileName(this ...
- php中关于js保存文件至本地的问题
最近在搞一个livezilla的在线客服聊天的东东,客户界面要求添加一个下载聊天记录的功能.于是我就是翻看了下网上的各种关于”js保存文件至本地“的资料,发现只能在IE下通过execCommand实现 ...
随机推荐
- copyTo和clone的区别/制作mask的fillpoly函数(有问题)
OpenCV中mat::copyto( )函数使用方法 OpenCV的fillPoly函数 使用OpenCV库进行图像处理时,经常会用到clone和copyTo函数,这里对两个函数进行介绍. copy ...
- 【python之路23】递归
1.递归的基础 举例说明:老师要班里坐在最后的一排学生要一本书,老师对前面的人说你向最后一排的同学要一本书,那么最前面的人跟坐在第2排的人说,第2排的人跟第3排的人说,当命令传递到最后一排时,最后一排 ...
- Ajax 用法简介
使用Ajax实现页面的局部刷新 一.不依赖jquery时是这样的用法: var xhr=new XMLHttpRequest(); xhr.onreadystatechange=function(ev ...
- js 百度地图和谷歌地图的选择
最近手上接到一个需求: 国外的域名访问,显示谷歌地图 国内的域名访问,显示百度地图 切换中英文的时候,中文->显示百度地图,英文->能显示谷歌地图就显示谷歌地图,不能显示(报错)就显示百度 ...
- centos下彻底删除mysql
打算重新试试安装两个mysql,就把老的删除了. yum remove mysql mysql-server mysql-libs compat-mysql51 rm -rf /var/lib/mys ...
- 【模板】tarjanLCA [2017年6月计划 学习tarjanLCA]
P3379 [模板]最近公共祖先(LCA) 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询 ...
- web前端学习(二)html学习笔记部分(10)-- HTML5构建应用布局和页面
1.2.25 HTML5构建应用布局和页面 1.2.25.1 HTML5在移动开发中的准则 1.尽量使用单页面开发 2.慎重选择前端UI框架 3.动画.特效使用准则(60fps) 浏览器消耗最小的 ...
- Spring使用JDBC配置具名参数
好处:若有多个参数,则不用再去对应位置?,直接对应参数名,便于维护 缺点:较为麻烦 使用具名参数时可以使用以下的方法 好处,通过实现类BeanPropertySqlParameterSource之间传 ...
- JS更改字体颜色、背景颜色
CSS 颜色十六进制值 http://www.w3school.com.cn/cssref/css_colorsfull.asp CSS background-color 属性 body { bac ...
- js计算精度问题(浮点数误差,大数计算出错)
https://github.com/camsong/blog/issues/9 0.1+0.2 //0.30000000000000004 1-0.9 //0.09999999999999998 9 ...