返回列表 發帖

資料結構 305 員工資料查詢(中)

資料結構 305 員工資料查詢

1. 題目說明:
請依下列題意進行作答,使輸出值符合題意要求。

1. 設計說明:
(1) 公司具有以下四張紀錄表:

員工資料表(EMPLOYEE),記錄員工編號(e_id)、員工姓名(e_name)、員工月薪水(e_salary)、員工部門編號(d_id)。

部門資料表(DEPARTMENT),記錄部門編號(d_id)、部門名稱(d_name)、部門經理員工編號(m_id)。

專案資料表(PROJECT),記錄專案編號(p_id)、專案名稱(p_name)、專案地點(p_location)。

員工參與專案時數資料表(HOUR_LOG),記錄員工編號(e_id)、參與專案編號(p_id)、參與專案時數(p_hours)。

(2) 請撰寫一程式,讓使用者輸入上述四種資料,以及某員工姓名(Name),列出該員工所參與的專案名稱(p_name),以及參與該專案的工作時數(p_hours)。

2. 輸入輸出:
輸入說明
第 1 列:四個小於 10 的正整數 E、D、P、H,E 為員工資料筆數、D 為部門資料筆數、P 為專案資料筆數、H 為員工參與專案時數筆數。
第 2 ~ E+1 列:員工資料表(EMPLOYEE),每一列包含員工編號(e_id,4字元)、員工姓名(e_name,3~10字元)、員工月薪水(e_salary,正整數)、員工部門編號(d_id,4字元);
第 E+2 ~ E+D+1 列:部門資料表(DEPARTMENT),每一列包含部門編號(d_id,4字元)、部門名稱(d_name,3~10字元)、部門經理員工編號(m_id,4字元);
第 E+D+2 ~ E+D+P+1 列:專案資料表(PROJECT),每一列包含專案編號(p_id,4字元)、專案名稱(p_name,3~10字元)、專案地點(p_location,3~10字元);
第 E+D+P+2 ~ E+D+P+H+1 列:員工參與專案時數資料表(HOUR_LOG),每一列包含員工編號(e_id,4字元)、參與專案編號(p_id,4字元)、參與專案時數(p_hours,正整數)。
第 E+D+P+H+2 列:欲查詢的員工姓名。

(注意:所有資料間皆以一個半形空白間隔。)

輸出說明
該員工所參與的專案名稱(p_name),以及參與該專案的工作時數(p_hours),資料間皆以一個半形空白間隔,輸出順序請依照專案名稱字典順序「由小到大」。
最後輸出該員工參與專案的總時數。

範例輸入1
3 2 2 4
E001 John 45000 D001
E002 Mary 43000 D002
E003 Tom 46000 D002
D001 RD E001
D002 SALE E002
P001 AI Taipei
P002 SE Tainan
E001 P001 20
E002 P002 30
E003 P001 20
E002 P001 10
Mary
範例輸出1
AI 10
SE 30
40
範例輸入2
4 3 4 7
E001 John 45000 D001
E002 Mary 43000 D002
E003 Tom 46000 D002
E004 Jame 50000 D003
D001 RD E001
D002 SALE E002
D003 Product E004
P001 AI Taipei
P002 SE Tainan
P003 IMG UK
P004 WEB Taipei
E001 P001 20
E004 P004 20
E002 P002 30
E004 P002 20
E003 P001 20
E002 P001 10
E004 P003 20
Jame
範例輸出2
IMG 20
SE 20
WEB 20
60
May

  1. //#include <iostream>
  2. //#include <vector>
  3. //#include <map>
  4. //#include <algorithm>
  5. #include <bits/stdc++.h>
  6. using namespace std;

  7. struct Employee {
  8.     string e_id, e_name, d_id;
  9.     int e_salary;
  10. };

  11. struct Project {
  12.     string p_id, p_name, p_location;
  13. };

  14. struct HourLog {
  15.     string e_id, p_id;
  16.     int p_hours;
  17. };

  18. int main() {
  19.     int E, D, P, H;
  20.     cin >> E >> D >> P >> H;
  21.     cin.ignore();

  22.     vector<Employee> employees(E);
  23.     for (int i = 0; i < E; i++) {
  24.         cin >> employees[i].e_id >> employees[i].e_name >> employees[i].e_salary >> employees[i].d_id;
  25.     }

  26.     map<string, string> project_names;
  27.     for (int i = 0; i < D; i++) {
  28.         string d_id, d_name, m_id;
  29.         cin >> d_id >> d_name >> m_id;
  30.     }
  31.    
  32.     for (int i = 0; i < P; i++) {
  33.         string p_id, p_name, p_location;
  34.         cin >> p_id >> p_name >> p_location;
  35.         project_names[p_id] = p_name;
  36.     }
  37.    
  38.     vector<HourLog> hour_logs(H);
  39.     for (int i = 0; i < H; i++) {
  40.         cin >> hour_logs[i].e_id >> hour_logs[i].p_id >> hour_logs[i].p_hours;
  41.     }
  42.    
  43.     string query_name;
  44.     cin >> query_name;
  45.    
  46.     map<string, int> project_hours;
  47.     for (const auto &emp : employees) {
  48.         if (emp.e_name == query_name) {
  49.             for (const auto &log : hour_logs) {
  50.                 if (log.e_id == emp.e_id) {
  51.                     project_hours[project_names[log.p_id]] += log.p_hours;
  52.                 }
  53.             }
  54.             break;
  55.         }
  56.     }
  57.    
  58.     int total_hours = 0;
  59.     vector<pair<string, int>> sorted_projects(project_hours.begin(), project_hours.end());
  60.     sort(sorted_projects.begin(), sorted_projects.end());
  61.    
  62.     for (const auto &entry : sorted_projects) {
  63.         cout << entry.first << " " << entry.second << endl;
  64.         total_hours += entry.second;
  65.     }
  66.     cout << total_hours << endl;
  67.    
  68.     return 0;
  69. }
