C++第二学期期末题库(qlu题库,自用)

重点:继承,友元,重载,进制,构造函数

第一次实验

填空

1、

2、

3、 

可以比较明显地看出,我们把李白遇到的情况列出后,是一颗二叉树,而二叉树的遍历,我们可以用递归的方式进行。

当然在进行递归的时候我们要注意终止条件的判断,这题的判断是:

从家门口开始走,有两种可能,遇到店和遇到花

只要李白遇到店不超过5次,遇到花不超过9次,最后一次已确定,就可以继续深搜

代码:

#include<bits/stdc++.h>

using namespace std;

int ans=0;

void dfs(int dian,int hua,int jiu){

    if(dian > 5 || hua > 9){

       return;

    }

    if(dian == 5 && hua == 9 && jiu == 1){

       ans++;

       return;

    }

    dfs(dian+1,hua,jiu*2);

    dfs(dian,hua+1,jiu-1);

}

int main(){

    dfs(0,0,2);

    cout << ans;

    return 0;

}

4、

小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!

站在台阶前,他突然又想着一个问题:

如果我每一步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完39级台阶,有多少种不同的上法呢?

请你利用计算机的优势,帮助小明寻找答案。

                    【 正确答案: 51167078

所以我们需要对每一个分支进行前序遍历(根左右),那么左边的节点是走一步,右边的节点是走两步,那么dfs(root.left),dfs(root.right),就可以变成dfs(1),dfs(2)。

思路比较清晰,只需要递归:

当走一步,走了一节台阶:f(step+1,n+1);

当走一步,走了两节台阶:f(step+1,n+2);

递归的出口就是偶数步,并且台阶数为39节。

代码:

//第39级台阶

#include<bits/stdc++.h>

using namespace std;

int num=0;

void f(int step,int n)

{

    if(n>39)

       return;

    if(n==39 && step%2==0)

    {

       num++;

       return;

    }

    f(step+1,n+1);

    f(step+1,n+2);

}

int main ()

{

    f(0,0);

    printf("%d",num);

    return 0;

}

编程题

1、

有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝? 

输入例子:

3

10

81

0

输出例子:

1

5

40

#include<stdio.h>
int main ()
{
    int i,j,a;
    for (i=1; i<100; i++)
    {
        for (j=1; j<100; j++)
        {
            a=i*19+j*23;
            if (a==823&&i>j)
                printf ("%d\n",j);
        }
    }
    return 0;
}

2、学生成绩管理系统

【问题描述】编写一个基于结构体得学生成绩信息管理系统。

主要功能如下: 1. 用结构体存放所有数据。

2. 每个功能都用函数实现。

3. 输入10个学生的学号和三门课程的成绩。

4. 计算每个学生的总分。

5. 按总分从高到低排序。

6. 加上名次一列。

7. 输出最后的二维表格样式的成绩,含学号、三门课成绩、总分、名次。

请编写五个函数完成相应功能的实现。其中:

input_data(STU s[]):输入原始数据函数。

calculate(STU s[]):计算总分函数。

sort_total(STU s[]):根据总分降序排序函数。

add_rank(STU s[]):增加名次列函数。

print_data(STU s[]):输出二维表格样式成绩的函数。

【输入形式】用户依次输入10名学生的学号和三门课成绩。

【输出形式】输出最后的二维表格样式的成绩,含学号、三门课成绩、总分、名次(包含表头),要求每个学生信息占用一行,每个数据占用15个字符且左对齐。

【样例输入】

10001 67 71 69 

10002 78 83.5 94.2

10003 61 67 87.5 

10004 88 89 92 

10005 66.7 78.6 93

10006 67 72 77

10007 74 63 89

10008 93 74 66

10009 74 76 81

10010 78 91 83

【样例输出】

Number:        Chinese:       Mathematics:   English:       Total score:   Ranking

10004            88                89                      92               269               1

10002            78                83.5                   94.2            255.7             2

10010            78                91                      83               252               3

10005            66.7             78.6                   93               238.3             4

10008            93                74                      66               233               5

10009            74                76                      81               231               6

10007            74                63                      89               226               7

10006            67                72                      77               216               8

10003            61                67                      87.5            215.5             9

10001            67                71                      69               207               10

【样例说明】用户依次输入10名学生的学号和三门课成绩。输出为二维表格样式的成绩,含学号、三门课成绩、总分、名次(包含表头),每个学生信息占用一行,每个数据占用15个字符且左对齐。

