程序实践:随机生成试题册

随机生成试题册,题目需要存放路径可自己设置,但是原题库需事先按要求构建

#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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值