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

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

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

下面是一個整體概述,和一個README.md
其中README中之前分開寫過,此次把他都寫到了一塊兒,因此就有點多~~~c++

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

  1. 字符串使用

3.排序的實現程序員

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

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

5.實現文件分離編程

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

  1. 添加退出選擇功能app

  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;

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

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

第三次實驗課

完成名字按字典排序,整段程序默認按字典寫入文件中,每次排序完畢顯示排序事後的數據

優化了界面,增長了修改界面能夠返回上一界面

自動生成排序數據

相關文章
相關標籤/搜索