【评分标准】 结果完全正确得20分,每个测试点10分。提交程序名为:scoremanage.c或scoremanage.cpp

 

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

const int N=10;
struct STU
{
	public:
		int num;
		double score1;
		double score2;
		double score3;
		double sum;
};

STU s[N];

void input_data(STU s[],int i)
{
	cin>>s[i].num>>s[i].score1>>s[i].score2>>s[i].score3;
	
}

void calculate(STU s[],int i)
{
	s[i].sum=s[i].score1+s[i].score2+s[i].score3;
}

void total(STU s[],int i)
{
	STU temp;
	for(int i=1;i<=10;i++)
	{
	    for(int j=1;j<=10-i;j++)
	    {
	    	if(s[j].sum<s[j+1].sum)
	    	{
	    		temp=s[j+1];
	    		s[j+1]=s[j];
	    		s[j]=temp;
			}
		}
	}
}

void print_s(STU s[],int i)
{
	cout<<std::left<<setw(15)<<s[i].num<<setw(15)<<s[i].score1<<setw(15)<<s[i].score2;
	cout<<std::left<<setw(15)<<s[i].score3<<setw(15)<<s[i].sum<<setw(15)<<i;
	cout<<endl;
	
}

int main() 
{
	for(int i=1;i<=10;i++)
	{
		input_data(s,i);
		calculate(s,i);
		total(s,i);
		
	}
	cout<<"Number:        Chinese:       Mathematics:   English:       Total score:   Ranking";
	cout<<endl;
	for(int i=1;i<=10;i++)
	{
		print_s(s,i);
	}
	
	return 0;
}

3、

给定一个t,将t秒转化为HH:MM:SS的形式,表示HH小时MM分钟SS秒。HHMMSS均是两位数,如果小于10用0补到两位。
【输入形式】
第一行一个数T(1<=T<=100000),表示数据组数。后面每组数据读入一个数t,0<=t<24*60*60。
【输出形式】
每组数据一行,HH:MM:SS。
【样例输入】

2
0
86399

【样例输出】
00:00:00
23:59:59

 

#include <iostream>  
#include <iomanip>  
using namespace std;  
  
// 函数将秒数转换为HH:MM:SS格式  
void convertSecondsToTime(int t) {  
    int hours = t / 3600;  
    int minutes = (t % 3600) / 60;  
    int seconds = t % 60;  
  
    // 使用setw和setfill来格式化输出,保证HH, MM, SS都是两位数  
    cout << setw(2) << setfill('0') << hours << ":"  
         << setw(2) << setfill('0') << minutes << ":"  
         << setw(2) << setfill('0') << seconds << endl;  
}  
  
int main() {  
    int T;  
    cin >> T; // 读取数据组数  
      
    for (int i = 0; i < T; ++i) {  
        int t;  
        cin >> t; // 读取每组的秒数  
          
        convertSecondsToTime(t); // 转换并输出  
    }  
  
    return 0;  
}

4、

【问题描述】有5个学生,每个学生的数据包括学号(num) ,姓名(name) ,总成绩(score) ,编程实现从键盘输入5位学生数据,按总成绩由高到低排序,输出排序后的学号、姓名、总成绩(为了简化问题,提示同学们可以将总成绩定义为int ;另,在排序交换时,不能只交换总成绩变量值)。

【输入形式】用户依次输入5名学生的学号、姓名和总成绩。

【输出形式】输出排好序的学生学号、姓名和总成绩,要求每个学生信息占用一行,每个数据占用15个字符且右对齐。

【样例输入】

1 aaaa 73 2 bbbbb 78 3 wanf 88 4 li 68 5 jing 89

【样例输出】

              5               jing              89

              3             wanf              88

              2           bbbbb             78

              1              aaaa             73

              4                   li              68

【样例说明】用户依次依次输入5名学生的学号、姓名和总成绩。输出为排好序的学生学号、姓名和总成绩,每个学生信息占用一行,每个数据占用15个字符且右对齐。

【评分标准】 结果完全正确得10分,每个测试点5分。提交程序名为:strstu.c或strstu.cpp

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

class student
{
	public:
	int num;
	string name;
    int score;
    
