单项选择题标准化考试系统

2023-11-19

单项选择题标准化考试系统

学校将大一上学期期末的c语言课程设计放进下学期开学,我选取的c课程设计题目是《单项选择题标准化考试系统》,参考了csdn一些大佬的文章,终于做出来了!!!
接下来,我将与大家一起浏览该系统,系统还有很多不足之处,欢迎提建议,希望能与更多人交流!

目录

  1. 运行环境
  2. 结构体定义
  3. 菜单函数
  4. 初始添加函数
  5. 添加函数
  6. 删除函数
  7. 其他函数

运行环境

由于课程设计要求,我运用了:

  1. visual c++ 6.0

  2. 自己生成的D盘的一个二进制文件

结构体的定义

typedef struct problem
{
	int n;//题号
	char t[50];//题目和答案搁这儿
	char a;//正确答案
}problem; 

题目只能录入49个字符,要是有题目要求的童鞋记得修改数组啊!
千万别越界,尽量别浪费空间!
千万别越界,尽量别浪费空间!
千万别越界,尽量别浪费空间!

菜单函数

//菜单函数,联系各功能
void menu()
{
   int choose;
                                //外观
   printf ("--------------单项选择题测评系统V2.0--------------\n");
   printf ("            欢迎使用本系统,祝你做题愉快     \n");
                            //功能的选择
   printf ("请选择本系统的功能:\n");
   printf ("            1.使用说明\n");
   printf ("            2.答题\n");
   printf ("            3.题目的初始增加\n");
   printf ("            4.题目的增加\n");
   printf ("            5.题目的删除\n");
   printf ("请输入你想用的功能:");  //选择
   scanf ("%d",&choose);
   switch (choose)
 { 
 	 case 1: specification(); break;
  	 case 2: work(); 		  break;
  	 case 3: add1(); 		  break;
  	 case 4: add2(); 		  break;
 	 case 5: cut(); 		  break;
  	 default :				  break;
 };  	
}

菜单函数主要由switch、case 、printf 组成,目的是为了调用其他函数实现功能。
运行界面:在这里插入图片描述

说明书

int specification()
{
	printf ("            说明书\n");
	printf ("  欢迎使用说明书功能:\n");
	printf ("     1.本系统由本人参考资料、与同学交流开发而成,不作商业用途\n");
	printf ("     2.菜单页面有5个功能,按照相关指示可使用\n");
	printf ("     3.未了模拟现实情况,题目的初始添加、添加、删除功能均为老师(出题者)使用,所以设置密码(123456)\n");
	printf ("               欢迎使用单项选择题测评系统V2.0,祝你做题愉快!\n");
	remenu();
}

考虑到完整性和用户体验特地加入,多个格式化输出,增强用户体验

初始化添加

//初始添加
int add1()
{
	problem *p,q;
	FILE *fp;
	char s;
	int i,j,total;
	if(!(mima())) 
	printf ("------------欢迎使用题目初始增加功能---------\n");
	printf ("请输入增添的题目数量:\n");
  	scanf ("%d",&total);
  	p=(problem *)malloc(total* sizeof (problem));
    if(p!=NULL)
       printf ("加载中,别急!\n");
    else 
       printf ("系统连接错误。\n");
    printf ("接下来,请按照例子增添题目:\n"); 
    printf ("例子:\n");
    printf ("题号:1\n");
  	printf ("题目:1+1=(),A.1 B.2 C.3 D.4\n");
  	printf ("正确答案:B\n");
    for (i=0;i<total;i++)
    {
    	printf ("题号:");
    	scanf  ("%d",&p[i].n);
    	scanf ("%c",&s);
    	printf ("正确答案:");
    	scanf  ("%c",&p[i].a);
    	scanf ("%c",&s);
    	printf ("题目:");
    	gets   (p[i].t);//用gets可以输入空格,已算是美观题目
    }
   fp=fopen("D:\\题库1","wb+");
   fwrite(p,sizeof(problem),total,fp);
   fclose (fp);
   free (p);
   fp=fopen("D:\\题库1","rb");
   printf ("以下是你加入的题目:\n");
   for (j=0;j<total;j++)
 {
   i=fseek (fp,j*sizeof (problem),0);//看重头开始的第j题
   if((i==0)&&(fread(&q,sizeof(problem),1,fp)==1)) 
         { 
    printf ("题号  正确答案   题目:\n");
    printf ("%d  %c  %s \n",q.n,q.a,q.t);
         } 
 }
   fclose(fp);
   remenu();
}

