首页 > 编程语言 >[C++/PTA] 学生成绩快速录入

[C++/PTA] 学生成绩快速录入

时间:2023-06-14 19:44:40浏览次数:38  
标签:no int C++ 学生 score PTA Student 录入 成绩

题目要求

现在需要录入一批学生的成绩(学号,成绩)。其中学号是正整数,并且录入时,后录入学生的学号会比前面的学号大;成绩分两等,通过(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,从而得到一个与前一个学生相同但学号连续的新的学生对象。

我是秋说,我们下次见。

标签:no,int,C++,学生,score,PTA,Student,录入,成绩
From: https://www.cnblogs.com/qiushuo/p/17481204.html

相关文章

  • [C++/PTA] 我的支付宝和余额宝
    题目要求支付宝AliPay和余额宝AliFund是一对好兄弟,他们来自同一个父类Account。已知类Account是支付宝AliPay和余额宝AliFund的虚基类,包括两个protected成员数据:longID;//账号stringname;//用户名支付宝AliPay是类Account的保护派生类,包括两个新增protected成员数据:double......
  • C/C++中的变长结构体
    1.问题来源首先看下如下的一段代码:#include<stdlib.h>#include<stdio.h>#include<string.h>#defineMAX_LEN1024typedefstructKDtree{doubledata[MAX_LEN];//数据intdim;//选择的维度structKDtree*left;//左子树structKDtree*right;......
  • C/C++——排序
    在C/C++中的排序,使用到的函数主要有:sort()qsort()下面详细分析sort()函数和qsort()函数。1、sort()函数sort()是STL中提供的算法,头文件为:#include<algorithm>usingnamespacestd;函数原型如下:template<classRandomAccessIterator>voidsort(RandomAccessIteratorfirst,Ran......
  • C/C++——map的基本操作总结
    标准库map类型是一种以键-值(key-value)存储的数据类型。以下分别从以下的几个方面总结:map对象的定义和初始化map对象的基本操作,主要包括添加元素,遍历等1、pair类型1.1、pair类型的定义和初始化pair类型是在有文件utility中定义的,pair类型包含了两个数据值,通常有以下的一些定义和初......
  • C/C++——vector的基本操作总结
    标准库vector类型是C++中使用较多的一种类模板,vector类型相当于一种动态的容器,在vector中主要有一些基本的操作,接下来分别从以下的几个方面总结:vector对象的定义和初始化vector对象的基本操作,主要包括添加元素,遍历等1、vector对象的定义和初始化在vector中主要有四种定义和初始化的......
  • C++ OpenMP、TBB库的简单使用
    1.OpenMP的简单使用OpenMP可以用来并行计算for循环,提高程序运行速度。首先要打开OpenMP支持:“配置属性”——“C/C++”——“语言”——“1.OpenMP支持”后选择“是”。1omp_get_num_procs()//获取系统中处理器的个数2omp_set_num_threads(num_count)/......
  • C++ 中的运算符重载
     您可以重定义或重载大部分C++内置的运算符。这样,您就能使用自定义类型的运算符。重载的运算符是带有特殊名称的函数,函数名是由关键字operator和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。https://www.tzffs.com/lnzt15/......
  • C++ 多态
     多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。C++多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。下面的实例中,基类Shape被派生为两个类https://www.tzffs.com/mnst14/......
  • C++ 模板类编译过程中出现“undefined reference to”问题
    问题描述C++在使用模板(template)类的时候,如果将类的成员函数的声明和实现分别放在.h头文件和.cpp源文件中,编译时会报错undefinedreferencexxx,找不到对应成员函数。起因.h文件中类的声明为://线程池,定义成模板类,为了代码的复用template<typenameT>classThreadPool{......
  • C/C++《程序设计课程设计》[2023-06-14]
    C/C++《程序设计课程设计》[2023-06-14]《程序设计课程设计》指导书程序设计课程设计说明书一、设计任务与要求《程序设计课程设计》是在完成《程序设计基础》课程学习后进行的一门专业实践课程,是培养学生综合运用所学知识解决专业相关问题的重要环节,是对学生实际工作能力的......