08-B. 最高成绩(静态成员)

该博客介绍了如何在C++中使用静态成员和友元函数来查找一组学生数据中的最高分数及其对应学号。通过创建一个学生类,包含学号、成绩、最高分数和最高分数学号的静态成员,以及用于更新最高分和学号的静态成员函数,实现了对输入数据的处理。在main函数中,读取学生数据并调用静态成员函数找出最高分和学号,最后输出结果。

08-静态成员与友元
题目描述
学生类定义如下:
class Student {
private:
int id; //学号
int score; //成绩
static int maxscore; //最高分数
static int maxid; //最高分数学生学号
public:
Student(int ti=0, int ts=0)
:id(ti), score(ts)
{}
static void findMax(Student & st); //寻找最高成绩和学号
static int getMaxScore(); //返回最高成绩
static int getMaxID(); //返回最高成绩的学号
};
输入一组学生学号和成绩,用上述静态成员求最高成绩和对应学号

输入
第一行输入n表示有n个学生
接着输入n行,每行包括两个数据,表示学号和成绩

输出
调用静态成员函数输出学号和最高成绩,格式看样例

输入样例
3
1002 68
1023 54
1045 32

1002–68

#include <iostream>
using namespace std;

class student
{
    int id;
    int score;
    static int maxscore;
    static int maxid;
    
public:
    student(int ti=0,int ts=0):id(ti),score(ts){}
    //student():id(0),score(0){}
    //student(int ti,int ts):id(ti),score(ts){}
    static void findmax(student &st);
    
    static int getmaxscore();
    static int getmaxid();
    
    int getid()
    {return id;}
    int getscore()
    {return score;}
};

int student::maxscore=0;
int student::maxid=0;

int student::getmaxscore()
{return maxscore;}
int student::getmaxid()
{return maxid;}

void student::findmax(student &st)//静态成员函数只能使用静态数据成员!
{
    if(st.getscore()>maxscore)
    {
        maxscore=st.getscore();//所以这里要st.getscore() 不可以直接使用
        maxid=st.getid();
    }
}

int main()
{
    int n,id,score;
    cin>>n;
    while(n--)
    {
        cin>>id>>score;
        student a(id,score);
        student::findmax(a);
    }
    cout<<student::getmaxid()<<"--"<<student::getmaxscore()<<endl;
    return 0;
}

