课程设计

 

单项选择题标准化考试系

所属专业:软件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的更多相关文章

  1. 第2-1-1章 FastDFS分布式文件服务背景及系统架构介绍

    目录 1 背景 1.1 为什么需要分布式文件服务 1.1.1 单机时代 1.1.2 独立文件服务器 1.1.3 分布式文件系统 1.2 什么是FastDFS 2 系统架构 2.1 Tracker集群 ...

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

    功能:java图形用户界面开发,练习打开保存文件 代码如下: import java.awt.FileDialog; import java.awt.Frame; import java.awt.Me ...

  3. vim保存文件时,生成.un~文件

    在用vim保存文件时,文件夹下生成.un~文件 怎么删除这些文件呢 在网上搜索的答案: http://stackoverflow.com/questions/15660669/what-is-a-un ...

  4. android 保存文件的各种目录列表

    一般的,我们可以通过context和Environment来获取要保存文件的目录 ($rootDir) +- /data -> Environment.getDataDirectory() | ...

  5. 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

    1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...

  6. C#项目打开/保存文件夹/指定类型文件,获取路径

    C#项目打开/保存文件夹/指定类型文件,获取路径 转:http://q1q2q363.xiaoxiang.blog.163.com/blog/static/1106963682011722424325 ...

  7. FileOutputStream保存文件

    //保存文件,根据传入的路径,存放在SD卡目录下public boolean saveToPath(String title, String pageName) { Bitmap b = getCha ...

  8. Qt snippet — 打开文件&保存文件

    打开文件: void Notepad::on_actionOpen_triggered() { QString fileName = QFileDialog::getOpenFileName(this ...

  9. php中关于js保存文件至本地的问题

    最近在搞一个livezilla的在线客服聊天的东东,客户界面要求添加一个下载聊天记录的功能.于是我就是翻看了下网上的各种关于”js保存文件至本地“的资料,发现只能在IE下通过execCommand实现 ...

随机推荐

  1. copyTo和clone的区别/制作mask的fillpoly函数(有问题)

    OpenCV中mat::copyto( )函数使用方法 OpenCV的fillPoly函数 使用OpenCV库进行图像处理时,经常会用到clone和copyTo函数,这里对两个函数进行介绍. copy ...

  2. 【python之路23】递归

    1.递归的基础 举例说明:老师要班里坐在最后的一排学生要一本书,老师对前面的人说你向最后一排的同学要一本书,那么最前面的人跟坐在第2排的人说,第2排的人跟第3排的人说,当命令传递到最后一排时,最后一排 ...

  3. Ajax 用法简介

    使用Ajax实现页面的局部刷新 一.不依赖jquery时是这样的用法: var xhr=new XMLHttpRequest(); xhr.onreadystatechange=function(ev ...

  4. js 百度地图和谷歌地图的选择

    最近手上接到一个需求: 国外的域名访问,显示谷歌地图 国内的域名访问,显示百度地图 切换中英文的时候,中文->显示百度地图,英文->能显示谷歌地图就显示谷歌地图,不能显示(报错)就显示百度 ...

  5. centos下彻底删除mysql

    打算重新试试安装两个mysql,就把老的删除了. yum remove mysql mysql-server mysql-libs compat-mysql51 rm -rf /var/lib/mys ...

  6. 【模板】tarjanLCA [2017年6月计划 学习tarjanLCA]

    P3379 [模板]最近公共祖先(LCA) 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询 ...

  7. web前端学习(二)html学习笔记部分(10)-- HTML5构建应用布局和页面

    1.2.25  HTML5构建应用布局和页面 1.2.25.1  HTML5在移动开发中的准则 1.尽量使用单页面开发 2.慎重选择前端UI框架 3.动画.特效使用准则(60fps) 浏览器消耗最小的 ...

  8. Spring使用JDBC配置具名参数

    好处:若有多个参数,则不用再去对应位置?,直接对应参数名,便于维护 缺点:较为麻烦 使用具名参数时可以使用以下的方法 好处,通过实现类BeanPropertySqlParameterSource之间传 ...

  9. JS更改字体颜色、背景颜色

    CSS 颜色十六进制值  http://www.w3school.com.cn/cssref/css_colorsfull.asp CSS background-color 属性 body { bac ...

  10. js计算精度问题(浮点数误差,大数计算出错)

    https://github.com/camsong/blog/issues/9 0.1+0.2 //0.30000000000000004 1-0.9 //0.09999999999999998 9 ...