1. 友元函数设计

1.1 程序描述

模拟电力公司统计用户用电量。请设计一个类FamliyElecPower描述每户人家一年的用电情况,一年的12个月的每月电量都要记录。设计函数CalTotalEPower,计算每户一年的总电量;函数CalAveEPower计算每户的每月平均用电量。函数CalTotalEPower和函数CalAveEPower是类FamliyElecPower的友元函数。主程序中创建1户人家,输入这户人家1年12个月的用电量,然后调用函数CalTotalEPower和函数CalAveEPower分别计算并输出这家的总用电量和平均每月用电量。

1.2 提示

class FamliyElecPower

{     int m_nID;                   //用户编号,是从1开始的正整数,由程序自动生成

string m_strFamliyName;     //家庭名称,是一个string型字符串;

//需要#include <string>

int m_array[12];                  //12个月的用电量

static int m_nCount;             //用来生成自动编号的计数器

public:

FamliyElecPower(){}

FamliyElecPower(string name, int* array);         // int* array 表示 整数型

//数组array[12]

void Show();                                                   //输出这户人家的所有信息

……                                                                      //其他方法请自行设计

};

…….                                                                            //其他函数等请自行设计

  1. 输入输出样例:

请输入用户名称:Wang                                 //带下划线的部分表示用户的输入

请分别输入12个月的电量:89 70 56 102 112 92 90 88 75 89 86 123

用户用电信息是:

编号:1                      名称:Wang

12个月的用电量:89 70 56 102 112 92 90 88 75 89 86 123

年总电量:1072          月均电量::89

1.4 上机思考题部分

从文件输入100个家庭的信息,统计每户年总电量、月均电量,结果可以输出到另一个文件中

选作部分的输入参见in.txt

//famliyelecpower.h
#pragma once
#ifndef FAMLIYELECPOWER_H
#define FAMLIYELECPOWER_H
#include<string>
using namespace std;
class FamliyElecPower {public:FamliyElecPower();FamliyElecPower(string& name, int array[]);void Show();void SetFEP(string& name, int array[]);friend int CalTotalEPower(FamliyElecPower& x);friend int CalAveEPower(FamliyElecPower& x);
private:int m_nID;string m_strFamliyName;int m_array[12];static int m_nCount;
};
#endif
//famliyelecpower.cpp
#include"famliyelecpower.h"
#include<stdlib.h>
#include<iostream>
#include<string>
#include<iomanip>
using namespace std;
int CalTotalEPower(FamliyElecPower& x)
{int t = 0;//cout << x.m_strFamliyName << "!" << endl;for(int i = 0; i < 12; i++) {t += x.m_array[i];//cout << x.m_array[i] << endl;}return t;
}
FamliyElecPower::FamliyElecPower(string& name, int array[]) {m_nID = ++m_nCount;m_strFamliyName = name;//int* m_array = new int[12];for (int i = 0; i < 12; i++) {m_array[i] = array[i];//cout << m_array[i] << endl;}
}
void FamliyElecPower::Show()
{cout << "编号:" << setw(3) << m_nID << "         " << "名称:" << setw(5) << m_strFamliyName << endl;cout << "12个月的用电量:" << ends;for (int i = 0; i < 12; i++) {cout << " " << m_array[i];}cout << endl;cout << "年总电量:" << CalTotalEPower(*this) << ends;cout << "    " << "月均电量:" << setw(4) << CalAveEPower(*this) << endl;
}
int CalAveEPower(FamliyElecPower& x)
{int a = 0;for (int i = 0; i < 12; i++) {a += x.m_array[i];}a /= 12;return a;
}
void FamliyElecPower::SetFEP(string& name, int array[])
{m_strFamliyName = name;for (int i = 0; i < 12; i++) {m_array[i] = array[i];}
}
FamliyElecPower::FamliyElecPower()
{m_nID = ++m_nCount;m_strFamliyName = "";for (int i = 0; i < 12; i++) {m_array[i] = 0;}
}
// mian.cpp
#include"famliyelecpower.h"
#include<iostream>
#include<string>
using namespace std;
int FamliyElecPower::m_nCount = 0;int main() {string s;cout << "请输入用户名称:" << ends;cin >> s;int a[12];cout << "请分别输入12个月的电量:" << ends;for (int i = 0; i < 12; i++) {cin >> a[i];}FamliyElecPower f(s, a);cout << "用户用电信息:" << endl;f.Show();return 0;
}
// sikao.cpp#include"famliyelecpower.h"
#include<iostream>
#include<string>
#include<ctime>
#include<cstdlib>
//#pragma warning(disable:4996)
using namespace std;
int FamliyElecPower::m_nCount = 0;
int main() {FILE* file, *file1;freopen_s(&file, "in.txt", "r", stdin);freopen_s(&file1, "out.txt", "w", stdout);string s;int a[12];FamliyElecPower f[101];for (int i = 0; i < 100; i++) {cin >> s;for (int j = 0; j < 12; j++) {cin >> a[j];}f[i].SetFEP(s, a);f[i].Show();}fclose(stdin);fclose(stdout);return 0;
}

