6-4 2018Final静态成员(黑名单) (20分)
怡山小学生物组是公认的熊孩子天堂,他们每天都在做各种尝试,如: 强迫蚕宝宝吃各种不同的菜叶,把小狗和小白鼠关进一个笼子里,重复输入流浪狗记录等等。忍无可忍的黄老师决定往成员信息里添加一项黑名单,限制黑名单中同学的单独活动,以保证生物组的日常管理秩序。
黑名单的增加来自两个时刻,一个是在增加新成员时,根据班主任的建议,直接将同学拉入黑名单,另一个是根据同学在组内的行为,由黄老师将其拉入。
黑名单的减小也有两个时刻,一个是黄老师将某位同学拉出,还有一个是黑名单已经满了,且需要拉入新的人员,此时,在黑名单中时间最长的成员,自动地被拉出黑名单。
输入:
输入时,先输入当前任务类型:
任务类型为1时,将加入新的学生记录;此时将输入学生的学号(假定新加入的学生肯定没有加入过),如果该学生应加入黑名单,则接着会多输入一个"999";
任务类型为2时,将某已有学生加入黑名单;此时将直接输入学生学号(假定不会将黑名单中已有的学生,再次加入黑名单);
任务类型为3时,将某些学生移出黑名单;此时将直接输入学生学号(假定这个学号肯定在黑名单中)。
任务类型为0时,结束输入。
输出:
在执行类型2和3任务时,将输出当前的黑名单中的学生学号,用空格间隔,输出顺序为学生被加入黑名单的顺序,先加入者在前。如果黑名单为空,输出"NULL BLACKLIST!".
函数接口定义:
请补全类Group
裁判测试程序样例:
#include <iostream>
using namespace std;
const int N=3;
class Group{
private:
int num;
static int blackList[N];
static int size;
public:
Group();
Group(int num, bool bSign);
static void addToList(int num);
static void removeFromList(int num);
static void displayList();
};
void Group::displayList(){
if(size==0) cout<<"NULL BLACKLIST!"<<endl;
else{
for(int i=0;i<size-1;i++) cout<<blackList[i]<<' ';
cout<<blackList[size-1]<<endl;
}
}
/* 请在这里填写答案 */
int main(){
int i, j, k, num, task, count=0;
Group g[100];
cin>>task;
while(task!=0){
switch(task){
case 1: cin>>num>>k;
if(k==999) {
g[count++]=Group(num, true);
cin>>task;
}else{
g[count++]=Group(num, false);
task = k;
}
break;
case 2: cin>>num;
Group::addToList(num);
Group::displayList();
cin>>task;
break;
case 3: cin>>num;
Group::removeFromList(num);//通过类名调用静态成员函数
Group::displayList();
cin>>task;
break;
}
}
return 0;
}
以下是AC代码(可自行插入裁判函数对应位置)
int Group::size = 0;//静态成员变量要在类外初始化
int Group::blackList[N] = { 0 };
Group::Group() {}
Group::Group(int num, bool bSign) {
if (bSign == true) {
addToList(num);
}
}
void Group::addToList(int num) {
if (size < N) {
blackList[size] = num;
size++;
}
else {
removeFromList(blackList[0]);
blackList[size] = num;
size++;
}
}
void Group::removeFromList(int num) {
int ii;
for ( ii = 0; ii < N; ii++) {
if (blackList[ii] == num) {
break;
}
}
for (ii = ii; ii + 1 < N; ii++) {
blackList[ii] = blackList[ii + 1];
}
blackList[ii] = 0;
size--;
}
7-1 宿舍谁最高? (20分)
学校选拔篮球队员,每间宿舍最多有4个人。现给出宿舍列表,请找出每个宿舍最高的同学。定义一个学生类Student,有身高height,体重weight等。
输入格式:
首先输入一个整型数n (1<=n<=1000000),表示n位同学。
紧跟着n行输入,每一行格式为:宿舍号,name,height,weight。
宿舍号的区间为[0,999999], name 由字母组成,长度小于16,height,weight为正整数。
输出格式:
按宿舍号从小到大排序,输出每间宿舍身高最高的同学信息。题目保证每间宿舍只有一位身高最高的同学。
输入样例:
7
000000 Tom 175 120
000001 Jack 180 130
000001 Hale 160 140
000000 Marry 160 120
000000 Jerry 165 110
000003 ETAF 183 145
000001 Mickey 170 115
输出样例:
000000 Tom 175 120
000001 Jack 180 130
000003 ETAF 183 145
以下为AC代码
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
class student {
public:
int num;//宿舍号
int height;//身高
int weight;//体重
string name;//名字
student() {}//无参类型构造函数
student(int a,string d,int b, int c):num(a),height(b),weight(c),name(d){}//有参类型构造函数
~student() {}
};
bool cmp(student a, student b) {
if (a.num != b.num) {
return a.num < b.num;
}
else {
return a.height < a.height;
}
}
int main() {
int a, b, c;
string d;
int n;
cin >> n;
student* tt = new student[100];//无参类型构造函数初始化对象数组
for (int i = 0; i < n; i++) {
cin >> tt[i].num >> tt[i].name >> tt[i].height >> tt[i].weight;//使用数组循环的方式进一步初始化对象
}
sort(tt, tt + n, cmp);
int i = 0;
while (i < n) {
int j = i + 1;
while (tt[i].num == tt[j].num) {
j++;
}
i = j;
printf("%06d ", tt[j - 1].num);
cout << tt[j - 1].name << " " << tt[j - 1].height << " " << tt[j - 1].weight << endl;
}
delete[]tt;
return 0;
}
7-5 该日是该年的第几天 (10分)
定义一个日期类Date,内有数据成员年、月、日,另有成员函数:构造函数用于初始化数据成员,输出,闰年的判断。 编写主函数:创建日期对象,计算并输出该日是该年的第几天。 输入格式: 测试输入包含若干测试用例,每个测试用例占一行。当读入0 0 0时输入结束,相应的结果不要输出。
输入样例:
2006 3 5
2000 3 5
0 0 0
输出样例:(括号内为说明)
64 (2006年3月5日是该年的第64天)
65 (2000年3月5日是该年的第65天)
代码
#include<iostream>
using namespace std;
class Date {
private:
int year, month, date;
public:
Date(int a, int b, int c) {//有参类型的构造函数
year = a, month = b, date = c;
}
Date() {}//无参类型的构造函数
~Date() {}
int num();
};
int Date::num() {
int tt = 0, k = 0;
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
int a[12] = { 31,29,31,30,31,30,31,31,30,31,30,31 };
while (k<month-1) {
tt += a[k];
k++;
}
tt += date;
}
else {
int a[12] = { 31,28,31,30,31,30,31,31,30,31,30,31 };
while (k < month - 1) {
tt += a[k];
k++;
}
tt += date;
}
return tt;
}
int main() {
int x, y, z;
int i;
Date* p = new Date[100];//无参类型构造函数来构造对象数组
for ( i = 0;;i++) {
cin >> x >> y >> z;
if (x == 0 && y == 0 && z == 0) {
break;
}
p[i] = Date(x, y, z);//有参类型构造函数进一步初始化
}
int j = 0;
while ( j < i ) {
cout << p[j].num() << endl;
j++;
}
delete[]p;
return 0;
}