湖南大学CG题库-(程序设计类课程教学辅助系统作业)【《HNU官方题解全集》】[绝密]—2021-2025
前言:如果你是HUNER,你可以用它来作为你的程序设计作业参考,加以学习,相信这档【官方题解】必能让你的编程学习轻松很多;对非HUNER的朋友,也可以用它作为参考,作为拓展,作为自我提高。说明:此文章最终将覆盖——我在HNU-CG遇到的题,这是我做出的承诺。但,我决定弄这件事时还在2021大一上,所以我会将一级目录分成每个学期,二级目录分成每个作业编号,三级目录分为每个题目名称——这样分步完成。对
·
前言:如果你是HUNER,你可以用它来作为你的程序设计作业参考,加以学习,相信这档【官方题解】必能让你的编程学习轻松很多;对非HUNER的朋友,也可以用它作为参考,作为拓展,作为自我提高。
说明:
- 此文章最终将覆盖——我在HNU-CG遇到的题,这是我做出的承诺。但,我决定弄这件事时还在2021大一上,所以我会将一级目录分成每个学期,二级目录分成每个作业编号,三级目录分为每个题目名称——这样分步完成。其中:部分题解答分为A、B,A为首解,B为补充的解(会用基础的语法),当然片段编程题只有A解
- 对于每次CG作业,如果题目过于简单,我可能会晚一点更新——这是很正常的事情
- CG题目主要是程序设计题,面对全选择填空题的作业,我也会补充相应的知识点
- 由于HNU的老师从不给出作业的官方题解,所以我声明“官方”两字。
老师不会拿我怎么样的 - 不做专栏的原因:HNU-CG上的题大部分是对语法考察多的模拟题,对算法考察难度较小,深入研究意义不大,且对非Hnuer的朋友帮不够友好。
- 对校外朋友的HNUCG介绍:CG是HNU作业提交和考试的平台。目前看来,每次题目的前缀有“作业”、“实验”两种,还有突然跑出来的项目作业,以及可爱的考试,所以该官方题解也会有四种类型
- 关于每篇篇末的总结,到期末复习时会正式给出
大一上学期⋙
实验九-结构题
1. 评委打分
A解
#include<iostream>
#include<string>
#include<cmath>
#include<algorithm>
using namespace std;
class student{
public:
string name;
int score;
};
int main(){
int n;
cin>>n;
student* ss=new student[n];
for(int i=0;i<n;i++){
string tmp;
cin>>tmp;
ss[i].name=tmp;
int a[7];
int mx=-101;
int mi=101;
int sum=0;
for(int i=0;i<7;i++){
cin>>a[i];
sum+=a[i];
mx=max(a[i],mx); //依次输入7组数据,每次输入更新最大最小值
mi=min(a[i],mi);
}
ss[i].score=(sum-mi-mx);
}
sort(ss,ss+n,[&](student a,student b){
return a.score>b.score;//匿名表达式,对自定义类型定义排序规则
});
for(int i=0;i<n;i++)cout<<ss[i].name<<' '<<ss[i].score<<endl;
delete[]ss;
return 0;
}
2. 选举
A解
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class person{
public:
int id;
int ws;
person(int a):id(a),ws(0){}
};
int main(){
int n,m;
cin>>n>>m;
vector<person>tm;
for(int i=0;i<n;i++){
person tmp(i+1);
tm.emplace_back(tmp); //初始化候选人数组tm
}
while(m--){
int a[n];
int mx=-1;
int winner=-1;
for(int i=0;i<n;i++){
cin>>a[i];
if(a[i]>mx){
mx=a[i];
winner=i;
}
}
tm[winner].ws++; //记录赢得的城市数
}
stable_sort(tm.begin(),tm.end(),[&](person s1,person s2){
return s1.ws>s2.ws;
});//用stable_sort保证排序前后相对顺序不变,因为要按编号小的要放前面
cout<<tm[0].id<<endl;//输出第一名
return 0;
}
3. 招聘
A解
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct person{
int K;
int I;
int E;
};
int main(){
int n;
cin>>n;
person* ps=new person[n];
int jie=0;
for(int i=0;i<n;i++)cin>>ps[i].K;
for(int i=0;i<n;i++)cin>>ps[i].I;
for(int i=0;i<n;i++)cin>>ps[i].E; //输入数据
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(j!=i){
if(ps[j].K>ps[i].K&&ps[j].I>ps[i].I&&ps[j].E>ps[i].E){jie++;break;}
}
}
} //循环两次,做一下BP
cout<<jie<<endl;
delete[]ps;
return 0;
}
4. 火星人足球赛
A解
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
class player{
public:
char team;
int id;
int time;
player(char a_team,int a_id,int a_time):team(a_team),id(a_id),time(a_time){}
bool operator==(player& p){
return this->team==p.team&&this->id==p.id;
}
};
bool myfind(vector<player>a,player target){
for(auto it:a)
if(it==target)return true;//自定义查找
return false;
}
int main(){
pair<string,vector<player>>h;
pair<string,vector<player>>a;//pair存储两队基本信息
cin>>h.first>>a.first;
vector<player>th;
vector<player>ta;//创建数组th,ta,存放黄牌的队员
int n;
cin>>n;
while(n--){ //关键的犯规处理
int a_time;
char a_team;
int a_id;
char jd;
cin>>a_time>>a_team>>a_id>>jd;
player tmp(a_team,a_id,a_time);
if(jd=='r'){//红牌直接放
if(tmp.team=='h')h.second.emplace_back(tmp);
else a.second.emplace_back(tmp);
}
else{//黄牌处理时,多加一下查找
if(tmp.team=='h'){
if(myfind(th,tmp))h.second.emplace_back(tmp);
else th.emplace_back(tmp);
}
else{
if(myfind(ta,tmp))a.second.emplace_back(tmp);
else ta.emplace_back(tmp);
}
}
}
if(h.second.empty()&&a.second.empty())cout<<"No Red Card"<<endl;
else{//对处理后的数据进行处理,排序
sort(h.second.begin(),h.second.end(),[&](player p1,player p2){
if(p1.time!=p2.time)return p1.time<p2.time;
else return p1.id>p2.id;
});
sort(a.second.begin(),a.second.end(),[&](player p1,player p2){
if(p1.time!=p2.time)return p1.time<p2.time;
else return p1.id>p2.id;
});
for(auto it:h.second){
cout<<h.first<<' '<<it.id<<' '<<it.time<<endl;
}
for(auto it:a.second){
cout<<a.first<<' '<<it.id<<' '<<it.time<<endl;
}
}
return 0;
}
5. 看电影
A解
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct film{
int id;
int b; //音频
int c; //字幕
int fc; //非常高兴
int jb; //基本满意
};
class cmp{//STL,自定义比较
public:
bool operator()(film f1,film f2){
if(f1.fc!=f2.fc)return f1.fc>f2.fc;
else return f1.jb>f2.jb;
}
};
int main(){
int n;
cin>>n;
int a[n];
for(int i=0;i<n;i++)cin>>a[i];
int m;
cin>>m;
film* fs=new film[m];
for(int i=0;i<m;i++){
cin>>fs[i].b;
fs[i].fc=0;
fs[i].jb=0;
}
for(int i=0;i<m;i++){
fs[i].id=i+1;
cin>>fs[i].c;
}
bool jd=1;
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(fs[i].b==a[j]){fs[i].fc++;jd=0;}
if(fs[i].c==a[j]){fs[i].jb++;jd=0;}
}//两次循环,进行匹配
}
if(jd)cout<<"unsatisfied"<<endl;
else{
stable_sort(fs,fs+m,cmp());
for(int i=0;i<m;i++){
cout<<fs[i].id<<' ';
if(i==m-1||fs[i].fc!=fs[i+1].fc||fs[i].jb!=fs[i+1].jb)break;
}
}
delete[]fs;
return 0;
}
6. 青蛙与蚊子
A解
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct frog{
int id;
int x;
int t;
int cd=0;//青蛙结构体
};
struct skeeter{
int x;
int b;
bool iseaten=false;
}; //蚊子结构体
class cmp{
public:
bool operator()(frog qw1,frog qw2){
return qw1.id<qw2.id; //伪函数,定义比较规则
}
};
int main(){
int n,m;
cin>>n>>m;
vector<frog>qw(n);
for(int i=0;i<n;i++){
cin>>qw[i].x>>qw[i].t;
qw[i].id=i;
}
sort(qw.begin(),qw.end(),[&](frog a1,frog a2){
return a1.x<a2.x;
});
vector<skeeter>wz(m);
for(int i=0;i<m;i++){
cin>>wz[i].x>>wz[i].b;
for(int j=0;j<=i;j++){
if(wz[j].iseaten==false){//如果没被吃,则进行判断
for(int k=0;k<n;k++){
if(qw[k].x<=wz[j].x&&(qw[k].x+qw[k].t)>=wz[j].x){
qw[k].cd++;
qw[k].t+=wz[j].b;
wz[j].iseaten=true;
j=-1;//进入下一次循环时,j会变为0,从而开启下一次寻找
break;//对前面没被吃的wz再进行检验
}
}//关键是这里“青蛙吃蚊子的模拟”
}
}
}
sort(qw.begin(),qw.end(),[&](frog a1,frog a2){
return a1.id<a2.id;
});
for(auto it:qw)cout<<it.cd<<' '<<it.t<<endl;
return 0;
}
7. 公共钥匙盒
A解
#include <iostream>
#include<vector>
#include<unordered_map>
#include<algorithm>
using namespace std;
//借钥匙的记录 结构体
//包含钥匙的id, 借的时间, 归还的时间(= 开始上课的时间+上课时长)
struct Borrows{
int id;
int borrow_time;
int back_time;
};
int borrow_num = 0; //借钥匙的老师人数
int back_num = 0; //还钥匙的老师人数
int main(){
//接收数据
int n;
cin >>n;
vector<int>keys(n);
for(int i=0; i<n; i++)keys[i] = i+1; //1.初始化起始钥匙盒状态
int b_num;
cin >>b_num;
vector<int>borrow_teachers(b_num); //借钥匙的老师
vector<int> back_teachers(b_num); //还钥匙的老师
int length; //时长
vector<Borrows>borrow(b_num); //借钥匙的记录
unordered_map<int,int>tmp;
for(int i=0; i<b_num; i++){
cin >>borrow[i].id;
cin >>borrow[i].borrow_time;
cin >>length;
borrow[i].back_time = borrow[i].borrow_time + length;
tmp[borrow[i].borrow_time]++;
tmp[borrow[i].back_time]++;
}
vector<int>time;
for(auto it:tmp)time.push_back(it.first);
sort(time.begin(),time.end());
//从开始时间模拟到结束时间
for(int i=0; i<time.size(); i++){
//3.1 找出此时刻借钥匙和还钥匙的老师
for(int j=0; j<b_num; j++){
if(borrow[j].borrow_time == time[i]){
borrow_teachers[borrow_num++] = j;//j,记录还钥匙老师的编号
}
if(borrow[j].back_time == time[i]){
back_teachers[back_num++] = j;
}
}
//3.2 先处理还钥匙事件
if(back_num > 0){
//3.2.1 先对还钥匙的老师进行冒泡排序,按钥匙号从小到大排序
for(int j=0; j<back_num-1; j++){
for(int k=0; k<back_num-j-1; k++){
if(borrow[back_teachers[k]].id > borrow[back_teachers[k+1]].id){
int temp = back_teachers[k];
back_teachers[k] = back_teachers[k+1];
back_teachers[k+1] = temp;
}
}
}
//3.2.2 依次归还钥匙
for(int j=0; j<back_num; j++){
for(int k=0; k<n; k++){
if(keys[k] == 0){
keys[k] = borrow[back_teachers[j]].id;
break;
}
}
}
}
//3.3 再处理借钥匙事件
for(int j=0; j<borrow_num; j++){
for(int k=0; k<n; k++){
if(borrow[borrow_teachers[j]].id == keys[k]){
keys[k] = 0;
break;
}
}
}
//3.4 结束后,将借钥匙和还钥匙的老师都清空
for(int j=0; j<borrow_num; j++){
borrow_teachers[j] = 0;
}
for(int j=0; j<back_num; j++){
back_teachers[j] = 0;
}
borrow_num = 0;
back_num = 0;
}
//4.输出最后钥匙盒的状态
for(auto it:keys)cout<<it<<' ';
return 0;
}
【实验九,结构体】总结
不得不得说,这次的题目要点难,最后一题竟然耗了我差不多三个小时。
但——
事不避难者进,志不求易者成。
作业九 构造函数
1. 构造函数
#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
class mx{
public:
double len;
double wid;
};
int main(){
mx a;
cin>>a.len>>a.wid;
cout<<"length = "<<a.len<<','<<"width = "<<a.wid<<endl;
cout<<"C = "<<2*(a.len+a.wid)<<endl;
cout<<"S = "<<a.len*a.wid<<endl;
cout<<"The diagonal length = "<<setprecision(6)<<sqrt(a.len*a.len+a.wid*a.wid)<<endl;
if(a.len==a.wid)cout<<"Is square ? "<<"Yes"<<endl;
else cout<<"Is square ? "<<"No"<<endl;
return 0;
}
片段题1. 矩阵相加
#include <iostream>
using namespace std;
class Matrix
{
public:
Matrix();
void input();
void display();
friend Matrix operator + (Matrix&, Matrix&);
friend istream & operator >> (istream &, Matrix &);
friend ostream & operator <<(ostream &,Matrix &);
private:
int mat[2][3];
};
Matrix::Matrix()
{
for (int i = 0; i < 2; i++)
for (int j = 0; j < 3; j++)
mat[i][j] = 0;
}
Matrix operator + (Matrix &a, Matrix &b)
{
for(int i=0;i<2;i++)
for(int j=0;j<3;j++)
a.mat[i][j]+=b.mat[i][j];
return a;
}
istream & operator >> (istream &in, Matrix &m)
{
for(int i=0;i<2;i++)
for(int j=0;j<3;j++)
in>>m.mat[i][j];
return in;
}
ostream & operator << (ostream &out, Matrix &m)
{
for(int i=0;i<2;i++)
for(int j=0;j<3;j++)
if(j!=2)out<<m.mat[i][j]<<' ';
else out<<m.mat[i][j]<<endl;
return out;
}
int main()
{
Matrix a, b, c;
cin >> a;
cin >> b;
c = a + b;
cout << c;
system("pause");
return 0;
}
片段题2. “Book”的实现
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
class Book{
public:
Book();
void show();
void setInfo(){
getline(cin,this->shelf_id);
cin>>price;
cin.get();
}
private:
float price;
string shelf_id;
};
Book::Book()
{
price = 0;
shelf_id = "";
}
void Book::show(){
cout<<"Shelf_ID: "<<this->shelf_id<<" "<<"Price: "<<this->price<<endl;
}
int main()
{
int n;
cin >> n; //从键盘输入整数n
cin.get(); //吸收整数输入后的回车
Book library[n]; //声明对象数组
for(int i=0;i<n;i++)
{
library[i].setInfo(); //从键盘输入对象数组的每个元素
}
for(int i=0;i<n;i++)
{
library[i].show(); //输出对象数组
}
return 0;
}
片段题3. 友元函数
#include <iostream>
using namespace std;
class Complex
{
private:
double real,image;
public:
Complex(){}
Complex(double a,double b)
{
real = a;
image = b;
}
void setRI(double a, double b)
{
real = a;
image = b;
}
double getReal()
{
return real;
}
double getImage()
{
return image;
}
void print()
{
cout<<"complex: "<<this->real;
if(image>0)cout<<'+';
cout<<this->image<<'i'<<endl;
}
friend Complex add(Complex,Complex); //声明友元函数
};
Complex add(Complex c1,Complex c2) //定义友元函数
{
Complex c3;;
c3.real=c1.real+c2.real; //访问Complex类中的私有成员
c3.image=c1.image+c2.image;
return c3;
}
int main()
{
double a,b,c,d;
cin>>a>>b>>c>>d;
Complex c1(a, b), c2, c3;
c2.setRI(c,d);
c3=add(c1,c2);
cout<<"c1:";
c1.print();
cout<<"c2:";
c2.print();
cout<<"c3:";
c3.print();
return 0;
}
片段题4. “点”类的实现
#include <iostream>
#include <iomanip>
#include <cmath> //声明sqrt函数
using namespace std;
class Point //完成Point类的声明,包含数据成员和成员函数
{
private:
int x;
int y;
public :
// 成员函数原型声明
Point();
void setPoint(int ,int ) ;
int getX();
int getY();
double myDistance( int ,int ) ;
};
Point::Point()
{}
void Point::setPoint(int x1,int y1) //从键盘输入Point的坐标
{
x=x1;
y=y1;
}
int Point::getX(){
return this->x;
}
int Point::getY(){
return this->y;
}
double Point::myDistance( int x1,int y1) //计算两个点的距离,并输出
{
return sqrt(x1*x1+y1*y1);
}
int main()
{
Point A,B; //定义两个Point对象,A和B;
double distance;
//从键盘输入A和B的坐标
int x,y;
cin>>x>>y;
A.setPoint(x,y);
cin>>x>>y;
B.setPoint(x,y);
distance = A.myDistance(abs(A.getX()-B.getX())
,
abs(A.getY()-B.getY()));
//输出结果
cout<<fixed<<setprecision(3)<<distance <<endl;
return 0;
}
【作业九,构造函数】总结
Just so easy
实验十-类和对象
片段题1. 矩阵计算
不得不说,这一题真的o( ̄▽ ̄)d好
#include <iostream>
#include <cstdlib>
using namespace std;
class matrix{
private:
int rows, cols;
int **p;
public:
matrix();
matrix(int &M, int &N);
matrix(matrix &A, int &&m, int &n);
~matrix();
matrix multi(int x); // 数乘
int det(); // 计算行列式
void out(); //输出矩阵
void input();
matrix operator+(matrix &another); //重载加法运算实现矩阵相加
matrix operator*(matrix &another); //重载乘法运算实现矩阵相乘
};
matrix::matrix(int &M, int &N){
rows=M, cols=N;
p=new int*[rows];
for(int i=0;i<M;i++)
{
p[i]=new int[cols];
}
}
matrix::matrix(matrix &A, int &&m, int &n) //从矩阵A中删除第m行第n列后得到新的矩阵
{//我一直以为int &&m,这个右值引用是写出来好看的
cols=A.cols-1;
rows=A.rows-1;//简单初始化
p=new int*[rows];
for(int i=0;i<rows;i++)
{
p[i]=new int[cols];
}
for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
p[i][j]=A.p[i][j];
for(int i=0; i<m; i++)
for(int j=n+1; j<A.cols; j++)
p[i][j-1]=A.p[i][j];
for(int i=m+1; i<A.rows; i++)
for(int j=0; j<n; j++)
p[i-1][j]=A.p[i][j];
for(int i=m+1; i<A.rows; i++)
for(int j=n+1; j<A.cols; j++)
p[i-1][j-1]=A.p[i][j];
}
matrix::~matrix()
{
for(int i=0; i<rows; i++)
delete[] p[i];
delete[] p;
}
matrix matrix::multi(int x) // 数乘
{
matrix tmp(rows, cols);
for(int i=0;i<rows;i++)
for(int j=0;j<cols;j++)
tmp.p[i][j]=x*this->p[i][j];
return tmp;
}
void matrix::out() //输出矩阵
{
/* 逐行输出,数据间用空格分隔 */
for(int i=0;i<rows;i++){
for(int j=0;j<cols;j++)
cout<<p[i][j]<<' ';
cout<<endl;
}
}
void matrix::input()
{
for(int i=0; i<rows; i++)
for(int j=0; j<cols; j++)
cin>>p[i][j];
}
matrix matrix::operator+(matrix &another) //重载加法运算实现矩阵相加
{
matrix tmp(rows, cols);
/* 矩阵对应位置元素相加 */
for(int i=0; i<rows; i++)
for(int j=0; j<cols; j++)
tmp.p[i][j]=this->p[i][j]+another.p[i][j];
return tmp;
}
matrix matrix::operator*(matrix &another) //重载乘法运算实现矩阵相乘
{
matrix tmp(rows, another.cols);
for(int i=0; i<rows; i++)
{
for(int j=0; j<another.cols; j++)
{
/* 计算A矩阵的第i行与B矩阵的第j列元素对应相乘后之和,作为新矩阵的第i行第j列元素的值 */
int sum=0;
for(int n=0;n<cols;n++)
sum+=this->p[i][n]*another.p[n][j];
tmp.p[i][j]=sum;
}
}
return tmp;
}
int matrix::det(){
if (rows==1)
return p[0][0];
else
{
int result=0, flag;
for(int i=0; i<cols; i++)
{
flag=(i%2)?-1:1;
matrix tmp(*this, 0, i);
result=result+flag*p[0][i]*tmp.det(); // 使用代数余子式求行列式的值, 递归
}
return result;
}
}
int main()
{
int M,N;
// A矩阵的行和列
cin>>M>>N;
matrix mA(M, N); //生成A矩阵
// 输入矩阵值
mA.input();
// 输入数乘值
int x;
cin>>x;
matrix mm1=mA.multi(x);
mm1.out();
//B矩阵的行和列
int K, L;
cin>>K>>L;
matrix mB(K, L); //生成B矩阵
mB.input();
/* 求矩阵A和矩阵B的和 */
if (M==K && N==L)
{
matrix mm2=mA+mB;
mm2.out();
}
/* 求矩阵A和矩阵B的乘积矩阵 */
if (N==K)
{
matrix mm3=mA*mB;
mm3.out();
}
/* 矩阵A的行列式的值 */
if (M==N)
cout<<mA.det()<<endl;
if (K==L)
cout<<mB.det()<<endl;
return 0;
}
片段题2. 约瑟夫问题
#include <iostream>
using namespace std;
class person{
private:
int no; /* 人的编号 */
person *next; /* 指向相邻的下一个人 */
public:
person(int num)
{
no=num;
next=NULL;
}
void setNext(person *p)
{
next=p;
}
int getNo()
{
return no;
}
person *getNext()
{
return next;
}
};
class cycle
{
private:
person *start; /* 开始数数的位置 */
int out; /* 数到几出列 */
int inQueue; /* 队伍中现有人数 */
public:
cycle(int num, int from, int whoOut)
{
inQueue=num, out=whoOut;
person *prv=NULL, *first=NULL;
for(int i=1; i<=num; i++)
{
person *p=new person(i);
if (i==1)
first=p;
if (i==from)
start=p;
if (i>1)
prv->setNext(p);
prv=p;
}
prv->setNext(first);
}
int getInQueue(){
return inQueue;
}
//-------------------------------------------------------
//-----------------------------------------------------------
void cnt() /* 根据题目要求数数,确定出列的人,将该人从圈中剔除 */
{
int js=out;
person* dummy; //这里用哨兵节点的方式做删除
js--;
if(js==0)js=inQueue;//这是个大坑
while(js--){
dummy=start;
start=start->getNext();
}
dummy->setNext(start->getNext());//通过成员函数修改next节点
start=start->getNext();
inQueue--;
}
//----------------------------------------------
person *getStart()
{
return start;
}
~cycle()
{
delete start;
}
};
int main()
{
int n,k, m ; /* n 圈内人数 k 开始数数 m 可数出列 */
cin>>n>>k>>m;
cycle *p=new cycle(n,k,m);
while(p->getInQueue()>1)
p->cnt();
person *winer=p->getStart();
cout<<winer->getNo()<<endl;
delete p;
return 0;
}
【实验十,类和对象】总结
这次的题目出的非常好,值得多多深入研究。
作业十-继承
片段题1. 实现宠物叫声的多态性
#include <string>
#include <iostream>
class Pet
{
public:
std::string color;
int weight;
int age;
public:
virtual void speak()=0;
};
class Cat :public Pet
{
public:
void speak(){
printf("Cat: miao miao miao...\n");
}
};
class Dog :public Pet
{
public:
void speak(){
printf("Dog: wang wang wang...\n");
}
};
int main(int argc, char** args)
{
Pet *pet;
Cat cat;
Dog dog;
cat.speak();
dog.speak();
}
片段题2 设计圆类,并以圆类为基类,派生圆柱类、圆锥类和圆球类(分别求出其面积和体积)
#include<iostream>
#include<math.h>
using namespace std;
// 定义数学常数pi
#define pi 3.1415926
// 创建抽象基类Area
class Area {
public:
virtual double GetArea() = 0;
};
// 创建抽象基类Volume
class Volume {
public:
virtual double GetVolume() = 0;
};
// 创建基类Circle圆类
class Circle:public Area {
public:
double r;
Circle(double x):r(x){}
double GetArea(){
return pi*r*r;
}
};
// 创建圆柱类
class Cylinder :public Circle, public Volume {
public:
double h;
Cylinder(double x,double y):Circle(x){
this->h=y;
}
double GetArea(){
return pi*r*r*2.0+pi*r*h*2.0;
}
double GetVolume(){
return pi*r*r*h;
}
};
// 创建圆锥类
class Cone :public Circle, public Volume {
public:
double h;
Cone(double x,double y):Circle(x),h(y){}
double GetArea(){
return pi*r*r+pi*r*sqrt(r*r+h*h);
}
double GetVolume(){
return pi*r*r*h/3.0;
}
};
// 创建球类
class Sphere :public Circle, public Volume {
public:
Sphere(double x):Circle(x){}
double GetArea(){
return 4.0*pi*r*r;
}
double GetVolume(){
return 4.0*pi*r*r*r/3.0;
}
};
int main() {
Circle circle(2);
cout << "创建一个圆对象" << endl;
cout << "半径 :2.0" << endl;
cout << "面积 :" << circle.GetArea() << endl << endl;
Cylinder cylinder(2, 3);
cout << "创建一个圆柱对象" << endl;
cout << "半径 :2.0" << endl;
cout << "高度 :3.0" << endl;
cout << "面积 :" << cylinder.GetArea() << endl;
cout << "体积 :" << cylinder.GetVolume() << endl << endl;
Cone cone(2, 3);
cout << "创建一个圆锥对象" << endl;
cout << "半径 :2.0" << endl;
cout << "高度 :3.0" << endl;
cout << "面积 :" << cone.GetArea() << endl;
cout << "体积 :" << cone.GetVolume() << endl << endl;
Sphere sphere(2);
cout << "创建一个球对象" << endl;
cout << "半径 :2.0" << endl;
cout << "面积 :" << sphere.GetArea() << endl;
cout << "体积 :" << sphere.GetVolume() << endl << endl;
return 0;
}
片段题3. 实现Point类对象与整数加法,实现两个Point类对象的加法
#include<iostream>
using namespace std;
class Point
{
private:
int x,y;
public:
Point()
{
x=y=0;
}
Point(int x0,int y0)
{
x=x0;
y=y0;
}
int GetX(){return x;}
int GetY(){return y;}
void Print()
{
cout<<x<<" "<<y<<""<<endl;
}
friend Point operator+(Point& pt,int dd);//友元函数声明
friend Point operator+(Point& pt1,Point& pt2);//友元函数声明
};
Point operator+(Point& pt,int dd)//加号操作符重载函数,实现Point类对象与整数加法
{
pt.x+=dd;
pt.y+=dd;
return pt;
}
Point operator+(Point& pt1,Point& pt2)//加号操作符重载函数,实现两个Point类对象的加法
{
pt1.x+=pt2.x;
pt1.y+=pt2.y;
return pt1;
}
int main()
{
int qq1,qq2,qq3,qq4;
cin>>qq1>>qq2>>qq3>>qq4;
Point a(qq1,qq2);
Point b(qq3,qq4);
Point c;
c=a+b;
c.Print();
c=c+2;
c.Print();
}
片段题4.求两个三角形面积和
#include<iostream>
#include<algorithm>
#include<string>
#include<cmath>
using namespace std;
class Triangle
{
public:
Triangle(double s1 = 0, double s2 = 0, double s3 = 0, double area=0)
{
m_s1 = s1;
m_s2 = s2;
m_s3 = s3;
m_area = area;
}
double getS1()
{
return m_s1;
}
double getS2()
{
return m_s2;
}
double getS3()
{
return m_s3;
}
double getArea()
{
return m_area;
}
Triangle operator+(Triangle triangle);
private:
double m_s1;
double m_s2;
double m_s3;
double m_area;
};
Triangle Triangle::operator+(Triangle triangle)
{
double p1=(this->m_s1+this->m_s2+this->m_s3)*0.5;
double s1=sqrt(p1*(p1-this->m_s1)*(p1-this->m_s2)*(p1-this->m_s3));
double p2=(triangle.m_s1+triangle.m_s2+triangle.m_s3)*0.5;
double s2=sqrt(p2*(p2-triangle.m_s1)*(p2-triangle.m_s2)*(p2-triangle.m_s3));
this->m_area=s1+s2;
return *this;
}
int main()
{
int t11,t12,t13,t21,t22,t23;
cin>>t11>>t12>>t13;
cin>>t21>>t22>>t23;
Triangle c1(t11,t12,t13), c2(t21,t22,t23),c3;
c3 = c1 + c2;
cout<<c3.getArea()<< endl;
system("pause");
return 0;
}
【作业十,继承】总结
老师们的水出题之路
大作业!《图书管理系统》
在开始解决这道简单题之前,让我们先来看看下面的简单程序
主要是我没那么快
【NO1.】QQ通讯录系统——用C++模拟实现,学C++必玩项目】
【NO2.】IT公司职工管理系统—————C++文件交互式的项目实现】
图书管理系统┏ (゜ω゜)=☞
最近有点偷懒,我要再加油一点!
HNU-CG:官方题解
后记⋙
- 做这件事的目的和意义——最大的意义是对自己的,一方面:我此前有些沉迷其他OJ,对学校编程作业比较拖延,以此做目标,可以督促一下我自己;另一方面,CG作业的完成质量上,我太依赖各种奇巧淫招,对CG一遍过就满足了,以完成好官方题解为目标,我会重复地一刷二刷CG题库,从而巩固基础知识。当然,最大的意义是:可以在大学四年里玩出些新花样
- 对他人的意义:对校外同学,可以做拓展、参考;对本校同学,大家都懂[]( ̄▽ ̄)*。
- 说明:
- 更新时间:
- 1->每次CG作业发布后的两到三天。最晚不过截至日期前的一周。
- 2->期中考试前和期末考试前的几周,我会回头再刷CG题库,对一些题目补充B解
- 3->假期有时间,我会重构题解,使其能更好地帮助大家、
- HNU-CG题目有一定的学习价值
- 这篇题解目前将设置粉丝可见,完成完毕后后将解除。
免责声明:对HNUer,如果你沉迷CV大法,懈怠修炼,导致走火入魔,以致期末FAIL的话,本官方题解拒绝负责😈
更多推荐
已为社区贡献2条内容
所有评论(0)