數據結構-課程設計-職工管理系統

来源:https://www.cnblogs.com/ygjzs/archive/2020/01/02/12142660.html
-Advertisement-
Play Games

職工管理管理系統 課程設計 本次課程設計,我還挺幸運的,抽到一道這麼簡單的題,思路很簡單,但拓展很強,相比其他同學的,我這個簡直是。。。,真是運氣太好了, 代碼寫了1500多行吧,做課程設計中,我也學到了很多東西,代碼太多,就放到了 "github" 上了 下麵是一個總體概述,和一個README.m ...


職工管理管理系統--課程設計

本次課程設計,我還挺幸運的,抽到一道這麼簡單的題,思路很簡單,但拓展很強,相比其他同學的,我這個簡直是。。。,真是運氣太好了,
代碼寫了1500多行吧,做課程設計中,我也學到了很多東西,代碼太多,就放到了github上了

下麵是一個總體概述,和一個README.md
其中README中以前分開寫過,這次把他都寫到了一起,所以就有點多~~~

先來一個總體概述:
1.fstream的使用

  1. 字元串使用

3.排序的實現

排序使用的選擇排序,採用的存儲方式為鏈式結構,根據對象的age進行排序參考的代碼為運用鏈表進行選擇排序

  1. 1:加入對年紀的判斷,確保輸入的年紀在正確範圍內
    2:加入對電話號碼的判斷,保證格式正確

5.實現文件分離

6.添加若文件里沒有數據顯示沒有數據

  1. 添加退出選擇功能

  2. 添加學歷選擇功能

9.添加性別選擇功能,若選擇錯誤需進行重新選擇

  1. 添加id排除重覆功能 ,輸入重覆的需進行重新選擇

  2. 修改數據是所有的查找不到的會提示沒有此人,併進行重新輸入,直到輸入的id號存在;

12.日期函數

13.使用結構 tm 格式化時間

14.#include <sstream>時間的格式化

15.名字按字典排序,升序和降序;

16每次添加新員工,預設按名字字典升序寫入文件;

17.增加修改成員界面的返回上一頁功能;

18.美化界面

19.自動生成排序數據

20.不寫了,好好複習下周的期末考試~~~~~~~~~!

fstream的使用

  • ofstream 該數據類型表示輸出文件流,用於創建文件並向文件寫入信息。

  • ifstream 該數據類型表示輸入文件流,用於從文件讀取信息。

  • fstream 該數據類型通常表示文件流,且同時具有 ofstream 和 ifstream 兩種功能,這意味著它可以創建文件,向文件寫入信息,從文件讀取信息。

要在 C++ 中進行文件處理,必須在 C++ 源代碼文件中包含頭文件

打開文件

在從文件讀取信息或者向文件寫入信息之前,必須先打開文件。ofstream 和 fstream 對象都可以用來打開文件進行寫操作,如果只需要打開文件進行讀操作,則使用 ifstream 對象。

下麵是 open() 函數的標準語法,open() 函數是 fstream、ifstream 和 ofstream 對象的一個成員。

void open(const char *filename, ios::openmode mode);

在這裡,open() 成員函數的第一參數指定要打開的文件的名稱和位置,第二個參數定義文件被打開的模式。
模式標誌 描述

ios::app ---- 追加模式。所有寫入都追加到文件末尾。

ios::ate ---- 文件打開後定位到文件末尾。

ios::in ---- 打開文件用於讀取。

ios::out ---- 打開文件用於寫入。

ios::trunc 如果該文件已經存在,其內容將在打開文件之前被截斷,即把文件長度設為 0。

您可以把以上兩種或兩種以上的模式結合使用。例如,如果您想要以寫入模式打開文件,並希望截斷文件,以防文件已存在,那麼您可以使用下麵的語法:

ofstream outfile;
outfile.open("file.dat", ios::out | ios::trunc );

