c++ 期末复习 函数题 PTA

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;
}

/ * 主要是为了自用啦 * /

  • 13
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值