运行界面:
在这里插入图片描述
其实主要的将数据放进指针数组,再将指针数组写进文件

添加

//增加
int add2()
{
	int n,total;
	int t1,t2;
	int i;
	char s;
	FILE *fp;
	problem *p,q;
	if(!(mima())) 
	printf ("------------欢迎使用题目增加功能---------\n");
	total=Total();
	printf ("当前题目总数为%d\n",total);
	printf ("请输入想加入题目数量:");
	scanf ("%d",&n);
	p=(problem *)malloc(n* sizeof (problem));//开辟空间
	fp=fopen ("D:\\题库1","ab+");
	for (i=0;i<n;i++)
	{
		printf ("题号:");
    	scanf  ("%d",&p[i].n);
    	scanf ("%c",&s);
    	printf ("正确答案:");
    	scanf  ("%c",&p[i].a);
    	scanf ("%c",&s);
    	printf ("题目:");
    	gets   (p[i].t);
	}	
	t1=fseek(fp,0*sizeof (problem),2);//将指针定位到末尾
    t2=fread(&q,sizeof(problem),1,fp);
    fwrite(p, n*sizeof (problem), 1, fp);
	fclose (fp);
	total=Total();
	printf ("当前题目总数为%d\n",total);
	remenu();
}

运行界面:
在这里插入图片描述
以”ab+“形式打开二进制文件,打开文件指针定位末尾,再如添加般写入文件

删除函数

//删除
int cut()
{
	FILE *fp;
    problem q,*p;
    int total,i,n,j;
    total=Total();
    printf ("现有题目:%d\n",total);
    p=(problem *)malloc(total* sizeof (problem));
    fp=fopen ("D:\\题库1","rb");
    if(fp==NULL)
    {
     	printf("文件打开失败");
    }
    fread(&q,sizeof(problem),1,fp);
    i=0;
      while(!feof(fp))//将文件放进结构体指针数组
	 {
     	p[i]=q;
     	fread(&q,sizeof(problem),1,fp);
     	i++;
 	 }
     fclose(fp);
     printf ("删除的题目号码:");
     scanf ("%d",&n);
     for (i=n-1;i<total;i++)
     {
     	strcpy(p[i].t,p[i+1].t);
     	p[i].a=p[i+1].a;
     }
     fopen ("D:\\题库1","wb+");
     fwrite(p,sizeof(problem),total-1,fp);
     fclose(fp);
	 fp=fopen("D:\\题库1","rb");
     printf ("以下是剩下的题目:\n");
     for (j=0;j<total;j++)
   {
     i=fseek (fp,j*sizeof (problem),0);//看重头开始的第j题
     if((i==0)&&(fread(&q,sizeof(problem),1,fp)==1)) 
         { 
     printf ("题号  正确答案   题目:\n");
     printf ("%d  %c  %s \n",q.n,q.a,q.t);
         } 
 }
     fclose(fp);
     remenu();
}

运行界面:
在这里插入图片描述
删除就是将文件放进结构体,再覆盖删除,再写入。
可以继续优化,例如输出题库让人知道删除哪一题、
再例如删除多个题目,指针放删除的题号。。。。。。

做题函数