類似地,您如果想要打開一個文件用於讀寫,可以使用下麵的語法:

ifstream  afile;
afile.open("file.dat", ios::out | ios::in );

關閉文件

當 C++ 程式終止時,它會自動關閉刷新所有流,釋放所有分配的記憶體,並關閉所有打開的文件。但程式員應該養成一個好習慣,在程式終止前關閉所有打開的文件。

下麵是 close() 函數的標準語法,close() 函數是 fstream、ifstream 和 ofstream 對象的一個成員。

void close();

寫入文件

在 C++ 編程中,我們使用流插入運算符( << )向文件寫入信息,就像使用該運算符輸出信息到屏幕上一樣。唯一不同的是,在這裡您使用的是 ofstream 或 fstream 對象,而不是 cout 對象。

讀取文件

在 C++ 編程中,我們使用流提取運算符( >> )從文件讀取信息,就像使用該運算符從鍵盤輸入信息一樣。唯一不同的是,在這裡您使用的是 ifstream 或 fstream 對象,而不是 cin 對象。

讀取 & 寫入實例

下麵的 C++ 程式以讀寫模式打開一個文件。在向文件 afile.dat 寫入用戶輸入的信息之後,程式從文件讀取信息,並將其輸出到屏幕上:
實例

#include <fstream>
#include <iostream>
using namespace std;
 
int main ()
{
    
   char data[100];
 
   // 以寫模式打開文件
   ofstream outfile;
   outfile.open("afile.dat");
 
   cout << "Writing to the file" << endl;
   cout << "Enter your name: "; 
   cin.getline(data, 100);
 
   // 向文件寫入用戶輸入的數據
   outfile << data << endl;
 
   cout << "Enter your age: "; 
   cin >> data;
   cin.ignore();
   
   // 再次向文件寫入用戶輸入的數據
   outfile << data << endl;
 
   // 關閉打開的文件
   outfile.close();
 
   // 以讀模式打開文件
   ifstream infile; 
   infile.open("afile.dat"); 
 
   cout << "Reading from the file" << endl; 
   infile >> data; 
 
   // 在屏幕上寫入數據
   cout << data << endl;
   
   // 再次從文件讀取數據,並顯示它
   infile >> data; 
   cout << data << endl; 
 
   // 關閉打開的文件
   infile.close();
 
   return 0;
}

當上面的代碼被編譯和執行時,它會產生下列輸入和輸出:

$./a.out
Writing to the file
Enter your name: Zara
Enter your age: 9
Reading from the file
Zara
9

上面的實例中使用了 cin 對象的附加函數,比如 getline()函數從外部讀取一行,ignore() 函數會忽略掉之前讀語句留下的多餘字元。

文件位置指針

istream 和 ostream 都提供了用於重新定位文件位置指針的成員函數。這些成員函數包括關於 istream 的 seekg("seek get")和關於 ostream 的 seekp("seek put")。

seekg 和 seekp 的參數通常是一個長整型。第二個參數可以用於指定查找方向。查找方向可以是 ios::beg(預設的,從流的開頭開始定位),也可以是 ios::cur(從流的當前位置開始定位),也可以是 ios::end(從流的末尾開始定位)。

文件位置指針是一個整數值,指定了從文件的起始位置到指針所在位置的位元組數。下麵是關於定位 "get" 文件位置指針的實例:
// 定位到 fileObject 的第 n 個位元組(假設是 ios::beg)
fileObject.seekg( n );
 
// 把文件的讀指針從 fileObject 當前位置向後移 n 個位元組
fileObject.seekg( n, ios::cur );
 
// 把文件的讀指針從 fileObject 末尾往回移 n 個位元組
fileObject.seekg( n, ios::end );
 
// 定位到 fileObject 的末尾
fileObject.seekg( 0, ios::end );

C++ 字元串

  • C++ 提供了以下兩種類型的字元串表示形式:
    • C 風格字元串
    • C++ 引入的 string 類類型

