[C++/PTA] 学生成绩的快速录入(构造函数)

简介: [C++/PTA] 学生成绩的快速录入(构造函数)

题目要求

现在需要录入一批学生的成绩(学号,成绩)。其中学号是正整数,并且录入时,后录入学生的学号会比前面的学号大;成绩分两等,通过(Pass,录入时用1代表),不通过(Fail,录入时用0代表)。

由于很多学号都是相邻的,并且学号相邻的学生成绩常常相同。所以在录入时,适当地加了速。如果当前学生的学号比前面的学号大1,且成绩与前面的成绩相同,则只输入0即可。

类定义

完成Student类

裁判测试程序样例:

#include<iostream>
using namespace std;
/* 请在这里填写答案 */
int main(){
    const int size=100;
    int i, N, no, score;
    Student *st[size];
    cin>>N;
    for(i=0; i<N; i++){
        cin>>no;
        if(no>0){
            cin>>score;
            st[i]=new Student(no, score);
        }
        else
            st[i]=new Student(*st[i-1]);
    }
    cout<<Student::count<<" Students"<<endl;
    for(i=0;i<N;i++) st[i]->display();
    for(i=0;i<N;i++) delete st[i];
    return 0;
}

输入样例:

5

3 0

0

7 1

0

12 1

输出样例:

5 Students

3 Fail

4 Fail

7 Pass

8 Pass

12 Pass

解题思路

定义一个叫做Student的类,包含学号和成绩两个数据成员,以及记录学生对象个数的静态数据成员count。

构造函数用于初始化学生对象。复制构造函数用于记录学生编号连续但成绩相同的情况。

成员函数display()用于输出学生信息。

代码

class Student{  // 定义Student类
  int no;  // 学号
  int score;  // 成绩,1表示通过,0表示未通过
public:
  static int count;  // 记录学生对象个数的静态数据成员
  // 构造函数,用于初始化学生对象
  Student(int n, int s)
  {
    no = n;
    score = s;
    count++;  // 每次创建学生对象时,静态数据成员count的值加1
  }
  // 复制构造函数,用于记录学生编号连续但成绩相同的情况
  Student(Student &p)
  {
    no = p.no + 1;  // 学号自动加1
    score = p.score;  // 成绩不变
    count++;  // 每次创建学生对象时,静态数据成员count的值加1
  }
  // 成员函数,用于输出学生信息
  void display()
  {
    cout << no << " ";
    if (score)
      cout << "Pass" << endl;
    else
      cout << "Fail" << endl;
  }
};
// 静态数据成员count的初始化
int Student::count = 0;

整体代码如下:

#include<iostream>
using namespace std;
class Student{  // 定义Student类
  int no;  // 学号
  int score;  // 成绩,1表示通过,0表示未通过
public:
  static int count;  // 记录学生对象个数的静态数据成员
  // 构造函数,用于初始化学生对象
  Student(int n, int s)
  {
    no = n;
    score = s;
    count++;  // 每次创建学生对象时,静态数据成员count的值加1
  }
  // 复制构造函数,用于记录学生编号连续但成绩相同的情况
  Student(Student &p)
  {
    no = p.no + 1;  // 学号自动加1
    score = p.score;  // 成绩不变
    count++;  // 每次创建学生对象时,静态数据成员count的值加1
  }
  // 成员函数,用于输出学生信息
  void display()
  {
    cout << no << " ";
    if (score)
      cout << "Pass" << endl;
    else
      cout << "Fail" << endl;
  }
};
// 静态数据成员count的初始化
int Student::count = 0;
// 主函数
int main() {
  const int size = 100;
  int i, N, no, score;
  Student *st[size];  // 存放学生对象指针的数组
  cin >> N;  // 输入学生个数
  for (i = 0; i < N; i++) {
    cin >> no;  // 输入学号
    if (no > 0) {  // 如果学号大于0,输入成绩并创建新的学生对象
      cin >> score;  // 输入成绩
      st[i] = new Student(no, score);  // 创建新的学生对象
    } else {  // 如果学号等于0,创建与前一个学生相同但学号连续的新的学生对象
      st[i] = new Student(*st[i - 1]);  // 创建与前一个学生相同但学号连续的新的学生对象
    }
  }
  cout << Student::count << " Students" << endl;  // 输出学生对象的总数
  for (i = 0; i < N; i++) st[i]->display();  // 输出每个学生对象的信息
  for (i = 0; i < N; i++) delete st[i];  // 释放存放学生对象指针的数组
  return 0;
}

在main()函数中,定义一个存放学生对象指针的数组st,用于存放动态创建的学生对象的地址。输入学生个数,然后循环输入每位学生的学号和成绩。如果学号大于0,则创建新的学生对象并将其地址存放在st数组中;否则,创建与前一个学生相同但学号连续的新的学生对象并将其地址存放在st数组中。

循环输出每个学生对象的信息,然后释放存放学生对象指针的数组。

总结

程序的主要难点在于如何判断学生编号连续但成绩相同的情况。

可采用复制构造函数来处理这种情况,即在复制构造函数中自动将学号加1,从而得到一个与前一个学生相同但学号连续的新的学生对象。

我是秋说,我们下次见。

目录
相关文章
|
1月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
94 5
|
1月前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
83 4
|
3月前
|
编译器 C++
C++ 类构造函数初始化列表
构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。
81 30
|
2月前
|
编译器 C语言 C++
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
C++入门4——类与对象3-1(构造函数的类型转换和友元详解)
30 1
|
2月前
|
C++
C++构造函数初始化类对象
C++构造函数初始化类对象
26 0
|
2月前
|
C++
C++入门4——类与对象3-2(构造函数的类型转换和友元详解)
C++入门4——类与对象3-2(构造函数的类型转换和友元详解)
29 0
|
4月前
|
编译器 C++
C++的基类和派生类构造函数
基类的成员函数可以被继承,可以通过派生类的对象访问,但这仅仅指的是普通的成员函数,类的构造函数不能被继承。构造函数不能被继承是有道理的,因为即使继承了,它的名字和派生类的名字也不一样,不能成为派生类的构造函数,当然更不能成为普通的成员函数。 在设计派生类时,对继承过来的成员变量的初始化工作也要由派生类的构造函数完成,但是大部分基类都有 private 属性的成员变量,它们在派生类中无法访问,更不能使用派生类的构造函数来初始化。 这种矛盾在C++继承中是普遍存在的,解决这个问题的思路是:在派生类的构造函数中调用基类的构造函数。 下面的例子展示了如何在派生类的构造函数中调用基类的构造函数:
|
6月前
|
安全 编译器 C++
C++一分钟之-构造函数与析构函数
【6月更文挑战第20天】C++中的构造函数初始化对象,析构函数负责资源清理。构造函数有默认、参数化和拷贝形式,需注意异常安全和成员初始化。析构确保资源释放,避免内存泄漏,要防止重复析构。示例代码展示了不同构造函数和析构函数的调用情况。掌握构造和析构是有效管理对象生命周期和资源的关键。
54 2
|
6月前
|
存储 人工智能 C++
【PTA】L1-064 估值一亿的AI核心代码(详C++)
【PTA】L1-064 估值一亿的AI核心代码(详C++)
55 1
|
6月前
|
存储 C++ 索引
【PTA】L1-059 敲笨钟(C++)
【PTA】L1-059 敲笨钟(C++)
51 1