本次課程設計,我還挺幸運的,抽到一道這麼簡單的題,思路很簡單,但拓展很強,相比其餘同窗的,我這個簡直是。。。,真是運氣太好了,
代碼寫了1500多行吧,作課程設計中,我也學到了不少東西,代碼太多,就放到了github上了ios
下面是一個整體概述,和一個README.md
其中README中之前分開寫過,此次把他都寫到了一塊兒,因此就有點多~~~c++
先來一個整體概述:
1.fstream的使用git
3.排序的實現程序員
排序使用的選擇排序,採用的存儲方式爲鏈式結構,根據對象的age進行排序參考的代碼爲運用鏈表進行選擇排序github
5.實現文件分離編程
6.添加若文件裏沒有數據顯示沒有數據數組
添加退出選擇功能app
添加學歷選擇功能函數
9.添加性別選擇功能,若選擇錯誤需進行從新選擇學習
添加id排除重複功能 ,輸入重複的需進行從新選擇
修改數據是全部的查找不到的會提示沒有此人,並進行從新輸入,直到輸入的id號存在;
12.日期函數
13.使用結構 tm 格式化時間
14.#include <sstream>
時間的格式化
15.名字按字典排序,升序和降序;
16每次添加新員工,默認按名字字典升序寫入文件;
17.增長修改爲員界面的返回上一頁功能;
18.美化界面
19.自動生成排序數據
20.不寫了,好好複習下週的期末考試~~~~~~~~~!
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++ 中繼續獲得支持。字符串其實是使用 null 字符 '\0' 終止的一維字符數組。所以,一個以 null 結尾的字符串,包含了組成字符串的字符。
下面的聲明和初始化建立了一個 "Hello" 字符串。因爲在數組的末尾存儲了空字符,因此字符數組的大小比單詞 "Hello" 的字符數多一個。
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
依據數組初始化規則,您能夠把上面的語句寫成如下語句:
char greeting[] = "Hello";
不須要把 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++ 標準庫中的這個類,如今讓咱們先來看看下面這個實例:
如今您可能還沒法透徹地理解這個實例,由於到目前爲止咱們尚未討論類和對象。因此如今您能夠只是粗略地看下這個實例,等理解了面向對象的概念以後再回頭來理解這個實例。
實例
#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;
這樣就能夠經過編譯了
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 結構在 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;
具體怎麼用的在代碼中有所體現;