C 風格字元串

C 風格的字元串起源於 C 語言,併在 C++ 中繼續得到支持。字元串實際上是使用 null 字元 '\0' 終止的一維字元數組。因此,一個以 null 結尾的字元串,包含了組成字元串的字元。

下麵的聲明和初始化創建了一個 "Hello" 字元串。由於在數組的末尾存儲了空字元,所以字元數組的大小比單詞 "Hello" 的字元數多一個。

char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};

依據數組初始化規則,您可以把上面的語句寫成以下語句:

char greeting[] = "Hello";

C/C++ 中定義的字元串

不需要把 null 字元放在字元串常量的末尾。C++ 編譯器會在初始化數組時,自動把 '\0' 放在字元串的末尾

實例

#include <iostream>
 
using namespace std;
 
int main ()
{
   char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
 
   cout << "Greeting message: ";
   cout << greeting << endl;
 
   return 0;
}

當上面的代碼被編譯和執行時,它會產生下列結果:

Greeting message: Hello

C++ 中有大量的函數用來操作以 null 結尾的字元串:

strcpy(s1, s2);----複製字元串 s2 到字元串 s1。

strcat(s1, s2);----連接字元串 s2 到字元串 s1 的末尾。

strlen(s1);----返回字元串 s1 的長度。

strcmp(s1, s2);----如果 s1 和 s2 是相同的,則返回 0;如果 s1<s2 則返回值小於 0;如果 s1>s2 則返回值大於 0。

strchr(s1, ch);----返回一個指針,指向字元串 s1 中字元 ch 的第一次出現的位置。

strstr(s1, s2);----返回一個指針,指向字元串 s1 中字元串 s2 的第一次出現的位置。

C++ 中的 String 類

C++ 標準庫提供了 string 類類型,支持上述所有的操作,另外還增加了其他更多的功能。我們將學習 C++ 標準庫中的這個類,現在讓我們先來看看下麵這個實例:

現在您可能還無法透徹地理解這個實例,因為到目前為止我們還沒有討論類和對象。所以現在您可以只是粗略地看下這個實例,等理解了面向對象的概念之後再回頭來理解這個實例。

實例

#include <iostream>
#include <string>
 
using namespace std;
 
int main ()
{
   string str1 = "Hello";
   string str2 = "World";
   string str3;
   int  len ;
 
   // 複製 str1 到 str3
   str3 = str1;
   cout << "str3 : " << str3 << endl;
 
   // 連接 str1 和 str2
   str3 = str1 + str2;
   cout << "str1 + str2 : " << str3 << endl;
 
   // 連接後,str3 的總長度
   len = str3.size();
   cout << "str3.size() :  " << len << endl;
 
   return 0;
}

當上面的代碼被編譯和執行時,它會產生下列結果:

str3 : Hello
str1 + str2 : HelloWorld
str3.size() :  10

排序的實現

排序使用的選擇排序,採用的存儲方式為鏈式結構,根據對象的age進行排序參考的代碼為運用鏈表進行選擇排序,參考的代碼如下:

這段代碼為實驗課上所寫代碼

void LinkedListSelectSort(LinkList head){
    LinkList save,r,p,q,s; //list指向頭結點
        save = head;
        while(save->next){
                q = save->next;
                r=q;
                p=q->next;
                while(p){
                    if (p->data < q->data) //尋找值最小結點與其前驅結點
                    {
                        s = r;
                        q=p;
                    }
                    r = p;
                    p=p->next;
                }
                if (q!=save->next) //若最小結點不是第一個未排序結點
                {
                    s->next = q->next;
                    q->next = save->next;
                    save->next = q;
                } //將最小結點與前面一個鏈結點交換位置
                save = q;
        }
}

根據定義的對象進行適當的修改,即可實現升序與降序。
因為每次執行while函數是會進行文件的讀,排序結束是也會對文件進行寫,所以test.txt里的內容也會跟著改變;