    student()
    {
    	num=0;
    	name="000";
    	score=0;
	}
		
};
student tmp;
void test01(student stu[])
{
	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < 5; j++)
		{
 			if (stu[j].score < stu[j + 1].score)
			{
			
				tmp = stu[j];
				stu[j] = stu[j + 1];
				stu[j + 1] = tmp;
			}//使用平均成绩将学生信息进行排序
		}
	}

}

int main()
{
	student stu[10];
	//student stu1;
	for(int i=1;i<=5;i++)
	{
		cin>>stu[i].num>>stu[i].name>>stu[i].score;
	}
	test01(stu);
	for(int j=0;j<5;j++)
	{
		//printf("%d %s %d",stu[j].num,stu[j].name,stu[j].score);
		cout<<setw(15)<<stu[j].num;
		cout<<setw(15)<<stu[j].name;
		cout<<setw(15)<<stu[j].score;
		cout<<endl;
	}
	return 0;
 } 

5、

【问题描述】定义一个结构体变量(包括年、月、日),编写程序,要求输入年、月、日,程序能计算并输出该日在本年中是第几天。注意闰年问题。

【输入形式】根据系统提示,输入年、月、日。

【输出形式】输出该日在本年中是第几天。

【样例输入】

2022 12 3

【样例输出】

input year,month,day:

12/3 is the 337th day in 2022.

【样例说明】根据系统提示,输入年、月、日。输出该日在本年中是第几天。

【评分标准】 结果完全正确得15分,每个测试点5分。提交程序名为:xt7-1-1.c或xt7-1-1.cpp

,#include<iostream>
using namespace std;

struct Time
{
	public:
		int year;
		int month;
		int day;
};

bool leapYear(int year)
{
	if(year%4==0&&year%100!=0)
	{
		return true;
	}
	if(year%400==0)
	{
		return true;
	}
	else return false;
}

int month_day(int month,int year)
{
	switch(month)
 {
	case 4:
	case 6:
	case 9:
	case 11:
	   return 30;
	case 2:
	if(leapYear(year))
	{
		return 29;
	 } 
	else
	{
		return 28;
	}
	default:
	return 31;
 }
}

int showTime(int day,int month,int year)
{
	int mon;
	for(int i=1;i<month;i++)
	{
		mon+=month_day(i,year);
	}
	return mon+day;
}

int main()
{
	Time t1;
	cout<<"input year,month,day:"<<endl;
	cin>>t1.year>>t1.month>>t1.day;
	int res=showTime(t1.day,t1.month,t1.year);
	cout<<t1.month<<"/"<<t1.day<<" is the "<<res<<"th day in "<<t1.year<<".";
	//cout<<res;
	return 0;
}

重载运算符

函数类型 operator 运算符(形参表)
{
  函数体;
}

第二次实验

1、

【问题描述】编写设计一个People类,用于计算成长数据。该类的数据成员有年龄(age)、身高(height)、体重(weight)和人数(num),其中人数为静态数据成员,成员函数有构造函数(People)、进食(Eatting)、运动(Sporting)、睡眠(Sleeping)、显示(Show)和显示人数(ShowNum)。其中构造函数由已知参数年龄(a)、身高(h)和体重(w)构造对象,进食函数使体重加1,运动函数使身高加1,睡眠函数使年龄、身高、体重各加1,显示函数用于显示人的年龄、身高、体重,显示人数函数为静态成员函数,用于显示人的个数。假设年龄的单位为岁,身高的单位为厘米,体重的单位为市斤,要求所有数据成员为protected访问权限,所有成员函数为public访问权限,在主函数中通过对象直接访问类的所有成员函数。用构造函数进行初始化,三个对象的初始化数据为:

年龄:            身高:               体重:

8                    120                   60

14                  156                   78

18                  170                   110

【输入形式】用构造函数进行初始化,用户无需输入数据。

【输出形式】分别输出3个对象的序号、年龄、身高、体重,以及输出总人数。

【样例输入】

【样例输出】

Number1:

Age:9years old

Height:122cm

Weight:62jin

Number2:

Age:15years old

Height:158cm

Weight:80jin

Number3:

Age:19years old

Height:172cm

Weight:112jin

Number of people:3

【样例说明】用户根据3个对象的初始化数据,通过构造函数进行初始化。然后计算其成长数据,分别输出3个对象的序号、年龄、身高、体重,以及总人数。

【评分标准】 结果完全正确得20分,每个测试点20分。提交程序名为:growth_data.c或growth_data.cpp

