课后作业3、类和对象(函数题)

本示例展示了如何使用C++定义和操作学生类,包括点的计数、俱乐部信息的输入输出、成绩录入优化、学生信息的快速录入、平均分计算、学生类的构造与析构以及最大成绩的查找。每个类都包含了必要的构造函数、析构函数、成员函数和静态成员变量,以实现特定的功能。例如,Point类用于统计点的个数,Club类用于存储俱乐部信息,Student类用于高效录入成绩,同时提供了计算平均分和查找最高成绩的函数。
摘要由CSDN通过智能技术生成

6-3 2017final点的个数

幼儿园小班的小朋友开始学画画了,小明喜欢在白纸上画点点,请你帮他统计一下点的个数。请定义一个Point类,内有数据成员x,y表示点的坐标,还有一个静态数据成员count用于统计点的个数。并有若干成员函数,如构造函数、显示点的个数的函数showCount()等。

裁判测试程序样例:

#include<iostream>
using namespace std;

/*你的代码将被嵌入在这里*/

int main()
{
int x,y;
cin>>x>>y;

Point::showCount();

Point a(x,y);
cout<<"Point A: "<<a.getX()<<","<<a.getY()<<endl;
Point::showCount();

Point b(a);
cout<<"Point B: "<<b.getX()<<","<<b.getY()<<endl;
Point::showCount();

Point c;
cout<<"Point C: "<<c.getX()<<","<<c.getY()<<endl;
Point::showCount();

Point d(x);
cout<<"Point D: "<<d.getX()<<","<<d.getY()<<endl;
Point::showCount();

return 0;
}

输入样例:

4 5

输出样例:

0
Point A: 4,5
1
Point B: 4,5
2
Point C: 0,0
3
Point D: 4,0
4
class Point
{
private:
    int m_x;
    int m_y;
public:
    static int count;
    static int showCount()
    {
        cout << count << endl;;
        return count;
    }
    int getX()
    {
        return m_x;
    }
    int getY()
    {
        return m_y;
    }
     Point(int x , int y)
    {
        m_x = x;
        m_y = y;
        count++;
    }
     Point(Point &a)
     {
         m_x = a.getX();
         m_y = a.getY();
         count++;
     }
     Point()
     {
         m_x = 0;
         m_y = 0;
         count++;
     }
     Point(int x)
     {
         m_x = x;
         m_y = 0;
         count++;
     }
};
int Point::count = 0;

6-5 体育俱乐部I(构造函数)

一个俱乐部需要保存它的简要信息,包括四项:名称(字符串),成立年份(整数),教练姓名(字符串)和教练胜率(0-100之间的整数)。用键盘输入这些信息后,把它们分两行输出:第一行输出名称和成立年份,第二行输出教练姓名和胜率。

裁判测试程序样例:

#include <iostream>
#include <string>
using namespace std;
class Coach{
    string name;
    int winRate;
public:
    Coach(string n, int wr){
        name=n; winRate=wr;
    }
    void show();
};
class Club{
    string name;
    Coach c;
    int year;
public:
    Club(string n1, int y, string n2, int wr);
    void show();
};
int main(){
    string n1, n2;
    int year, winRate;
    cin>>n1>>year>>n2>>winRate;
    Club c(n1,year, n2, winRate);
    c.show();
    return 0;
}

/* 请在这里填写答案 */

输入样例:

Guanzhou 2006 Tom 92

输出样例:

Guanzhou 2006
Tom 92%
void Coach::show()
{
    cout<<name<<" "<<winRate<<"%";
}
void Club::show()
{
    cout<<name<<" "<<year<<endl;
    c.show();
}
//初始化列表的方法对Coach类定义的c进行初始化
//而不能对其在函数体内进行赋值
Club::Club(string n1, int y, string n2, int wr):c(n2,wr)
{
    year=y;
    name=n1;
}

 

6-6 学生成绩的快速录入(构造函数)

现在需要录入一批学生的成绩(学号,成绩)。其中学号是正整数,并且录入时,后录入学生的学号会比前面的学号大;成绩分两等,通过(Pass,录入时用1代表),不通过(Fail,录入时用0代表)。

