一、题目:设计考场的编排,生成准考证号
二、目的与要求
1. 目的
培养学生综合利用C++语言进行程序设计的能力,加强函数的运用及学生对软件工程方法的初步认识,提高软件系统分析能力和程序文档建立、归纳总结的能力,培养学生利用系统提供的标准函数及典型算法进行设计。
2. 基本要求
(1) 用C++语言编程,在Visual C++环境下调试完成;
(2) 使用结构数组,各个功能分别使用函数来完成。
三、设计方法和基本原理
1.课题功能描述
本程序要求根据考生人数、考场个数和每个考场的人数,为考生生成准考证号,并显示生成的考生信息。
2.问题详细描述
根据考生的报名信息、考场数和每个考场容纳的人数,来编排考生的准考证号。已知准考证号(字符串)依次由由考场号(2位)、学校代码(2位)、考生学号的前两位(2位)、座位号(2位)共8位组成,其中学校代码已给定(const int CODE = 18)。已知,每个考生的信息包括学号(int num)、姓名(char name[20])和准考证号(char testID[8])。要求编写多个函数分别实现下列功能,而后在main函数中进行调用。
(1) 录入考生的报名信息,即学号和姓名。
(2) 根据用户输入考生人数,每个考场容纳的人数,生成准考考号。例如:若某考生的学号为99764,考场号为2,座位号为5,学校代码为18,则该考生的准考证号为:”02189905”,注意当考场号和座位号小与10时,前面加0。
(3) 显示全部考生的考试信息,如输出考生的学号、姓名、准考证号、考场号和座位号。
(4) 按考场号分别显示考生信息。
3. 问题的解决方案
(1) 采用结构体类型存储学生信息。
(2) 使用字符型数组存储准考证号,因此要将考场号、学校代码、考生学号、座位号分别转换为字符型数据进行存储。
(3) 考场号和座位号的编排与总人数和每个考场的人数有关。
四、主要技术问题的描述
分别编写函数实现编排考场号、学校代码转换、取学号前两位、编排座位号、显示信息,形参为结构数组,在上述函数中分别将转换的结果分别存放到testID成员(准考证号,字符数组)中相应的数组元素中。
五、创新要求
在基本要求达到后,进行创新设计:
(1)使用多文件,即主函数和各个函数分别存放在不同的.cpp文件中,在头文件中进行函数原型声明。
(2)对程序功能进行拓展,使其更加实用。例如,按照随机数编排座位号等
//student.h
#ifndef STUDENT_H
#define STUDENT_H
struct Student
{
int num; //学号(为5位的学号)
char name[20]; //姓名
char testID[9]; //准考证号(8位)
};
void input_info(Student*stu,int count);//录入考生的报名信息,即学号和姓名
void print_one(Student*stu);//显示一个考生的考试信息,如输出考生的学号、姓名、准考证号、考场号和座位号。
void print_by_attendNum(Student*stu,int attendNum);//按考场号显示考生信息。
int search_by_num(Student*,int num);//按照学号,查找信息
int search_by_name(Student*,char*name);//按照姓名,查找信息
void set_attendNumber(Student*stu);//编排考场号
void change_CODE(Student*);//学校代码转换
void get_num_first2(Student*);//取学号前两位
void set_place(Student*stu,int place_num);//编排座位号
int get_place(int*);//获取一个,按照随机数编排的座位号。
void set(int*,int num);//辅助函数,将数组置一
bool search(int*array,int point);
#endif // STUDENT_H
//student.cpp
#include "Student.h"
#include
#include
#include
#include
#include
#include
using std::cout;
using std::cin;
using std::endl;
extern int const STUDEN_COUNT;
extern const int SHCOOL_CODE ;
extern const int FULL_NUMBER ;
//录入考生的报名信息,即学号和姓名
void input_info(Student*stu,int count)
{
for (int i= 0;i < count ; ++i)
{
std::cout<<"输入第"<>stu[i].num;
std::cout<<" 输入第"<>stu[i].name;
std::cout< FULL_NUMBER)
return;
if (place_num < 10 )//保证宽度为2
itoa(place_num,num+1,10);
else
itoa(place_num,num,10);
std::strcat( (*stu).testID,num );
}
//编排准考证号
void set_attendNumber(Student*stu)
{
int array[FULL_NUMBER];//用于存储一个考场座位的状态
set(array,FULL_NUMBER);//该考场所有位置都可用
float max_number = static_cast(FULL_NUMBER);//浮点型保存考场容纳人数
for (int i = 0;i< STUDEN_COUNT; ++i)
{
set_attendNumber(stu+i,static_cast(i/max_number+1));//考场号(2位)
change_CODE(stu+i);//学校代码(2位)
get_num_first2(stu+i);//考生学号的前两位(2位)
if (i%FULL_NUMBER == 0)
set(array,FULL_NUMBER);
set_place(stu+i,get_place(array));//座位号(2位)
}
}
//获取一个,按照随机数编排的座位号
int get_place(int*array)
{
srand( (unsigned)time( NULL) );
int point = -1;
while (true)
{
point = rand()%FULL_NUMBER;
if (search(array,point))