職工管理管理系統--課程設計
本次課程設計,我還挺幸運的,抽到一道這么簡單的題,思路很簡單,但拓展很強,相比其他同學的,我這個簡直是,,,,真是運氣太好了,
代碼寫了1500多行吧,做課程設計中,我也學到了很多東西,代碼太多,就放到了github上了
下面是一個總體概述,和一個README.md
其中README中以前分開寫過,這次把他都寫到了一起,所以就有點多~~~
先來一個總體概述:
1.fstream的使用
- 字串使用
3.排序的實作
排序使用的選擇排序,采用的存盤方式為鏈式結構,根據物件的age進行排序參考的代碼為運用鏈表進行選擇排序
- 1:加入對年紀的判斷,確保輸入的年紀在正確范圍內
2:加入對電話號碼的判斷,保證格式正確
5.實作檔案分離
6.添加若檔案里沒有資料顯示沒有資料
-
添加退出選擇功能
-
添加學歷選擇功能
9.添加性別選擇功能,若選擇錯誤需進行重新選擇
-
添加id排除重復功能 ,輸入重復的需進行重新選擇
-
修改資料是所有的查找不到的會提示沒有此人,并進行重新輸入,直到輸入的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;
具體怎么用的在代碼中有所體現;
出生日期的計算:根據年齡,月份和日子自己輸入;
第三次實驗課
完成名字按字典排序,整段程式默認按字典寫入檔案中,每次排序完畢顯示排序過后的資料
優化了界面,增加了修改界面可以回傳上一界面
自動生成排序資料
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/75516.html
標籤:C++