由于很多学号都是相邻的,并且学号相邻的学生成绩常常相同。所以在录入时,适当地加了速。如果当前学生的学号比前面的学号大1,且成绩与前面的成绩相同,则只输入0即可。

类定义:

完成Student类 

裁判测试程序样例:

#include<iostream>
using namespace std;

/* 请在这里填写答案 */

int main(){
    const int size=100;
    int i, N, no, score;
    Student *st[size];
    cin>>N;
    for(i=0; i<N; i++){
        cin>>no;
        if(no>0){
            cin>>score;
            st[i]=new Student(no, score);
        }
        else
            st[i]=new Student(*st[i-1]);
    }
    cout<<Student::count<<" Students"<<endl;
    for(i=0;i<N;i++) st[i]->display();
    for(i=0;i<N;i++) delete st[i];
    return 0;
}

输入样例:

5
3 0
0
7 1
0
12 1

输出样例:

5 Students
3 Fail
4 Fail
7 Pass
8 Pass
12 Pass
class Student
{
private:
    int num,score;
public:
    static int count;
    Student(int n,int s)
    {
		num = n;
		score = s;
		count++;
	}
	Student(Student &s)
    {
        num = s.num+1;
        score=s.score;
		count++;
	}
	void display()
    {
		cout<<num<<" ";
		if(score)
		cout<<"Pass"<<endl;
		else
		cout<<"Fail"<<endl;
	}
};
int Student::count=0;

6-7 学生平均分计算

定义一学生类,已有若干个学生数据,包括学号、姓名、成绩,要求输出这些学生数据并计算平均分。

定义一学生类,已有若干个学生数据,包括学号、姓名、成绩,要求输出这些学生数据并计算平均分

裁判测试程序样例:

利用学生类进行对象定义并输出结果的例子如下:
/* 请在这里填写答案 */

int Stud::sum=0;
int Stud::num=0;
int main()
{
    Stud  s1(1,"Li",89),s2(2,"Chert",78),s3(3,"zheng",94);
    s1.disp();
    s2.disp();
    s3.disp();
    cout<<"avg="<<Stud::avg()<<endl;
    return 0;
}

输入:

输出样例:

1,Li,89
2,Chert,78
3,zheng,94
avg=87
class Stud
{
public:
    int no,score;
    string name;
    static int num;
    static int sum;
    Stud(int a,string b,int c)
    {
        no = a;
        name = b;
        score = c;
        sum += c;
        num++;
    }
    void disp()
    {
        cout<<no<<','<<name<<','<<score<<endl;
    }
    static double avg()
    {
        return sum = sum*1.0/num;
        
    }
};

 

6-8 学生类的构造与析构

类定义:

定义一个学生类Student,使得main()函数能够得到指定的输出结果

main()函数如下:

/* 请在这里填写答案 */
int main()
  {Student stud1(10010,"Wang_li",'f');
   stud1.display();
   Student stud2(10011,"Zhang_fun",'m');
   stud2.display();
   return 0;
}

输入样例:

输出样例:

在这里给出相应的输出。例如:

Constructor called.
num:10010
name:Wang_li
sex:f

Constructor called.
num:10011
name:Zhang_fun
sex:m

Destructor called.
Destructor called.
class Student
{
private:
    int num;
    string name;
    char sex;
public:
    Student(int a,string b,char c)
    {
        num = a;
        name = b;
        sex = c;
    }
    void display()
    {
        cout<<"Constructor called."<<endl;
        cout<<"num:"<<num<<endl;
        cout<<"name:"<<name<<endl;
        cout<<"sex:"<<sex<<endl;
        cout<<endl;
    }
    ~Student()
    {
        cout<<"Destructor called."<<endl;
    }
};

 

6-9 输出最大值

根据给定的程序,写成相关的成员函数,完成指定功能。

函数接口定义:

定义max函数,实现输出最高成绩对应的学号以及最高成绩值。 