/*编写设计一个People类,用于计算成长数据。该类的数据成员有年龄(age)、身高(height)、
体重(weight)和人数(num),其中人数为静态数据成员,成员函数有构造函数(People)、进
食(Eatting)、运动(Sporting)、睡眠(Sleeping)、显示(Show)和显示人数(ShowNum)。其中
构造函数由已知参数年龄(a)、身高(h)和体重(w)构造对象,进食函数使体重加1,运动函数使
身高加1,睡眠函数使年龄、身高、体重各加1,显示函数用于显示人的年龄、身高、体重,显示
人数函数为静态成员函数,用于显示人的个数。假设年龄的单位为岁,身高的单位为厘米,体重
的单位为市斤,要求所有数据成员为protected访问权限,所有成员函数为public访问权限,
在主函数中通过对象直接访问类的所有成员函数。  */

#include <iostream>					// 预处理命令
using namespace std;					// 使用标准命名空间std

// 人(people)类
class People
{
protected:
// 数据成员:
	int age;						// 年龄
	int height;						// 身高
	int weight;						// 体重
	static int num;					// 人数

public:
//  公有函数:
	People(int a, int h, int w);			// 构造函数
	void Eatting(){ weight++; }			// 进食使体重加1
	void Sporting(){ height++; }			// 运动使身高加1
	void Sleeping();					// 睡眠
	void Show() const;				// 显示人的信息
	static void ShowNum()				// 显示人数
	{ cout << "Number of people:" << num << endl; }
};

int People::num = 0;					// 初始化静态数据成员num

// 人(people)类的实现部分
People::People(int a, int h, int w): age(a), height(h), weight(w)
{ num++; }							// 由已知信息构造对象, 人数num将自加1

void People::Sleeping()					// 睡眠
{
	age++;						// 睡眠使年龄加1
	height++;						// 睡眠使身高加1
	weight++;						// 睡眠使体重加1
}

void People::Show() const
// 显示人的信息
{
	cout << "Number" << num << ':' << endl;	// 显示人的序号
	cout << "Age:" << age << "years old" << endl;		// 显示年龄
	cout << "Height:" << height << "cm" <<endl;	// 显示身高
	cout << "Weight:" << weight << "jin" << endl;// 显示体重
	cout << endl;						// 换行
}

int main(void)						// 主函数main(void)
{
	People obj1(8, 120, 60);			// 定义对象
	obj1.Eatting();					// 进食
	obj1.Sporting();					// 运动
	obj1.Sleeping();					// 睡眠
	obj1.Show();					// 显示信息
	
	People obj2(14, 156, 78);			// 定义对象
	obj2.Eatting();					// 进食
	obj2.Sporting();					// 运动
	obj2.Sleeping();					// 睡眠
	obj2.Show();					// 显示信息

	People obj3(18, 170, 110);			// 定义对象
	obj3.Eatting();					// 进食
	obj3.Sporting();					// 运动
	obj3.Sleeping();					// 睡眠
	obj3.Show();					// 显示信息

	People::ShowNum();				// 显示人数

	system("PAUSE");            		// 调用库函数system( ),输出系统提示信息
	return 0;                    		// 返回值0,返回操作系统
}


2、

十六进制数是在程序设计时经常要使用到的一种整数的表示方式。它有0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F共16个符号,分别表示十进制数的0至15。十六进制的计数方法是满16进1,所以十进制数16在十六进制中是10,而十进制的17在十六进制中是11,以此类推,十进制的30在十六进制中是1E。
  给出一个非负整数,将它表示成十六进制的形式。
【输入形式】

  输入包含一个非负整数a,表示要转换的数。0<=a<=2147483647


【输出形式】
输出这个整数的16进制表示
【样例输入】

30


【样例输出】

1E
#include <iostream>
using namespace std;
string h="0123456789ABCDEF";
int main()
{
	int x;
	string s="";
	cin>>x;
	do
	{
		s=h[x%16]+s;
		x/=16;
	}
	while(x);
	cout<<s<<endl;
	return 0;
}

