任务描述

本关任务:编写一个能管理多条学生信息的程序。

相关知识

为了完成本关任务,你需要掌握构造函数与析构函数的调用和对象数组的使用。

构造函数与析构函数的调用
构造函数不能直接调用,只能通过声明一个对象或者使用new 运算符动态创建对象时由系统自动调用。

例如:

class Test
{
public:
int A;
Test();
Test(int a);
};
/* 此处省略定义构造函数部分 */
int main()
{
Test t; // 调用无参构造函数
Test t2(10); // 调用带参构造函数
Test t3 = Test(10); // 同上
Test *t = new Test; // 动态创建对象,调用无参构造函数
Test *t2 = new Test(10); // 动态创建对象,调用带参构造函数
}
而析构函数则不同,它能够通过对象主动调用,并在以下两种情况下它会自动调用:

若一个对象被定义在一个函数体内,当这个函数结束时(声明的变量的生命周期结束)会自动调用。

若一个对象是使用 new 运算符动态创建,在使用 delete 释放时会自动调用。

例如:

/* Test类的声明接上 */
Test::~Test() // 修改一下析构函数,让它打印一条消息
{
cout << “Test的析构函数被调用” << endl;
}
int main()
{
cout << “p1” << endl;
{
Test t1(1); // t1 的生命周期就只在这个大括号内
} //因此在这个位置 t1 的析构函数就会被调用
cout << “p2” << endl;
Test *t2 = new Test(10);
delete t2; // t2 所指对象的析构函数在此被调用
cout<<“p3”<<endl;
{
Test *t3 = new Test;
} // t3 所指对象的析构函数并不会被调用,因为没有使用 delete 运算符
}
输出结果为:

p1
Test的析构函数被调用
p2
Test的析构函数被调用
p3
上述代码中 t1 对象的析构函数调用的位置有点微妙,它是在代码离开大括号}的那瞬间的位置被调用的,因为一个变量只在直接包含它的那层大括号的范围内存活。

对象数组
数组对象就是大批量实例化对象的一种方法,以往我们都是这样:Student stu实例化对象,如果有好几百个对象应该怎么办?

这时候就用到了对象数组,顾名思义,就是把所有要实例化的对象都放到一个组里面,然后直接实例化这个组,就像这样:Student stu[100],便可一次性实例化100个对象。

对象数组与一般的数组基本一致,只是多了两个过程:

在数组创建的时候对数组的每一个元素都调用了构造函数;

在数组生命结束的时候对数组的每一个元素都调用了析构函数。

如果使用 new 运算符来动态创建对象数组,也是同样的过程。

注意:在创建数组时如果不使用列表初始化语法对数组中的每一个元素调用构造函数,那么默认调用无参数的构造函数,因此也就要求这个类必须要有无参数的构造函数。

例如:

class Test1
{
public:
Test1();
~Test1();
};
Test1::Test1()
{
cout << “Test1的构造函数” <<endl;
}
Test1::~Test1()
{
cout << “Test1的析构函数” <<endl;
}
class Test2
{
public:
Test2(int a); // 没有无参数的构造函数
~Test2();
};
Test2::Test2(int a)
{
cout << “Test2的构造函数” <<endl;
}
Test2::~Test2()
{
cout << “Test2的析构函数” <<endl;
}
int main()
{
Test1 ts1[2]; // Test1 有无参构造函数,OK
Test2 ts2[2]; // 错误,Test2 没有无参构造函数
Test2 ts3[2]={Test2(10)}; // 这个也错误,因为只对第一个元素调用了构造函数,第二个还是会主动调用无参构造函数
Test2 ts4[2]={Test2(10),Test2(20)}; // 正确
}
如果删除那两行错误的声明,那么输出结果为:

Test1的构造函数
Test1的构造函数
Test2的构造函数
Test2的构造函数
Test2的析构函数
Test2的析构函数
Test1的析构函数
Test1的析构函数
为了方便查看,在输出结果中间空了一行,上面是创建数组时对元素调用构造函数产生的输出,下面是数组死亡时对每一个元素调用析构函数产生的输出。

编程要求
在右侧编辑器中的Begin-End之间补充代码,设计 Student 类并实现用于管理学生信息表(学生表的长度不超过5)的3个函数,成员变量和函数的访问性都为公有的,具体类结构和函数要求如下:

学号,int类型

姓名,string类型

分数,float类型

带参构造函数:Student(int sid,string name,float sco),分别用这三个参数设置内部的三个成员。

void Add(int sid,string name,float sco),函数用于向学生表的末尾添加一条学生记录。

void PrintAll(),输出学生表中所有的记录,格式为:学号 姓名 成绩。

void Average(),计算学生表中学生的平均成绩并输出,格式为:平均成绩 计算结果。

提示:学生表可以用全局对象数组来完成,定义全局对象数组和定义全局变量一样,即定义在最外层作用域。

测试说明
平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试:

测试输入:0 厉宏富 96 1 冷欣荣 85 2 鲍俊民 76

预期输出:

0 厉宏富 96
1 冷欣荣 85
2 鲍俊民 76
平均成绩 85.6667

下面展示一些 内联代码片