加入一些判斷

1:加入對年紀的判斷,確保輸入的年紀在正確範圍內
2:加入對電話號碼的判斷,保證格式正確

實現文件分離

1.頭文件中不要使用using namespace,由於c++編譯的特性,由於初學還沒深入瞭解,不做具體編譯的解釋
2.由於沒有了命名空間,所以string定義要寫成std::string
3.main.cpp中引入staff.cpp,staff.cpp中引入staff.h

main.cpp

#include <iostream>
#include <string>
#include <fstream>

#include "staff.cpp"

staff.cpp

#include <iostream>
#include <string>
#include <fstream>
#include "staff.h"

using namespace std;

這樣就可以通過編譯了

第二次上機試驗

添加若文件里沒有數據顯示沒有數據

添加退出選擇功能

添加學歷選擇功能

添加性別選擇功能,若選擇錯誤需進行重新選擇

添加id排除重覆功能 ,輸入重覆的需進行重新選擇

修改數據是所有的查找不到的會提示沒有此人,併進行重新輸入,直到輸入的id號存在;

學習日期函數

C++ 標準庫沒有提供所謂的日期類型。C++ 繼承了 C 語言用於日期和時間操作的結構和函數。為了使用日期和時間相關的函數和結構,需要在 C++ 程式中引用 頭文件。

有四個與時間相關的類型:clock_t、time_t、size_t 和 tm。類型 clock_t、size_t 和 time_t 能夠把系統時間和日期表示為某種整數。

結構類型 tm 把日期和時間以 C 結構的形式保存,tm 結構的定義如下:

struct tm {
  int tm_sec;   // 秒,正常範圍從 0 到 59,但允許至 61
  int tm_min;   // 分,範圍從 0 到 59
  int tm_hour;  // 小時,範圍從 0 到 23
  int tm_mday;  // 一月中的第幾天,範圍從 1 到 31
  int tm_mon;   // 月,範圍從 0 到 11
  int tm_year;  // 自 1900 年起的年數
  int tm_wday;  // 一周中的第幾天,範圍從 0 到 6,從星期日算起
  int tm_yday;  // 一年中的第幾天,範圍從 0 到 365,從 1 月 1 日算起
  int tm_isdst; // 夏令時
}

當前日期和時間

下麵的實例獲取當前系統的日期和時間,包括本地時間和協調世界時(UTC)。
實例

#include <iostream>
#include <ctime>
 
using namespace std;
 
int main( )
{
   // 基於當前系統的當前日期/時間
   time_t now = time(0);
   
   // 把 now 轉換為字元串形式
   char* dt = ctime(&now);
 
   cout << "本地日期和時間:" << dt << endl;
 
   // 把 now 轉換為 tm 結構
   tm *gmtm = gmtime(&now);
   dt = asctime(gmtm);
   cout << "UTC 日期和時間:"<< dt << endl;
}

當上面的代碼被編譯和執行時,它會產生下列結果:


本地日期和時間:Sat Jan  8 20:07:41 2011

UTC 日期和時間:Sun Jan  9 03:07:41 2011

使用結構 tm 格式化時間

tm 結構在 C/C++ 中處理日期和時間相關的操作時,顯得尤為重要。tm 結構以 C 結構的形式保存日期和時間。大多數與時間相關的函數都使用了 tm 結構。下麵的實例使用了 tm 結構和各種與日期和時間相關的函數。

在練習使用結構之前,需要對 C 結構有基本的瞭解,並懂得如何使用箭頭 -> 運算符來訪問結構成員。
實例

#include <iostream>
#include <ctime>
 
using namespace std;
 