一、实验目的 1、懂得如何分析问题域中存在的各对象; 2、掌握如何用类来统一描述这些具有共同属性和功能的对象,掌握类的定义; 3、理解类和对象之间的关系,并掌握如何访问类中的成员,要求实现类的封装; 4、掌握类中的构造函数的功能及使用; 5、掌握类的方法的重载; 6、掌握类中的静态成员及使用。 二、实验内容 1、定义学生类及教师类,要求给出类中必要的成员,并实现对某学生或某教师的信息的输出。 2、设计一个图书类,实现对图书总销售量的统计,可参考下列类图设计,如有需要,可自添加其他成员。 测试时要求: (1)创建一个无参的书本对象,通过访问器对书本信息进赋值,并调用sale()方法,然后输出图书书名、库存数量、总销售额等信息。 如: Books book1=new Books(); (2)创建一个带参的书本对象,实现对图书信息的初始化,并调用sale()方法,然后输出图书书名、库存数量、总销售额等信息。 如: Books book2=new Books(“面向对象程序设计”,”978-7-302-48907-8”,”清华大学出版社”,45.0,200); book2.sale(100); book2.sale(50); Books -bookName:String(书名) -bookIsbn:String(图书ISBN号) -press:String(出版社) -price:double(图书价格) -number:int(图书库存数量) -totalSale:double(销售总额) + Books() (完成对图书基本信息的初始化,可赋一些初值,如图书ISBN号默认值为“0000000000000”) + Books(String,String,String,double,int) (完成对图书基本信息的初始化) +print():void (打印图书基本信息) +sale(int):double (计算并返回图书销售额) …… 3、附加题 定义一个类Student,根据以下输入和输出描述,设计该类成员,通过getSumScore()和average()计算全班学生的《面向对象程序设计》课程的总成绩和平均成绩,要求使用静态成员变量或静态成员方法。 输入描述 学生姓名 课程成绩 输出描述 总成绩和平均成绩 比如 输入 Zhang 82 Li 79 Wang 93 Liu 66 Xia 90 输出 总成绩:410 平均成绩:82
最新发布
10-23
<think>我们参考用户提供的引用内容,特别是引用[1]和引用[2]中关于Java类和对象、封装性等内容,以及引用[3]中结构体的相关知识(虽然是用C++,但面向对象思想相通),来设计用户所需的面向对象编程实验代码示例。 用户要求实现学生类、教师类、图书类以及学生成绩统计类,并且要求包含类定义、构造函数、方法重载、静态成员使用等。 根据要求,我们将分别设计四个类: 1. 学生类(Student):包含学号、姓名、年龄等属性,以及显示信息的方法,并使用构造函数和方法重载。 2. 教师类(Teacher):包含工号、姓名、所教课程等属性,以及显示信息的方法,同样使用构造函数和方法重载。 3. 图书类(Book):包含书号、书名、作者等属性,以及借阅和归还的方法,使用静态成员来记录图书总数。 4. 学生成绩统计类(GradeStatistics):包含学生成绩数组,提供添加成绩、计算平均分、最高分等方法,使用静态成员来记录学生总数。 注意:我们使用Java语言实现,因为引用[1][2]都是关于Java的。 我们将按照以下步骤: 1. 定义每个类,包括成员变量(属性)和成员方法。 2. 为每个类设计构造函数(包括无参构造和有参构造,以展示方法重载)。 3. 在图书类中使用静态成员变量记录图书总数,并在构造函数中更新。 4.学生成绩统计类中使用静态成员变量记录学生总数。 5. 在每个类中展示封装性,将属性设为private,通过public方法访问。 下面给出代码示例: </think>### 面向对象编程实验:类和对象的实现 以下是学生类、教师类、图书类和学生成绩统计类的完整实现,包含类定义、构造函数、方法重载、静态成员使用等面向对象核心特性: #### 1. 学生(Student) ```java public class Student { // 成员变量(封装性) private String id; private String name; private int age; // 静态成员:记录学生总数 private static int totalStudents = 0; // 构造函数重载 public Student() { totalStudents++; // 更新静态计数器 } public Student(String id, String name) { this(); // 调用无参构造 this.id = id; this.name = name; } public Student(String id, String name, int age) { this(id, name); // 调用两参构造 this.age = age; } // 方法重载:成绩录入 public void recordScore(int math) { System.out.println(name + "数学成绩:" + math); } public void recordScore(int math, int english) { System.out.printf("%s 总成绩:%d\n", name, (math + english)); } // 静态方法访问静态成员 public static int getTotalStudents() { return totalStudents; } // Getter/Setter(封装性实现) public void setName(String name) { if(name.length() > 1 && name.length() < 20) { this.name = name; } } // 其他getter/setter省略... } ``` #### 2. 教师类 (Teacher) ```java public class Teacher { private String teacherId; private String name; private String course; // 构造函数 public Teacher(String teacherId, String name) { this.teacherId = teacherId; this.name = name; } // 方法重载:授课方法 public void teach() { System.out.println(name + "正在授课"); } public void teach(String courseName) { this.course = courseName; System.out.println(name + "开始教授《" + courseName + "》"); } // 静态工具方法 public static String generateEmail(String name) { return name.toLowerCase() + "@university.edu"; } } ``` #### 3. 图书类 (Book) ```java public class Book { private String isbn; private String title; private String author; private boolean isBorrowed; // 静态成员:图书馆藏书总量 private static int totalBooks = 0; // 构造函数 public Book(String isbn, String title) { this(isbn, title, "未知作者"); // 重载调用 } public Book(String isbn, String title, String author) { this.isbn = isbn; this.title = title; this.author = author; totalBooks++; // 新增图书时更新 } // 借阅方法 public void borrow() { if (!isBorrowed) { isBorrowed = true; System.out.println(title + "借阅成功"); } else { System.out.println("该书已被借出"); } } // 静态访问器 public static int getLibrarySize() { return totalBooks; } } ``` #### 4. 学生成绩统计(GradeStatistics) ```java import java.util.ArrayList; public class GradeStatistics { private ArrayList<Integer> scores = new ArrayList<>(); // 静态常量 public static final int MAX_SCORE = 100; public static final int MIN_SCORE = 0; // 方法重载:添加成绩 public void addScore(int score) { if(score >= MIN_SCORE && score <= MAX_SCORE) { scores.add(score); } } public void addScore(int[] scoreArray) { for(int score : scoreArray) { addScore(score); } } // 统计计算 public double calculateAverage() { if(scores.isEmpty()) return 0.0; int sum = 0; for(int score : scores) { sum += score; } return (double) sum / scores.size(); } // 静态工具方法 public static String getGradeLevel(int score) { if(score >= 90) return "A"; else if(score >= 80) return "B"; else if(score >= 70) return "C"; else if(score >= 60) return "D"; else return "F"; } } ``` ### 关键实现解析 1. **封装性实现** 所有类成员变量使用`private`修饰,通过public方法(如`setName()`)控制访问,确保数据有效性[^2]。 2. **构造函数重载** 学生类展示三种构造方式:无参构造、两参构造、三参构造,通过`this()`实现链式调用。 3. **静态成员应用** - `Student.totalStudents`统计学生总数 - `Book.totalBooks`统计图书总量 - `GradeStatistics.MAX_SCORE`定义常量边界值 4. **方法重载范例** - `recordScore()`支持单科/多科成绩录入 - `teach()`实现无参/带课程名的授课 - `addScore()`接受单个分数或分数数组 5. **类关系设计** 学生、教师、图书为独立实体类,成绩统计类作为工具类处理学生成绩数据。 ### 使用示例 ```java public class Main { public static void main(String[] args) { // 学生对象创建 Student s1 = new Student("S001", "张三", 20); s1.recordScore(85); s1.recordScore(90, 88); // 教师对象使用 Teacher t1 = new Teacher("T001", "李教授"); t1.teach("Java程序设计"); // 图书管理 Book b1 = new Book("978-7-04-050694-5", "Java核心技术"); b1.borrow(); // 成绩统计 GradeStatistics stats = new GradeStatistics(); stats.addScore(new int[]{85, 92, 78, 90}); System.out.println("平均分:" + stats.calculateAverage()); System.out.println("等级:" + GradeStatistics.getGradeLevel(85)); } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值