这是一个do-while循环,用于将十进制数x转换为十六进制。

  • x%16:计算x除以16的余数。这个余数对应于h字符串中的一个字符,即x的当前最低位的十六进制表示。
  • h[x%16]:从h字符串中获取与x%16对应的字符。
  • s=h[x%16]+s;:将这个字符添加到s的开头。注意,由于字符串在C++中是不可变的,所以我们实际上是在创建一个新的字符串,并将其赋值给s
  • x/=16;:更新x的值,通过将其除以16并向下取整。这相当于移除了x的最低位的十六进制表示。

循环继续执行,直到x变为0,此时我们已经处理了x的所有位。

第三次实验

太简单,不写了嘿嘿

第四次实验

1、

【问题描述】声明一个复数类Complex,重载运算符“+“,使之能用于复数的加法运算,参加运算的两个运算量可以都是类对象c1和c2,也可以其中有一个是实数i,顺序任意。例如,c1+c2, i+c1,c1+i 均合法 (设i为实数,c1, c2为复数)。并用重载流提取运算符“>>”实现对复数的输入,用重载流插入运算符“<<”实现对复数的输出。运行程序分别求两个复数之和、实数和复数之和、复数和实数之和。

【输入形式】按照系统提示,分别输入两个复数和一个实数。

【输出形式】分别输出两个复数之和、实数和复数之和、复数和实数之和。

【样例输入】

12.4 -5.3

3.2 -1.6

-7.8

【样例输出】

Input real part and imaginary part of complex number:

Input real part and imaginary part of complex number:

Input a real number:

c1 + c2 = ( 15.6-6.9i )

i + c1 = ( 4.6-5.3i )

c1 + i = ( 4.6-5.3i )

【样例说明】按照系统提示,分别输入两个复数和一个实数。分别输出两个复数之和、实数和复数之和、复数和实数之和。

【评分标准】 结果完全正确得20分,每个测试点5分。提交程序名为:com_dou.c或com_dou.cpp

#include<bits/stdc++.h>
using namespace std;
typedef double db;

class Complex
{
	public:
	db real;
	db imag;
	
	public:
		void set_com()
		{
			cin>>real>>imag;
		}
	char aa(db t)
	{
		if(t>0) return '+';
		}	
			
};

Complex Complex::operator+(Complex &c2)
{
	Complex c3;
	c3.imag=imag+c2.imag;
	c3.real=real+c2.real;
	
	return c3;
}
Complex Complex::operator-(Complex &c2)
{
	Complex c3;
	c3.imag=imag-c2.imag;
	c3.real=real-c2.real;
	
	
	return c3;
}
Complex Complex::operator*(Complex &c2)
{
	Complex c3;
	c3.imag=imag*c2.real+c2.imag*real;
	c3.real=real*c2.real-imag*c2.imag;
	cout<<"c1*c2=("<<c3.real<<aa(c3.imag)<<c3.imag<<"i)"<<endl;
	return c3;
}
Complex Complex::operator+(Complex &c2)
{
	Complex c3,c4,c5,c6;
	c4.imag=-c2.imag;
	c4.real=c2.real;
	c5=c4*c2;
	c6=c1*c4;
	
	
	c3.imag=c6.imag/c5.imag;
	c3.real=c6.real/c5.real;
	cout<<"c1/c2=("<<c3.real<<aa(c3.imag)<<c3.imag<<"i)"<<endl;
	return c3;
}


int main()
{
	cout<<"Please enter the real and imaginary parts of c1:"<<endl;
	Complex c1;
	set_com();
	cout<<"Please enter the real and imaginary parts of c2:"<<endl;
	Complex c2;
	set_com();
	Complex c3=c1+c2;
	cout<<"c1+c2=("<<c3.real<<c3.aa(c3.imag)<<c3.imag<<"i)"<<endl;
	
	Complex c4=c1-c2;
	cout<<"c1-c2=("<<c4.real<<c4.aa(c4.imag)<<c4.imag<<"i)"<<endl;
	
	Complex c5=c1*c2;
	cout<<"c1*c2=("<<c5.real<<c5.aa(c5.imag)<<c5.imag<<"i)"<<endl;
	
	Complex c6=c1/c2;
	cout<<"c1/c2=("<<c6.real<<c6.aa(c6.imag)<<c6.imag<<"i)"<<endl;
	return 0;
}

第六次实验

第七次实验

第八次实验

1、

【问题描述】现在要开发一个系统,管理对多种汽车的收费工作。 给出下面的一个基类框架

class Vehicle

{ protected:

string NO;//编号

public:

virtual void display()=0;//输出应收费用

}

