[C++] 类与对象练习题1

问题 B: 虚拟电话(构造与析构)

虚拟电话包含属性:电话号、状态、机主姓名。 1、电话号是一个类,它包含号码和类型,其中号码是整数类型,类型用单个字母表示用户类别,A表示政府,B表示企业、C表示个人。类操作包括构造、属性的获取和设置等方法,根据需要自行编写。 2、状态用一个数字表示,1表示在用,0表示未用, 3、机主姓名是一个字符串 电话操作包括:构造、析构、打印和查询。 1、构造函数需要考虑复合类成员的构造,并且输出提示信息。假设电话号码为12345678,则构造函数输出"12345678 constructed." 2、打印是输出电话的相关信息,其中如果电话状态是在用则输出use;状态是未用则输出unuse,输出格式看示例。 3、析构函数是输出提示信息。假设电话号为12345678,则析构函数输出"12345678 destructed. " 4、查询操作是根据给定的号码查询电话,如果电话自身号码和给定号码不相同,则返回0;如果电话自身号码和给定号码相同,则返回1 用C++和面向对象思想实现以下要求: 1、输入相关数据,创建三个电话对象,并通过构造方法初始化。 2、输入若干个电话号码,通过查询操作查询这些号码是否在三个电话对象中,如果不存在输出"wrong number.",存在则调用打印操作输出电话信息,具体看输出样例。
(略)
==利用指针数组创建对象 ==

代码

#include <iostream>
#include <iomanip>
#include <string>
using namespace std;

class phone
{
	int num;
	char type;
public:
	phone(int n, char ty)
	{
		num=n; type=ty;
	}
	phone(){}
	~phone(){}
	int getNum() { return num; }
	char getType() { return type; }
};

class VisPhone
{
private:
	phone p;
	int state;
	string name;
public:
	VisPhone() {}
	VisPhone(int n, char ty, int st, string na):p(n, ty)
	{
		state=st; name=na;
		cout<<p.getNum()<<" constructed."<<endl;
	}

	~VisPhone(){ cout<<p.getNum()<<" destructed."<<endl; } //have a try

	int query(int n)
	{
		if(n==p.getNum())
			return 1;
		else
			return 0;
	}
	void print()
	{
		string a[2] = {"unuse", "use"};
		cout<<"Phone="<<p.getNum()<<"--Type="<<p.getType();
		cout<<"--State="<<a[state]<<"--Owner="<<name<<endl;
	}
};


int main()
{
	int t;
	int num;
	char type;
	int state, sn;
	string name;

	VisPhone *test[3];//利用指针数组创建对象
	for(int i=0; i<3; i++)
	{
		cin>>num>>type>>state>>name;
		test[i] =new VisPhone(num, type, state, name);
	}

	cin>>t;
	while(t--)
	{
		cin>>sn;
		int flag=0;
		for(int i=0; i<3; i++)
		{
			if(test[i]->query(sn))
			{
				test[i]->print();
				flag=1;
			}
		}
		if(flag==0)
			cout<<"wrong number."<<endl;
	}
	for(int i=2; i>=0; i--)
		delete test[i];
	
	return 0;
}

问题 E: 平均学分绩点计算(类和对象)

题目描述

课程的总评成绩与绩点对应关系为:

A+ ~ 4.5、A~ 4.0、B+~ 3.5、B~3.0、C+ ~ 2.5、C ~ 2.0、D ~ 1.0、F ~ 0

如果选修n门课(n<20),则平均学分绩点(GPA)的计算公式为:

平均学分绩点(GPA)

= (∑各课程总评成绩对应绩点×课程学分)/ ∑ 课程学分

用选课类描述选课信息,包含属性: 课程号、课程学分、总评成绩、包含方法:返回课程号、计算成绩对应的绩点并返回结果、构造函数。

主函数输入某学生的n门选课信息,计算获得的学分及平均学分绩点。

可以增加成员或全局函数,静态、非静态、友元都可以。

输入

第一行输入测试次数t

后跟t组测试数据,每组测试数据格式如下:

选课门数n

n门选课信息,课程号 学分 总评绩点

输出

对每组测试数据,输出:

选修的所有课程号

获得学分(保留1位小数) 平均学分绩点(保留2位小数)

样例输入

2
4
1300800001 3 A
1501020003 4 B
1900600005 5 A+
5000520002 3 C
3
1300800007 3 B
1501020006 3.5 F
5000520008 3 A

样例输出