2. 友元类设计

2.1 基本要求:

教师作为学生的友元类,操作学生的学分和总成绩。

2.2 功能设计:

(1)设计学生类,包含学生姓名、学分和总成绩;

(2)设计教师类,包含教师姓名,教师有权限修改每个学生的学分和总成绩;

(3)在以上类中增加合适的成员函数以完成程序的功能;

(4)教师类设计成学生类的友元;

2.3 主程序中建立1名教师,3名学生,实现教师分别修改3名学生的学分和总成绩的操作。

2.4  上机思考题部分:

主程序和界面要求:

2.4.1 主程序要求:

(1)至少有5名学生,3名教师;

(2)用户随意选择一位教师、一名学生,让该教师给该学生增加学分、

增加总成绩;

(3)程序结束前输出每位学生的姓名、学分、总成绩

2.4.2 界面要求(输出样例):

您需要建立几位学生(M)和几位教师(N):5 3

请输入5位学生的姓名:张朋 李元 刘文 贺明 鲁笑

请输入3位教师的姓名:严华 耿燕 吴晓乐

请选择一位教师: 吴晓乐

请选择一位学生:贺明

请输入要增加的学分:3

教师吴晓乐给学生贺明增加学分,操作成功。

请输入要增加的总成绩:88

教师吴晓乐给学生贺明增加总成绩,操作成功。

还要继续吗?(Y/N):

如果用户选择N,则输出每位学生的姓名、学分、总成绩,然后程序结束;

如果用户选择Y, 则转向步骤:选择教师,程序继续运行。

//student.h
#pragma once
#include<string>
#include"teacher.h"
using namespace std;
class Student {friend class Teacher;
public:Student();void setStudentName(string& s);void show();bool check(string);
private:string name;double credit;double score;
};
//teacher.h
#pragma once
#include<string>
#include"student.h"
using namespace std;
class Teacher {
public:void modifyCredit(class Student& x, double c);void modifySorce(class Student& x, double s);void setName(string);bool check(string);
private:string name;
};
//teacher.cpp
#include"teacher.h"
#include"student.h"
#include<iostream>
using namespace std;
void Teacher::modifyCredit(Student& x, double c)
{x.credit += c;
}
void Teacher::modifySorce(Student& x, double s)
{x.score += s;
}
void Teacher::setName(string s)
{name = s;
}
bool Teacher::check(string s)
{return name == s;
}
// student.cpp
#include"student.h"
#include"teacher.h"
#include<string>
#include<iostream>
#include<iomanip>
using namespace std;Student::Student()
{credit = 0;score = 0;
}void Student::setStudentName(string& s)
{name = s;
}void Student::show()
{cout << "姓名:" << name << endl;cout << "学分:" << credit << endl;cout << "总成绩" << score << endl;
}bool Student::check(string s)
{return name == s;
}
//main.cpp
#include<iostream>
#include<string>
#include"student.h"
#include"teacher.h"
using namespace std;
int main() {int m, n;cout << "您需要输入的学生人数(M)和教师人数(N):" << ends;cin >> m >> n;Teacher* t = new Teacher[n];Student* s = new Student[m];string name;cout << "请输入" << m << "位学生姓名:";for (int i = 0; i < m; i++) {cin >> name;s[i].setStudentName(name);}cout << "请输入" << n << "位教师姓名:";for (int i = 0; i < n; i++) {cin >> name;t[i].setName(name);}string st, te;char op;do {cout << "请选择一位教师:" << ends;cin >> te;int c = 0;for (int i = 0; i < n; i++) {if (t[i].check(te)) {c = i + 1;break;}}if (c) {cout << "请输入一位学生:";cin >> st;int cc = 0;for (int i = 0; i < m; i++) {if (s[i].check(st)) {cc = i + 1;break;}}if (cc) {cout << "请输入要增加的学分:" << ends;double cd;cin >> cd;t[c - 1].modifyCredit(s[cc - 1], cd);cout << "教师" << te << "给学生" << st << "增加学分,操作成功。" << endl;cout << "请输入要增加的总成绩:" << ends;cin >> cd;t[c - 1].modifySorce(s[cc - 1], cd);cout << "教师" << te << "给学生" << st << "增加总成绩,操作成功。" << endl;}else {cout << "您选择的不是学生" << endl;}}else {cout << "您不是教师,无法修改" << endl;}cout << "还要继续吗(Y/N)" << ends;cin >> op;} while (op == 'Y' || op == 'y');for (int i = 0; i < m; i++) {s[i].show();}return 0;
}