Vehicle为基类构建出Car、Truck和Bus三个派生类

Car的收费公式为: 载客数*8+重量*2;

Truck的收费公式为:重量*5;

Bus的收费公式为: 载客数*3;

生成上述类并编写主函数,要求主函数中有一个基类Vehicle指针数组,数组元素不超过10个。

Vehicle *pv[10];

主函数根据输入的信息,相应建立Car、Truck和Bus类对象,对于Car给出载客数和重量,Truck给出重量,Bus给出载客数。假设载客数和重量均为整数。提示:应用虚函数实现多态。

【输入形式】每个测试用例占一行,每行给出汽车的基本信息,每一个为当前汽车的类型1为car,2为Truck,3为Bus。接下来为它的编号,接下来Car是载客数和重量,Truck给出重量,Bus给出载客数。最后一行为0,表示输入的结束。

【输出形式】要求输出各车的编号和收费值。

【样例输入】

2 00012 2000

1 00011 4 600

3 00015 26

0

【样例输出】

00012 10000

00011 1232

00015 78

【样例说明】每个测试用例占一行,每行给出汽车的基本信息,每一个为当前汽车的类型1为car,2为Truck,3为Bus。接下来为它的编号,接下来Car是载客数和重量,Truck给出重量,Bus给出载客数。最后一行为0,表示输入的结束。输出各车的编号和收费值。

【评分标准】 结果完全正确得30分,每个测试点15分。提交程序名为:vehicle_charge.c或vehicle_charge.cpp

#include<bits/stdc++.h>
using namespace std;

class Vehicle
{
	public:
		string NO;
		virtual void display()=0;
};

class Car:public Vehicle
{
	public:
		int weight;
		int num;
	virtual void display()
	{
		cout<<NO<<" "<<weight*2+num*8<<endl;
	}
};

class Truck:public Vehicle
{
	public:
		int weight;
		int num;
	virtual void display()
	{
		cout<<NO<<" "<<weight*5<<endl;
	}
};

class Bus:public Vehicle
{
	public:
		int weight;
		int num;
	virtual void display()
	{
		cout<<NO<<" "<<num*3<<endl;
	}
};

void dodisplay(Vehicle &v1)
{
	v1.display();
}

void test01()
{
	Car c1;
	Truck t1;
	Bus b1;
	for(int i=0;i<10;i++)
	{
		int n;
		cin>>n;
		
		if(n==0) break;
		if(n==1)
		{
			cin>>c1.NO;
			cin>>c1.num>>c1.weight;
			dodisplay(c1);
		}
		else if(n==2)
		{
			cin>>t1.NO>>t1.weight;
			dodisplay(t1);
		}
		else if(n==3)
		{
			cin>>b1.NO>>b1.num;
			dodisplay(b1);
		}
		
	}
	
	
}

int main()
{
	test01();
	return 0;
}

2、

【问题描述】在停车场收费系统中,收费者会根据车型的不同按不同的单价和计费方式收取不同的停车费,其中:

轿车Car:每小时8元,超过30分钟按一小时计算,未超过30分钟不收费;

客车Bus:每小时10元,30分钟以内按半小时计费,未达1小时但超过30分钟按1小时计算;

货车Truck:每小时15元,未达1小时的按1小时计算;

其他未知类型:按默认方法计算,见裁判程序。

请补充必要的类和函数定义,使停车场类Parker可收取停入的n辆车的费用。

程序框架如下

#include <iostream>

#include <string>

using namespace std;

const float Car_Price= 8;

const float Bus_Price= 10;

const float Truck_Price=15;

class Vehicle{

protected:

float price;

int minute;

public:

   virtual float computeFee(){return 20.0f*minute/60;};

   virtual string getType(){return "unknow"; };

   float getPrice();

   void setPrice(float _price);

   int getMinute();

   void setMinute(int _minute);

   Vehicle(float _price,int _minute); 

   Vehicle(){

   };

};

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

int main(){

int n,minute; //停车辆次,时长 

char type;

Vehicle *vp;

Parker p;

cin>>n;

for(int i=1;i<=n;i++){

cin>>type>>minute;

switch(type){

case 'c':vp=new Car(minute);break;

case 't':vp=new Truck(minute);break;

case 'b':vp=new Bus(minute);break;

default: vp=new Vehicle();vp->setMinute(minute);

}

cout<<"type:"<<vp->getType() <<" minute:"<<vp->getMinute()<<" fee:"<<vp->computeFee()<<endl;

p.park(vp);

delete vp;

}

cout<<"sum:"<<p.getSum()<<endl;

return 0;

}

