职工信息的综合运算及可视化

一、实验目的

深入掌握单链表应用的算法设计。

二、实验内容及要求

内容:设有一个职工文件emp.dat,每个职工记录包含职工编号(no)、姓名(name)、部门号(depno)和工资数(salary)信息。设计一个程序exp2-11.cpp完成以下功能:

(1)从emp. dat文件中读出职工记录,并建立一个带头结点的单链表L。

(2)输人一个职工记录。v

(3)显示所有职工记录。√

(4)按编号no对所有职工记录进行递增排序

(5)按部门号depno对所有职工记录进行递增排序。

(6)按工资数salary对所有职工记录进行递增排序。

(7)删除指定职工号的职工记录。

(8)删除职工文件中的全部记录。

(9)将单链表L中的所有职工记录存储到职工文件emp. dat中。

三、算法设计

(1)职工信息的综合运算功能

建立为职工创建相应的类,再通过单链表对职工信息进行存储。将职工信息单链表进行封装,实现对职工信息的文件读入和文件写入、职工信息的删除和添加、职工信息的查询和显示。并通过相应的gui程序实现对职工信息操作的可视化。

(2)算法思想

       顺序表:

       将线性表中的所有元素按照其逻辑顺序依次存储到计算存储器中指定存储位置开始的一块连续的存储空间中。

       链表:

       链表的每个存储节点不仅包含元素本身的信息(数据域),还包含表示元素之间逻辑关系的信息(指针域)。数据域用于存储数据,指针域来存储其逻辑相邻元素的物理存储地址。

(3)算法描述:

       顺序表:

       创建顺序表:将需要初始化值依依对应的复制到顺序表中。

       输出顺序表:从前往后遍历顺序表的每一个位置,并将其位置上的元素输出。

       获取某一位置元素值:直接通过位置下标获取这一位置的值并返回。

       获取某一元素值的位置:从前往后遍历顺序表并比对,相同则返回这一位置 下标。

       在某一位置插入元素:将这一位置后面的元素对应后移,然后将需要添加的元素加入这一位置。

       删除某一位置的元素:将这一位置的元素值返回,然后将这一位置后的元素依依前移一个位置。

       链表:

       头插法:将第一个有数据的节点保存到需要添加的节点的地址域中,然后将需要添加节点地址保存到头节点的地址域中。

       尾插法:从头节点遍历找到尾节点的地址,然后将需要添加节点的位置保存到尾节点的地址域中,并将需要添加节点的地址域置为NULL。

       输出链表所有元素:从第一个有数据的节点开始,遍历所有节点,并输出其数据域的数据。

       按元素值查询:从第一个有数据的节点开始,将查询元素值与节点数据域中对应的数据值进行比对,相同则返回,否者继续。重复此操作直到尾节点。

       按元素值删除:从第一个有数据的节点开始,将查询元素值与节点数据域中对应的数据值进行比对,相同则删除。重复此操作直到尾节点,。

       排序:遍历链表,将所有节点中的数据保存到数组中,然后对数组进行排序,最后利用数组中有序的数据进行连接成 新的逻辑顺序的链表。

四、算法实现

//从文件读入职工信息

void ListWorker::ReadToList()

{

        QFile infile;

        Worker *p,*pnew;

        int newNo,newDepno;

        double newSalary;

        QString newName;

        p=H;

        infile.setFileName("data/worker1.dat");

        infile.open(QIODevice::ReadOnly);

        if(!infile.isOpen())

        {

               qDebug()<<QString("open file failure");

               return;

        }

        QDataStream stream(&infile);

        stream>>length;

        pnew=Q_NULLPTR;

        for(int i=0;i<length;i++)

        {

                stream>>newNo>>newName>>newSalary>>newDepno;

               pnew=new Worker;

               pnew->SetNo(newNo);

               pnew->SetName(newName);

               pnew->SetDepno(newDepno);

               pnew->SetSalary(newSalary);

               pnew->SetPnext(Q_NULLPTR);

               p->SetPnext(pnew);

               p=pnew;

        }

        head=H->GetPnext();

        tail=pnew;

        infile.close();

}

//插入职工信息

    bool ListWorker::Insert(Worker a)

{

        Worker *p;

        p=new Worker;

        p->SetNo(a.GetNo());

        p->SetName(a.GetName());

        p->SetDepno(a.GetDepno() );

        p->SetSalary(a.GetSalary() );

        p->SetPnext(Q_NULLPTR);

        if(tail==Q_NULLPTR)

        {

               H->SetPnext(p);

               head=tail=p;

        }

        else

        {

               tail->SetPnext(p);

               tail=p;

        }

        length++;

        return true;

}

//按职工编号增序排序

bool ListWorker::SortNo()

{

    struct data no[length];

    Worker *p=head;

    if(head==Q_NULLPTR) return false;

    for(int i=0;i<length;i++)

    {

        no[i].n=p->GetNo();

        no[i].p=p;

        p=p->GetPnext();

    }

    sort(no,no+length,cmp);

    p=H;

    for(int i=0;i<length;i++)

    {

        p->SetPnext(no[i].p);

        p=p->GetPnext();

    }

    p->SetPnext(Q_NULLPTR);

    head=H->GetPnext();

    tail=p;

    return true;

}

。。。。。。

五、程序运行截图

 

 

工程代码下载链接:职工信息管理系统.zip_简单的人事信息系统中职工记录-C/C++文档类资源-CSDN下载

  • 4
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我来为您画一份职工信息综合运算流程图。 首先,我们需要明确一下任务的要求和数据的结构。假设我们需要对一批职工信息进行处理,每个职工信息包括姓名、工号、部门、基本工资、津贴、实际工资等字段。我们可以用一个员工类来表示这些信息,代码如下: ``` class Employee: def __init__(self, name, id, department, salary, allowance): self.name = name self.id = id self.department = department self.salary = salary self.allowance = allowance self.total_salary = salary + allowance ``` 接下来,我们可以使用一个列表来存储所有的职工信息。假设我们已经将数据读入到了employees列表中。 接下来,我们需要进行一些综合运算,例如计算所有职工的实际工资总和、找出某个部门的所有职工、找出工资最高的职工等等。我们可以使用循环和条件语句来实现这些运算。 以下是一个职工信息综合运算的流程图,其中包括了计算所有职工的实际工资总和、找出某个部门的所有职工、找出工资最高的职工这三个运算的实现: ![职工信息综合运算流程图](https://i.loli.net/2021/08/24/x8GJtT5M6q9Y3dn.png) 在实现时,我们可以根据具体的需求来编写不同的函数,并在主程序中调用这些函数。例如,计算实际工资总和的函数可以按照以下方式实现: ``` def calculate_total_salary(employees): total_salary = 0 for employee in employees: total_salary += employee.total_salary return total_salary ``` 找出某个部门的所有职工的函数可以按照以下方式实现: ``` def find_employees_by_department(employees, department): result = [] for employee in employees: if employee.department == department: result.append(employee) return result ``` 找出工资最高的职工的函数可以按照以下方式实现: ``` def find_employee_with_highest_salary(employees): highest_salary = 0 highest_salary_employee = None for employee in employees: if employee.total_salary > highest_salary: highest_salary = employee.total_salary highest_salary_employee = employee return highest_salary_employee ``` 在主程序中,我们可以按照以下方式调用这些函数: ``` total_salary = calculate_total_salary(employees) employees_in_sales_department = find_employees_by_department(employees, "Sales") employee_with_highest_salary = find_employee_with_highest_salary(employees) ``` 这样,我们就完成了职工信息综合运算的任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程先生w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值