Homework7_ch5 数据的共享与保护(2)——friend相关推荐

  1. 我的C++笔记(数据的共享与保护)

    *数据的共享与保护: * 1.作用域: * 作用域是一个标识符在程序正文中有效的区域.C++中标识符的作用域有函数原型作用域.局部作用域(块作用域).类作用域和命名空间作用域. * (1).函数原型作 ...

  2. 【学习笔记】C++语言程序设计(郑莉):数据的共享与保护

    [学习笔记]C++语言程序设计(郑莉):数据的共享与保护 1. 标识符的作用域与可见性 1.1 作用域 1.1.1 函数原型作用域 1.1.2 局部作用域 1.1.3 类作用域 1.1.4 命名空间作 ...

  3. Part5 数据的共享与保护 5.4类的友元5.5共享数据的保护

    友元是C++提供的一种破坏数据封装和数据隐藏的机制. 通过将一个模块声明为另一个模块的友元,一个模块能够引用到另一个模块中本是被隐藏的信息. 可以使用友元函数和友元类. 为了确保数据的完整性,及数据封 ...

  4. 第5章 数据的共享与保护

    本专栏为C++学习笔记,参考书籍为:C++语言程序设计 第五版 -清华大学出版社- 郑莉 B站视频:https://space.bilibili.com/702528832/video PPT与代码已 ...

  5. 支付宝人脸数据被共享?李开复道歉

    9月12日消息,今天,有媒体报道创新工场董事长兼CEO李开复在HICOOL全球创业者峰会上表示,曾在早期帮助旷视科技公司找了包括美图和蚂蚁金服等合作伙伴,让他们拿到了大量的人脸数据,并在随后的摸索过程 ...

  6. 数据脱敏平台-大数据时代的隐私保护利器

    什么是数据脱敏 又称数据漂白.数据去隐私化或数据变形.是对核心业务数据中敏感的信息,进行变形.转换.混淆,使得对业务数据中的身份.组织等隐私敏感信息进行去除或掩盖,以保护数据能被合理.安全地利用. 数 ...

  7. 开放科学背景下的科学数据开放共享:国家青藏高原科学数据中心的实践

    开放科学背景下的科学数据开放共享:国家青藏高原科学数据中心的实践 潘小多1,2, 李新1,2, 冉有华3, 郭学军2 1 中国科学院青藏高原研究所国家青藏高原科学数据中心,北京 100101 2 中国 ...

  8. 公共云计算彼端的数据能否得到有效保护?

    [51CTO.com 独家特稿]互联网大佬谷歌的各类云计算产品大家已经耳熟能详,文字处理.电子表格和演示稿制作工具这三大在线办公软件已经出来很久了.此外还有Google Sites和App Engin ...

  9. 人民链鲍大伟:打破壁垒,建立全域数据治理共享及应用平台

    2020年10月,在人民网主办的"人民链信誉评价研讨会"上,微众银行与人民在线就共建"人民链"达成战略合作.依托"人民链",微众银行融合区块 ...

最新文章

  1. 智能视觉组参赛总结及体会- 西安邮电大学 - AI小布丁
  2. Python爬虫==入门基础概念
  3. 系统业务逻辑书籍_咨询行业书籍推荐
  4. PHP 实现冒泡排序
  5. c语言怎样获得函数内参数的值_C语言可变参数函数的实现原理
  6. java 窗口 单例_java单例模式实现面板切换
  7. cmake release和debug代码运行效果不一样_这35个小细节,让你的Java 代码运行效率翻倍!...
  8. 软件测试--缺陷报告
  9. 亲个嘴竟然有这么大的学问
  10. 大数据有哪些特点和作用
  11. Android 动态调试和JEB启动调试命令
  12. MATLAB —— 低通滤波器设计与信号滤波
  13. 高通AR系列与MTK芯片对比专业详解
  14. (MTT)连续能量函数最小化方法
  15. 从银行、保险到证券,揭开大数据在金融行业的应用
  16. 安卓搭建文件共享服务器,安卓文件共享云服务器
  17. 在 AIX 上实现 iSCSI
  18. 队列的顺序实现(入队、出队、对长、获取队头元素)
  19. CG原画绘画教程之人物-张聪-专题视频课程
  20. OpenCV for Python之图像RIO与泛洪填充

热门文章

  1. 使用dnf下载与安装网络源的rpm
  2. 推荐个比较好用的协同办公软件,帮助你高效办公
  3. PHP - 下载 - PHP 5.2.5
  4. 谷歌11年发展历程 从创新到创新
  5. 数学王子高斯传奇,一路开挂打怪的一生
  6. nrf52832 学习笔记(七)蓝牙协议层级理解
  7. 作为一个普通本科学生我大学四年到底走了多少弯路
  8. JiangxiBank
  9. LeetCode2029. 石子游戏 IX
  10. pt-thread的使用