//做题
int work()
{	
	int *a,i,j;
	int n,total,score;
	int t1,t2;
	char answer,b;
	problem q;
	FILE *fp;
	total=Total();
	score=0;
	printf ("欢迎使用单项选择题系统答题功能\n");
	printf ("现在的题目数量有:%d\n",total);
	printf ("请输入想完成的题数:");
	scanf ("%d",&n);
	if (n<total)
	{
			
     	 a=(int*)malloc(n*sizeof(int));//分配空间生成动态数组
      	 for(i=0;i<n;i++)
	 {
	     loop1: srand( time (NULL));//srand和rand一起使用,不同种子让rand生成数不同
	 	 a[i]=rand()%total+1;//保证随机数在total内(小于total)(total为总题数)
		 for(j=i-1;j>=0;j--)
	   {
		     if(a[i]==a[j])
			 goto loop1;//让生成数不同
	   }
	 }
	 printf ("以下是你抽出的题号:");
     for (i=0;i<n-1;i++)
      {
     	printf ("%d、",a[i]);
      }
        printf ("%d\n",a[n-1]);
	   	
	}
	else
	  {
	  	 printf ("题数不足,退出。\n");
	  	 remenu();
	  }
	fp=fopen("D:\\题库1","rb");
	for (i=0;i<n;i++)
	{
    	t1=fseek(fp,(a[i]-1)*sizeof (problem),1);
    	t2=fread(&q,sizeof(problem),1,fp);
    	if ((t1==0)&&(t2==1))
    	{
    		printf ("%d.%s\n",q.n,q.t);
    		printf ("请输入正确答案:");
    		scanf ("%c",&b);
    		scanf ("%c",&answer);
    		if (q.a==answer)
    		   { 
    		   		score++;
    		   		printf ("\n");
    		   		printf ("正确答案:%c\n",q.a);
    		   	} 
    	}
    	rewind (fp);
	}
	printf ("答对题目总数是%d,一共%d分\n",score,5*score);
	fclose (fp);
	remenu();
}

运行界面:
在这里插入图片描述
按照现实生活可加详解啥的,在对答案那一步

其他函数

                      //其他函数
//返回函数:重新返回菜单
int remenu()
{
 	int a;
  	printf ("请输入任意符号返回菜单");
    if (scanf("%d",&a)!=EOF)
 {
 	 printf ("\n");
  	 system ("cls");
     menu();
 } 
   else 
    {
 	 system ("cls");
     printf ("已退出该系统,欢迎下次再来!\n");
    } 
}

//题目计数函数,极重要
int Total()
{
   int t1,t2;
   int total;
   FILE *fp;
   problem q;
   fp=fopen("D:\\题库1","rb");
   t1=fseek(fp,-1*sizeof (problem),2);//-1是灵魂操作,感谢大佬
   t2=fread(&q,sizeof(problem),1,fp);
   if ((t1==0)&&(t2==1))
     {
     	total=q.n;
     }
   fclose (fp); 
   return total;	
}
//用户体验,3次错密码酸爽!!!
int mima ()
{
  int i,j;
  for (i=0;i<4;i++)//密码,虽有4但只能输入3次
 {
//密码错误,结束
     while (i==3)
         printf ("你不是开发者,系统崩溃\n");  
      while (i==3)     break;
     	printf ("请输入执行者密码:");
    	  scanf ("%d",&j);
   	  if (j!=key) 
         printf ("密码错误,你还有%d次机会\n",A-i-1);
              else 
           break; 
     }
//密码正确,执行操作
   return 0;
}

参考文献

参考文献
1.RUMOR. 单项选择题标准化考试系统设计
https://blog.csdn.net/weixin_44499343/article/details/100064443
2. kafmC语言文本文件实现局部修改
https://blog.csdn.net/kafmws/article/details/80717176

结语

欢迎交流多给意见
加油,快点完成课设!
感谢文献作者的帮助!
需要源码和报告书可留言
系甘啦,bye,bye!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

单项选择题标准化考试系统 的相关文章

