您现在的位置是:首页 > 正文

【大一程序设计基础作业】P266Ex3

2024-01-30 22:28:14阅读 0

使用第二题中定义的教职工类体系,编写程序,输入某月各种职称教师的工资信息,建立异质链表,输出每位教师的工资条,统计当月的总工资、平均工资、最高工资和最低工资

再上一题中,我们已经完成了类体系的构建。

读题,看到有输入和输出的要求,所以我们可以从输入输出入手。

输入各种职称教师的工资信息(以每种教职工一位为例)仅需调用几次input函数即可……

不确定,再看一眼,发现题中说要建立异质链表,原来是要让我们用异质链表来管理不同“类”的教职工

这边带大家复习一些异质链表:由于基类指针可以指向派生类的这一性质,我们可以使用基于一个基类指针创造出的一系列空间来管理一组不同派生类的数据。为了方便管理,采用链表这一数据结构来管理,因而得名异质链表(管理一堆不同类数据的链表)cancan代码:
 

void AddFront(Tworker*& h, Tworker*& t)//结点的创建
{
    t->next = h;
    h = t;
}
class Tworker//链表这一数据结构特有的next成员
{
    /*...*/
public:Tworker* next;
    /*...*/
};

有了异质链表之后,我们的输入输出就不再使用成员函数了,而是用链表中的指针去调用成员函数

ptr = new Teacher; ptr->input();ptr->print();

 除了输入和打印工资条,题中还有一个要求是求总工资、平均值、最值

众所周知,总工资等于所有工资的总和……那我们就会很自然地想到循环,用循环把这些元素都加起来,大家大声告诉我这个叫什么:

对,就是遍历链表。

可能大家对链表的知识有点遗忘,这里再帮大家复习一下。ptr指针相当于一个小机器人,它走到哪个结点,就对哪个结点中的信息进行操作(比如记下信息或念出这些信息)。遍历则是让这个小机器人通过循环语句顺着一个个结点走下去,在循环语句结束之后,他会停在这一系列结点的后面,此时我们就要把它收回来,让他休息一下,也就是让ptr指向空指针。(好生硬的比喻)

上代码:

double Allsa(Tworker *&ptr,Tworker *&d)
{
    double sa = 0;//定义一个容器,用来装总工资
    while (ptr)//ptr可以理解为一个不断移动的指针,指到哪个结点就对哪个结点的信息进行操作
    {
        sa += ptr->Salary();/从头结点开始遍历,把每个结点里的工资往容器里装
        ptr = ptr->next;//让ptr指向下一个结点
        i++;
    }
    ptr = d;//d是实现定义好的空指针,目的是在程序结束之后释放ptr
    return sa;//返回容器里装的工资(让大家看看里面装了多少钱)
}

平均值则是在求和的基础上用总量除以个数。我为了方便,直接在遍历求和的过程中统计个数,这这样一来,在最后输出的时候用和除以个数就可以把平均值输出了。

最值则是先读取头结点中的数据,装到容器里面,在遍历的过程中将链表中的数据与容器中的数据一一比较,若找到更大/更小值时,将它装进容器。最后容器里装的就是最大/最小值了。上代码:

double Minsa(Tworker*& ptrr, Tworker*& dd)
{
    double min = ptrr->Salary();
    while (ptrr)
    {
        if (min > ptrr->Salary())
            min = ptrr->Salary();
        ptrr = ptrr->next;
    }
    ptrr = dd;
    return min;
}
double Maxsa(Tworker*& ptrr, Tworker*& dd)
{
    double max = ptrr->Salary();
    while (ptrr)
    {
        if (max < ptrr->Salary())
            max = ptrr->Salary();
        ptrr = ptrr->next;
    }
    ptrr = dd;
    return max;
}

 把这几个部分加上,这个程序就完成了,最终代码如下,供大家学习参考:

// P266Ex2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
using namespace std;
class Tworker
{
protected:
    double baseSalary;
    string name, number;
public:
    //virtual ~Tworker();
    Tworker(){
        baseSalary = 3000;
        cout << "请输入姓名:\n";
        cin >> name;
        cout << "请输入教职工编号\n";
        cin >> number;
    }
    Tworker* next;
    virtual double Salary() = 0;
    virtual void input() = 0;
    virtual void print() = 0;
};
class Teacher:public Tworker 
{
protected:
    double lsubsidy;
    int lessennum;
    int jobnum;
    double* p;
public:
    void print()
    {
        if(jobnum==1)
        cout <<"\njob:教授\n" << "name:" << name << "\nnumber:" << number << "\nsalary:" << Salary()<<endl;
        else if(jobnum==2)cout << "\njob:副教授\n" << "name:" << name << "\nnumber:" << number << "\nsalary:" << Salary() << endl;
        else if(jobnum==3)cout << "\njob:讲师\n" << "name:" << name << "\nnumber:" << number << "\nsalary:" << Salary() << endl;
    }
    void input()
    {
        p = &lsubsidy;
        cout << "请输入课时数:\n";
        cin >> lessennum;
        IN:cout << "请输入职称代码:(教授为1,副教授为2,讲师为3)\n";
        cin >> jobnum;
        if (jobnum == 1)*p = 50;
        else if (jobnum == 2) *p = 30;
        else if (jobnum == 3)*p = 20;
        else { cout << "职称代码有误,请重新输入\n"; goto IN; }
    }
    double Salary()
    {
        return lsubsidy * lessennum + baseSalary;
    }
};
class Manager:public Tworker
{
protected:double jobSalary;
public:void print()
{
    cout << "\njob:管理人员\n" << "name:" << name << "\nnumber:" << number << "\nsalary:" << Salary() << endl;
}
    Manager()
    {
        jobSalary = 2500;
    }
    void input() { jobSalary = 2500; }
    double Salary()
{
    return jobSalary + baseSalary;
}
};
class Laber :public Tworker {
protected:double dsubsidy; int days;
public:
    void print()
    {
        cout << "\njob:实验室人员\n" << "name:" << name << "\nnumber:" << number << "\nsalary:" << Salary() << endl;
    }double Salary() { return dsubsidy * days + baseSalary; }
      Laber()
      {
          dsubsidy = 100;
      }
      void input()
      {
          cout << "请输入工作天数:\n";
          cin >> days;
      }
};
void Input(Tworker& tc)
{
    tc.input();
}
void Print(Tworker& t)
{
    cout << endl;
    t.print();
    cout << endl;
}
void AddFront(Tworker*& h, Tworker*& t)
{
    t->next = h;
    h = t;
}
static double i = 0;
double Allsa(Tworker *&ptr,Tworker *&d)
{
    double sa = 0;
    while (ptr)
    {
        sa += ptr->Salary();
        ptr->print();
        ptr = ptr->next;
        i++;
    }
    ptr = d;
    return sa;
}
double Minsa(Tworker*& ptrr, Tworker*& dd)
{
    double min = ptrr->Salary();
    while (ptrr)
    {
        if (min > ptrr->Salary())
            min = ptrr->Salary();
        ptrr = ptrr->next;
    }
    ptrr = dd;
    return min;
}
double Maxsa(Tworker*& ptrr, Tworker*& dd)
{
    double max = ptrr->Salary();
    while (ptrr)
    {
        if (max < ptrr->Salary())
            max = ptrr->Salary();
        ptrr = ptrr->next;
    }
    ptrr = dd;
    return max;
}
int main()
{
    Tworker* d = NULL, * ptr;
    ptr = new Teacher; ptr->input(); AddFront(d, ptr);
    ptr = new Laber; ptr->input(); AddFront(d, ptr);
    ptr = new Manager; ptr->input(); AddFront(d, ptr);
    double allsa=Allsa(ptr, d);
    cout << "\n总工资为:" << allsa;
    cout << "\n平均工资为:" << (allsa / i);
    cout << "\n最低工资为:" << Minsa(ptr, d);
    cout << "\n最高工资为:" << Maxsa(ptr, d);
}

 

 

