虚拟电话包含属性:电话号、状态、机主姓名。 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
#include
#include
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;
}
课程的总评成绩与绩点对应关系为:
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
#include
#include
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
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;
}