需求分析
1.设计题目:单项选择题标准考试系统
2.系统功能需求分析:能够答题,插入试题,查看题库试题,删除题库试题,最后退出系统五个功能
二:概要设计:
2.1系统总体设计框架:
![](https://img-blog.csdnimg.cn/e2ddc4f2c1c545e4aa9311c25a49a8d8.png)
功能模块说明
答题模块
![](https://img-blog.csdnimg.cn/2b5fde1242cb4127b7ddaa837f64dac9.png)
2.3插入试题模块:
确定插入题目数,选择需要插入的题目类型,打开文件,插入题目,关闭文件.
2.4删除试题模块:
确定删除题号,选择需要删除的题目类型,读出文件,删除题目,并创建一个新的文件覆盖原文件,把剩下的试题读入文件.
2.4系统设计
主要结构体
题目,选项A,B,C,D,答案
struct Test{
char question[200];
char option1[100];
char option2[100];
char option3[100];
char option4[100];
char key;
}
2.5主要功能函数
int addtest()//增加试题
void answerq()//答题
void changeface()//选择试题类型界面
int changeopenfile()//选择打开文件
int compare(char a,char b)//答案对照
void readfile(int i,Test p)//显示题目
void showtest(int n,int m)//展示题目或删除结构体元素
void startinterface()//开始界面
4 系统调试
(1)操作界面
![](https://img-blog.csdnimg.cn/612042e8280f4bfa920b2eb056a3e7ae.png)
程序代码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include<conio.h>
#define MAX 50
typedef struct Test{
char question[200];
char option1[100];
char option2[100];
char option3[100];
char option4[100];
char key;
}Test;
FILE *fp;
void changeface()//选择试题类型界面
{
printf("\n\n\n\n\n");
printf("\t\t--------------------------------------\n");
printf("\t\t| 选择试题类型 |\n");
printf("\t\t| |\n");
printf("\t\t| 1.数据结构 |\n");
printf("\t\t| |\n");
printf("\t\t| 2.c/c++ |\n");
printf("\t\t| |\n");
printf("\t\t--------------------------------------\n");
}
int addtest()//增加试题
{
int i, num;
Test title[MAX]={"\0"};
FILE *fp;
changeface();
do
{
scanf("%d",&i);
fflush(stdin);
switch(i)
{
case 1:fp=fopen("questionbank1.txt","a+");break;
case 2:fp=fopen("questionbank2.txt","a+");break;
default:printf("你输入的指令不正确,请重新输入\n");
}
}while(i!=1&&i!=2);
system("cls");
while(1)
{
printf("请输入要插入的题目数(<=50)\n");
scanf("%d",&num);
fflush(stdin);
if(num<=MAX&&num>0)break;
else printf("输入有误,请重新输入题目数\n");
}
for(i=0;i<num;i++)
{
printf("请输入第%d道题题目,选项和答案:\n",i+1);//输入结构体元素内容
printf("请输入题目\n");
gets(title[i].question);
printf("请输入选项A:");
gets(title[i].option1);
printf("\n请输入选项B:");
gets(title[i].option2);
printf("\n请输入选项C:");
gets(title[i].option3);
printf("\n请输入选项D:");
gets(title[i].option4);
fflush(stdin);
printf("\n请输入答案:\n");
scanf("%1c",&title[i].key);
fflush(stdin);
system("cls");
}
for(i=0;i<num;i++)
{
printf("%d.%s\n%s\t%s\t",i+1,title[i].question,title[i].option1,title[i].option2);
printf("%s\t%s\n答案:%c\n",title[i].option3,title[i].option4,title[i].key);
}
if(fp==NULL)return 0;
else
{
for(i=0;i<num;i++) fprintf(fp,"%s\t%c\n%s\t%s\t%s\t%s\n",title[i].question,title[i].key,title[i].option1,title[i].option2,title[i].option3,title[i].option4);
fclose(fp);
}return 1;
}
void startinterface()//开始界面
{
printf("\n\n\n\n\n");
printf("\t\t --------------------------------------\n");
printf("\t\t | 单项选择题标准化考试系统 |\n");
printf("\t\t | |\n");
printf("\t\t | 1.答题 |\n");
printf("\t\t | |\n");
printf("\t\t | 2.试题插入 |\n");
printf("\t\t | |\n");
printf("\t\t | 3.显示题库题目 |\n");
printf("\t\t | |\n");
printf("\t\t | 4.删除试题 |\n");
printf("\t\t | |\n");
printf("\t\t | 5.退出系统 |\n");
printf("\t\t --------------------------------------\n");
}
int changeopenfile()//选择打开文件
{
int i;
do{
scanf("%d",&i);
fflush(stdin);
switch(i)
{
case 1:fp=fopen("questionbank1.txt","r+");break;
case 2:fp=fopen("questionbank2.txt","r+");printf("rrrrrrrrr\n");break;
default:printf("你输入的指令不正确,请重新输入\n");
}
}while(i!=1&&i!=2);
system("cls");
return i;
}
int compare(char a,char b)//答案对照
{
if(a==b||(a-32)==b)
{printf("答对了\n");return 1;}
else {printf("答错了\n正确答案是%c\n",b);return 0;}
}
void readfile(int i,Test p)//显示题目
{
printf("%d.%s\n",i+1,p.question);
printf("A.%s\t",p.option1);
printf("B.%s\n",p.option2);
printf("C.%s\t",p.option3);
printf("D.%s\n",p.option4);
}
void answerq()//答题
{
Test title[MAX];
int n,i,j,k,num[MAX],score,sum=0;char h;
if(fp==NULL)
{
printf("\n不能打开questionbank.dat文件,按任何键退出程序!\n");
getch();
exit(-1);
}
for(j=0;!feof(fp);j++)//统计文件中的结构体项数
{
fscanf(fp,"%s\t%c\n%s\t%s\t%s\t%s\n",&title[j].question,&title[j].key,&title[j].option1,&title[j].option2,&title[j].option3,&title[j].option4);
}
fclose(fp);
while(1)
{
printf("请输入需要答题的题目数\n");
scanf("%d",&n);//n必须小于j
fflush(stdin);
if(n>j)
printf("输入的题目数大于题库的题目数,请重新输入\n");
else break;
}
for(i=0;i<n;i++)//产生n个不同的随机数
{
srand(time(NULL));
num[i]=rand()%j;
while(1)
{
for(k=0;k<i;k++)//排除相同随机数
if(num[k]==num[i])break;
if(k==i)break;
num[i]=rand()%j;
}
readfile(i,title[num[i]]);
printf("输入答案:");
scanf("%c",&h);
fflush(stdin);
score=compare(h,title[num[i]].key);
sum+=score;
}
printf("答对%d题\n",sum);
printf("按任意键返回主界面\n");
getch();
}
void showtest(int n,int m)//展示题目或删除结构体元素
{
int i,j,k;
Test title[MAX];
if(fp==NULL)
{
printf("\n不能打开questionbank.dat文件,按任何键退出程序!\n");
getch();
exit(-1);
}
for(j=0;!feof(fp);j++)//统计文件中的结构体项数
{
fscanf(fp,"%s\t%c\n%s\t%s\t%s\t%s\n",&title[j].question,&title[j].key,&title[j].option1,&title[j].option2,&title[j].option3,&title[j].option4);
}
fclose(fp);
for(i=0;i<j;i++)
readfile(i,title[i]);
if(n==1)
{
printf("按任意键返回主界面\n");
getch();
system("cls") ;
}
else
{
printf("输入需要删除的题号:\n");
scanf("%d",&k);
switch(m)
{
case 1:fp=fopen("questionbank1.txt","w+");break;
case 2:fp=fopen("questionbank2.txt","w+");break;
}
for(i=0;i<j;i++)
{
if(k-1==i)continue;
fprintf(fp,"%s\t%c\n%s\t%s\t%s\t%s\n",title[i].question,title[i].key,title[i].option1,title[i].option2,title[i].option3,title[i].option4);
}
fclose(fp);
printf("删除成功\n\n按任意键返回主界面\n");
getch();
system("cls") ;
}
}
void main()
{
char ch,c;int m;
while(1)
{
startinterface();
ch=getchar();
system("cls");
fflush(stdin);
if(ch=='5')//退出系统
{
printf("是请输入Y\t否请按任意键\n");
c=getch();system("cls");
if(c=='y'||c=='Y') break;
else continue;
}
switch(ch)
{
case '1': changeface();
m=changeopenfile();answerq();system("cls");break;
case '2': if(addtest())
printf("保存成功!\n");
else
printf("保存失败!\n");
getch();break;
case '3': changeface();
m=changeopenfile();
showtest(1,m);
break;
case '4':changeface();
m=changeopenfile();showtest(2,m);break;
default:
printf("你输入的指令无效,请按任意键继续执行\n");getch();break;
}
fflush(stdin);
system("cls") ;
}
}