【输入形式】输入的第一行为进入停车场的车辆总数n. 接下来有n行输入,每行为一辆车的类型及停车时长,时长单位为分钟,类型’c’代表Car,类型’b’代表Bus,类型’t’代表Truck,其他字符则为未知类型。

【输出形式】输出为n+1行,前n行输出每辆车的类型,停车时长,收取的费用,最后一行输出目前停车场得到的停车费总额。

【样例输入】

4

b 135

c 240

t 56

c 42

【样例输出】

type:bus minute:135 fee:25

type:car minute:240 fee:32

type:truck minute:56 fee:15

type:car minute:42 fee:8

sum:80

【样例说明】输入的第一行为进入停车场的车辆总数n. 接下来有n行输入,每行为一辆车的类型及停车时长,时长单位为分钟,类型’c’代表Car,类型’b’代表Bus,类型’t’代表Truck,其他字符则为未知类型。输出为n+1行,前n行输出每辆车的类型,停车时长,收取的费用,最后一行输出目前停车场得到的停车费总额。

【评分标准】 结果完全正确得30分,每个测试点15分。提交程序名为:parker.c或parker.cpp

/*在停车场收费系统中,收费者会根据车型的不同按不同的单价和计费方式收取不同的停车费,其中:
轿车Car:每小时8元,超过30分钟按一小时计算,未超过30分钟不收费
客车Bus:每小时10元,30分钟以内按半小时计费,未达1小时但超过30分钟按1小时计算
货车Truck:每小时15元,未达1小时的按1小时计算
其他未知类型:按默认方法计算,见裁判程序。
请补充必要的类和函数定义,使停车场类Parker可收取停入的n辆车的费用。
*/

#include <iostream>
#include <string>
using namespace std;
const float Car_Price= 8;
const float Bus_Price= 10;
const float Truck_Price=15;
class Vehicle{
	protected:
		float price;
		int minute;
	public:
	   virtual float computeFee(){return 20.0f*minute/60;};
	   virtual string getType(){return "unknow"; };
	   float getPrice();
	   void setPrice(float _price);
	   int getMinute();
	   void setMinute(int _minute);
	   Vehicle(float _price,int _minute); 
	   Vehicle(){
	   };
};
void Vehicle::setMinute(int _minute){
minute=_minute;
}
int Vehicle::getMinute(){
    return minute;
}
void Vehicle::setPrice(float _price){
    price=_price;
}
float  Vehicle::getPrice(){
    return price;
}
Vehicle::Vehicle(float _price,int _minute){
price=_price;
minute=_minute;
}

class Car:public Vehicle
{
    public:
    Car(int m):Vehicle(Car_Price,m){};
    virtual string getType(){return "car";};
    virtual float computeFee()
    {
        int h=minute/60;
        if(minute-h*60>30) h++;
        return h*price;
    };
};
class Bus:public Vehicle
{
    public:
    Bus(int m):Vehicle(Bus_Price,m){};
    virtual string getType(){return "bus";};
    virtual float computeFee()
    {
        int h=minute/30;
        if(h*30<minute) h++;

        return h*price/2;
    };
};
class Truck:public Vehicle
{
    public:
    Truck(int m):Vehicle(Truck_Price,m){};
    virtual string getType(){return "truck";};
    viruztual float computeFee()
    {
        int h=minute/60;
        if(h*60<minute) h++;
        return h*price;
    };
};
class Parker{
double sum=0;
public:
    void park(Vehicle *a){
    sum+=a->computeFee();
    }
    double getSum(){
    return sum;
    }
};

int main(){
	int n,minute; //停车辆次,时长 
	char type;
	Vehicle *vp;
	Parker p;
	cin>>n;
	
	for(int i=1;i<=n;i++){
		cin>>type>>minute;
		switch(type){
			case 'c':vp=new Car(minute);break;
			case 't':vp=new Truck(minute);break;
			case 'b':vp=new Bus(minute);break;
			default: vp=new Vehicle();vp->setMinute(minute);
		}
		cout<<"type:"<<vp->getType() <<" minute:"<<vp->getMinute()<<" fee:"<<vp->computeFee()<<endl;
		p.park(vp);
		delete vp;
	}
	cout<<"sum:"<<p.getSum()<<endl;
	return 0;
}