1300800001 1501020003 1900600005 5000520002
获得学分:15.0 平均学分绩点:3.50
1300800007 1501020006 5000520008
获得学分:6.0 平均学分绩点:2.21

代码示例

#include <iostream>
#include <iomanip>
#include <string>
using namespace std;

class Curricula{
private:
	int n;
	string *classNumber, *value;
	double *credit, gpa, all_credit, get_cre;
public:
	Curricula(int n_init):n(n_init){
		gpa=all_credit=get_cre=0;
		classNumber = new string[n];
		credit = new double[n];
		value = new string[n];
		for(int i=0; i<n; i++){
			cin>>classNumber[i]>>credit[i]>>value[i];
			all_credit+=credit[i];
			if(value[i]!="F")
				get_cre+=credit[i];
		}
	}
	~Curricula(){
		delete[] classNumber;
		delete[] credit;
		delete[] value;
	}
	string getClassNumber(int i) { return classNumber[i]; }
	double calGPA();
	void print();
};

void Curricula::print(){
	for(int i=0; i<n; i++){
		cout<<classNumber[i]<<' ';
	}
	cout<<endl;
	cout<<"获得学分:"<<setprecision(1)<<fixed<<get_cre;
	cout<<"平均学分绩点:"<<setprecision(2)<<fixed<<calGPA()<<endl;
}

double Curricula::calGPA(){
	double sum=0;
	double *credit_point = new double[n];
	for(int i=0; i<n; i++){
		if(value[i]=="A+")
			credit_point[i] = 4.5;
		else if(value[i]=="A")
			credit_point[i] = 4.0;
		else if(value[i]=="B+")
			credit_point[i] = 3.5;
		else if(value[i]=="B")
			credit_point[i] = 3.0;
		else if(value[i]=="C+")
			credit_point[i] = 2.5;
		else if(value[i]=="C")
			credit_point[i] = 2.0;
		else if(value[i]=="D")
			credit_point[i] = 1.0;
		else if(value[i]=="F")
			credit_point[i] = 0;

		credit_point[i] *= credit[i];
		sum += credit_point[i];
	}
	gpa = sum/all_credit;
	return gpa;

}

int main()
{
	int t;
	cin>>t;
	while(t--){
		int n;
		cin>>n;
		Curricula test(n);
		test.print();
	}
	return 0;
}

五子棋简单实现(类和对象)

题目描述

五子棋是一种两人对弈的纯策略型棋类游戏,双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成5子连线者获胜。假设棋盘为十五路(15×15)棋盘,输入o表示白子落子,u表示黑子落子。

用面向对象的思想实现五子棋游戏包含多个类。本题练习类和对象,将规则类和棋盘类合并,只定义棋盘类,实现五子棋的落子功能,不接受悔棋。

棋盘类:

属性:15*15棋盘。

方法:初始棋盘为空。

       接受落子,判定是否合法。

            根据落子,修改棋盘状态。

       根据落子,判定是否五子连线。

       输出棋盘状态。

可根据题目,增加其它方法。不能增加属性。

注1:判定是否合法规则为:①当落子位置在棋盘外时视为非法,②当落子位置中已有棋子时视为非法。除以上两种情况外,其他情况视为合法。

注2:五子连线判定在每次落子后进行,如果得出黑子或白子胜,则后面的落子操作不进行(但OJ要求完成读入)。

注3:落子点有可能非法,输入数据保证了黑、白子间隔落子,不用考虑黑子、白子落子顺序问题。即当一方落子,如果落子合法,输入数据会立即移交给另一方落子; 如果落子非法,输入数据会使得这一方继续落子,当出现落子合法的情况后,输入数据会立即移交给另一方落子。

注4:输入数据保证最终的棋盘至少有一个棋子,不会出现整个棋盘无棋子的情况。

输入

第1行:测试次数t ( 1 <= t <= 15)

每组测试数据表示一次五子棋游戏,格式为:

每组中的第1行:落子次数n (1 <= n <= 300)

每组中的第2行到第n + 1行:落子,o或u, x, y,分别代表落子方和落子坐标(落子坐标与屏幕坐标方向一致, x, y为整数,合法坐标为(1,1)到(15,15))

输出