複製代碼
回復 1# may
----------------------------------------------
程式說明:
資料結構設計

Employee 結構體儲存員工資訊。

Project 結構體儲存專案資訊。

HourLog 結構體儲存員工參與專案時數。

資料輸入

依序讀取 EMPLOYEE、DEPARTMENT、PROJECT、HOUR_LOG 四類資料。

透過 map 儲存 PROJECT 資料,使專案編號對應專案名稱。

資料處理

透過 query_name 找到對應 e_id,再比對 HOUR_LOG 記錄。

利用 map 來累計同一專案的時數。

輸出處理

map 轉換為 vector<pair<string, int>> 以專案名稱排序輸出。

最後輸出總時數。
---------------------------------
測資:
測試資料00
輸入
3 2 2 4
E001 John 45000 D001
E002 Mary 43000 D002
E003 Tom 46000 D002
D001 RD E001
D002 SALE E002
P001 AI Taipei
P002 SE Tainan
E001 P001 20
E002 P002 30
E003 P001 20
E002 P001 10
Mary
輸出
AI 10
SE 30
40
測試資料 01
輸入
4 3 4 7
E001 John 45000 D001
E002 Mary 43000 D002
E003 Tom 46000 D002
E004 Jame 50000 D003
D001 RD E001
D002 SALE E002
D003 Product E004
P001 AI Taipei
P002 SE Tainan
P003 IMG UK
P004 WEB Taipei
E001 P001 20
E004 P004 20
E002 P002 30
E004 P002 20
E003 P001 20
E002 P001 10
E004 P003 20
Jame
輸出
IMG 20
SE 20
WEB 20
60
測試資料 02
輸入
2 1 3 3
E001 Alice 50000 D001
E002 Bob 55000 D001
D001 HR E001
P001 Cloud NewYork
P002 DevOps SF
P003 Security London
E001 P001 15
E001 P002 10
E002 P003 20
Alice
輸出
Cloud 15
DevOps 10
25
測試資料 03
輸入
5 2 3 6
E001 John 40000 D001
E002 Mary 45000 D002
E003 David 48000 D001
E004 Kevin 42000 D002
E005 Emma 47000 D001
D001 IT E001
D002 HR E002
P001 ML Tokyo
P002 Data Taipei
P003 AI London
E002 P001 25
E004 P002 30
E005 P003 15
E003 P002 10
E001 P001 20
E002 P003 20
Kevin
輸出
Data 30
30
測試資料 04
輸入
3 2 3 5
E001 Alex 55000 D001
E002 Brian 53000 D002
E003 Chloe 56000 D001
D001 Finance E001
D002 Marketing E002
P001 UX Berlin
P002 Backend Paris
P003 AI Zurich
E001 P001 30
E002 P002 40
E003 P003 25
E002 P001 15
E001 P003 20
Brian
輸出
Backend 40
UX 15
55
這些測試資料涵蓋了:

員工參與不同數量的專案

有些員工未參與專案

員工參與多個專案

員工參與時數累計並按專案名稱排序
May

TOP

返回列表