随机推荐

  • ES删除数据

    ES删除数据 注意 删除数据请谨慎执行 删除大于 日期的 其他场景可参照执行 DeleteQuery deleteQuery new DeleteQuery deleteQuery setIndex es中 index deleteQuer
  • ORACLE数据库备份管理-rman备份到NFS

    1 相关案例 1 df h无法正常显示文件系统挂载情况 使用如下命令进行处理 umount f nfsdir 2 节点启动出现问题 询问是否包含nfs服务 将分享节点nfs服务重启 1 案例1从linux linux 实施脚本如下 mkdi
  • LeetCode 237. 删除链表中的节点

    题目链接 点击这里 Definition for singly linked list public class ListNode int val ListNode next ListNode int x val x class Solut
  • 深度学习(一)深度学习的概念

    什么是深度学习 深度学习是机器学习与神经网络 人工智能 图形化建模 优化 模式识别和信号处理等技术融合后产生的一个领域 深度学习网路是神经网络革命性的发展 人们甚至认为可以用它来创建更加强大的预测模型 深度学习的分类 深度学习使用多层机器学
  • CMakeLists中条件判断: if()-endif()成对出现

    缺少endif 时提示代码块opening is not closed 1 if if xxx 要缩进 endif 2 if else if xxx 要缩进 else xxx 要缩进 endif
  • Windows RuntimeError: Distributed package doesn‘t have NCCL built in问题

    问题描述 python在windows环境下dist init process group backend rank world size 处报错 RuntimeError Distributed package doesn t have
  • Serilog + SQL Server 动态分表记录日志

    Serilog SQL Server 分表记录日志 Serilog SQL Server 动态分表记录日志 依赖包 安装依赖包 配置 appsettings json 配置 Program cs Serilog SQL Server 动态分
  • visio 科学图形包_Gnuplot科学绘图(三十九)——地图及圆圈数据图

    Gnuplot科学绘图 系列内容Gnuplot科学绘图 三十一 曲线色彩填充 Gnuplot科学绘图 三十二 填充风格Gnuplot科学绘图 三十三 柱状图Gnuplot科学绘图 三十四 阶梯图Gnuplot科学绘图 三十五 数据平滑Gnu
  • element-ui中日期区间组件

    elementui中日期组件使用 最长只能选择3个月 不限制禁用日期 描述 时间组件代码 描述 点击 确定 按钮进行验证 点击 清空 按钮 清空输入框中的数据 时间范围不能超过3个月 并添加快捷选择今天 最近一周 最近一月 最近3个月 以下
  • js正则 年龄只能为正数,不能为负数,且不能超过150

    需求 要对输入的年龄加条件限制 不能任意输入 只能为正数 不能输入小数 负数
  • 正则表达式(日期、金额、特殊字符)_java语言

    正则表达式 java 正则表达式在线测试网站 个人觉得还算精确 http tool chinaz com regex 备注 如有错误 希望留言指出 虚心请教 金额格式 正数 包含至多2位小数 第1种形式 校验金额格式是否正确 正数 包含至多
  • Android OpenCv 提取图像的RGB三原色分割图像Split Core.split

    基础知识 如果你还不了解 图片 是如何存储的 建议先去看这篇文章 关于三通道彩色图像的存储方式理解 函数简析 我们都知道 彩色图片每个像素点都对应三个值 如 R G B Core split 这个函数则是帮我们这三个值分开 即分别提取 R
  • VUE3快速上手--知识点

    本文是根据B站尚硅谷的视频 尚硅谷Vue2 0 Vue3 0全套教程 全网最新最强vuejs从入门到精通 Vue3部分形成的笔记 一 简介 2020年9月18日 Vue js发布3 0版本 代号 One Piece 海贼王 Vue3相比Vu
  • fileinclude (攻防世界web)

    题目 从题目页面可得到对我们有用的信息 flag存放在了flag php中 并且还知道了当前页面的绝对路径 分析完当前页面能够获取到的所有信息后 查看页面源代码试试 发现得到了主页的php源码 分析以上源码 可知其中 lan为我们可控的 并
  • CentOS安装mariadb

    1 安装 root localhost yum install mariadb mariadb server 2 启动并自启 root ecs 3f21 systemctl enable mariadb now 3 查看启动状态 root
  • CLIP 改进工作

    Contents 图像分类 IJCV 2022 Learning to prompt for vision language models Introduction Context Optimization CoOp Experiments
  • Quartz定时任务详解

    一 添加依赖
  • android Instrumentation

    Android提供了一系列强大的测试工具 它针对Android的环境 扩展了业内标准的JUnit测试框架 尽管你可以使用JUnit测试Android工程 但Android工具允许你为应用程序的各个方面进行更为复杂的测试 包括单元层面及框架层
  • VUE中用原生JS实现触底加载数据

    VUE中用原生JS实现触底加载数据 在vue开发过程中使用第三方组件是不可避免的 但是第三方样式的css样式属实头痛 所以我选择原生JS的写法完成了触底加载 1 定义data page 1 页数 limit 10 每页数据条数 flag t
  • 单项选择题标准化考试系统

    单项选择题标准化考试系统 学校将大一上学期期末的c语言课程设计放进下学期开学 我选取的c课程设计题目是 单项选择题标准化考试系统 参考了csdn一些大佬的文章 终于做出来了 接下来 我将与大家一起浏览该系统 系统还有很多不足之处 欢迎提建议