c++課程設(shè)計報告通信錄
課程設(shè)計說明書
課程名稱 C++項目設(shè)計
設(shè)計題目
學(xué)生姓名 學(xué)號
專 業(yè)
指導(dǎo)教師
年 月 日
目錄
一、系統(tǒng)開發(fā)相關(guān)情況 1
(一)開發(fā)背景 1
(二)系統(tǒng)開發(fā)的目標 1
二、系統(tǒng)以及需求分析 1
(一)系統(tǒng)目標 1
三、程序功能描述以及模塊結(jié)構(gòu) 2
(一)功能模塊描述及主要類描述 2
(二)程序流程圖 3
(三)數(shù)據(jù)結(jié)構(gòu)表 4
四、用戶使用說明與調(diào)試結(jié)果 4
(一)使用說明 4
(二)調(diào)試結(jié)果 4
(三)優(yōu)缺點分析 8
五、總結(jié) 8
參考文獻: 9
附錄:職工信息管理系統(tǒng)源碼(C++) 9
隨著信息技術(shù)在管理上越來越深入而廣泛的應(yīng)用,管理信息系統(tǒng)的實施在技術(shù)上已逐步成熟。管理信息系統(tǒng)是一個不斷發(fā)展的新型學(xué)科,任何一個單位要生存要發(fā)展,要高效率地把內(nèi)部活動有機地組織起來,就必須建立與自身特點相適應(yīng)的管理信息系統(tǒng)。
本文介紹了在Microsoft Visual C++ 6.0環(huán)境下開發(fā)一個通訊錄的過程。
本系統(tǒng)界面友好,操作簡單,比較實用。
一、系統(tǒng)開發(fā)相關(guān)情況
(一) 開發(fā)背景
隨著信息技術(shù)在管理上越來越深入而廣泛的應(yīng)用,管理信息系統(tǒng)的實施在技術(shù)上已逐步成熟。管理信息系統(tǒng)是一個不斷發(fā)展的新型學(xué)科,任何一個單位要生存要發(fā)展,要高效率地把內(nèi)部活動有機地組織起來,就必須建立與自身特點相適應(yīng)的管理信息系統(tǒng)。
(二)系統(tǒng)開發(fā)的目標
為了更好地適應(yīng)我校的要求,進一步提供全方位的信息服務(wù)通訊錄在實施后應(yīng)該能夠達到以下的目標:
★ 能夠準確地記錄職工的相關(guān)信息。
★ 系統(tǒng)界面友好、操作簡單易行,查詢靈活方便,數(shù)據(jù)儲存安全可靠。
★ 系統(tǒng)維護安全、方便、可靠,并且能夠?qū)崿F(xiàn)實用性,先進性的要求。
二、系統(tǒng)以及需求分析
(一)系統(tǒng)目標
除了前面所述,我們所開發(fā)的系統(tǒng)還應(yīng)該具有以下功能:
⑴ 原始數(shù)據(jù)修改簡單方便;
⑵ 方便的數(shù)據(jù)查詢;
⑶ 刪除數(shù)據(jù)方便簡單,穩(wěn)定性好;
⑷ 數(shù)據(jù)計算自動完成,盡量減少人工干預(yù);
三、程序功能描述以及模塊結(jié)構(gòu)
(一)功能模塊描述及主要類描述
模塊一:增加人員函數(shù)Add();增加通訊錄基本信息。
模塊二:刪除人員函數(shù)Delete();刪除指定的學(xué)生的基本信息。
模塊三:修改人員函數(shù)Modify();修改指定的通訊錄基本信息。
模塊四:查詢?nèi)藛T信息函數(shù)Query();查詢指定的學(xué)生信息。
模塊五:數(shù)據(jù)存盤,載入函數(shù)Save()以及Load();儲存與載入基本信息。
模塊六:預(yù)覽數(shù)據(jù)void Look();預(yù)覽比較詳細的信息。
模塊七:刪除通訊錄void DesTory();刪除已載入的所有的信息。
模塊八:基礎(chǔ)數(shù)據(jù)設(shè)置函數(shù)void TJ();;統(tǒng)計男女的人數(shù),以及總?cè)藬?shù)。
本通訊錄采用了面向?qū)ο蟮某绦蛟O(shè)計方法。所有的方法均以類為基礎(chǔ)。所涉及到的類包括:
class Person 基本員工類;該類是一個基類,設(shè)置了屬于保護類的職工基本屬性,以及構(gòu)造函數(shù)Person(char ID,char *Name,int Duty)??梢越o職工類型繼承。
Class Manage 管理類;該類定義了管理函數(shù),即前文所述八個模塊功能的實現(xiàn)方法,鏈表的使用也包括其中。此類的作能在于將所有功能模塊集成并定義本系統(tǒng)使用的主要方法。
(二)程序流程圖
開始
定義變量
數(shù)據(jù)處理
調(diào)用輸出函數(shù)
Y
N
輸入C的值
C>=1&&C<=8
調(diào)用保存函數(shù)
調(diào)用預(yù)覽函數(shù)
調(diào)用清除函數(shù)
調(diào)
用
查詢
函數(shù)
調(diào)用輸出函數(shù)
調(diào)用修改函數(shù)
調(diào)用刪除函數(shù)
調(diào)用新增函數(shù)
調(diào)用統(tǒng)計函數(shù)
退出系統(tǒng)
圖 3-1 程序流程圖
(三)數(shù)據(jù)結(jié)構(gòu)表
序號
成員名
數(shù)據(jù)類型
長度
字段含義
1
No
string
學(xué)號
2
Name
char
20
名字
3
Sex
char
10
性別
4
Tel
string
20
聯(lián)系方式
5
Age
string
年齡
表3-1 數(shù)據(jù)結(jié)構(gòu)表
四、用戶使用說明與調(diào)試結(jié)果
(一)使用說明
這是一個關(guān)于職工信息管理系統(tǒng),具有錄入、輸出、刪除、查詢、修改、保存、統(tǒng)計等功能,建立了一個含有學(xué)號、姓名、性別、聯(lián)系方式等成員的類的變量class Person 。已從文本錄入了范例數(shù)據(jù)。調(diào)試過程中,可按照有關(guān)提示進行相關(guān)操作:
增加通訊錄按“1”鍵;
刪除通訊錄按“2”鍵;
修改通訊錄按“3”鍵;
查詢詳細通訊錄按“4”鍵;
保存通訊錄數(shù)據(jù)設(shè)置按“5”鍵;
預(yù)覽通訊錄按“6”鍵;
清除通訊錄按“7”鍵;
統(tǒng)計數(shù)據(jù)按“8”鍵。
(二)調(diào)試結(jié)果
★代碼中運用了switch 語句調(diào)用各子函數(shù),數(shù)字 1、2、3、4、5、6、7、8等七個數(shù)字代表不同的指令。
★系統(tǒng)啟動時,會自動在存放該系統(tǒng)的磁盤根目錄之下裝入一個數(shù)據(jù)文件:person.txt,調(diào)試時一個數(shù)據(jù)文件都已經(jīng)寫入部分數(shù)據(jù),使用功能“6-預(yù)覽通訊錄”,顯示如下:
★指令“n”為退回主界面,“y”代表進入查詢詳細信息界面:可以按照學(xué)號、名字、電話號碼查找較詳細信息
★指令“2-刪除通訊錄”代表調(diào)用刪除人員函數(shù)Delete(),要求操作者輸入職工的相關(guān)ID,系統(tǒng)根據(jù)操作者輸出的ID,找出對應(yīng)的記錄,然后刪除該職工的信息,如果刪除的是第一個結(jié)點,則 p1->next,指向第二個結(jié)點;下圖示范了刪除第一個節(jié)點之后的顯示結(jié)果:
如果刪除的是第i個(0< i <n)就把下一個結(jié)點地址賦給前一個結(jié)點地址;如果找不到對應(yīng)的ID,則不會刪除任何一個記錄,并輸出“未找到!”。
★指令“3-修改人員”代表調(diào)用修改人員函數(shù)Modify(),體統(tǒng)根據(jù)操作者輸入的ID找到對應(yīng)的記錄,將新輸入的數(shù)據(jù)對應(yīng)地賦給要修改的各成員。
★指令“5-保存數(shù)據(jù)”表示調(diào)用存盤函數(shù)Save(),輸入“Y”或者“N”以進一步操作。
★指令“8-統(tǒng)計”,調(diào)用TJ();函數(shù),按照男、女統(tǒng)計人數(shù):
★指令“7-清除通訊錄”,調(diào)用DesTory()清除已存數(shù)據(jù):
(三)優(yōu)缺點分析
優(yōu)點:
★ 系統(tǒng)中包含了輸入、輸出、保存、刪除、查詢、修改等多種功能,系統(tǒng)操作靈活性較強,功能較強大;
★ 可以隨意地選擇不同的指令進行操作;
★ 排版效果清晰明了,美觀;
★ 操作簡單方便。
缺點:
★ 由于該系統(tǒng)對數(shù)據(jù)采用文本保存方式,所以安全性不可靠。
★ 采用鏈表結(jié)構(gòu)操作,不能支持超大量的數(shù)據(jù),否則運行緩慢。
五、總結(jié)
本次設(shè)計我們選擇的題目是通訊錄。因為事先的計劃非常明確,所以我們在完成這個設(shè)計的過程也是比較順利的。在系統(tǒng)分析和設(shè)計的部分仍然花了比較多的時間。模塊設(shè)計部分因為涉及功能的實現(xiàn),要從抽象的設(shè)計轉(zhuǎn)化成實際的代碼,因此對于某項功能的實現(xiàn)方法都思考得比較詳盡。加上在開發(fā)系統(tǒng)之前,我們閱讀很多與本系統(tǒng)有相關(guān)內(nèi)容的書籍以做參考,使得此次系統(tǒng)編寫能順利進行。由于班里每個人都需要做一份設(shè)計,所以我們經(jīng)?;ハ嘟涣?。在交流的時候經(jīng)常能夠互相提出更好的建議。
經(jīng)過對通訊錄的分析與編寫,我得到了很大的收獲。自主學(xué)習的必要性更是解決問題的基礎(chǔ)。這次設(shè)計使我重溫了以前學(xué)過的各科知識,讓我對C++編程有了更深刻的認識。除了對系統(tǒng)作出正確的分析,實際的調(diào)查工作對系統(tǒng)的整體設(shè)計有著至關(guān)重要的作用。所以在分析系統(tǒng)之前,我花了一些時間在公司的實際管理工作調(diào)查上。也因為這樣,如何編寫代碼逐漸變得明朗。每一個功能模塊經(jīng)過調(diào)查后后,各個功能逐漸顯露出來,然后,反復(fù)探討,驗證這項功能是否有存在的必要,是否可以改進得更好。在這樣的前提下,最后順利完成了這份設(shè)計。
這次C++系統(tǒng)設(shè)計作業(yè),提升了我分析問題的能力和思考問題的邏輯能力,更明白實際調(diào)研的重要性。從這次設(shè)計學(xué)到的東西,相信會對我們?nèi)蘸蟮膶W(xué)習工作起到很大的指導(dǎo)作用
附錄:通訊錄系統(tǒng)源碼(C++)
#include<iostream>
#include<fstream>
#include<string>
#include<conio.h>
#include<Windows.h>
//#include<windows.h>
using namespace std;
string ID;//具有唯一性
class Person
{
protected:
string No; //學(xué)號
string Age;
char Name[20]; //姓名
char Sex[10]; //性別
string Tel; //聯(lián)系方式
Person *next;
public:
Person(string ID,char *Name,char *Sex,string Age,string Tel)
{
strcpy(this->Name,Name);
strcpy(this->Sex,Sex);
this->Tel=Tel;
this->No=ID;
this->Age=Age;
}
friend class Manage;
};
class Manage
{
private:
Person *person;
public:
Manage()
{
person=0;
Load();
}
~Manage()
{
Person *p;
p=person;
while(p)
{
p=p->next;
delete person;
person=p;
}
person=0;
}
void Find(char Name[20]);//按姓名查找
void Find(string ID);//按編號查找
void Add(); //添加加信息
void Delete(); //刪除信息
void Modify(string ID); //修改信息
void Query(); //查詢信息
void TJ(); //清除文件信息
void Save(); //保存數(shù)據(jù)
void Load(); //讀入數(shù)據(jù)
void Look();//預(yù)覽
void DesTory();
void Output(Person *p)
{
cout<<"\t\t學(xué)號: "<<p->No<<endl;
cout<<"\t\t姓名: "<<p->Name<<endl;
cout<<"\t\t性別: "<<p->Sex<<endl;
cout<<"\t\t年齡: "<<p->Age<<endl;
cout<<"\t\t聯(lián)系電話: "<<p->Tel<<endl;
cout<<endl;
}
};
void Manage::Add()
{
system("cls");
Person *p,*p2; //新結(jié)點指針
string No,Age,Tel;
char Name[20],Sex[10];
char c;
cout<<"\n** 新增學(xué)生通訊錄 **\n";
//輸入學(xué)生信息
cout<<"輸入學(xué)號:\t";
cin>>No;
cout<<endl;
{
Person *p1;
p1=person;
while(p1)
{
if(p1->No==No)
{
break;
}
else
{
p1=p1->next;
}
}
if(p1!=NULL)
{
cout<<"該學(xué)號已存在,是否修改該學(xué)生信息(Y/N) "<<endl;
cin>>c;
if(toupper(c)=='Y')
{
cout<<"該學(xué)生信息為:"<<endl;
Find(No);
cout<<endl;
Modify(No);
return ;
}
else
return ;
}
}
cout<<"輸入姓名:\t";
cin>>Name;
cout<<endl;
cout<<"輸入性別:\t";
cin>>Sex;
cout<<endl;
cout<<"輸入年齡:\t";
cin>>Age;
cout<<endl;
cout<<"輸入聯(lián)系方式:\t";
cin>>Tel;
cout<<endl;
p=new Person(No,Name,Sex,Age,Tel);
p->next=0;
//學(xué)生結(jié)點加入鏈表
if(person) //若已經(jīng)存在結(jié)點
{
p2=person;
while(p2->next) //查找尾結(jié)點
{
p2=p2->next;
}
p2->next=p; //連接
}
else //若不存在結(jié)點(表空)
{
person=p; //連接
}
system("cls");
cout<<"\t\t\t ***添加成功***\n"<<endl;
cout<<"是否繼續(xù)添加(Y/N) "<<endl;
cin>>c;
if(toupper(c)=='Y')
{
Add();
return ;
}
else
return ;
}
void Manage::Delete() //刪除人員
{
system("cls");
char c;
string No;
cout<<"\n** 刪除信息 **\n";
cout<<"輸入要刪除的學(xué)生ID:\t";
cin>>No;
cout<<endl;
//查找要刪除的結(jié)點
Person *p1,*p2;
p1=person;
while(p1)
{
if(p1->No==No)
break;
else
{
p2=p1;
p1=p1->next;
}
}
//刪除結(jié)點
if(p1!=NULL)//若找到結(jié)點,則刪除
{
cout<<"所要刪除的學(xué)生的信息如下:\n"<<endl;
Output(p1);
cout<<"確定是否刪除(Y/N): ";
cin>>c;
if(toupper(c)!='Y')
return;
// system("pause");
if(p1==person) //若要刪除的結(jié)點是第一個結(jié)點
{
person=p1->next;
delete p1;
}
else //若要刪除的結(jié)點是后續(xù)結(jié)點
{
p2->next=p1->next;
delete p1;
}
cout<<"\t\t***刪除成功***\n";
cout<<"是否繼續(xù)刪除(Y/N) "<<endl;
cin>>c;
if(toupper(c)=='Y')
{
Delete();
return ;
}
else
return ;
}
else //未找到結(jié)點
cout<<"未找到該學(xué)生!\n";
getch();
}
void Manage::Modify(string ID)
{
Person *p1;
char c;
p1=person;
while(p1)
{
if(p1->No==ID)
break;
else
{
p1=p1->next;
}
}
if(p1!=NULL)//若找到結(jié)點
{
system("cls");
cout<<"所要修改的學(xué)生的信息如下:\n"<<endl;
Output(p1);
do
{
cout<<"1. 修改姓名 2. 修改性別 3. 修改年齡 4. 修改聯(lián)系方式 5. 退出修改 \n"<<endl;
cout<<"請選擇(1-5)要修改的信息\n"<<endl;
cin>>c;
if(c!='5')
cout<<"請輸入新的信息: ";
switch(c)
{
case '1': cin>>p1->Name; break;
case '2': cin>>p1->Sex; break;
case '3': cin>>p1->Age; break;
case '4': cin>>p1->Tel; break;
default: break;
}
}while(c!='5');
system("cls");
cout<<"\t ***修改成功***\n"<<endl;
cout<<"是否繼續(xù)修改(Y/N): "<<endl;
cin>>c;
if(toupper(c)=='Y')
{
cout<<"請輸入要修改人員的ID: ";
cin>>ID;
cout<<endl;
Modify(ID);
return ;
}
else
return ;
}
else //未找到結(jié)點
cout<<"未找到該學(xué)生!\n";
getch();//暫停
}
void Manage::Save() //數(shù)據(jù)寫入到文件
{
ofstream fPerson("Person.txt",ios::out);
char c;
cout<<"\n保存數(shù)據(jù),是否繼續(xù)?[Y/N]:";
cin>>c;
if(toupper(c)!='Y')
return;
Person *p=person;
while(p)
{
fPerson<<p->No<<" "<<p->Name<<" "<<p->Sex<<" "<<p->Age<<" "<<p->Tel<<endl;
p=p->next;
}
fPerson.close();
cout<<"\n保存成功...\n";
system("pause");
}
void Manage::Load() //數(shù)據(jù)讀入
{
ifstream fPerson;
Person *p=person;
string No,Age,Tel;
char Name[20],Sex[10];
fPerson.open("person.txt",ios::in);
fPerson>>No>>Name>>Sex>>Age>>Tel;
while(fPerson.good())
{
p=new Person(No,Name,Sex,Age,Tel);
p->next=0;
//員工結(jié)點加入鏈表
if(person) //若已經(jīng)存在結(jié)點
{
Person *p2;
p2=person;
while(p2->next) //查找尾結(jié)點
{
p2=p2->next;
}
p2->next=p; //連接
}
else //若不存在結(jié)點(表空)
{
person=p; //連接
}
fPerson>>No>>Name>>Sex>>Age>>Tel;
}
fPerson.close();
}
void Manage::Find(string ID)
{
Person *p1;
p1=person;
while(p1)
{
if(p1->No==ID)
break;
else
{
p1=p1->next;
}
}
if(p1!=NULL)
{
Output(p1);
}
else
cout<<"未找到該學(xué)生"<<endl;
}
void Manage::Find(char Name[20])
{
Person *p1;
int count=0;
p1=person;
while(p1)
{
if(strcmp(p1->Name,Name)==0)
{
count++;
Output(p1);
}
p1=p1->next;
}
if(count)
{
cout<<"\t查詢成功!!!"<<endl;
cout<<"\n共找到 "<<count<<" 個名字為 ★"<<Name<<"★ 的同學(xué)\n"<<endl;
}
else
cout<<"\n\t\t未找到該學(xué)生!!!\n"<<endl;
}
void Manage::Query()
{
char c;
string ID,Tel;
char Name[20];
do{
cout<<"1. 按學(xué)號查找 2. 按名字查找 3. 按電話號碼查找 4.退出查找"<<endl;
cin>>c;
// system("cls");
cout<<endl;
switch(c)
{
case '1': {
cout<<"輸入學(xué)號 ID: ";
cin>>ID;
Find(ID);
}; break;
case '2': {
cout<<"輸入姓名 Name: ";
cin>>Name;
Find(Name);
}; break;
case '3': {
cout<<"輸入電話號碼 Tel"<<endl;
cin>>Tel;
Find(Tel);
};break;
case '4':break;
default: cout<<"輸入有誤 請重新輸入!!!\n"<<endl;
}
}while(c!='1'&&c!='2'&&c!='3'&&c!='4');
cout<<"\t\t\t ***查找成功***\n"<<endl;
cout<<"是否繼續(xù)查找(Y/N) "<<endl;
cin>>c;
if(toupper(c)=='Y')
{
Query();
return ;
}
else
return ;
system("pause");
}
void Manage::Look()
{
//設(shè)置字體顏色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED | FOREGROUND_GREEN);
system("cls");
Person *p1;
int count=0;
char c;
p1=person;
while(p1)
{
cout<<"ID: "<<p1->No<<"\t姓名: "<<p1->Name<<endl;
count++;
p1=p1->next;
}
if(count!=0)
{
cout<<"\n\t\t預(yù)覽成功!!! \n"<<endl;
cout<<"查詢詳細信息(Y/N): ";
cin>>c;
if(toupper(c)=='Y')
{
Query();
return;
}
else
return ;
}
else
{
cout<<"尚未創(chuàng)建通訊錄,是否創(chuàng)建(Y/N)"<<endl;
cin>>c;
if(toupper(c)=='Y')
{
Add();
return;
}
else
return ;
}
}
void Manage::DesTory()
{ //設(shè)置字體為紅色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_RED);
char c;
system("cls");
cout<<"\n\t\t\t** 清除信息 **\n";
cout<<"警告:\n 清除通訊錄信息會導(dǎo)致您保存的信息完全消失!!!\n"<<endl;
cout<<"★是否決定清除通訊錄信息(Y/N): "<<endl;
cin>>c;
if(toupper(c)!='Y')
return;
cout<<"請再次確認(Y/N)"<<endl;
cin>>c;
if(toupper(c)!='Y')
return;
else
{
Person *p;
p=person;
while(p)
{
p=p->next;
delete person;
person=p;
}
person=0;
// ofstream fPerson("person.txt");
// fPerson.close();
}
system("pause");
}
void Manage::TJ()
{
Person *p1;
int count=0,Boy=0,Girl=0;
p1=person;
while(p1)
{
count++;
if(strcmp(p1->Sex,"男")==0)
Boy++;
if(strcmp(p1->Sex,"女")==0)
Girl++;
p1=p1->next;
}
cout<<"\n總共有 "<<count<<"份通訊錄\n"<<endl;
cout<<"男生: "<<Boy<<"\t 女生: "<<Girl<<"\n"<<endl;
system("pause");
}
int main(void)
{
Manage m;
int c;
do
{
//設(shè)置字體為綠色
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY |
FOREGROUND_GREEN);
system("cls");
cout<<" =========================================="<<endl;
cout<<" ★ ☆\t 1.新增通訊錄 \t☆ ★"<<endl;
cout<<" ★ ☆\t 2.刪除通訊錄 \t☆ ★"<<endl;
cout<<" ★ ☆\t 3.修改通訊錄 \t☆ ★"<<endl;
cout<<" ★ ☆\t 4.查詢詳細信息 \t☆ ★"<<endl;
cout<<" ★ ☆\t 5.保存數(shù)據(jù) \t☆ ★"<<endl;
cout<<" ★ ☆\t 6.預(yù)覽信息 \t☆ ★"<<endl;
cout<<" ★ ☆\t 7.清除通訊錄 \t☆ ★"<<endl;
cout<<" ★ ☆\t 8.統(tǒng)計 \t☆ ★"<<endl;
cout<<" =========================================="<<endl;
cout<<"0-退出\t請選擇(1-8): ";
cin>>c;
switch(c)
{
case 1: m.Add(); break;
case 2: m.Delete();break;
case 3: {
system("cls");
cout<<"請輸入要修改人員的ID: ";
cin>>ID;
cout<<endl;
m.Modify(ID);
};break;
case 4: {
system("cls");
m.Query();
}; break;
case 5: m.Save(); break;
case 6: m.Look(); break;
case 7: m.DesTory(); break;
case 8: m.TJ(); break;
default: break;
}
}while(c!=0);
char s;
cout<<"\n★是否要保存您的所有操作(Y/N): "<<endl;
cin>>s;
if(toupper(s)=='Y')
m.Save();
return 0;
}
25