裁判测试程序样例:

#include <iostream>
using namespace std;
class Student
 {public:
   Student(int n,float s):num(n),score(s){}
   int num;
   float score;
 };

int main()
{Student stud[5]={
  Student(101,78.5),Student(102,85.5),Student(103,98.5),
  Student(104,100.0),Student(105,95.5)};
 void max(Student* );
 Student *p=&stud[0];
 max(p);
 return 0; 
 }
/* 请在这里填写答案 */

输入样例:

输出样例:

104 100
void max(Student *arr)
{
    float max_score=arr[0].score;
    int k=0;
    for(int i = 1;i < 5;i++)
        if(arr[i].score > max_score) 
        {
            max_score = arr[i].score;
            k=i;
        }
    cout<<arr[k].num<<" "<<max_score<<endl;
}

 

6-11 自定义的学生类

本题要求定义一个简单的学生类,数据成员仅需要定义学号和姓名,函数成员的原型见给出的代码,请给出函数成员的类外完整实现。

函数接口定义:


class Student
{
private:
    int m_id;
    char m_name[10];
public:
    Student(int id=0,char *name="");
    ~Student();
    void print();
    
};

其中m_idm_name分别表示学生的学号和姓名,类型已经定义好。类内声明了3个成员函数,分别表示构造函数、析构函数和用于输出学生信息的函数。
构造函数要完成两个数据成员的初始赋值,并做一行输出,形如:“Hi!学号 姓名”。
析构函数要求输出一行,形如:“Bye!学号 姓名”。
print函数要求在一行中输出学生信息,形如:“学号 姓名”。
注:学号和姓名之间用一个空格分开。

裁判测试程序样例:


#include <iostream>
#include <cstring>
using namespace std;

int main()
{
    Student stu_array[3]={Student(1,"Zhang"),Student(2,"Wang")};
    return 0;
}

/* 请在这里填写答案 */
Student::Student(int id,char *name)
{
    m_id=id;
    strcpy(m_name ,name);
    cout<<"Hi!"<<m_id<<" "<<m_name<<endl;
}
Student::~Student()
{
    cout<<"Bye!"<<m_id<<" "<<m_name<<endl;
}
void Student::print()
{
    cout<<m_id<<" "<<m_name<<endl;
}

6-4 2018Final静态成员(黑名单)

怡山小学生物组是公认的熊孩子天堂,他们每天都在做各种尝试,如: 强迫蚕宝宝吃各种不同的菜叶,把小狗和小白鼠关进一个笼子里,重复输入流浪狗记录等等。忍无可忍的黄老师决定往成员信息里添加一项黑名单,限制黑名单中同学的单独活动,以保证生物组的日常管理秩序。

黑名单的增加来自两个时刻,一个是在增加新成员时,根据班主任的建议,直接将同学拉入黑名单,另一个是根据同学在组内的行为,由黄老师将其拉入。

黑名单的减小也有两个时刻,一个是黄老师将某位同学拉出,还有一个是黑名单已经满了,且需要拉入新的人员,此时,在黑名单中时间最长的成员,自动地被拉出黑名单。

输入:

输入时,先输入当前任务类型:

任务类型为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;
}

输入样例:

1 102
1 345 999
1 123
2 102
1 333
2 333
2 123
3 102
3 123
3 333
0

输出样例:

345 102
345 102 333
102 333 123
333 123
333
NULL BLACKLIST!

 

int Group::size=0;
int Group::blackList[N]={0};

Group::Group(){}

Group::Group(int num,bool bSign)
{
    this->num=num;
    if(bSign==true)
        Group::addToList(num);
}
void Group::addToList(int num)
{
    if(size==N) 
    {
        removeFromList(blackList[0]);
    }
    blackList[size++]=num;
}
void Group::removeFromList(int num)
{
    int bj = 0;
    for(bj = 0;bj < size;bj++)
        if(blackList[bj] == num)
            break;
    for(int i = bj;i < size-1;i++)
        blackList[i]=blackList[i+1];
    size--;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

102101222_张凯权

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值