作业2

1、

【问题描述】有两个矩阵a和b(各元素为整数),均为2行3列。求两个矩阵之和。重载运算符“+”,使其能用于矩阵相加(如c=a+b)。注意:请定义成员函数void input()用于输入矩阵各个元素,定义成员函数void display()用于输入矩阵。

【输入形式】根据系统提示,输入两个2行3列的矩阵。

【输出形式】输出两个矩阵a和b,以及两个矩阵的和。

【样例输入】

1 2 3 4 5 6

5 6 7 8 9 0

【样例输出】

input value of matrix:

input value of matrix:

Matrix a:

1 2 3

4 5 6

Matrix b:

5 6 7

8 9 0

Matrix c = Matrix a + Matrix b :

6 8 10

12 14 6

【样例说明】根据系统提示,输入两个2行3列的矩阵。输出两个矩阵a和b,以及两个矩阵的和。

【评分标准】 结果完全正确得15分,每个测试点5分。提交程序名为:xt10-4.c或xt10-4.c

#include<bits/stdc++.h>
using namespace std;

class Matrix
{
	public:
		int seq[2][3];
		
		void display(char a)
		{
		    if(a=='c')
		    {
		    	cout<<"Matrix c = Matrix a + Matrix b :"<<endl;
			}
			else
			cout<<"Matrix "<<a<<":"<<endl;
	    	for(int i=0;i<2;i++)
	    	{
	    		for(int j=0;j<3;j++)
	    		{
	    			cout<<seq[i][j]<<" ";
				}
				cout<<endl;
			}
			cout<<endl;
		
		}
	    
	    void input()
	    {
	    	cout<<"input value of matrix:"<<endl;
	    	for(int i=0;i<2;i++)
	    	{
	    		for(int j=0;j<3;j++)
	    		{
	    			cin>>seq[i][j];
				}
			}
		}
		
		
		
		Matrix operator +(Matrix&); 
		
	
};

Matrix Matrix::operator +(Matrix& matrix)

{
	Matrix rem;
    	for(int i=0;i<2;i++)
    	{
    		for(int j=0;j<3;j++)
    		{
    			int sum=seq[i][j]+matrix.seq[i][j];
    			rem.seq[i][j]=sum;
			}
		}

    
    return rem;

}

int main()
{
	Matrix m1;
	m1.input();
	Matrix m2;
	m2.input();
	Matrix m3=m1+m2;
	m1.display('a');
	m2.display('b');
	m3.display('c');
	
}

  • 16
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中的erase函数用于删除容器中的元素。根据引用\[1\]和引用\[2\]的内容,我们可以总结出erase函数的几种用法。 第一种用法是通过指定位置来删除元素。例如,可以使用erase函数来删除字符串中的一部分字符。在这种用法中,可以传入两个迭代器,表示要删除的元素的范围。例如,可以使用str.erase(str.begin()+5, str.end()-7)来删除字符串str中从第5个字符到倒数第7个字符之间的所有字符。 第二种用法是通过指定单个位置来删除元素。例如,可以使用erase函数来删除向量中的特定元素。在这种用法中,可以传入一个迭代器,表示要删除的元素的位置。例如,可以使用e.erase(it)来删除向量e中的末尾元素。 第三种用法是通过指定范围来删除元素,并返回删除后的迭代器。例如,可以使用erase函数来删除向量中的一部分元素,并返回删除后的迭代器。这个迭代器指向删除范围的下一个元素。例如,可以使用it3 = e.erase(it2, it3)来删除向量e中从it2到it3之间的所有元素,并将it3指向删除范围的下一个元素。 需要注意的是,对于第三种用法,如果直接使用erase函数返回的迭代器来删除元素,会导致未定义的行为。正确的做法是使用返回的迭代器来更新要删除的位置,然后再调用erase函数来删除元素。例如,可以使用a.erase(it3)来删除向量a中it3所指的元素。 综上所述,C++中的erase函数可以根据不同的用法来删除容器中的元素。 #### 引用[.reference_title] - *1* [C++中的erase方法](https://blog.csdn.net/QLU_minoz/article/details/81632765)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [C++(11):erase函数](https://blog.csdn.net/Leo_csdn_/article/details/82221721)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值