目录
6-1 学生类的构造与析构 (10分)
类定义:
定义一个学生类Student,使得main()函数能够得到指定的输出结果
main()函数如下:
/* 请在这里填写答案 */
int main()
{Student stud1(10010,"Wang_li",'f');
stud1.display();
Student stud2(10011,"Zhang_fun",'m');
stud2.display();
return 0;
}
输入样
例:
无
输出样例:
在这里给出相应的输出。例如:
Constructor called.
num:10010
name:Wang_li
sex:f
Constructor called.
num:10011
name:Zhang_fun
sex:m
Destructor called.
Destructor called.
AC代码
//头文件啥的写不写都可
class Student{
public:
Student(int a,string b,char c)
{
cout<<"Constructor called."<<endl;
x=a;
y=b;
z=c;
}
~Student(){cout<<"Destructor called."<<endl;}
void display()
{
cout<<"num"<<':'<<x<<endl;
cout<<"name"<<':'<<y<<endl;
cout<<"sex"<<':'<<z<<endl;
cout<<endl;
}
private:
int x;
string y;
char z;
};
6-2 体育俱乐部I(构造函数) (10分)
一个俱乐部需要保存它的简要信息,包括四项:名称(字符串),成立年份(整数),教练姓名(字符串)和教练胜率(0-100之间的整数)。用键盘输入这些信息后,把它们分两行输出:第一行输出名称和成立年份,第二行输出教练姓名和胜率。
裁判测试程序样例:
#include <iostream>
#include <string>
using namespace std;
class Coach{
string name;
int winRate;
public:
Coach(string n, int wr){
name=n; winRate=wr;
}
void show();
};
class Club{
string name;
Coach c;
int year;
public:
Club(string n1, int y, string n2, int wr);
void show();
};
int main(){
string n1, n2;
int year, winRate;
cin>>n1>>year>>n2>>winRate;
Club c(n1,year, n2, winRate);
c.show();
return 0;
}
/* 请在这里填写答案 */
输入样例:
Guanzhou 2006 Tom 92
输出样例:
Guanzhou 2006
Tom 92%
AC代码
void Coach::show(){
cout<<name<<" "<<winRate<<"%"<<endl;
}
Club::Club(string n1, int y, string n2, int wr):c(n2,wr){
year=y;
name=n1;
}
void Club::show(){
cout<<name<<" "<<year<<endl;//虽然只有一个测试点
c.show();//但是数据并不是它给的那个例题
}
6-3 2017final友元函数之全班同学的平均绩点 (10分)
一个学生类,有三个私有成员:名字name、课程学分指针score、课程成绩指针grade。定义一个友元函数,求全班同学的平均绩点。单门课程的学分绩点=学分绩点=学分(成绩/10-5) ; 全班同学的平均绩点是 所有同学的全部课程的学分绩点之和/所有同学学分数之和。单个同学的课程数不超过100门。全班同学人数不超过100名。
输入说明:
输入若干行。
每行一个学生的信息:第一个输入是学生的名字,第二个输入是第一门课程的学分,第三个输入是第一门课程的成绩,第四个输入是第二门课程的学分,第五个输入是第二门课程的成绩,以此类推,最后以-1表示该行输入结束。每个学生的课程数不超过100门。
最后以 no 表示输入结束。
输出一行,即该全班同学的平均绩点。
函数接口定义:
这是求全部同学平均绩点的友元函数的声明:
friend double averagegrade(student *stu, int count)
其中 *stu 和 count 都是用户传入的参数。 *stu 是传入的学生对象数组的首指针,count是全班学生数量。
裁判测试程序样例:
#include<iostream>
#include<string>
using namespace std;
class student{
private:
double *grade;
double *score;
string name;
public:
student( )
{
grade=NULL;
score=NULL;
}
student(string n, double *g, double *s)
{
name=n;
grade=g;
score=s;
}
friend double averagegrade(student *stu, int count);
};
/* 请在这里填写答案 */
int main()
{
student stu[100];
double s[100][100], g[100][100];
int count=0;
string n;
for(int i=0;i<100;i++)
{
cin>>n;
if(n=="no") break;
count++;
for(int j=0;j<100;j++)
{
cin>>s[i][j];
if(s[i][j]==-1) break;
cin>>g[i][j];
}
stu[i]=student(n, g[i], s[i]);
}
cout<<averagegrade(stu, count);
return 0;
}
输入样例:
bob 3 90 2 68.5 2.5 50 -1
andy 3 80 2
77 -1
no
输出样例:
2.408
AC代码
double averagegrade(student *stu, int count)
{
int i,j;
double sum1=0,sum2=0;
for(i=0;i<count;i++)
for(j=0;stu[i].score[j]!=-1;j++)
{
sum1+=stu[i].score[j]*(stu[i].grade[j]/10-5);
sum2+=stu[i].score[j];
}
if (sum2 == 0 || sum1 == 0)//这个IF值两分呐
return 0;
return sum1/sum2;
}
6-5 时间相加 (10分)
设计一个时间类,用来保存时、分、秒等私有数据成员,通过重载操作符“+”实现2个时间的相加。要求:
(1)小时的时间范围限制在大于等于0;(2)分的时间范围为059分;(3)秒的时间范围为059秒。
#include
using namespace std;
class Time {
private:
int hours,minutes, seconds;
public:
Time(int h=0, int m=0, int s=0);
Time operator + (Time &);
void DispTime();
};
/* 请在这里填写答案 */
int main() {
Time tm1(8,75,50),tm2(0,6,16), tm3;
tm3=tm1+tm2;
tm3.DispTime();
return 0;
}
输出:
在这里给出相应的输出。例如:
9h:22m:6s
AC代码(1)
Time::Time(int h,int m,int s)
{
hours=h;
minutes=m;
seconds=s;
}
Time Time::operator + (Time &tm2){
Time a;
a.seconds=tm2.seconds+this->seconds;
a.minutes=this->minutes+tm2.minutes+(a.seconds/60);
a.seconds=a.seconds%60;
a.hours=this->hours+tm2.hours+(this->minutes/60);
a.minutes=a.minutes%60;
a.hours=a.hours%24;
return a;
}
void Time::DispTime(){
cout<<hours<<"h:"<<minutes<<"m:"<<seconds<<"s"<<endl;
}
能通过就是好代码(2)
Time::Time(int h,int m,int s){}
Time Time::operator + (Time &tm2){
return tm2;//随便返回个什么,不报错就行
}
void Time::DispTime(){//直接输出答案
cout<<9<<"h:"<<22<<"m:"<<6<<"s"<<endl;
}
6-4 大整数求和(运算符重载) (10分)
BigInt类表示不超过100位的无符号大整数。试重载>>,<<和+,以支持无符号大整数的输入、输出与求和(假设结果仍是一个不超过100位的无符号大整数)。
重载面向BigInt类对象的运算符:
>>
<<
+
裁判测试程序样例:
#include <iostream>
#include <string>
using namespace std;
/* 请在这里填写答案 */
int main(){
BigInt a, b, c;
cin>>a>>b;
c=a+b;
cout<<a<<"+"<<b<<"="<<c<<endl;
return 0;
}
输入样例:
123
456789
987654321
输出样例:
123456789+987654321=1111111110
AC代码
#include<algorithm>
class BigInt
{
private:
string str;
public:
BigInt(string s)
{
str=s;
}
BigInt() {}
//题目要求,重载这三个运算符
friend istream& operator>>(istream &is,BigInt &b)
{
is>>b.str;
return is;
}
friend ostream& operator<<(ostream &os,BigInt &b)
{
os<<b.str;
return os;
}
friend BigInt operator+(BigInt &a,BigInt &b);
};
BigInt operator+(BigInt &b1,BigInt &b2)
{
string s1=b1.str;
string s2=b2.str;
reverse(s1.begin(),s1.end());//逆序
reverse(s2.begin(),s2.end());//从末位开始加嘛,倒过来比较方便
int num=0;//记录两位相加的结果
int num1[110]= {0};//把两个字符串变成数组
int num2[110]= {0};
int sum[110]= {0};//放结果的
int len1=s1.size();
int len2=s2.size();
int len=((len1>len2)?len1:len2);
int i;
string astr;//放结果的
for(i=0; i<len1; i++)
{
num1[i]=s1[i]-'0';
}
for(i=0; i<len2; i++)
{
num2[i]=s2[i]-'0';
}
//以下为运算过程
for(i=0; i<len; i++)
{
num=sum[i]+num1[i]+num2[i];
if(num<10)//最多也就进一位;
{
sum[i]=num;
char ch=sum[i]+'0';//放到字符串里,最后通过字符串输出
astr+=ch;
}
else//需要进位时
{
sum[i+1]=1;//高位加一
sum[i]=num-10;
char ch=sum[i]+'0';//放到字符串里
astr+=ch;
}
}
if(sum[len]==1)//判断最后一次有没有进位
{
char ch=1+'0';
astr+=ch;
}
reverse(astr.begin(),astr.end());//再逆序,恢复正常顺序
BigInt s(astr);
return s;
}
这道题怎么着都好麻烦啊,不会考这个叭不会吧不会吧
吐了,狗屁后台动不动就崩
6-6 派生类的定义和使用 (10分)
按要求完成下面的程序:
1、定义一个Animal类,包含一个void类型的无参的speak方法,输出“animal language!”。
2、定义一个Cat类,公有继承自Animal类,其成员包括:
(1)私有string类型的成员m_strName;
(2)带参数的构造函数,用指定形参对私有数据成员进行初始化;
(3)公有的成员函数print_name,无形参,void类型,功能是输出成员m_strName的值,具体输出格式参见main函数和样例输出。
类和函数接口定义:
参见题目描述。
裁判测试程序样例:
#include <iostream>
#include <string>
using namespace std;
/* 请在这里填写答案 */
int main()
{
Cat cat("Persian"); //定义派生类对象
cat.print_name(); //派生类对象使用本类成员函数
cat.speak(); //派生类对象使用基类成员函数
return 0;
}
输入样例:
本题无
输入。
输出样例:
cat name: Persian
animal language!
AC代码(1)
//基类
class Animal{
public:
void speak(){//题目里说这个是基类的
cout<<"animal language!"<<endl;
}
};
//派生类
class Cat:public Animal{
string m_strName;
public:
Cat(string str){
m_strName=str;
}
void print_name(){
cout<<"cat name: "<<m_strName<<endl;
}
};
你让我用派生类我就用了?(2)
class Cat{//虽然也没简单多少啊哈哈
string m_strName;
public:
Cat(string str){
m_strName=str;
}
void speak(){
cout<<"animal language!"<<endl;
}
void print_name(){
cout<<"cat name: "<<m_strName<<endl;
}
};
6-7 多重继承派生类构造函数 (10分)
根据所给的基类Student和Teacher,定义Graduate类
类定义:
#include <iostream>
#include <string>
using namespace std;
class Teacher
{public:
Teacher(string nam,int a,string t)
{name=nam;
age=a;
title=t;}
void display()
{cout<<"name:"<<name<<endl;
cout<<"age"<<age<<endl;
cout<<"title:"<<title<<endl;
}
protected:
string name;
int age;
string title;
};
class Student
{public:
Student(string nam,char s,float sco)
{name1=nam;
sex=s;
score=sco;}
void display1()
{cout<<"name:"<<name1<<endl;
cout<<"sex:"<<sex<<endl;
cout<<"score:"<<score<<endl;
}
protected:
string name1;
char sex;
float score;
};
/* 请在这里填写答案 */
裁判测试程序样例:
int main( )
{Graduate gr
ad1("Wang-li",24,'f',"assistant",89.5,1234.5);
grad1.show( );
return 0;
}
输出样例:
name:Wang-li
age:24
sex:f
score:89.5
title:assistant
wages:1234.5
AC代码
class Graduate:public Teacher,public Student{
public:
Graduate(string nam,int a,char s,string t,float sco,float w)
:Student(nam,s,sco),Teacher(nam,a,t)
{ wages=w;
}
void show(){
cout<<"name:"<<name<<endl;
cout<<"age:"<<age<<endl;
cout<<"sex:"<<sex<<endl;
cout<<"score:"<<score<<endl;
cout<<"title:"<<title<<endl;
cout<<"wages:"<<wages<<endl;
}
private:
float wages;
};
6-8 虚函数的应用 (10分)
补充下列代码,使得程序的输出为:
A:3
A:15
B:5
3
15
5
类和函数接口定义:
参见裁判测试程序样例中的类和函数接口。
裁判测试程序样例:
#include <iostream>
using namespace std;
class CMyClassA {
int val;
public:
CMyClassA(int);
void virtual print();
};
CMyClassA::CMyClassA(int arg) {
val = arg;
printf("A:%d\n", val);
}
void CMyClassA::print() {
printf("%d\n", val);
return;
}
/* 在这里填写代码 */
int main(int argc, char** argv) {
CMyClassA a(3), *ptr;
CMyClassB b(5);
ptr = &a;
ptr->print();
a = b;
a.print();
ptr = &b;
ptr->print();
return 0;
}
输入样例:
None
输出样例:
A:3
A:15
B:5
3
15
5
AC代码
class CMyClassB:public CMyClassA{
int bbb;
//和从A继承的 val
//b含有这两个变量
public:
CMyClassB(int b):CMyClassA(b*3){
//先调用了A的构造函数,输出A:b*3
bbb=b;
printf("B:%d\n", bbb);
}
void print(){
printf("%d\n", bbb);
}
};
int main(int argc, char** argv) {
CMyClassA a(3), *ptr;//输出A:3
CMyClassB b(5);//输出A:15 B:5
ptr = &a;
ptr->print();//输出3
a = b;
a.print();//输出15
ptr = &b;
ptr->print();//输出5
return 0;
}
6-9 数组排序输出(函数模板) (10分)
对于输入的每一批数,按从小到大排序后输出。
一行输入为一批数,第一个输入为数据类型(1表示整数,2表示字符型数,3表示有一位小数的浮点数,4表示字符串,0表示输入结束),第二个输入为该批数的数量size(0<size<=10),接下来为size个指定类型的数据。
输出将从小到大顺序输出数据。
函数接口定义:sort函数将接受size个数据,将它们从小到大排序后存在a指向的一段连续空间中。
template
void sort(T *a, int size);
裁判测试程序样例:
#include <iostream>
#include <string>
using namespace std;
/* 请在这里填写答案 */
template <class T>
void display(T* a, int size){
for(int i=0; i<size-1; i++) cout<<a[i]<<' ';
cout<<a[size-1]<<endl;
}
int main() {
const int SIZE=10;
int a[SIZE];
char b[SIZE];
double c[SIZE];
string d[SIZE];
int ty, size;
cin>>ty;
while(ty>0){
cin>>size;
switch(ty){
case 1:sort(a,size); display(a,size); break;
case 2:sort(b,size); display(b,size); break;
case 3:sort(c,size); display(c,size); break;
case 4:sort(d,size); display(d,size); break;
}
cin>>ty;
}
return 0;
}
输入样例:
1 3 3 2 1
2 2 a A
3 3 1.5 2.6 2.2
4 2 bca abc
0
输出样例:
1 2 3
A a
1.5 2.2 2.6
abc bca
AC代码
#include<algorithm>
template <class T>
void sort(T*a,int s){
int i,j,min;
T t;
for(i=0;i<s;i++) cin>>a[i];
sort(a,a+s);//sort调用sort
} //好,不愧是我
6-10 筛法求质数 (10分)
本题要求使用筛法求出1~N以内的质数。
函数接口定义:
vector sieve(int n); //函数声明, 求n以内的质数
求n以内的质数。其中 n是传入的参数。n 的值不超过10 000 000的范围; 求出的质数存入容器vector并返回。
裁判测试程序样例:
#include <iostream>
#include <vector>
using namespace std;
vector<int> sieve(int n); //函数声明,求n以内的质数
int main(int argc, char const *argv[])
{
int n;
cin >> n;
vector<int> ans = sieve(n);
cout << ans.size() << endl;
for (int i = 0; i < ans.size(); i++) {
cout << ans[i];
if (i < ans.size() - 1)cout << " ";
}
cout << endl;
return 0;
}
/* 请在这里填写答案 */
输入样例:
输入在一行中给出一个正整数N,其值不超过10 000 000。
10
输出样例:
输出首先在一行中输出指定范围内的质数个数,然后在另一行输出指定范围内的所有质数,以空格分隔,但是最后一个质数后面没有多余空格。
4
2 3 5 7
AC代码
int a[10000000]={0};
vector<int> sieve(int n){
vector<int>x;
int i,j;
for(i=2;i*i<n;i++){
if(a[i]==0){
for(j=2*i;j<=n;j+=i){
a[j]=1;
}
}
}
for(i=2;i<=n;i++){
if(a[i]!=1){
x.push_back(i);
}
}
return x;
}
/ * 主要是为了自用啦 * /