本文主要是介绍考场考号自动安排程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
#include<iostream>
#include<vector>
#include<cstring>
#include<string>
#include<iomanip>
using namespace std;
typedef struct
{
int num; //学生的学号
char name[20]; //学生的姓名
char textID[9]; //学生的准考证号
}Student;
vector<Student> svec;
int a3;//用a3来存放考室的个数
int a4;//用来存放最后一个未满的教室的人数
const CODE=18;//学校代码已经给定为18;
vector<Student>::iterator iter_begin;
void input_students_info() //输入学生信息的函数
{
string str;
while(!(str=="N"||str=="n"))
{
cout<<"/n请输入你的学号:"<<endl;
int a1;//用来输入学生的学号
cin>>a1;
while(a1<0||a1>1000000000)
{
cout<<"学号范围不符合要求,请重新输入!"<<endl;
cin>>a1;
cin.clear ();
}
cout<<"请输入你的姓名:"<<endl;
char p1[20];
cin.clear ();
cin>>p1;
cin.clear ();
Student s;
s.num =a1;
strcpy(s.name,p1);
strcpy(s.textID ,"");
svec.push_back (s);
cout<<"还要输入下一个考生信息吗? 按(N/n)结束输入,按任意键继续:"<<endl;
cin>>str;
}//while结束
cout<<"考生信息输入完毕!"<<endl;
cout<<"共有"<<svec.size ()<<"名考生报考"<<endl;
return ;
}
void produce_text_number()
{
int a2;//用来记录每个考室最多安排的人数
cout<<"请输入每个考室最多安排的人数(不超过30人):"<<endl;
cin>>a2;
cin.clear ();
while(!(a2>=0&&a2<=30))
{
cout<<"输入不符合要求,请重新输入!"<<endl;
cin>>a2;
cin.clear ();
}
if(svec.size ()%a2) //如果不是刚好满考室,就加上一个考室
{
a3=svec.size ()/a2+1;
a4=svec.size ()%a2;
}
else a3=svec.size ()/a2;//刚好满教室的情况
iter_begin=svec.begin ();
if(a4!=0) //当有教室未满时
{
for(int i=1;i<=a3-1;++i)//先安排满的教室
{
for(int j=1;j<=a2;++j,++(iter_begin))
{
char s1[9];
int first=0,second=0,oldfirst=0,oldsecond=0;//用来找出学号的前两位
s1[0]=(i/10)+48;
s1[1]=(i%10)+48;
s1[2]=(CODE/10)+48;
s1[3]=(CODE%10)+48;
first=(*iter_begin).num /10;
second=(*iter_begin).num %10;
while(first!=0)
{
oldfirst=first;
oldsecond=second;
second=first%10;
first=first /10;//错误在这里,没有注意到它们的顺序,如果是first=first /10;再second=first%10;
//那么求出的就是新的first的余数了,而要求的是oldfirst的余数。其实可以写成这样
//first=oldfirst/10; second=oldfirst%10;这样就不要管它们的顺序了
}
s1[4]=oldfirst+48;
s1[5]=oldsecond+48;
s1[6]=(j/10)+48;
s1[7]=(j%10)+48;
s1[8]='/0';
strcpy((*iter_begin).textID ,s1);
}//内for循环结束
}//外for循环结束
for(int k=1;k<=a4;++k,++(iter_begin))//处理未满的考室
{
char s1[9];
int first=0,second=0,oldfirst=0,oldsecond=0;//用来找出学号的前两位
s1[0]=(i/10)+48;
s1[1]=(i%10)+48;
s1[2]=(CODE/10)+48;
s1[3]=(CODE%10)+48;
first=(*iter_begin).num /10;
second=(*iter_begin).num %10;
while(first!=0)
{
oldfirst=first;
oldsecond=second;
second=first%10;
first=first /10;
}
s1[4]=oldfirst+48;
s1[5]=oldsecond+48;
s1[6]=(k/10)+48;
s1[7]=(k%10)+48;
s1[8]='/0';
strcpy((*iter_begin).textID ,s1);
}
}//if(a4!=0)处理结束
else
{
for(int i=1;i<=a3;++i)//安排满的教室
{
for(int j=1;j<=a2;++j,++(iter_begin))
{
char s1[9];
int first=0,second=0,oldfirst=0,oldsecond=0;//用来找出学号的前两位
s1[0]=(i/10)+48;
s1[1]=(i%10)+48;
s1[2]=(CODE/10)+48;
s1[3]=(CODE%10)+48;
first=(*iter_begin).num /10;
second=(*iter_begin).num %10;
while(first!=0)
{
oldfirst=first;
oldsecond=second;
second=first%10;
first=first /10;
}
s1[4]=oldfirst+48;
s1[5]=oldsecond+48;
s1[6]=(j/10)+48;
s1[7]=(j%10)+48;
s1[8]='/0';
strcpy((*iter_begin).textID ,s1);
}//内for循环结束
}//外for循环结束
}//else结束
}
void show_arrange_result()
{
char ch;
iter_begin=svec.begin ();
for( ; iter_begin!=svec.end ();++iter_begin)
{
cout<<"姓名:"<<setw(20)<<(*iter_begin).name <<"学号:"<<setw(10)<<(*iter_begin).num <<"准考证号"<<setw(10)<<(*iter_begin).textID <<endl;
}
cin>>ch;
}
void main()
{
input_students_info();
produce_text_number();
show_arrange_result();
}
/*错误总结:
(1)这是一个低级错误,没有注意到它们的顺序,如果是first=first /10;再second=first%10;
那么求出的就是新的first的余数了,而要求的是oldfirst的余数。其实可以写成这样
first=oldfirst/10; second=oldfirst%10;这样就不要管它们的顺序了
*/
这篇关于考场考号自动安排程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!