对每组测试数据,输出棋盘最终状态(#表示黑子,@表示白子),

输出五子棋游戏结果:

白子胜、黑子胜、白子继续、黑子继续。

各组测试数据的输出以空行分隔。

示例输入

2
11
u 8 8
o 7 9
u 9 9
o 10 10
u 7 9
u 8 10
o 11 11
u 8 9
o 8 7
u 8 11
o 9 8
11
u 8 8
o 10 6
u 8 9
o 8 7
u 10 8
o 11 8
u 8 11
o 11 7
u 8 12
o 10 7
u 8 10

示例输出

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 @ 0 0 0 0 0 0
0 0 0 0 0 0 @ # # # # 0 0 0 0
0 0 0 0 0 0 0 @ # 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 @ 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 @ 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
黑子继续

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 @ # # # # # 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 @ @ # 0 0 0 0 0 0 0
0 0 0 0 0 0 @ @ 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
黑子胜

代码

#include <iostream>

using namespace std;

class chessBoard{
protected:
    char board[20][20];
public:
    chessBoard()
    {
        for(int i=1; i<=15; i++)
            for(int j=1; j<=15; j++)
                board[i][j]='0';
    }
    int isLegal(char take, int x, int y)
    {
        if(x>15 || x<1 || y>15 || y<1)
            return 0;
        else if(board[x][y]!='0')
            return 0;
        else
            return 1;
    }
    void upgrade(char take, int x, int y)
    {
        switch(take)
        {
            case 'u': board[x][y]='#'; break;
            case 'o': board[x][y]='@'; break;
        }
    }
    int isLine(char take, int x, int y);
    void print()
    {
        for(int i=1; i<=15; i++)
        {
            for(int j=1; j<=15; j++)
            {
                cout<<board[i][j]<<' ';
            }
            cout<<endl;
        }
    }
};

int chessBoard::isLine(char take, int x, int y)
    {

        int i, j;
        //horizontal
        int counter=1;
        for(i=x; i>=x-3 && i>=1; i--)
        {
            if(board[i][y]==board[i-1][y])
                counter++;
            else
                break;
        }
        for(i=x; i<=x+3 && i<=15; i++)
        {
            if(board[i][y]==board[i+1][y])
                counter++;
            else
                break;
        }
        if(counter>=5)
            return 1;

        //vertical
        counter=1;
        for(i=y; i>=y-3 && i>=1; i--)
        {
            if(board[x][i]==board[x][i-1])
                counter++;
            else
                break;
        }
        for(i=y; i<=y+3 && i<=15; i++)
        {
            if(board[x][i]==board[x][i+1])
                counter++;
            else
                break;
        }
        if(counter>=5)
            return 1;
        //右斜
        counter=1;
        for(i=x, j=y; j>=y-3 && j>=1 && i>=x-3 && i>=1; i--, j--)
        {
            if(board[i][j]==board[i-1][j-1])
                counter++;
            else
                break;
        }
        for(i=x, j=y; j<=y+3 && j<=15 && i<=x+3 && i<=15; i++, j++)
        {
            if(board[i][j]==board[i+1][j+1])
                counter++;
            else
                break;
        }
        if(counter>=5)
            return 1;
        //左斜
        counter=1;
        for(i=x, j=y; j<=y+3 && j<=15 && i>=x-3 && i>=1; i--, j++)
        {
            if(board[i][j]==board[i-1][j+1])
                counter++;
            else
                break;
        }
        for(i=x, j=y; j>=y-3 && j>=1 && i<=x+3 && i<=15; i++, j--)
        {
            if(board[i][j]==board[i+1][j-1])
                counter++;
            else
                break;
        }
        if(counter>=5)
            return 1;

        return 0;
    }

int main()
{
    int x, y;
    char take;
    int t, n;
    int flag;
    cin>>t;
    while(t--)
    {
        flag=0;
        cin>>n;
        chessBoard test;
        while(n--)
        {
            cin>>take>>x>>y;
            if(test.isLegal(take, x, y))
            {
                test.upgrade(take, x, y);
                //test.print();
                if(test.isLine(take, x, y))
                {
                    flag=1;
                    //break;
                }
            }
        }
        test.print();
        if(flag==1)
        {
            if(take=='u')
                cout<<"黑子胜"<<endl;
            else if(take=='o')
                cout<<"白子胜"<<endl;
        }
        else
        {
            if(take=='u')
                cout<<"白子继续"<<endl;
            else if(take=='o')
                cout<<"黑子继续"<<endl;
        }
        cout<<endl;
    }
    return 0;
}
  • 1
    点赞
  • 0
    评论
  • 22
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:1024 设计师:我叫白小胖 返回首页

打赏作者

qq_45418426

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值