int main( )
{
   // 基於當前系統的當前日期/時間
   time_t now = time(0);
 
   cout << "1970 到目前經過秒數:" << now << endl;
 
   tm *ltm = localtime(&now);
 
   // 輸出 tm 結構的各個組成部分
   cout << "年: "<< 1900 + ltm->tm_year << endl;
   cout << "月: "<< 1 + ltm->tm_mon<< endl;
   cout << "日: "<<  ltm->tm_mday << endl;
   cout << "時間: "<< ltm->tm_hour << ":";
   cout << ltm->tm_min << ":";
   cout << ltm->tm_sec << endl;
}

當上面的代碼被編譯和執行時,它會產生下列結果:

1970 到目前時間:1503564157
年: 2017
月: 8
日: 24
時間: 16:42:37

時間的格式化

用到了#include <sstream>
c++ int i,j,k; stringstream s;//包含在sstream頭文件里 s<<1234; string ch = s.str(); cout<<ch<<endl; while(1); return 0;

具體怎麼用的在代碼中有所體現;

出生日期的計算:根據年齡,月份和日子自己輸入;

第三次實驗課

完成名字按字典排序,整段程式預設按字典寫入文件中,每次排序完畢顯示排序過後的數據

優化了界面,增加了修改界面可以返回上一界面

自動生成排序數據


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ORM一直是長久不衰的話題,各種重覆造輪子的過程一直在進行,輪子都一樣是圓的,你的又有什麼特點呢? CRL這個輪子造了好多年,功能也越來越標準完備,在開發過程中,解決了很多問題,先上一張腦圖描述CRL的功能 開發框架的意義在於 開發更標準,更統一,不會因為不同人寫的代碼不一樣 開發效率更高,無需重新 ...
  • 年前我們一起聊了 程式員為什麼要懂架構、架構是什麼 和 架構都有哪些類型 這三個話題,今天我們來看看架構師是怎樣開展工作的,他/她需要對接上下游哪些角色,以什麼作為工作輸入,最終要對外輸出什麼產物。這些內容既有助於我們跟架構崗同事更好的協作,也可以作為是否往架構轉型的參考,接下來我們一起揭開架構師的... ...
  • 老讀者都知道了,六年前,我從蘇州回到洛陽,抱著一幅“海歸”的心態,投了不少簡歷,也“約談”了不少面試官,但僅有兩三個令我感到滿意。其中有一位叫老馬,至今還活在我的手機通訊錄里。他當時扔了一個面試題把我砸懵了:“王二,Java 字元串可以引用傳遞嗎?” 我當時二十三歲,正值青春年華,從事 Java 編 ...
  • 如果對於Post提交,需要對參數進行urlEncode處理的需要註意。 對於Post參數,可以用TString或者TStringStream兩者。如果你採用的是用TStringStream,那麼必須按照要求,自行urlEncode處理。這裡沒有問題。 但如果你是用的TString參數。那麼請不要做u ...
  • 一個自己實現的Vector(只能處理基本類型數據) 轉載自: https://www.ev0l.art/index.php/archives/22/ string 類型不行 bool char int double float long long 等基本類型可用 使用模板類實現。底層為數組實現。 d ...
  • 給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和為目標值的那 兩個 整數,並返回他們的數組下標。 你可以假設每種輸入只會對應一個答案。但是,你不能重覆利用這個數組中同樣的元素。 示例: 給定 nums = [2, 7, 11, 15], target = 9 因為 num ...
  • 一、複習了一維數組,還複習了強制類型轉換的註意點。 package com.bjpowernode.java_learning; public class D67_1_GoDeepIntoArrays { public static void main(String[] args) { //創建一個 ...
  • 任何一種程式設計語言設計的程式在運行時都有可能出現錯誤。 捕獲錯誤最理想的是在編譯期間,但有的錯誤只有在運行時才會發生。 對於這些錯誤,一般有兩種解決方法: 遇到錯誤就終止程式的運行。 由程式員在編寫程式時,就考慮到錯誤的檢測、錯誤消息的提示,以及錯誤的處理。 java異常 在java語言中,將程式 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...