C-链表实现,保存文件,评估-单项选择题系统课程设计---ShinePans

课程设计

单项选择题标准化考试系

所属专业:软件工程软件三班

完成人:潘尚

一.设计计划.

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.装入内存

 

 

3.答题模块

{

五.问题.

文件读写时文件指针的移位:

当用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("│                  │ [email protected]潘尚      │     │\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("版权所有:潘尚。联系:[email protected]\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);

}

七.测试.

菜单

答题

录入

统计

帮助

时间: 2024-10-12 12:38:17

C-链表实现,保存文件,评估-单项选择题系统课程设计---ShinePans的相关文章

面试小结2-单项选择题

二.单项选择题:1. 下面的网络协议中,面向连接的的协议是: A .A 传输控制协议 B 用户数据报协议 C 网际协议 D 网际控制报文协议2. 在/etc/fstab文件中指定的文件系统加载参数中, D 参数一般用于CD-ROM等移动设备.A defaults B sw C rw和ro D noauto3. Linux文件权限一共10位长度,分成四段,第三段表示的内容是 C .A 文件类型 B 文件所有者的权限 C 文件所有者所在组的权限 D 其他用户的权限4. 终止一个前台进程可能用到的命令

12.JAVA之GUI编程打开与保存文件

功能:java图形用户界面开发,练习打开保存文件 代码如下: import java.awt.FileDialog; import java.awt.Frame; import java.awt.Menu; import java.awt.MenuBar; import java.awt.MenuItem; import java.awt.TextArea; import java.awt.event.ActionEvent; import java.awt.event.ActionListen

vim的保存文件和退出命令

文章来源:http://blog.sina.com.cn/s/blog_5e357d2d0100zmth.html 命令 简单说明 :w 保存编辑后的文件内容,但不退出vim编辑器.这个命令的作用是把内存缓冲区中的数据写到启动vim时指定的文件中. :w! 强制写文件,即强制覆盖原有文件.如果原有文件的访问权限不允许写入文件,例如,原有的文件为只读文件,则可使用这个命令强制写入.但是,这种命令用法仅当用户是文件的属主时才适用,而超级用户则不受此限制. :wq 保存文件内容后退出vim编辑器.这个

[android] 保存文件到手机内存

1. 界面的准备工作,普通登录界面,采用线性布局和相对布局. <Checkbox/>有个属性 android:checked=”true”,默认选中状态,相对布局里面<Button/>位于右边android:layout_alignParentRight=”true”,位于父控件的右面.密码框星号显示android:inputType=”textPassword” 2. 遇到device not found等错误可以直接忽略掉,布局文件属性里面绑定点击方法,传入的参数View对象代

C#打开/保存文件,获取路径

1.打开文件路径: OpenFileDialog a= new OpenFileDialog(); //new一个方法 a.Filter = "(*.et;*.xls;*.xlsx)|*.et;*.xls;*.xlsx|all|*.*"; //删选.设定文件显示类型 a.ShowDialog(); //显示打开文件的窗口 string fileName = a.FileName; //获得选择的文件路径 System.Diagnostics.Process.Start(fileName

(九)android 中数据存储与访问——保存文件到手机内存

9.1手机的存储区域 手机的存储区域通常有两个地方:一:手机内部存储空间,理解成一块微硬盘/data/data/:二:外部存储空间SD卡 9.2方法捕获异常的原则 如果方法有返回值,则用try catch捕获,如果方法的返回值是Void类型,则使用throws抛出异常 9.3 上下文Context Context:是一个类,提供一些方便的api 可以得到应用程序的环境,例如:环境的包名,安装路径,资源路径,资产的路径 9.4 保存文件到手机内存——登陆界面例子程序 9.4.1 项目需求 用户登陆

Asp.net直接保存文件到客户端

在我们的系统的编写过程中,应该有很多的时候需要客户下载文件.我第一次的做法(应该也是大部分人的做法吧?)是: 1 HttpResponse response = HttpContext.Current.Response; 2 string js = "<script language=javascript>window.open('{0}');</script>"; 3 js = string.Format(js, url); 4 response.Write(

win8不通过新打开窗口进行打开和保存文件,点击即显示文本内容,点击即保存文件

前面的一篇博客讲到通过打开新窗口进行打开和保存文件,这一篇则重点介绍怎样一步到位来进行打开和保存文件(这里还以.txt文本文件为例). 我们要打开.txt文本文件,无非是想要里面的文本内容,并且把其显示到页面里罢了,那我们能不能直接点击按钮就让文件的内容自动显示到页面上............ 而不需要经过打开新窗口这一步骤呢 同样,我们点击保存按钮,能不能就直接给文件命名为自己想要的名称,而且直接保存到自己想要的位置或者文件里........ 而不经过打开新窗口定位某一个具体的文件夹下这一步骤

Linux下使用vi新建文件保存文件时遇到错误:E212: Can&#39;t open file for writing

出现E212: Can't open file for writing的问题是由于权限问题导致的,解决方法有以下思路: 1.使用root进行登录,然后再操作. 2.在使用命令时,前面加sudo. 3.如果是多级文件夹的文件时,由于这个文件夹没有创建,所以要先创建这个文件夹,再来操作这个文件. Linux下使用vi新建文件保存文件时遇到错误:E212: Can't open file for writing