网站文章

  • LeNet模型——tensorflow实现

    LeNet模型——tensorflow实现

    文章目录MNIST数据集MNIST数据集简介MNIST数据集加载MNIST数据集可视化数据集格式转换tendorflow模型类ModelSequetial卷积类Conv2D池化类AveragePool...

    2024-01-30 22:27:44
  • CCNP-第六篇-OSPF高级版(三)

    CCNP-第六篇-OSPF高级版(三)

    CCNP-第六篇-OSPF高级版(三) 这一节差不多都是密码认证了,还有个NSSA和OE1,OE2 OSPF默认路由 OSPF认证问题 OSPF特殊区域,NSSA,STUB OSPF下发默认路由 其实...

    2024-01-30 22:27:37
  • tornado mysql 操作_tornado 数据库操作

    tornado是python的web框架,web程序开发中数据库操作是必须的。安装:tornado的官方文档中提供的说明比较少,而且提供的模块中未找到数据库方面的模块,难道没有针对数据库操作进行封装?百度查询了一下才发现,tornado在升级过程中把数据库模块独立出来了。模块为torndb模块。模块git地址:https://github.com/bdarnell/torndb 官方文档地址...

    2024-01-30 22:27:29
  • 各种排序算法的时间复杂度和空间复杂度

    各种排序算法的时间复杂度和空间复杂度

    2024-01-30 22:27:20
  • 机器学习入门与Python实战(四):K近邻分类(KNN)

    机器学习入门与Python实战(四):K近邻分类(KNN)

    目录现实问题:“物以类聚,人以群分”一.KNN算法概述二.KNN算法介绍K近邻分类模型算法步骤距离计算方式KNN分类图K值选择三.KNN特点KNN算法的优势和劣势知识巩固Python实战:KNN数据分...

    2024-01-30 22:26:51
  • HTTP1.0 HTTP 1.1 HTTP 2.0主要区别

    HTTP1.0 HTTP 1.1主要区别长连接HTTP 1.0需要使用keep-alive参数来告知服务器端要建立一个长连接,而HTTP1.1默认支持长连接。HTTP是基于TCP/IP协议的,创建一个TCP连接是需要经过三次握手的,有一定的开销,如果每次通讯都要重新建立连接的话,对性能有影响。因此最好能维持一个长连接,可以用个长连接来发多个请求。节约带宽HTTP 1.1支持只发送he...

    2024-01-30 22:26:45
  • Ansible安装与配置(自动化运维管理工具) 热门推荐

    Ansible安装与配置(自动化运维管理工具) 热门推荐

    原文链接:http://blog.csdn.net/xyang81/article/details/51568227Ansible是一个简单高效的自动化运维管理工具,用Python开发,能大批量管理N...

    2024-01-30 22:26:39
  • 在Vue中封装一个select组件 热门推荐

    在Vue中封装一个select组件 热门推荐

    我们使用iview封装一个select组件 封装的是每一个select下拉框 &lt;template&gt; &lt;div class=&#39;select&#39;&gt; &lt;i-select :model.sync=&#39;selecteddata&#39; :placeholder=&#39;placeholdertext&#39; filterable multiple...

    2024-01-30 22:25:59
  • jsp ajax不返回数据,【100分】ajax在jsp页面接受不到数据解决方法

    当前位置:我的异常网» Java Web开发»【100分】ajax在jsp页面接受不到数据解决方法【100分】ajax在jsp页面接受不到数据解决方法www.myexceptions.net网友分享于:2013-03-20浏览:42次【100分】ajax在jsp页面接受不到数据大家帮我看看是哪的问题啊 ,我刚接触ajax-------jsp页面--------var xmlHttp;f...

    2024-01-30 22:25:53
  • jquery autocomplete前后台整合实例(1)

    最近在做项目时需要用到搜索自动提示,例如姓名查找模糊匹配提示。目前Jquery的自动提示插件非常多,我会例举几款,写出一些与后台交互的例子本文介绍一款Jquery autocomplete官方地址:https://github.com/devbridge/jQuery-Autocomplete下面直接来实例,不玩虚的,不参与后台交互的这里就不做介绍了,本文涉及的后台开发语言是java,

    2024-01-30 22:25:44