前言:如果你是HUNER,你可以用它来作为你的程序设计作业参考,加以学习,相信这档【官方题解】必能让你的编程学习轻松很多;对非HUNER的朋友,也可以用它作为参考,作为拓展,作为自我提高。
说明:

  1. 此文章最终将覆盖——我在HNU-CG遇到的题,这是我做出的承诺。但,我决定弄这件事时还在2021大一上,所以我会将一级目录分成每个学期,二级目录分成每个作业编号,三级目录分为每个题目名称——这样分步完成。其中:部分题解答分为A、B,A为首解,B为补充的解(会用基础的语法),当然片段编程题只有A解
  2. 对于每次CG作业,如果题目过于简单,我可能会晚一点更新——这是很正常的事情
  3. CG题目主要是程序设计题,面对全选择填空题的作业,我也会补充相应的知识点
  4. 由于HNU的老师从不给出作业的官方题解,所以我声明“官方”两字。老师不会拿我怎么样的
  5. 不做专栏的原因:HNU-CG上的题大部分是对语法考察多的模拟题,对算法考察难度较小,深入研究意义不大,且对非Hnuer的朋友帮不够友好
  6. 对校外朋友的HNUCG介绍:CG是HNU作业提交和考试的平台。目前看来,每次题目的前缀有“作业”、“实验”两种,还有突然跑出来的项目作业,以及可爱的考试,所以该官方题解也会有四种类型
  7. 关于每篇篇末的总结,到期末复习时会正式给出

大一上学期⋙

实验九-结构题

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:官方题解


在这里插入图片描述





后记⋙

  1. 做这件事的目的和意义——最大的意义是对自己的,一方面:我此前有些沉迷其他OJ,对学校编程作业比较拖延,以此做目标,可以督促一下我自己;另一方面,CG作业的完成质量上,我太依赖各种奇巧淫招,对CG一遍过就满足了,以完成好官方题解为目标,我会重复地一刷二刷CG题库,从而巩固基础知识。当然,最大的意义是:可以在大学四年里玩出些新花样
  2. 对他人的意义:对校外同学,可以做拓展、参考;对本校同学,大家都懂[]( ̄▽ ̄)*。
  3. 说明:
  • 更新时间:
  • 1->每次CG作业发布后的两到三天。最晚不过截至日期前的一周。
  • 2->期中考试前和期末考试前的几周,我会回头再刷CG题库,对一些题目补充B解
  • 3->假期有时间,我会重构题解,使其能更好地帮助大家、
  1. HNU-CG题目有一定的学习价值
  2. 这篇题解目前将设置粉丝可见,完成完毕后后将解除

免责声明:对HNUer,如果你沉迷CV大法,懈怠修炼,导致走火入魔,以致期末FAIL的话,本官方题解拒绝负责😈

Logo

惟楚有才,于斯为盛。欢迎来到长沙!!! 茶颜悦色、臭豆腐、CSDN和你一个都不能少~

更多推荐