#include <string>
#include <iostream>
using namespace std;/********* Begin *********/
class Student
{//在此处声明所需的成员public:int SID;string Name;float Sco;Student();Student(int sid,string name,float sco){SID=sid;Name=name;Sco=sco;}
};
/********* End *********/
Student ss[5];
int ssCount;
Student::Student()
{}
void Add(int sid,string name,float sco)
{/********* Begin *********/ss[ssCount] = Student(sid,name,sco);ssCount++;/********* End *********/
}void PrintAll()
{/********* Begin *********///打印出学生表中所有记录for(int i=0;i<ssCount;i++){cout<<ss[i].SID<<" "<<ss[i].Name<<" "<<ss[i].Sco<<endl;}/********* End *********/
}void Average()
{/********* Begin *********///计算并打印出学生表中的平均成绩float sum=0.00;float ave;for(int i=0;i<ssCount;i++){sum+=ss[i].Sco;}ave=sum/ssCount;cout<<"平均成绩 "<<ave<<endl;/********* End *********/
}

对象数组 —— 学生信息表相关推荐

  1. JS7day(事件对象,事件流,事件捕获和冒泡,阻止事件流动,事件委托,学生信息表案例)

    文章目录 事件对象 获取事件对象 部分常用属性 事件流 事件捕获概念: 事件冒泡概念: 阻止事件流动: 相同的鼠标经过事件: 两种(监听事件)注册事件的区别: 传统on注册(L0) 事件监听注册(L2 ...

  2. 页面显示格式化的时间、倒计时效果、学成在线案例(创建、添加节点)、学生信息表(重点)、5秒钟之后跳转页面(location.href应用)、学生信息表(页面刷新数据不丢失)(重点)——API练习案例

    目录 1. 页面显示格式化的时间 2. 倒计时效果 3. 学成在线案例(创建节点.添加节点) 4.学生信息表案例(重点) 5. 5秒钟之后跳转页面(location.href的应用) 6. 学生信息表 ...

  3. 【Python练习】创建学生信息表-列表推导式的应用

    1. 使用列表推导式,生成 2018-2021 四个年级,每个年级四个专业(计算机.机械.自动化和电子信息),每个专业三个班级,每个班级 45 人的对应学号(如 2019010205),共计 2160 ...

  4. javascript+css学生信息表综合案例(附详细代码)

    本文主要实现:通过获取input框value值,并将数据渲染到表格中,自动生成对应的学生信息表,同时可以删除相应的信息. <!DOCTYPE html> <html lang=&qu ...

  5. 查询选修c语言课程的学生学号和姓名,数据库实验(学生信息表)

    目录 数据库实验(学生信息表) 实验一 实验二 实验三 实验四 数据库实验(学生信息表) 实验一 创建数据库以及学生信息表.课程信息表.选课表 create Table student (Sno ch ...

  6. 怎么在mysql创建数据库怎么加入学号_数据库怎么创建学生信息表

    语音内容: 大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答. 数据库创建学生信息表的方法是: 1.新建表:单击数据库"studentDb"前图标,然后右键&qu ...

  7. mysql实验学生表_数据库实验(学生信息表)

    数据库实验(学生信息表) 实验一 创建数据库以及学生信息表.课程信息表.选课表 create Table student (Sno char(9) primary key, Sname char(20 ...

  8. 学生信息表 -通过选择年级和班级得到详细的学生信息名单

    功能: 通过选择年级和班级得到详细的学生信息名单 知识点: 1. A inner join B on A.id=B.id的应用     Inner Join 逻辑运算符返回满足第一个(顶端)输入与第二 ...

  9. 数据结构实验-学生信息表

    (实验)自定义数据元素的类型和存储结构(顺序表或链表均可),完成如下的功能: ①录入:从键盘输入学生信息表的各个数据元素(至少包含学号,姓名,年龄,语文成绩,数学成绩,英语成绩): ②查找:可按学号查 ...

  10. 数据库单表查询教师班级学生信息表

    单表查询实例 以下为单表查询小实验,由于没有教师表和学生表数据库文件,因此没有运行截图,若有语法错误还望大佬们指正. 1.查询学生信息表(info_student)中的班级信息 Select &quo ...

最新文章

  1. 还没用上 JDK 11吧,JDK 12 早期访问构建版使用
  2. Android软键盘遮挡的四种解决方案
  3. 去掉windows console application的dos显示
  4. Oracle 触发器的使用小结
  5. [MYSQL]卸载重装数据库
  6. HNOI2015 实验比较
  7. eq相等,smarty 比较操作符!时间戳
  8. request_do?send方法
  9. scrapy Request
  10. 欧氏空间内积定义_泛函分析笔记3:内积空间
  11. Flutter之实战InheritedWidget详解
  12. 第一个微信小程序的诞生
  13. Xshell上传文件方法
  14. rplidar的安装与使用
  15. 【小程序】前端微信授权登录
  16. matlab和keil下如何查找数组最大值的下标(角标)
  17. xlwings 冻结窗口格 / 冻结首行/ FreezePanes
  18. b站视频-尚硅谷jQuery教程张晓飞老师-笔记(二)
  19. 浏览器内部工作原理[译]How browsers work (转)
  20. 图像处理技术-基本运算

热门文章

  1. PMP考试需要准备什么教材呢?
  2. linux 文件读写 加速,MMAP文件加速读写小技俩
  3. 计算机导论考试考什么,计算机导论考试
  4. eclipse快捷键
  5. 盘点一下 在Python中安装包的三种方法
  6. 一信通短信接口对接_吉信通:短信接口是什么?
  7. 12.06课堂笔记以及作业
  8. Linux最常用的20个命令
  9. Python模块安装:Python3安装pdfminer3k
  10. 101/103/104规约应用典型问题例举