随机生成试题册,题目需要存放路径可自己设置,但是原题库需事先按要求构建
#include <iostream>
#include <fstream>
#include <vector>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <windows.h>
using namespace std;
class test;
vector<test> G[6];
class test
{
private:
char No[10];
char tip[256];
int level;
char pro[256];
char cho[256];
char ans;
int cnt;
public:
test();
test(char*a,char*b,int c,char*d,char*e,char f,int co=0);
void print();
char k1[2];
char*getn();
char*gett();
int getl();
char*getp();
char*getch();
char geta();
int getco();
void Run();
void change(char* Tip1,int level1,char* pro1,char *cho1,char ans1);
void changec();
void changen(char *);
friend void readfile(char* s) //从文件中读取数据
{
ifstream inf(s);
while(!inf.eof())
{
test a;
inf.getline(a.No, 10);
//printf("%s\n", a.No);
inf.getline(a.tip, 256);
inf >> a.level;
inf.getline(a.k1, 2);
inf.getline(a.pro, 256);
inf.getline(a.cho, 256);
inf >> a.ans;
inf >> a.cnt;
inf.getline(a.k1, 2);
int m = a.getn()[1] - '0'; //取No的第二个字符即为章节号
//printf("%c\n", a.getn()[1]);
//printf("m = %d\n", m);
G[m].push_back(a); //将其放入容器
}
}
};
void makepaper();
void test::changen(char *s)
{
strcpy(No,s);
}
void test::changec()
{
cnt++;
}
void test::print()
{
cout << "\n 题号:" << No << endl;
cout<<" 描述:" << tip << endl;
cout<<" 难度:" << level << endl;
cout<<" 题目:" << pro << endl;
cout<<" 选项:" << cho << endl;
cout<<" 答案:" << ans << endl;
cout<<" 调用次数:" << cnt << endl;
}
test::test() //构造函数
{
*No = NULL;
*tip = NULL;
level = 0;
*pro = NULL;
*cho = NULL;
ans = 'A';
cnt=0;
}
test::test(char*a,char*b,int c,char*d,char*e,char f,int co) //构造函数
{
strcpy(No, a);
strcpy(tip, b);
level = c;
strcpy(pro, d);
strcpy(cho, e);
ans = f;
cnt = co;
}
char* test::getn()
{
return No;
}
char* test::gett()
{
return tip;
}
int test::getl()
{
return level;
}
char* test::getp()
{
return pro;
}
char* test::getch()
{
return cho;
}
char test::geta()
{
return ans;
}
int test::getco()
{
return cnt;
}
void test::change(char* tip1,int level1,char* pro1,char *cho1,char ans1)
{
strcpy(tip, tip1);
level = level1;
strcpy(pro, pro1);
strcpy(cho, cho1);
ans = ans1;
}
void rebuild()
{
ofstream outf("D:\\1.txt");
for(int m = 1; m <= 5; m++)
{
for(int i = 0; i < G[m].size(); i++)
{
outf << G[m][i].getn() << endl;
outf << G[m][i].gett() << endl;
outf << G[m][i].getl() << endl;
outf << G[m][i].getp() << endl;
outf << G[m][i].getch() << endl;
outf << G[m][i].geta() << endl;
outf << G[m][i].getco() << endl;
}
}
outf.close();
}
void Display()
{
cout<<" ******** 1.查询试题 *******" << endl;
cout<<" ******** 2.添加试题 *******" << endl;
cout<<" ******** 3.修改试题 *******" << endl;
cout<<" ******** 4.删除试题 *******" << endl;
cout<<" ******** 5.生成试卷 *******" << endl;
cout<<" ******** 6.退出系统 *******" << endl;
}
void makeanswer(double ave,int *a );
void Search() //搜索函数
{
cout << "\n********************欢迎查询试题***********************"<<endl;
char c;
do
{
int choose;
cout << " ---> 1.按章节查询" << endl;
cout << " ---> 2.按难度查询" << endl;
cout << " ---> 3.退出查询" << endl;
cout << "\n 请输入查询方式:";
cin >> choose;
if(choose == 1)
{
cout << endl << " 第一章共" << G[1].size() << "题" << endl;
cout << " 第二章共" << G[2].size() << "题" << endl;
cout << " 第三章共" << G[3].size() << "题" << endl;
cout << " 第四章共" << G[4].size() << "题" << endl;
cout << " 第五章共" << G[5].size() << "题" << endl;
cout<<"\n 请输入要查询试题的章节和题号:";
int n, m;
scanf("%d %d", &m, &n);
if(m < 1 || m > 5 || n > G[m].size())
{
cout << "\n 抱歉,没有找到你想查询的题" << endl;
Search();
}
else
G[m][n-1].print();
}
else if(choose == 2)
{
cout<<"\n 难度共分为5级:"<<endl;
cout<<" 1-易,2-偏易,3-中等,4-偏难,5-难"<<endl;
cout<<"\n 请输入选择的难度:";
int q,i,j;
cin >> q;
if(q < 1 || q > 5)
{
cout<<"\n 抱歉,没有找到你想查询的难度"<<endl;
Search();
}
else
{
for(i = 1; i < 6; i++)
for(j = 0; j < G[i].size(); j++)
if(G[i][j].getl() == q)
G[i][j].print();
}
}
else if(choose == 3)
system("cls");
cout << "\n 是否继续查询试题Y/N: ";
getchar();
c = getchar();
}while(c == 'Y');
system("cls");
}
void Add() //添加函数
{
char c;
cout<<"\n\n*********************************欢迎添加试题******************************" << endl;
do
{
cout << "\n 请输入要添加试题的章节:";
int m;
scanf("%d", &m);
int n = G[m].size(), i = 0;
int total = m * 1000 + n + 1;
char str[6];
char tip[256];
int level;
char pro[256];
char cho[256];
char ans;
memset(str,0,sizeof(str[0]));
itoa(total, str, 10);
char str2[2] = "0";
strcat(str2,str);
strcpy(str,str2);
cout<<" 输入提示:";
getchar();
gets(tip);
cout<<" 输入难度:";
cin>>level;
cout<<" 输入题目:";
getchar();
gets(pro);
cout<<" 输入选项:";
gets(cho);
cout<<" 输入答案:";
ans = getchar();
test a(str, tip, level, pro, cho, ans, 0);
if(level < 1 || level > 5)
cout << " 难度应在1~5之间" << endl;
else
a.print();
G[m].push_back(a);
rebuild();
cout << "\n 是否继续添加试题Y/N:";
getchar();
c=getchar();
}while(c == 'Y');
system("CLS");
}
void Change() //更改函数
{
char c;
cout<<"\n\n*****************欢迎修改试题***************************"<<endl;
do
{
cout << endl << " 第一章共" << G[1].size() << "题" << endl;
cout << " 第二章共" << G[2].size() << "题" << endl;
cout << " 第三章共" << G[3].size() << "题" << endl;
cout << " 第四章共" << G[4].size() << "题" << endl;
cout << " 第五章共" << G[5].size() << "题" << endl;
cout << endl << " 请输入要修改试题的章节和题号:";
int m, n;
scanf("%d %d", &m, &n);
char tip[256];
int level;
char pro[256];
char cho[256];
char ans;
cout << " 输入提示:";
getchar();
gets(tip);
cout << " 输入难度:";
cin >> level;
cout << " 输入题目:";
getchar();
gets(pro);
cout << " 输入选项:";
gets(cho);
cout << " 输入答案:";
ans = getchar();
G[m][n-1].print();
G[m][n-1].change(tip, level, pro, cho, ans);
G[m][n-1].print();
rebuild();
cout << "\n 是否继续修改试题Y/N:";
getchar();
c = getchar();
}while(c == 'Y');
system("CLS");
}
void Delete() //删除函数
{
char c;
cout << "\n************************欢迎删除试题********************************"<<endl;
do
{
cout << endl << " 第一章共" << G[1].size() << "题" << endl;
cout << " 第二章共" << G[2].size() << "题" << endl;
cout << " 第三章共" << G[3].size() << "题" << endl;
cout << " 第四章共" << G[4].size() << "题" << endl;
cout << " 第五章共" << G[5].size() << "题" << endl;
cout << endl << " 请输入要删除试题的章节和题号:";
int m, n;
scanf("%d %d", &m, &n);
for(int i = n; i < G[m].size(); i++)
{
char str[6];
int x = 0;
char str2[2] = "0";
strcpy(str,G[m][i].getn());
x = atol(str) - 1;
itoa(x, str, 10);
strcat(str2, str);
G[m][i].changen(str2);
}
G[m][n-1].print();
for(int j = n; j < G[m].size(); j++)
{
if(n == G[m].size())
break;
G[m][j-1] = G[m][j];
}
G[m].resize(G[m].size() - 1);
G[m][n-1].print();
rebuild();
cout << "\n 是否继续删除试题Y/N:";
getchar();
c = getchar();
}while(c == 'Y');
system("CLS");
}
vector<test> M;
void Set() //设置题目
{
M.clear();
srand(time(0));
cout << endl << " *********欢迎生成试卷*********" << endl;
cout << " **********1.随机生成**********" << endl;
cout << " **********2.人为指定**********" << endl;
cout << " **********3.退出生成试卷******" << endl;
cout << endl << " 请输入生成方式:";
int chos;
scanf("%d", &chos);
if(chos == 1)
{
int a[20], m;
double sum = 0, ave = 0;
memset(a,0,sizeof(a));
cout << "\n 请输入所需题数:";
scanf("%d", &m);
bool hash[6][105];
memset(hash, false, sizeof(hash));
for(int i = 0; i < m; i++)
{
int x = 1 + rand() % 5;
int y = rand() % G[x].size();
if(!hash[x][y])
{
hash[x][y] = true;
M.push_back(G[x][y]);
}
}
for(int j = 0; j < M.size(); j++)
{
char* str;
str = M[j].getn();
a[str[1]-'0']++;
sum += M[j].getl();
}
ave = sum / M.size();
makepaper();
makeanswer(ave, a);
}
if(chos == 2)
{
int m, a[10], s = 0;
double sum, avel;
cout << endl << " 请输入所需题数(1- 30):";
scanf("%d", &m);
cout << endl << " 请输入各章所需题数(共5章): ";
cout << endl << " 第一章共" << G[1].size() << "题" << endl;
cout << " 第二章共" << G[2].size() << "题" << endl;
cout << " 第三章共" << G[3].size() << "题" << endl;
cout << " 第四章共" << G[4].size() << "题" << endl;
cout << " 第五章共" << G[5].size() << "题" << endl << endl;
memset(a, 0, sizeof(a));
for(int i = 1; i < 6; i++)
{
cout << " 第" << i <<"章题数:";
scanf("%d", &a[i]);
s += a[i];
}
if(s != m)
{
cout << "\n 输入错误!请重新输入各章题数!" << endl;
return ;
}
else
{
int cho1;
cout << endl << " 请确定难度模式" << endl;
cout << " **********1.随机*************" << endl;
cout << " **********2.难度3.5左右******" << endl;
cout << " **********3.难度为5比例******" << endl;
cout << endl << " 请输入难度模式:";
scanf("%d", &cho1);
if(cho1 == 1)
{
int i,j,k;
double sum = 0;
for(j = 1; j < 6; j++)
{
for(k = 0; k < a[j]; k++)
{
i = rand() % G[j].size();
M.push_back(G[j][i]);
sum += G[j][i].getl();
}
}
avel = sum / m;
makepaper();
makeanswer(avel,a);
}
if(cho1 == 2)
{
sum = 0;
for(int j = 1; j < 6; j++)
{
for(int k = 0; k < a[j]; k++)
{
int x = rand() % G[j].size();
M.push_back(G[j][x]);
sum += G[j][x].getl();
}
}
avel = sum / M.size();
avel = sum / m;
if(avel < 3.2 || avel > 3.8)
{
do{
if(avel < 3.2)
{
int cnt1 = 0,t = 0;
for(int i = 0; i < M.size(); i++)
{
if(M[i].getl() < 3 && !t)
{
char *str;
str = M[i].getn();
for(int j = 0; j < G[str[1]-'0'].size(); j++)
{
if(!cnt1 && G[str[1]-'0'][j].getl() >= 4)
{
M[i] = G[str[1]-'0'][j];
cnt1 = 1;
t = 1;
}
}
}
}
}
for(int k = 0; k < M.size(); k++)
sum += M[k].getl();
avel = sum / M.size();
if(avel > 3.8)
{
int cnt2 = 0, t = 0;
for(int i = 0; i < M.size(); i++)
{
if(M[i].getl() < 3 && !t)
{
char *str;
str = M[i].getn();
for(int j = 0; j < G[str[1]-'0'].size(); j++)
{
if(!cnt2 && G[str[1]-'0'][j].getl() <= 2)
{
M[i] = G[str[1]-'0'][j];
cnt2=1;
t=1;
}
}
}
}
}
sum = 0;
for(int l = 0; l < M.size(); l++)
sum += M[l].getl();
avel = sum / M.size();
}while(avel < 3.2 || avel > 3.8);
sum = 0;
for(int l = 0; l < M.size(); l++)
sum += M[l].getl();
avel = sum / M.size();
makepaper();
makeanswer(avel,a);
}
}
if(cho1 == 3)
{
double sum = 0, avel;
int percent;
cout << endl << " 请输入难度为5的比例(%):";
scanf("%d", &percent);
int lv5 = (int)(m * percent / 100);
vector<test> A;
for(int i = 1; i < 6; i++)
{
for(int j = 0; j < G[i].size(); j++)
{
if(G[i][j].getl() == 5)
A.push_back(G[i][j]);
if(lv5 > A.size ())
{
cout << endl << " 指定题数超过了难度为5的总题数,请重新输入!" << endl;
cout << endl << " 按回车后返回查询界面!" << endl;
getchar();
getchar();
system("CLS");
Search();
}
else
{
int b[10];
for(int k1 = 1; k1 < 6; k1++)
b[k1] = a[k1];
cout << endl;
for(int s = 0; s < lv5; s++)
{
char *str;
int x = rand() % A.size();
str = A[x].getn();
if(a[str[1] - '0'] <= 0)
s--;
else
{
M.push_back(A[x]);
b[str[1]-'0'] -- ;
}
}
for(int i1 = 1; i1 < 6; i1++)
{
for(int j1 = 0; j1 < b[i1]; j1++)
{
int x1 = rand() % G[i1].size();
if(G[i1][x1].getl() != 5)
M.push_back(G[i1][x1]);
else
j1--;
}
for(int t = 0; t < M.size(); t++)
sum += M[t].getl();
avel = sum / M.size();
makepaper();
makeanswer(avel, a);
}
}
}
}
}
}
if(chos == 3)
return;
}
system("CLS");
}
void makepaper() //制作试卷
{
char p1[20];
char a[14]="testpaper.txt";
cout<<"\n 请输入您要生成的试卷路径(示例:D:\\""\\,按回车键结束!):";
cin>>p1;
cout<<" 试卷生成中⋯⋯⋯⋯"<<endl;
strcat(p1,a);
ofstream outf(p1);
if(!outf)
{
cout<<" 不能打开..."<<endl;
return;
}
else
{
for(int i=0;i<M.size();i++)
{
outf<<M[i].getn()<<endl;
outf<<M[i].gett()<<endl;
outf<<M[i].getl()<<endl;
outf<<M[i].getp()<<endl;
outf<<M[i].getch()<<endl;
M[i].changec();
outf<<M[i].getco()<<endl;
}
outf.close();
}
cout<<" 试卷生成完毕!"<<endl;
}
void makeanswer(double ave,int *a) //制作答案
{
char p2[100];
char b[11]="answer.txt";
cout<<"\n 请输入您要生成的答案路径(示例:D:\\""\\,按回车键结束!):";
cin>>p2;
cout<<" 答案生成中⋯⋯⋯⋯"<<endl;
strcat(p2,b);
ofstream outf(p2);
outf<<"本试卷共有"<<M.size()<<"道题."<<endl;
for(int i=1;i<6;i++)
outf<<"第"<<i<<"章有"<<a[i]<<"道题."<<endl;
outf<<"难度为:"<<ave<<endl;
for( i=1;i<=M.size();i++)
outf<<i<<"."<<M[i-1].geta()<<endl;
cout<<" 答案生成完毕!"<<endl;
cout<<"\n 试卷及答案已存放于指定的路径中!"<<endl;
cout<<"\n 按回车后返回主界面!"<<endl;
getchar();
getchar();
system("cls");
}
int main()
{
readfile("D:\\data.txt"); //从D盘中读取试题信息
int choose; //选项编号
do
{
Display(); //显示菜单
cout << "\n 输入选择:";
cin >> choose;
switch(choose)
{
case 6:
{
system("ClS"); //当choose值为6时退出程序
return 0;
}
case 1:
Search(); //当choose值为1时,查询试题
break;
case 2:
Add(); //当choose值为2时,添加试题
break;
case 3:
Change(); //当choose值为3时,改变试题
break;
case 4:
Delete(); //当choose值为4时,删除试题
break;
case 5:
Set(); //当choose值为5时,设置题目
break;
default: //否则输入错误
cout << "输入错误,看清选项 " << endl;
break;
}
} while(choose);
return 0;
}