第一篇:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)—java通訊錄管理系統(tǒng)
import java.io.*;import java.util.*;public class LittleProgram {
static boolean isDelete = true;
static boolean isFind = true;
public static void main(String [] args)//主方法,程序從這里開始運(yùn)行
throws IOException,NumberNotFoundException
{
int choice=-1;
do{
LittleProgram lp = new LittleProgram();
System.out.println();
System.out.println(“t
#”);
System.out.println();
System.out.println(“tt通訊錄管理系統(tǒng)”);
System.out.println(“t
請(qǐng)用號(hào)碼插入,查找,修改,刪除數(shù)據(jù)”);
System.out.println();
System.out.println(“t
#n”);
System.out.print(“1.增加號(hào)碼:n”+
“2.查找號(hào)碼:n”+
“3.刪除號(hào)碼:n”+ “4.清除所有號(hào)碼:n”+ “5.把號(hào)碼全部打印到屏幕n”+ “6.把通訊錄按號(hào)碼排序n”+
“7.修改號(hào)碼n”+
“8.統(tǒng)計(jì)通碼訊錄的總?cè)藬?shù)n”+
“9.關(guān)于作者n”+
“0.退出程序.n” +
“輸入:”);
BufferedReader in =
//從終
new BufferedReader(//端接
new InputStreamReader(System.in));//收數(shù)
String inputLine = in.readLine();
//字選
choice= Integer.valueOf(inputLine).intValue();//項(xiàng);
switch(choice)
{
case 1: {//1.增加號(hào)碼
String str = lp.inputData();
lp.addData(str);
System.out.println(“增加號(hào)碼成功.”);
timeOut(1);
}break;
case 2: {//2.查找號(hào)碼
long find = 0;
System.out.print(“請(qǐng)輸入你要查找的號(hào)碼:”);
BufferedReader inn =
new BufferedReader(new InputStreamReader(System.in));
String inputLi = inn.readLine();
find = Integer.valueOf(inputLi).longValue();
lp.findData(find);
timeOut(2);
}break;
case 3: {//3.刪除號(hào)碼
long deleteNumber = 0;
System.out.print(“請(qǐng)輸入你想刪除號(hào)碼:”);
BufferedReader bf =
new BufferedReader(new InputStreamReader(System.in));
String inputL = bf.readLine();
deleteNumber = Integer.valueOf(inputL).longValue();
lp.deleteData(deleteNumber);
if(isDelete)
System.out.println(“刪除號(hào)碼成功!”);
timeOut(1);
}break;
case 4: {
lp.clearData();//4.清除所有號(hào)碼
timeOut(1);
}break;
case 5: {
print();//5.把號(hào)碼全部打印到屏幕
timeOut(2);
}break;
case 6: {
lp.numSort();//6.把號(hào)碼按號(hào)碼排序
System.out.println(“按照號(hào)碼從小到大排序成功!n”+
“排序后:n”);
print();
timeOut(2);
}break;
case 7: {
lp.rewrite();//7.修改號(hào)碼
timeOut(2);
}break;
case 8: {
int count = lp.count();
System.out.println(“共有”+count+“個(gè)號(hào)碼記錄.”);
timeOut(2);
}break;
case 9: {
System.out.print(“tt李雪萍n”+
“tt安徽理工大學(xué)理學(xué)院n”+
“ttQQ:1154646392n”);
timeOut(4);
}break;
}}while(choice!= 0);
System.out.println(“Bye!^-^”);
System.exit(0);
}
public String inputData()//從終端接收數(shù)據(jù)的方法,返回字符串
throws IOException,NumberFormatException
{
System.out.print(“請(qǐng)依次輸入 :號(hào)碼 姓名 地址 生日n” +
“每項(xiàng)數(shù)據(jù)請(qǐng)用空格隔開:”);
String all = “";
try{
BufferedReader in =
//從終
new BufferedReader(//端接
new InputStreamReader(System.in));
//收數(shù)
String inputLine = in.readLine();
//據(jù)
StringTokenizer str =
new StringTokenizer(inputLine,” “);//接收的數(shù)據(jù)用空格隔開,這個(gè)類用來提取每個(gè)字符串
long num = Integer.valueOf(str.nextToken()).longValue();//號(hào)碼
String name =(String)str.nextToken();
//姓名
String add =(String)str.nextToken();
// 地址
String birth =(String)str.nextToken();//出生年月
all = String.valueOf(num)+” , “+
name +” , “+
add +” , “+
String.valueOf(birth);//把所有的數(shù)據(jù)用” , “隔開然后在連起來放進(jìn)字符串a(chǎn)ll
}catch(IOException e){}
catch(NumberFormatException e){}
return all;//返回字符串a(chǎn)ll
}
public void addData(String str)//增加號(hào)碼的方法
throws IOException
{
String s1 =”“,s2=”“ ,s3= ”“;
File file = new File(”c:data.txt“);
if(file.exists())//如果文件data.txt存在 {
try{
BufferedReader in =
new BufferedReader(new FileReader(file));
while((s1=in.readLine())!=null)
s2+=s1+”n“;//把文件中的每行數(shù)據(jù)全部放進(jìn)一個(gè)字符串s2
s2+=str+”n“;
//再把s2于形參str相連放進(jìn)s2
BufferedReader in2 =
//把字符
new BufferedReader(//串s2也
new StringReader(s2));
//就是原
PrintWriter out =
//文件+
new PrintWriter(//形參str(新輸入的一行數(shù)據(jù))
new BufferedWriter(//重新寫進(jìn)data.txt
new FileWriter(file)));
//覆蓋原來的數(shù)據(jù)
while((s3=in2.readLine())!= null)
{
out.println(s3);
}
out.close();
//System.out.println(”write data true.“);
}catch(IOException e){}
}else{
System.err.println(”File “data” Missing!“);
}
}
public void clearData()//清除data.txt的所有數(shù)據(jù)的方法
throws IOException
{
File file = new File(”c:data.txt“);
if(file.exists())//如果文件在{
try{
PrintWriter out =
new PrintWriter(new BufferedWriter(new FileWriter(file)));
out.print(”“);//在文件data.txt里寫進(jìn)一個(gè)空字符,所以清除了原來的內(nèi)容
out.close();//關(guān)閉文件
System.out.println(”clear data true!“);
}catch(IOException e){}
}else{
System.err.println(”File “data” Missing!“);
}
}
public void deleteData(long deleteNumber)//刪除某條號(hào)碼數(shù)據(jù)
throws IOException,FileNotFoundException
{
isDelete = true;
try{
DataMap mp = new DataMap();//生成一個(gè)自己編寫的容器
long j=0;
String s1=”“,s2=”“,s3=”“;
BufferedReader in =
new BufferedReader(new FileReader(”c:data.txt“));
while((s1=in.readLine())!=null)
{
j=numberTokenizer(s1);
mp.put(j,s1);
}
try{
if(mp.containsKey(String.valueOf(deleteNumber).toString()))
{
mp.remove(deleteNumber);
}else
throw new NumberNotFoundException();
Collection c = mp.values();
Iterator iter = c.iterator();
while(iter.hasNext())
{
s1 =(String)iter.next();
s3 +=s1+”n“;
}
BufferedReader in2 =
new BufferedReader(new StringReader(s3));
PrintWriter out =
new PrintWriter(new BufferedWriter(new FileWriter(”c:data.txt“)));
//System.out.println(”delete No“+deleteNumber);
while((s1 = in2.readLine())!=null)
{
out.println(s1);
} out.close();}catch(NumberNotFoundException e){
isDelete = false;
System.out.println(deleteNumber+” no found :(“);
}
}catch(IOException e){}
}
public long numberTokenizer(String s)
throws IOException
{
StringTokenizer st =
new StringTokenizer(s,” “);
return Integer.valueOf((st.nextToken())).longValue();
}
public void findData(long find)//查找數(shù)據(jù)
throws IOException,NumberNotFoundException
{
isFind = true;
String s = ”“,findString =”“;long i;DataMap dm = new DataMap();BufferedReader in =
new BufferedReader(new FileReader(”c:data.txt“));
while((s=in.readLine())!=null)
{
i=numberTokenizer(s);
dm.put(i,s);
}
//in.close();
try{
if(dm.containsKey(String.valueOf(find).toString()))
{
findString = dm.get(find);
System.out.println(”學(xué)號(hào)“+find+”學(xué)生的資料是:“);
System.out.println(findString);
}else
throw new NumberNotFoundException();
}catch(NumberNotFoundException e){
System.out.println(find+” no found :(“);
isFind = false;
}
}
public static void print()//讀取文本文件把數(shù)據(jù)打印到終端的方法
throws IOException
{
try{
BufferedReader in =
new BufferedReader(new FileReader(”c:data.txt“));
String read = ”“;
while((read = in.readLine())!=null)
System.out.println(read);
}catch(IOException e){}
}
public static void timeOut(double sec)//停頓短暫時(shí)間的一個(gè)方法完全可以不要這個(gè)功能
{
double seconds = sec;
long t = System.currentTimeMillis()+(int)(seconds*1000);
while((System.currentTimeMillis()) ; } public void numSort()//按學(xué)號(hào)排序 throws IOException { long i = 0; String s = ”“; try{ DataArrayList dal = new DataArrayList(); BufferedReader in = new BufferedReader(new FileReader(”c:data.txt“)); while((s=in.readLine())!=null) { i=numberTokenizer(s); dal.add(i); } Collections.sort(dal); DataMap dm = new DataMap(); BufferedReader in2 = new BufferedReader(new FileReader(”c:data.txt“)); while((s=in2.readLine())!=null) { i=numberTokenizer(s); dm.put(i,s); } PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(”c:data.txt“))); Iterator it = dal.iterator(); long temp = 0; String tempStr = ”“; while(it.hasNext()) { temp = Integer.valueOf((String)it.next()).longValue(); tempStr = dm.get(temp); out.println(tempStr); } out.close(); }catch(IOException e){} } public void rewrite() throws IOException,NumberNotFoundException { try{ System.out.print(”請(qǐng)輸入你要修改的學(xué)生號(hào)碼:“); BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); String inputLine = in.readLine(); long num = Integer.valueOf(inputLine).longValue(); findData(num); if(isFind) { deleteData(num);System.out.print(”請(qǐng)重新輸入該號(hào)碼:“);String str = inputData(); addData(str); System.out.println(”rewrite true!“); } }catch(IOException e){} catch(NumberNotFoundException e){} } public int count() throws IOException { DataArrayList dal = new DataArrayList(); try{ String s = ”“; long i =0; BufferedReader in = new BufferedReader(new FileReader(”c:data.txt“)); while((s=in.readLine())!=null) { i=numberTokenizer(s); dal.add(i); } }catch(IOException e){} return dal.size(); } } /* * * @author RangWei * TODO 這是個(gè)寫的一個(gè)容器,繼承公共類HashMap * 大概的功能就相當(dāng)一個(gè)數(shù)組 * */ class DataMap extends HashMap//一個(gè)存儲(chǔ)數(shù)據(jù)的Map { public void put(long i,String str)//把學(xué)號(hào)和數(shù)據(jù)放進(jìn)這個(gè)Map { //以后一個(gè)學(xué)號(hào)(key)對(duì)應(yīng)的是一個(gè)人的數(shù)據(jù)(value) put(String.valueOf(i).toString(),str); } public void remove(long i)//接收學(xué)號(hào),然后刪除學(xué)號(hào)(key)和它對(duì)應(yīng)的數(shù)據(jù)(value) { remove(String.valueOf(i).toString().toString()); } public String get(long i)//接收一個(gè)學(xué)號(hào),然后返回這個(gè)key對(duì)應(yīng)的value { String s = String.valueOf(i).toString(); if(!containsKey(s)) { System.err.println(”Not found Key: "+s); } return(String)get(s); } } /* * * @author RangWei * * TODO 這個(gè)類繼承ArrayList * 用來按數(shù)字排序,在用號(hào)碼排序時(shí)要用到它 * */ class DataArrayList extends ArrayList { public void add(long num) { String numToString = String.valueOf(num).toString(); add(numToString); } } /* * * @author RangWei * * TODO 增加的一個(gè)Exception,主要是在文件里沒有要找 * 的號(hào)碼就拋出 * */ class NumberNotFoundException extends Exception { public NumberNotFoundException() {} } 信息科學(xué)與技術(shù)學(xué)院 程序設(shè)計(jì)基礎(chǔ)課程設(shè)計(jì)報(bào)告 題目名稱: 通信管理系統(tǒng) 學(xué)生姓名: 學(xué) 號(hào): 專業(yè)班級(jí): 指導(dǎo)教師: 2016年 12月 31日 目錄 1.課程設(shè)計(jì)題目與要求........................1 1.1設(shè)計(jì)題目..........................................1 1.2設(shè)計(jì)要求..........................................1 2.總體設(shè)計(jì)..................................2 2.1 總體功能框架......................................2 2.2 數(shù)據(jù)結(jié)構(gòu)概要設(shè)計(jì)..................................2 3.詳細(xì)設(shè)計(jì)..................................3 3.1 數(shù)據(jù)結(jié)構(gòu)詳細(xì)設(shè)計(jì)..................................3 3.2 系統(tǒng)功能詳細(xì)設(shè)計(jì).................................10 4.運(yùn)行結(jié)果.................................16 5.課程設(shè)計(jì)總結(jié).............................20 5.1 編程中的問題及解決方法...........................20 5.2 小結(jié).............................................20 5.3 心得體會(huì).........................................20 5.4 程序設(shè)計(jì)方法.....................................20 參考文獻(xiàn)...................................21 1.課程設(shè)計(jì)題目與要求 1.1設(shè)計(jì)題目 通信管理系統(tǒng) 1.2設(shè)計(jì)要求 用C/C++設(shè)計(jì)出模擬手機(jī)通信錄管理系統(tǒng),實(shí)現(xiàn)對(duì)手機(jī)中的通信錄進(jìn)行管理。 (一)功能要求 (1)查看功能:選擇此功能時(shí),列出下列三類選擇。 A 辦公類 B 個(gè)人類 C 商務(wù)類,當(dāng)選中某類時(shí),顯示出此類所有數(shù)據(jù)中的姓名和電話號(hào)碼) (2)增加功能:能錄入新數(shù)據(jù)(一個(gè)結(jié)點(diǎn)包括:姓名、電話號(hào)碼、分類(可選項(xiàng)有:A 辦公類 B 個(gè)人類 C 商務(wù)類)、電子郵件)。例如 楊春 *** 商務(wù)類 Chuny@126.C++om 當(dāng)錄入了重復(fù)的姓名和電話號(hào)碼時(shí),則提示數(shù)據(jù)錄入重復(fù)并取消錄入;當(dāng)通信錄中超過15條信息時(shí),存儲(chǔ)空間已滿,不能再錄入新數(shù)據(jù);錄入的新數(shù)據(jù)能按遞增的順序自動(dòng)進(jìn)行條目編號(hào)。 (3)拔號(hào)功能:能顯示通信錄中所有人姓名,當(dāng)選中某個(gè)姓名時(shí),屏幕上模擬打字機(jī)的效果依次顯示此人電話號(hào)碼中的各個(gè)數(shù)字,并伴隨相應(yīng)的拔號(hào)聲音。 (4)修改功能:選中某個(gè)人的姓名時(shí),可對(duì)此人的相應(yīng)數(shù)據(jù)進(jìn)行修改(5)刪除功能:選中某個(gè)人的姓名時(shí),可對(duì)此人的相應(yīng)數(shù)據(jù)進(jìn)行刪除,并自動(dòng)調(diào)整后續(xù)條目的編號(hào)。 (二)其它要求: (1)只能使用C/C++語言,源程序要有適當(dāng)?shù)淖⑨?,使程序容易閱讀(2)至少采用文本菜單界面(如果能采用圖形菜單界面更好)(3)建議使用結(jié)構(gòu)和鏈表等數(shù)據(jù)結(jié)構(gòu) (4)學(xué)生可自動(dòng)增加新功能模塊(視情況可另外加分)2.總體設(shè)計(jì) 2.1 總體功能框架 新增聯(lián)系人查看通信錄撥號(hào) 功能模塊 修改信息刪除聯(lián)系人導(dǎo)入通信錄導(dǎo)出通信錄 退出系統(tǒng) 圖 2-1 總體功能框架圖 2.2 數(shù)據(jù)結(jié)構(gòu)概要設(shè)計(jì) 本通信管理系統(tǒng)采用的數(shù)據(jù)結(jié)構(gòu)為線性表中的鏈表。鏈表的結(jié)構(gòu)體成員分為數(shù)據(jù)域和指針域。數(shù)據(jù)域?yàn)槁?lián)系人(contacts)結(jié)構(gòu)體,成員有聯(lián)系人姓名(name)、聯(lián)系人電話號(hào)碼(teleNum)、聯(lián)系人類別(classes)、電子郵件(email)四個(gè)。 圖 2-2 數(shù)據(jù)結(jié)構(gòu)組成 3.詳細(xì)設(shè)計(jì) 3.1 數(shù)據(jù)結(jié)構(gòu)詳細(xì)設(shè)計(jì) 結(jié)構(gòu)體名稱:contact,LNode,*LinkList typedef struct { string name;//姓名 string teleNum;//電話號(hào)碼 int classes;//分類 string email;//電子郵件 }contacts; typedef struct LNode { contacts data;//數(shù)據(jù)域 struct LNode* next;//指針域 }LNode,*LinkList; 具體操作: InitList(&L)操作結(jié)果:初始化鏈表 具體代碼: int InitList(LinkList &L){ L = new LNode;L->next = NULL;return 0;} CreateList_H(&L,n)操作結(jié)果:前插法創(chuàng)建一個(gè)鏈表 具體代碼: void CreateList_H(LinkList &L,int n){ LinkList p;for(int i = 0;i < n;i++)//根據(jù)聯(lián)系人個(gè)數(shù)創(chuàng)建鏈表 { p = new LNode;cout <<“請(qǐng)輸入聯(lián)系人的姓名:”; cin >> p->data.name;cout <<“請(qǐng)輸入聯(lián)系人的電話號(hào)碼:”;cin >> p->data.teleNum;cout <<“請(qǐng)輸入聯(lián)系人的分類(分類如下,輸入相應(yīng)序號(hào)即可)”<< endl;cout <<“1 辦公類 2 個(gè)人類 3 商務(wù)類”<< endl;cin >> p->data.classes;cout <<“請(qǐng)輸入聯(lián)系人的電子郵件:”;cin >> p->data.email;p->next = L->next;L->next=p;} } CheckAll(L,c) 操作結(jié)果:顯示類別為c的聯(lián)系人姓名和電話號(hào)碼 具體代碼: void CheckAll(LinkList L,int c)//c是聯(lián)系人類別 { LinkList p; p = L->next; cout <<“姓名tt”<<“電話號(hào)碼”<< endl;//表頭 while(p)//當(dāng)鏈表沒到尾部時(shí) { if(p->data.classes==c)//若符合類別則輸出聯(lián)系人姓名和電話號(hào)碼 { cout << p->data.name <<“tt”<< p->data.teleNum << endl; } p=p->next; } } CheckAll(L) 操作結(jié)果:顯示已有聯(lián)系人的姓名 具體代碼: void CheckAll(LinkList L){ LinkList p;p=L->next;while(p) { cout << p->data.name << endl;p=p->next;} } Search(L, name) 操作結(jié)果:找到名為name的聯(lián)系人位置 具體代碼: LinkList Search(LinkList L,string name){ LinkList p;p=L->next;while(p&&p->data.name!=name)//當(dāng)鏈表沒到尾部且沒找到聯(lián)系人時(shí) { p=p->next;} return p;} IfExist(L, c)操作結(jié)果:判斷是否存在聯(lián)系人contacts 具體代碼: char IfExist(LinkList L,contacts c){ LinkList p;p=L->next;while(p&&p->data.name!=c.name)//根據(jù)姓名查找是否存在該聯(lián)系人 { p=p->next;} if(!p)//若到達(dá)鏈表尾部,則不存在 return 'n';if(p->data.teleNum==c.teleNum)//若找到聯(lián)系人姓名 if(p->data.classes==c.classes)//依次判斷電話號(hào)碼、類別、電子郵件是否相同 if(p->data.email==c.email)return 'y';return 'n';} Length(L) 操作結(jié)果:獲取鏈表的長(zhǎng)度 具體代碼: int Length(LinkList L){ int i=0;LinkList p=L->next;while(p){ ++i;p=p->next;} return i;} Add(&L, c)操作結(jié)果:把contacts添加到鏈表中 具體代碼: int Add(LinkList &L,contacts c){ LinkList p,s;if(Length(L)>=MAXSIZE)//判斷鏈表長(zhǎng)度是否達(dá)到最大值 { cout <<“存儲(chǔ)空間已滿,無法新增聯(lián)系人!”<< endl;return 0;} if(IfExist(L,c)=='y')//判斷輸入的聯(lián)系人是否已經(jīng)存在 { cout <<“對(duì)不起,您輸入的聯(lián)系人已存在!”<< endl;return 0;} //若通訊錄中不存在該聯(lián)系人,則增加到通信錄 p=L;s=new LNode;s->data=c;s->next=p->next;p->next=s;return 0;} Dail(L,name) 操作結(jié)果:撥打姓名為name的聯(lián)系人的電話 具體代碼: void Dail(LinkList L,string name){ LinkList p,s;p=L->next;s=Search(L,name);//根據(jù)姓名查找聯(lián)系人所在 //模擬打字機(jī)效果,輸出聯(lián)系人電話號(hào)碼 string tele=s->data.teleNum;for(int i=0;i cout << endl;//播放聲音 PlaySound(“E:670.wav”,NULL,SND_FILENAME|SND_ASYNC);} ChangeInfo(&L,name)操作結(jié)果:修改姓名為name的聯(lián)系人的信息 具體代碼: void ChangeInfo(LinkList &L,string name){ LinkList p;p=Search(L,name);//找到聯(lián)系人的位置所在 cout <<“ 請(qǐng)輸入要修改的信息(輸入對(duì)應(yīng)序號(hào)即可):”<< endl;cout <<“1 姓名”<< endl;cout <<“2 電話號(hào)碼”<< endl;cout <<“3 分類”<< endl;cout <<“4 電子郵件”<< endl; //根據(jù)選擇修改聯(lián)系人信息 int elec;cin >> elec;switch(elec){ case 1: { cout <<“姓名改為:”<< endl;string newName;cin >> newName;p->data.name=newName;break;} case 2: { cout <<“電話號(hào)碼改為:”< cout <<“分類改為(分類如下,輸入相應(yīng)序號(hào)即可)”;cout <<“1 辦公類 2 個(gè)人類 3 商務(wù)類”<< endl;int newCalsses;cin >> newCalsses;p->data.classes=newCalsses;break;} case 4: { cout <<“電子郵件改為:”<< endl;string newEmail;cin >> newEmail;p->data.email=newEmail;break;} } } Delete(&L,name)操作結(jié)果:刪除姓名為name的聯(lián)系人 具體代碼: void Delete(LinkList &L,string name){ LinkList p=L,s;//找到需刪除聯(lián)系人的前一個(gè)位置 while(p->next&&p->next->data.name!=name){ p=p->next;} s=p->next;p->next=s->next;delete s;//刪除聯(lián)系人 } Read(L)操作結(jié)果:從文件中讀入信息到鏈表 具體代碼: void Read(LinkList L){ LinkList p; //打開文件導(dǎo)入通信錄 ifstream fin;fin.open(“通信錄.txt”,ios::in);string s1,s2,s3,s4;fin >> s1 >> s2 >> s3 >> s4; while(!fin.eof())//當(dāng)沒有到文件尾時(shí) { string s5; contacts c; fin >> c.name >> c.teleNum >> s5 >> c.email; if(s5.compare(“辦公類”)==0) c.classes=1; if(s5.compare(“個(gè)人類”)==0) c.classes=2; if(s5.compare(“商務(wù)類”)==0) c.classes=3; Add(L,c);//將聯(lián)系人c增加到鏈表中 } fin.close();} 操作結(jié)果:將所有聯(lián)系人導(dǎo)出到文件里保存 具體代碼: void Write(LinkList L)Write(L){ endl; } LinkList p=L->next;int l=Length(L);//打開文件寫入通信錄 ofstream fout(“通信錄.txt”,ios::out|ios::trunc);fout <<“姓名t”<<“電話號(hào)碼t”<<“分類t”<<“電子郵件 ”<< for(int i=0;i case 1: { fout <<“辦公類”; break; } case 2: { fout <<“個(gè)人類”; break; } case 3: { fout <<“商務(wù)類”; break; } } fout <<“t”<< p->data.email;if(i<(l-1)) fout << endl;p=p->next;} fout.close();3.2 系統(tǒng)功能詳細(xì)設(shè)計(jì) 3.2.1 文件數(shù)據(jù)讀出(1)函數(shù)原型: void CreateList_H(LinkList &L,int n)(2)函數(shù)功能: 創(chuàng)建鏈表,給鏈表增加n個(gè)聯(lián)系人 (3)函數(shù)形參: CreateList_H(&L,n),其中L是鏈表指針,n是增加的聯(lián)系人的數(shù)目 (4)函數(shù)算法流程:如圖3-1所示 3-1算法流程圖1 3.2.2 文件數(shù)據(jù)讀出 (1)函數(shù)原型: int Add(LinkList &L,contacts c)(2)函數(shù)功能: 單個(gè)增加聯(lián)系人 (3)函數(shù)形參: Add(&L, c),其中L是鏈表指針,c是具體的聯(lián)系人(4)函數(shù)算法流程:如圖3-2所示 3-2算法流程圖2 3.2.3 文件數(shù)據(jù)讀出 (1)函數(shù)原型:void Dail(LinkList L,string name)(2)函數(shù)功能: 撥打姓名為name的聯(lián)系人的電話,在撥打時(shí)依次顯示此人電話號(hào)碼中的各個(gè)數(shù)字,并伴隨相應(yīng)的拔號(hào)聲音 (3)函數(shù)形參: Dail(L, name),其中L為鏈表指針,name為撥號(hào)的聯(lián)系人的姓名 (4)函數(shù)算法流程:如圖3-3所示 3-3 算法流程圖3 3.2.4 文件數(shù)據(jù)讀出 (1)函數(shù)原型: void ChangeInfo(LinkList &L,string name)(2)函數(shù)功能: 修改姓名為name的聯(lián)系人的信息 (3)函數(shù)形參: ChangeInfo(&L,name),其中L為鏈表指針,name為將要修改信息的聯(lián)系人的姓名 (4)函數(shù)算法流程:如圖3-4所示 3-4 算法流程圖4 3.2.5 文件數(shù)據(jù)讀出 (1)函數(shù)原型: void Delete(LinkList &L,string name)(2)函數(shù)功能: 從鏈表中刪除姓名為name的聯(lián)系人 (3)函數(shù)形參: Delete(&L,name),其中L為鏈表指針,name為將要?jiǎng)h除的聯(lián)系人的姓名 (4)函數(shù)算3-5所示 法流程:如圖 3-5 算法流程圖5 3.2.6 文件數(shù)據(jù)讀出 (1)函數(shù)原型: void Read(LinkList L)(2)函數(shù)功能: 將文件中的聯(lián)系人信息導(dǎo)入通信管理系統(tǒng)中(3)函數(shù)形參:Read(L),其中L為鏈表指針(4)函數(shù)算法流程:如圖3-6所示 3-6 算法流程圖6 3.2.7 文件數(shù)據(jù)讀出 (1)函數(shù)原型: void Write(LinkList L)(2)函數(shù)功能: 將通信管理系統(tǒng)中所有聯(lián)系人的各項(xiàng)信息有序的導(dǎo)出,保存在文件里 (3)函數(shù)形參: Write(L),其中L為鏈表指針(4)函數(shù)算法流程:如圖3-7所示 3-7 算法流程圖7 4.運(yùn)行結(jié)果 (1)打開系統(tǒng),顯示主菜單界面,如圖4-1所示: 圖4-1 主菜單界面 (2)輸入數(shù)字1,進(jìn)行新增聯(lián)系人的操作。接著輸入1選擇批量增加,輸入數(shù)字2選擇單個(gè)增加。批量增加如圖4-2所示,單個(gè)增加如圖4-3所示: 圖4-2 批量增加聯(lián)系人 圖4-3 單個(gè)增加聯(lián)系人 (3)輸入數(shù)字2,進(jìn)行查看通信錄的操作,然后選擇聯(lián)系人的類別,查看此類中的所有聯(lián)系人姓名及電話號(hào)碼,如圖4-4所示: 圖4-4 按類別查看聯(lián)系人 (4)輸入數(shù)字3,進(jìn)行撥號(hào)操作,如圖4-5所示: 圖4-5 撥號(hào) (5)輸入數(shù)字4,進(jìn)行修改信息操作,然后輸入將要修改信息的聯(lián)系人姓名,再選擇學(xué)要修改的信息項(xiàng),如圖4-6所示: 圖4-6 修改聯(lián)系人信息 (6)輸入數(shù)字5,然后輸入將要?jiǎng)h除的聯(lián)系人姓名,進(jìn)行刪除聯(lián)系人的操作,如圖4-7所示: 圖4-7 刪除聯(lián)系人 (7)輸入數(shù)字6,進(jìn)行導(dǎo)入通信錄操作,將文件“通訊錄.txt”中的聯(lián)系人信息導(dǎo)入通訊管理系統(tǒng),如圖4-8所示: 圖4-8 導(dǎo)入通信錄 (8)輸入數(shù)字7,進(jìn)行導(dǎo)出通信錄操作,如圖4-9所示;導(dǎo)出的通信錄如圖4-10所示: 圖4-9 導(dǎo)出通信錄 圖4-10 已導(dǎo)出通信錄列表 (9)輸入數(shù)字0,退出通信管理系統(tǒng),如圖4-11所示: 圖4-11 退出通信管理系統(tǒng) 5.課程設(shè)計(jì)總結(jié) 5.1 編程中的問題及解決方法 在本次程序設(shè)計(jì)過程中,遇到的主要問題是模擬打字機(jī)效果輸出聯(lián)系人電話號(hào)碼以及從導(dǎo)入通信錄。 前者是由于對(duì)字符串的理解不到位,后來查閱了相關(guān)資料后意識(shí)到可以將字符串看作字符數(shù)組,從而獲取單個(gè)的字符,然后在每個(gè)字符的輸出后利用系統(tǒng)的休眠函數(shù)Sleep設(shè)置停頓,從而達(dá)到想要的效果。 后者是因?yàn)樵趯?dǎo)出通信錄的時(shí)候多輸出了一個(gè)回車換行符,導(dǎo)致在進(jìn)行文件讀入時(shí)多讀入一個(gè)回車換行符,以至于總是多一個(gè)聯(lián)系人。然后便在導(dǎo)出文件時(shí),不再在末尾輸出回車換行符,從而解決了該問題。5.2 小結(jié) 總的來說這次課程設(shè)計(jì)完成總體較好。首先在已經(jīng)學(xué)習(xí)了的數(shù)據(jù)結(jié)構(gòu)基礎(chǔ)上,我很快的想出了具體的設(shè)計(jì)思路,接著利用課余時(shí)間寫出了大體的框架。再寫出大題框架后隨即進(jìn)行了細(xì)節(jié)的完善,最后大概用了兩天時(shí)間進(jìn)行各項(xiàng)功能的調(diào)試。在代碼的編寫過程中并未產(chǎn)生太大瓶頸,遇到問題在查閱相關(guān)資料以及仔細(xì)調(diào)試后也得到了很好地解決,這是一次能好的體驗(yàn),也是對(duì)自己能力的一次考驗(yàn)。5.3 心得體會(huì) 經(jīng)過這次課程設(shè)計(jì),我對(duì)數(shù)據(jù)結(jié)構(gòu)這門課程有了更深刻的了解,不再僅僅是書本上抽象的代碼,還對(duì)如和將數(shù)據(jù)結(jié)構(gòu)應(yīng)用到具體的實(shí)例中有了更好的認(rèn)識(shí)。編程不僅需要對(duì)理論知識(shí)的理解,更重要的是它實(shí)際的應(yīng)用,只有具體地進(jìn)行過程序的設(shè)計(jì),才能有更深刻的記憶和領(lǐng)會(huì)。同時(shí)通過查閱資料和讀別人的代碼,我也學(xué)會(huì)到一些新的內(nèi)容和一些巧妙的思想。5.4 程序設(shè)計(jì)方法 本程序設(shè)計(jì)主要采用的方法是利用結(jié)構(gòu)體進(jìn)行編程,而采用的數(shù)據(jù)結(jié)構(gòu)是線性表中的鏈表結(jié)構(gòu)。參考文獻(xiàn) [1] 嚴(yán)蔚敏,吳偉民.?dāng)?shù)據(jù)結(jié)構(gòu)(c語言版)[M].2.北京:清華大學(xué)出版社,2016 [2] 陳維新,林小茶.c++面向?qū)ο笳n程設(shè)計(jì)教程[M].清華大學(xué)出版社 package cn.pab.manager; import java.util.List;import java.util.Scanner; import cn.pab.dao.PersonDao;import cn.pab.dao.TypeDao;import cn.pab.dao.UserDao;import cn.pab.dao.impl.PersonDaoImpl;import cn.pab.dao.impl.TypeDaoImpl;import cn.pab.dao.impl.UserDaoImpl;import cn.pab.entity.Person;import cn.pab.entity.Type;/** * 業(yè)務(wù)類 */ public class PABmanager { /** * 系統(tǒng)啟動(dòng) */ public static void main(String[] args){ Scanner input = new Scanner(System.in); UserDao userDao = new UserDaoImpl(); TypeDao typeDao = new TypeDaoImpl(); PersonDao personDao = new PersonDaoImpl(); System.out.println(“***********歡迎使用個(gè)人通訊錄管理系統(tǒng)**********”); System.out.print(“n請(qǐng)選擇操作(1.系統(tǒng)登錄 2.密碼修改 3.取消):”); String in = input.next(); if(“1”.equals(in)){ boolean islogin = userDao.login(); if(islogin){ System.out.println(“***********成功登錄個(gè)人通訊錄管理系統(tǒng)**********”); //System.out.print(“n請(qǐng)選擇操作(1.類別管理 2.聯(lián)系人管理 3.退出系統(tǒng)):”); }else{ System.out.println(“用戶名或密碼錯(cuò)誤,不能登錄!”); System.exit(-1); } }else if(“2”.equals(in)){ boolean modiFlag = userDao.modify(); if(modiFlag){ System.out.println(“密碼修改成功!”);}else{ System.out.println(“密碼修改失??!”);} System.exit(-1);}else{ System.out.println(“您已經(jīng)退出系統(tǒng)!”);System.exit(-1);} while(true){ System.out.print(“n請(qǐng)選擇操作(1.類別管理 2.聯(lián)系人管理 3.退出系統(tǒng)):”);String in2 = input.next();if(“1”.equals(in2)){ while(true){ System.out.print(“n請(qǐng)繼續(xù)選擇操作(1.新建類別 2.查詢類別 3.刪除類別 4.返回):”); String num = input.next(); if(“1”.equals(num)){ System.out.print(“請(qǐng)輸入類別的名稱:”);String lbmc = input.next(); System.out.print(“請(qǐng)輸入類別的說明:”);String lbsm = input.next();System.out.print(“請(qǐng)輸入類別的備注:”);String lbbz = input.next(); Type type = new Type(lbmc,lbsm,lbbz); typeDao.createType(type);}else if(“2”.equals(num)){ List System.out.println(“tt類別信息列表”); System.out.println(“類別名稱tt類別說明tt類別備注”); for(int i = 0;i < types.size();i++){ Type type =types.get(i); System.out.print(type.getLbmc()+“t”); System.out.print(type.getLbsm()+ “tt”); System.out.println(type.getLbbz()); } }else if(“3”.equals(num)){ System.out.print(“請(qǐng)輸入類別的名稱:”); String lbmc = input.next(); Type type = new Type(lbmc,null,null); typeDao.deleteType(type);}else if(“4”.equals(num)){ break;}else{ System.out.println(“您輸入不合法,請(qǐng)重新選擇!”); } } }else if(“2”.equals(in2)){ while(true){ System.out.print(“n請(qǐng)繼續(xù)選擇操作(1.新建聯(lián)系人 2.查詢聯(lián)系人 3.更新聯(lián)系人 4.刪除聯(lián)系人 5.返回):”); String num = input.next(); if(“1”.equals(num)){ System.out.print(“請(qǐng)輸入聯(lián)系人的類別名稱:”);String lb = input.next(); System.out.print(“請(qǐng)輸入聯(lián)系人的姓名:”);String xm = input.next(); System.out.print(“請(qǐng)輸入聯(lián)系人的電話:”);String dh = input.next(); System.out.print(“請(qǐng)輸入聯(lián)系人的手機(jī)號(hào):”);String sjh = input.next(); System.out.print(“請(qǐng)輸入聯(lián)系人的工作單位:”);String gzdw = input.next(); System.out.print(“請(qǐng)輸入聯(lián)系人的住址:”); String zz = input.next(); System.out.print(“請(qǐng)輸入聯(lián)系人的郵政編碼:”); String yzbm = input.next(); Person person = new Person(lb,xm,dh,sjh,gzdw,zz,yzbm); personDao.createPerson(person); }else if(“2”.equals(num)){ System.out.print(“請(qǐng)輸入聯(lián)系人的姓名:”); String name = input.next(); Person p = personDao.queryPerson(name); System.out.println(“tt查詢到的聯(lián)系人信息”); System.out.println(“類別t姓名t電話tt手機(jī)號(hào)tt工作單位t住址t郵政編碼”); System.out.print(p.getLb()+ “t”); System.out.print(p.getXm()+ “t”); System.out.print(p.getDh()+ “t”); System.out.print(p.getSjh()+ “t”); System.out.print(p.getGzdw()+ “t”); System.out.print(p.getZz()+ “t”); System.out.println(p.getYzbm()); } } } }else if(“3”.equals(num)){ System.out.print(“請(qǐng)輸入需更新的聯(lián)系人編號(hào):”); int id = input.nextInt(); System.out.print(“請(qǐng)輸入需更新的聯(lián)系人信息選項(xiàng):”); String item = input.next(); System.out.print(“請(qǐng)輸入聯(lián)系人信息選項(xiàng)的值:”); String val = input.next(); personDao.updatePerson(id,item, val); }else if(“4”.equals(num)){ System.out.print(“請(qǐng)輸入要?jiǎng)h除聯(lián)系人的姓名:”); String name = input.next(); personDao.deletePerson(name); }else if(“5”.equals(num)){ break; }else{ System.out.println(“您輸入不合法,請(qǐng)重新選擇!”); } } }else if(“3”.equals(in2)){ System.out.println(“您已經(jīng)退出系統(tǒng)!”);System.exit(-1);}else{ System.out.println(“您輸入不合法,請(qǐng)重新選擇!”);} 《數(shù)據(jù)結(jié)構(gòu)》 課程設(shè)計(jì)報(bào)告書 一.課程設(shè)計(jì)題目 圖書借閱管理系統(tǒng) 二.課程設(shè)計(jì)內(nèi)容 實(shí)現(xiàn)圖書管理信息系統(tǒng)的設(shè)計(jì) (一)管理員功能: ①登錄:輸入管理員密碼,若密碼錯(cuò)誤則不得執(zhí)行管理員操作。 ②添加新書:增加新的圖書資料,同時(shí)需檢查新書的圖書編號(hào)是否已存在于原圖書資料中,若已存在則應(yīng)取消添加或提示重新輸入。 ③修改圖書:通過編號(hào)查詢?cè)搱D書資料,若該編號(hào)存在,則顯示已有信息,允許修改,否則提示 無該圖書信息。 ④刪除圖書:通過編號(hào)查詢?cè)搱D書資料,若該編號(hào)存在,則顯示已有信息,允許刪除,否則提示無該圖書信息。刪除對(duì)象包括該圖書資料以及“圖書狀態(tài)”和“借閱人”中與此書相關(guān)的所有記錄。 ⑤查找圖書: A.按書號(hào)查找:通過編號(hào)查詢?cè)搱D書資料,若該編號(hào)存在,則顯示圖書信息,否則提示無該圖書信息。 B.按書名查找:通過書名查詢?cè)搱D書資料,若該編號(hào)存在,則顯示圖書信息,否則提示無該圖書信息。 C.按作者查找:通過作者查詢?cè)搱D書資料,若該編號(hào)存在,則顯示圖書信息,否則提示無該圖書信息。 ⑥查看全部圖書:顯示所有圖書資料,包括書號(hào)、書名、作者、狀態(tài)和借閱人等信息。 ⑦修改讀者:通過姓名查詢?cè)撟x者信息,若該姓名存在,則顯示已有信息,允許修改,否則提示無該讀者信息。 ⑧刪除讀者:通過姓名查詢?cè)撟x者信息,若該姓名存在,則顯示已有信息,允許刪除,否則提示無該讀者信息。刪除對(duì)象包括該讀者姓名、班級(jí)、電話以及“圖書狀態(tài)”和“借閱人”中與此人相關(guān)的所有記錄。 ⑨查看所有讀者:顯示所有讀者資料,包括姓名、班級(jí)、電話等信息。 (二)讀者功能: ①登錄:輸入讀者姓名,若未經(jīng)注冊(cè)則不得進(jìn)入讀者服務(wù)界面。②注冊(cè):新用戶經(jīng)注冊(cè)方可登錄系統(tǒng)并使用讀者服務(wù)功能。③借書: A.輸入所需圖書編號(hào),判斷該編號(hào)是否存在,若不存在則提示重新輸入。 B.若所輸入圖書編號(hào)存在,則判斷該書籍是否已被借出,若已借則不允許執(zhí)行借書操作。 C.若所輸入圖書未借,則提示輸入讀者姓名,判斷所輸入讀者姓名是否存在,若不存在則提示重新輸入。D.若讀者姓名存在,則允許執(zhí)行借書操作。 E.借書處理包括在“圖書狀態(tài)”中加上“已借”標(biāo)記。④還書: A.輸入所借書編號(hào),判斷該編號(hào)是否存在,若不存在則提示重新輸入。B.判斷該書是否已借出,若未借則不允許執(zhí)行還書操作。C.借書處理包括在“圖書狀態(tài)”中加上“未借”標(biāo)記。⑤查詢圖書: A.按書號(hào)查找:通過編號(hào)查詢?cè)搱D書資料,若該編號(hào)存在,則顯示圖書信息,否則提示無該圖書信息。 B.按書名查找:通過書名查詢?cè)搱D書資料,若該編號(hào)存在,則顯示圖書信息,否則提示無該圖書信息。 C.按作者查找:通過作者查詢?cè)搱D書資料,若該編號(hào)存在,則顯示圖書信息,否則提示無該圖書信息。 ⑥查看借閱情況:輸入讀者姓名,若該姓名不存在則提示重新輸入,若該姓名存在則顯示該讀者借閱信息。 三.算法設(shè)計(jì) 1.流程圖(部分示例) ①管理員登錄 ②讀者登錄 ③讀者借閱圖書 ④管理員或讀者按書名查找圖書 2.代碼實(shí)現(xiàn) #include #include //將字符串BookFile替換原文件中的宏名稱book #define ReaderFile “reader.txt” using namespace std;//**********讀者結(jié)構(gòu)體,用于存放讀者基本信息********** class Reader { private: char rname[10]; char rclass[10]; char rtel[10];public: Reader()//構(gòu)造函數(shù),實(shí)現(xiàn)數(shù)據(jù)初始化 {strcpy(rname,“");strcpy(rclass,”“);strcpy(rtel,”“);} //初始化 void set_rname(char *rn)//設(shè)置讀者姓名 {strcpy(rname,rn);} //將rn的字符復(fù)制給rname char * get_rname()//獲得讀者姓名 {return rname;} //返回rname的值 void set_rclass(char *rc)//設(shè)置班級(jí) {strcpy(rclass,rc);} char *get_rclass() //獲得班級(jí) {return rclass;} void set_rtel(char *rt) //設(shè)置電話 {strcpy(rtel,rt);} char *get_rtel() //獲得電話 {return rtel;} void copy(Reader m)//讀者Reader結(jié)構(gòu)體copy函數(shù) {strcpy(rname,m.get_rname());strcpy(rclass,m.get_rclass());strcpy(rtel,m.get_rtel());} };//*********讀者管理結(jié)構(gòu)體,實(shí)現(xiàn)對(duì)讀者用戶的管理********* class ReaderManage { Reader readers[50];//定義讀者結(jié)構(gòu)體數(shù)組對(duì)象,最多50位 int length; void readFile() //讀取讀者文件函數(shù) { ifstream fread;//定義輸入文件流對(duì)象fread length=0; //計(jì)數(shù) if(!fread) {cout<<”讀取磁盤文件失敗!“< fread.open(ReaderFile,ios::binary);//使文件流與文件關(guān)聯(lián),以二進(jìn)制方式打開 int i=0; while((fread.read((char *)&readers[i],sizeof(Reader))))//計(jì)算并返回所占字節(jié)數(shù) i++; length=i; fread.close();//關(guān)閉磁盤文件 } void saveFile()//保存讀者文件 { ofstream fwrite; //定義輸出文件流對(duì)象fwrite if(!fwrite) {cout<<”文件保存失敗!n“;exit(1);} fwrite.open(ReaderFile,ios::binary);//使文件流與文件關(guān)聯(lián),以二進(jìn)制方式打開 fwrite.write((char *)readers,length*sizeof(Reader));//計(jì)算并返回所占字節(jié)數(shù) fwrite.close();//關(guān)閉磁盤文件 } public: ReaderManage()//構(gòu)造函數(shù),讀取讀者文件 {readFile();} ~ReaderManage()//析構(gòu)函數(shù),保存讀者文件 {saveFile();} void add_reader(Reader r)//添加讀者用戶函數(shù) { if(length>=50) {cout<<”對(duì)不起,注冊(cè)人數(shù)已滿!n“;return;} readers[length].copy(r);//調(diào)用讀者結(jié)構(gòu)體copy函數(shù) length++;} int search(char *rn)//按姓名查找讀者函數(shù) { for(int i=0;i if(strcmp(readers[i].get_rname(),rn)==0)//判斷是否相等 return i; return-1; } bool revise(Reader reader,int i)//修改讀者資料函數(shù) { readers[i].copy(reader);//調(diào)用讀者結(jié)構(gòu)體cpoy函數(shù) return true;} void delete_reader(int index)//刪除讀者函數(shù) { for(int i=index;i readers[i].copy(readers[i+1]);//用后面的地址覆蓋前面的地址 length--;} bool log_reader(Reader r)//登錄時(shí)判斷讀者用戶是否存在函數(shù),相當(dāng)于遍歷 { for(int i=0;i if(strcmp(readers[i].get_rname(),r.get_rname())==0) return true; return false; } void reg_reader()//注冊(cè)用戶函數(shù) { char n[10]; //姓名name char c[10]; //班級(jí)class char t[10]; //電話tel Reader reader; cout<<”nt請(qǐng)輸入您的姓名:“; cin>>n; cout<<”nt請(qǐng)輸入您的所在班級(jí):“; cin>>c; cout<<”nt請(qǐng)輸入您的聯(lián)系電話:“; cin>>t; reader.set_rname(n);//調(diào)用讀者結(jié)構(gòu)體設(shè)置讀者姓名函數(shù) reader.set_rclass(c);//調(diào)用讀者結(jié)構(gòu)體設(shè)置讀者班級(jí)函數(shù) reader.set_rtel(t);//調(diào)用讀者結(jié)構(gòu)體設(shè)置聯(lián)系電話函數(shù) add_reader(reader);//調(diào)用讀者結(jié)構(gòu)體添加讀者函數(shù) cout<<”nt注冊(cè)成功!“;} void show_reader()//不帶參的顯示讀者信息函數(shù) { cout<<”n ☆☆☆☆☆☆☆☆☆☆☆☆讀★★者★★信★★息★★列★★表☆☆☆☆☆☆☆☆☆☆☆nn“; cout<<”姓名ttt班級(jí)ttt電話n“; for(int i=0;i { cout< cout<<”ttt“< cout<<”ttt“< } } void show_reader(int i)//帶參的顯示讀者信息函數(shù) { cout<<”n ☆☆☆☆☆☆☆☆☆☆☆☆讀★★者★★信★★息★★列★★表☆☆☆☆☆☆☆☆☆☆nn“; cout<<”姓名ttt班級(jí)ttt電話n“; cout< cout<<”ttt“< cout<<”ttt“< } }; //********書籍結(jié)構(gòu)體,用于存放書籍基本信息******** class Book { private: char bnum[10]; //書號(hào) char bname[20]; //書名 char bauthor[10]; //作者 char rname[10]; //借閱人 public: int tag; //狀態(tài)標(biāo)記判斷指標(biāo)(已借/在架)Book() //構(gòu)造函數(shù)初始化信息 {strcpy(bnum,”“);strcpy(bname,”“);strcpy(bauthor,”“);strcpy(rname,”“);tag=0;} void set_bnum(char *no) //設(shè)置書號(hào) {strcpy(bnum,no);} //把字符串no中的字符復(fù)制到字符串bnum中 char *get_bnum() //獲得書號(hào) { return bnum;} //返回值為bnum void set_bname(char *n) //設(shè)置書名 {strcpy(bname,n);} char *get_bname() //獲得書名 {return bname;} void set_bauthor(char *a) //設(shè)置作者 {strcpy(bauthor,a);} char * get_bauthor() //獲得作者姓名 {return bauthor;} void set_tag(int t) //狀態(tài)設(shè)置 {tag=t;} void set_rname(char *rn) //設(shè)置借閱人 {strcpy(rname,rn);} char *get_rname() //獲得借閱人姓名 {return rname;} void show_tag() //顯示圖書狀態(tài) { if(tag==1) {cout<<”已借“;} else {cout<<”在架“;} } void copy(Book m) //Book結(jié)構(gòu)體copy函數(shù) { strcpy(bnum,m.get_bnum()); //將獲得書號(hào)函數(shù)里的返回值里的字符復(fù)制到bnum strcpy(bname,m.get_bname()); strcpy(bauthor,m.get_bauthor()); tag=0; } };//**********書籍管理結(jié)構(gòu)體,實(shí)現(xiàn)管理書籍功能********** class BookManage { private: Book books[100]; //定義Book書籍結(jié)構(gòu)體數(shù)組對(duì)象,最大容量100本 int length; void saveFile() //保存書籍文件 { ofstream fwrite;//定義輸出文件流ofstream結(jié)構(gòu)體對(duì)象fwrite if(!fwrite) {cout<<”文件保存失敗!n“;exit(1); } fwrite.open(BookFile,ios::binary);//使文件流與文件建立關(guān)聯(lián),以二進(jìn)制方式打開 fwrite.write((char *)books,length*sizeof(Book));//計(jì)算并返回所占字節(jié)數(shù) fwrite.close(); //關(guān)閉磁盤文件 } void readFile() //讀取書籍文件 { ifstream fread;//定義輸入文件流對(duì)象fread length=0; if(!fread) {cout<<”文件讀取失敗!“< Book temp; //定義書籍結(jié)構(gòu)體臨時(shí)對(duì)象temp int i=0; fread.open(BookFile ,ios::binary);//使文件流與文件建立關(guān)聯(lián),以二進(jìn)制方式打開 while((fread.read((char *)&books[i],sizeof(Book)))) i++; //每讀完一次,指針后移一位,直到不能讀出正確結(jié)果為止 length=i; fread.close();} public: BookManage() //構(gòu)造函數(shù),讀取磁盤文件 { length=0; //從頭讀起,計(jì)數(shù),最大100 readFile(); //調(diào)用讀取文件函數(shù) } ~BookManage() //析構(gòu)函數(shù),保存磁盤文件 { saveFile(); //調(diào)用保存文件函數(shù) } bool add(Book book) //添加圖書資料 { if(length>=100) { cout<<”對(duì)不起,儲(chǔ)存已滿,您無法繼續(xù)添加!n“; return-1; } else { books[length].copy(book);//調(diào)用書籍結(jié)構(gòu)體copy函數(shù) length++; return(length-1); } } int bnu_search(char *bnu) //按書號(hào)查找書籍 { for(int i=0;i if(strcmp(books[i].get_bnum(),bnu)==0)//字符串比較,判斷是否相等 return i; return-1; } int bna_search(char *bna) //按書名查找書籍 { for(int i=0;i if(strcmp(books[i].get_bname(),bna)==0)//判斷 return i; return-1; } int bau_search(char *bau)//按作者查找書籍 { for(int i=0;i if(strcmp(books[i].get_bauthor(),bau)==0)//判斷 return i; return-1; } int rn_search(char *rn)//按借閱人查找書籍 { for(int i=0;i if(strcmp(books[i].get_rname(),rn)==0)//判斷 return i; return-1; } void revise(Book book,int i)//帶參的修改書籍函數(shù) {books[i].copy(book);} //調(diào)用Book結(jié)構(gòu)體copy函數(shù) void deleteBook(int index)//帶參的刪除書籍資料函數(shù) { for(int i=index;i books[i].copy(books[i+1]);//用后面的地址將當(dāng)前的地址覆蓋 length--; } void show_book()//不帶參的顯示書籍函數(shù) { cout<<” ☆☆☆☆☆☆☆☆☆☆☆書★★籍★★信★★息★★列★★表☆☆☆☆☆☆☆☆☆☆☆nn“; cout<<”書號(hào)“; cout.width(10); cout<<”書名“; cout.width(10); cout<<”作者“; cout.width(17); cout<<”狀態(tài)“; cout.width(25); cout<<”借閱人n“; for(int i=0;i { cout< cout.width(10); cout< cout.width(10); cout< cout.width(20); books[i].show_tag(); cout.width(20); cout< } } void show_book(int i)//帶參的顯示書籍函數(shù) { cout<<” ☆☆☆☆☆☆☆☆☆☆☆書★★籍★★信★★息★★列★★表☆☆☆☆☆☆☆☆☆☆☆nn“; cout<<”書號(hào)“; cout.width(10); cout<<”書名“; cout.width(10); cout<<”作者“; cout.width(17); cout<<”狀態(tài)“; cout.width(25); cout<<”借閱人n“; cout< cout.width(10); cout< cout.width(10); cout< cout.width(20); books[i].show_tag(); cout.width(20); cout< } void br_book()//讀者借、還書功能函數(shù) { ReaderManage reader; int choi;//選擇 int a; //圖書狀態(tài)指標(biāo)(1已借2在架) char sh[10];//需要還書的書號(hào) char dz[10];//讀者姓名 cin>>sh; int index=bnu_search(sh);//定義一個(gè)變量等于查找到的書號(hào) if(index>=0) { if(books[index].tag==1)//已借 a=1; if(books[index].tag==0)//在架 a=2; switch(a) { case 1: cout<<”nt該書目前狀態(tài)為<已借出>n“; cout<<”nt請(qǐng)選擇您需要的服務(wù):1:還書 0:返回n“; cin>>choi; cin.ignore();//清除以回車結(jié)束的輸入緩沖區(qū)的內(nèi)容,消除上一次輸入對(duì)下一次輸入的影響 if(choi!=1&&choi!=0) { cout<<”nt操作有誤,請(qǐng)重新選擇(0/1)!n“; return; } else if(choi==1) { cout<<”nt請(qǐng)輸入您的姓名:“; cin>>dz; cin.ignore(); int index1=reader.search(dz); if(index1==-1) { cout<<”nt對(duì)不起,系統(tǒng)無該讀者記錄,新用戶請(qǐng)先注冊(cè)!“; return; } else { strcpy(dz,”“);//將讀者姓名已空白代替 books[index].set_rname(dz);//借閱人一項(xiàng)變?yōu)榭瞻?/p> books[index].set_tag(0);//圖書狀態(tài)變?yōu)樵诩?/p> cout<<”nt還書成功!“< } }break; case 2: cout<<”nt該書目前狀態(tài)為<在館>n“; cout<<”nt請(qǐng)您需要的服務(wù):1:借書 0:返回n“; cin>>choi; cin.ignore(); if(choi!=1&&choi!=0) { cout<<”nt操作有誤,請(qǐng)重新選擇(0/1)!n“; return; } else if(choi==1) { cout<<”nt請(qǐng)輸入您的姓名:“; cin>>dz; int index1=reader.search(dz); if(index1==-1) { cout<<”nt對(duì)不起,系統(tǒng)無改讀者記錄,新用戶請(qǐng)先注冊(cè)!“; return; } else { books[index].set_rname(dz); books[index].set_tag(1); cout<<”nt借書成功!“< } }break; } } else { cout<<”nt對(duì)不起,系統(tǒng)無該書記錄!“;} } bool in(int i)//判斷圖書是否在架函數(shù) { if(books[i].tag==1) return false; return true; } };//**********菜單結(jié)構(gòu)體,實(shí)現(xiàn)界面引導(dǎo)********** class Menu { BookManage bm; //定義書籍管理結(jié)構(gòu)體對(duì)象bm ReaderManage rm; //定義讀者管理結(jié)構(gòu)體對(duì)象rm Reader r; //定義讀者結(jié)構(gòu)體對(duì)象r private: int choice; //菜單序號(hào)選擇 int key; //管理員密碼 public: void header() //頁眉 { system(”color fd“); cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 圖 書 借 閱 管 理 系 統(tǒng) ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“;} void log_menu() //主界面登錄菜單 { system(”color fd“); header(); cout<<”nttt< 請(qǐng) 選 擇 登 錄 身 份 >n“; cout<<”ntttt1: 管理員nntttt2: 讀 者nntttt0: 退 出nt您的選擇是: “;choice: cin>>choice; cin.ignore(); //清除以回車結(jié)束的輸入緩沖區(qū)的內(nèi)容,消除上一次輸入對(duì)下一次輸入的影響 switch(choice) { case 1: log_admin(); //管理員登錄,需密碼驗(yàn)證 break; case 2: reader_lr(); //讀者登錄或注冊(cè) break; case 0: exit(1); //退出系統(tǒng) break; default: cout<<”nt您的操作有誤,請(qǐng)重新選擇(0→2): “; goto choice; } } void admin_menu() //管理員管理菜單 { system(”cls“); system(”color f9“); cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 系★統(tǒng)★管★理★界★面 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 1: 添加新的圖書資料 2: 修改已有圖書資料 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 3: 刪除已有圖書資料 4: 查找已有圖書資料 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 5: 查看所有圖書資料 6: 修改讀者用戶信息 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 7: 刪除讀者用戶信息 8: 查看所有讀者信息 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 9: 返回系統(tǒng)登錄界面 0: 退出圖書管理系統(tǒng) ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”nt請(qǐng)選擇您需要的服務(wù)序號(hào): “;choice: cin>>choice; cin.ignore(); switch(choice) { case 1: //添加圖書 addBook(); bm.~BookManage(); break; case 2: //修改圖書 reviseBook(); bm.~BookManage(); break; case 3: //刪除圖書 delBook(); bm.~BookManage(); break; case 4: //查找圖書 absearch_menu(); break; case 5: //查看全部圖書 bm.show_book(); cout<<”nt顯示完畢!“; system(”pause“); admin_menu(); break; case 6: //修改讀者 reviseReader(); rm.~ReaderManage(); break; case 7: //刪除讀者 delReader(); rm.~ReaderManage(); break; case 8: //查看所有讀者 rm.show_reader(); cout<<”nt顯示完畢!“; system(”pause“); admin_menu(); break; case 9: //返回系統(tǒng)登錄界面 system(”cls“); log_menu(); case 0: //退出系統(tǒng) exit(1); break; default: cout<<”nt您的操作有誤,請(qǐng)重新選擇(0→7): “; goto choice; } } void reader_menu() //讀者服務(wù)菜單 { system(”cls“); system(”color f9“); cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 讀★者★服★務(wù)★界★面 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 1: 借 閱 圖 書 2: 歸 還 圖 書 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 3: 查 找 圖 書 4: 借 閱 情 況 ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ 5: 返 上 一 級(jí) 0: 退 出 系 統(tǒng) ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆ ☆n“; cout<<”t ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”nt請(qǐng)選擇您需要的服務(wù)序號(hào): “;choice: cin>>choice; cin.ignore(); switch(choice) { case 1: cout<<”nt請(qǐng)輸入您欲借閱的圖書書號(hào): “; bm.br_book(); bm.~BookManage(); break; case 2: cout<<”nt請(qǐng)輸入您欲歸還的圖書書號(hào): “; bm.br_book(); bm.~BookManage(); break; case 3: bsearch_menu(); break; case 4: rn_search(); break; case 5: system(”cls“); reader_lr(); break; case 0: exit(1); break; default: cout<<”nt您的操作有誤,請(qǐng)重新選擇(0→5): goto choice; } } void bsearch_menu() //讀者查找書籍菜單 { system(“color f2”); cout<<“ttt☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n”;cout<<“ttt☆ ☆n”; cout<<“ttt☆ 書★籍★查★找★界★面 ☆n”; cout<<“ttt☆ ☆n”; cout<<“ttt☆ 1: 按 書號(hào)查找 ☆n”; cout<<“ttt☆ ☆n”; cout<<“ttt☆ 2: 按 書名查找 ☆n”; cout<<“ttt☆ ☆n”; cout<<“ttt☆ 3: 按 作者查找 ☆n”; cout<<“ttt☆ ☆n”; cout<<“ttt☆ 4: 返 回 上 級(jí) ☆n”; cout<<“ttt☆ ☆n”; cout<<“ttt☆ 0: 退 出 系 統(tǒng) ☆n”;cout<<“ttt☆ ☆n”; cout<<“ttt☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n”; int bsc;//book search choice cout<<“nt請(qǐng)輸入您需要的服務(wù)序號(hào): ”; cin>>bsc; cin.ignore(); switch(bsc){ case 1: bnu_search(); break; case 2: bna_search(); “; break; case 3: bau_search(); break; case 4: reader_menu(); break; case 5: exit(1); default: cout<<”nt操作有誤,請(qǐng)重新選擇<0→4>“; break; } } void absearch_menu() //管理員查找書籍菜單 { system(”color f2“); cout<<”ttt☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 書★籍★查★找★界★面 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 1: 按 書號(hào)查找 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 2: 按 書名查找 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 3: 按 作者查找 ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 4: 返 回 上 級(jí) ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆ 0: 退 出 系 統(tǒng) ☆n“; cout<<”ttt☆ ☆n“; cout<<”ttt☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆n“; int bsc;//book search choice cout<<”nt請(qǐng)輸入您需要的服務(wù)序號(hào): “; cin>>bsc; cin.ignore(); switch(bsc) { case 1: bnu_search(); break; case 2: bna_search(); break; case 3: bau_search(); break; case 4: admin_menu(); break; case 5: exit(1); default: cout<<”nt操作有誤,請(qǐng)重新選擇<0→4>“; break; } } void reader_lr()//讀者登錄或注冊(cè)菜單 { system(”cls“); header(); system(”color f1“); cout<<”nttt< 讀 者 登 錄 界 面 >n“; cout<<”nttt 1: 登 錄t2: 注 冊(cè)nnttt 3: 返 回t0: 退 出nt您的選擇是: “; int rlc;//reader login choice choice: cin>>rlc; cin.ignore(); switch(rlc) { case 1: //已注冊(cè)讀者登錄 cout<<”nt請(qǐng)輸入您的姓名: “; char rn[10];//reader name cin>>rn; r.set_rname(rn); if(rm.log_reader(r)) { cout<<”nt登錄成功!“; system(”pause“); reader_menu(); } else cout<<”nt登錄失敗!新用戶請(qǐng)先注冊(cè)!“; system(”pause“); reader_lr(); break; case 2: //新用戶注冊(cè) rm.reg_reader(); rm.~ReaderManage(); system(”pause“); reader_lr(); break; case 3: system(”cls“); log_menu(); case 0: exit(1); break; default: cout<<”nt您的操作有誤,請(qǐng)重新選擇(0→2): goto choice; } } void log_admin() //管理員登錄 { cout<<“nt請(qǐng)輸入管理員密碼:”; int key; cin>>key; if(key==14125) { cout<<“nt登錄成功!nnt”; system(“pause”); admin_menu(); //管理員操作菜單 } else {cout<<“nt登錄失敗!原因是密碼錯(cuò)誤!n”; cout<<“nt請(qǐng)選擇 <1:返回上一級(jí)菜單 0:退出系統(tǒng)> cin>>choice; cin.ignore(); switch(choice) ”;“; { case 1: system(”cls“); log_menu(); break; case 0: exit(1); break; default: cout<<”nt操作有誤,請(qǐng)重新選擇(0/1)“; } } } void rn_search() //按書號(hào)查找函數(shù) { char rn[10];//reader name cout<<”nt請(qǐng)輸入您的姓名:“; cin>>rn; int index=bm.rn_search(rn); if(index>=0) bm.show_book(index); else cout<<”nt對(duì)不起,系統(tǒng)無您的借閱記錄!“; cout<<”nt“; system(”pause“); reader_menu(); } void bnu_search() //按書號(hào)查找函數(shù) { char bnu[10]; cout<<”nt請(qǐng)輸入您要查找的書號(hào):“; cin>>bnu; int index=bm.bnu_search(bnu); if(index>=0) bm.show_book(index); else cout<<”nt對(duì)不起,系統(tǒng)無該書籍記錄!“; cout<<”nt“; system(”pause“); bsearch_menu(); } void bna_search() //按書名查找函數(shù) { cout<<”nt請(qǐng)輸入您要查找的書名:“< char bna[20]; cin>>bna; int index=bm.bna_search(bna); if(index>=0) bm.show_book(index); else cout<<”nt對(duì)不起,系統(tǒng)無該書籍記錄!“; cout<<”nt“; system(”pause“); bsearch_menu(); } void bau_search() //按作者查找函數(shù) { cout<<”nt請(qǐng)輸入您要查找的作者:“< char bau[10]; cin>>bau; int index=bm.bau_search(bau); if(index>=0) bm.show_book(index); else cout<<”nt對(duì)不起,系統(tǒng)無該書籍記錄!“; cout<<”nt“; system(”pause“); bsearch_menu(); } void addBook() //新增書籍函數(shù) { char numb[10]; //書號(hào) char nameb[20]; //書名 char authorb[10];//作者 Book book; //書籍結(jié)構(gòu)體對(duì)象book int tag1;input1:cout<<”nt請(qǐng)輸入新書書號(hào):“; cin>>numb; int index=bm.bnu_search(numb); if(index==-1) { cout<<”nt系統(tǒng)目前尚無該書記錄,您可以繼續(xù)操作!n“; cout<<”nt請(qǐng)輸入新書書名:“; cin>>nameb; cout<<”nt請(qǐng)輸入新書作者:“; cin>>authorb; tag1=0; book.set_bnum(numb); book.set_bname(nameb); book.set_bauthor(authorb); book.set_tag(tag1); bm.add(book); cout<<”nt恭喜您!新書資料錄入成功!“; } else { cout<<”nt對(duì)不起,該書號(hào)紀(jì)錄已存在!請(qǐng)重新輸入!“; goto input1; } system(”pause“); admin_menu();} void reviseBook() //修改書籍函數(shù) { char numb[10]; char nameb[20]; char authorb[10]; Book book; int index=-1;input2: cout<<”nt請(qǐng)輸入您要修改書籍的書號(hào):“; cin>>numb; index=bm.bnu_search(numb); if(index==-1) { cout<<”nt對(duì)不起,您輸入的書號(hào)不存在,請(qǐng)重新輸入!“< goto input2; return; } bool sta=bm.in(index);//判斷是否在館 if(sta) { cout<<”nt該書目前處于<在架>狀態(tài),您可以繼續(xù)操作!“; cout<<”nt請(qǐng)輸入更改后的書名:“; cin>>nameb; cout<<”nt請(qǐng)輸入更改后的作者:“; cin>>authorb; book.set_bnum(numb); book.set_bname(nameb); book.set_bauthor(authorb); bm.revise(book,index); cout<<”nt恭喜您!書籍資料修改成功!“;} else cout<<”nt該書已被借出,請(qǐng)于讀者歸還后再進(jìn)行相關(guān)操作!“< system(”pause“); admin_menu(); } void delBook() //刪除書籍函數(shù) { char numb[10]; cout<<”nt請(qǐng)輸入您要?jiǎng)h除書籍的書號(hào):“; cin>>numb; int index=bm.bnu_search(numb); if(index>=0) { cout<<”nt您確定要?jiǎng)h除該書記錄嗎(y/n) “; char y; cin>>y; if(y=='y'||y=='Y') { bm.deleteBook(index); cout<<”nt刪除成功!“; } else cout<<”nt刪除取消!“; } else cout<<”nt對(duì)不起,系統(tǒng)沒有該圖書記錄!“; system(”pause“); admin_menu(); } void reviseReader()//修改讀者用戶函數(shù) { char namer[10]; Reader reader;get1: cout<<”nt請(qǐng)輸入你要修改讀者用戶的姓名: “; cin>>namer; int index=rm.search(namer); if(index==-1) { cout<<”nt對(duì)不起,系統(tǒng)無改讀者記錄,重新輸入請(qǐng)按1,返回請(qǐng)按0: int a; cin>>a;get2: cin.ignore(); switch(a) { case 1: goto get1; break; case 0: system(“pause”); admin_menu(); break; default: cout<<“nt您的操作有誤,請(qǐng)重新選擇(0/1): ”; goto get2; } return; } “; else { char namer[10]; char classr[10]; char telr[10]; Reader reader; cout<<”nt請(qǐng)輸入更改后的讀者姓名:“; cin>>namer; cout<<”nt請(qǐng)輸入更改后的班級(jí)名稱:“; cin>>classr; cout<<”nt請(qǐng)輸入更改后的聯(lián)系電話:“; cin>>telr; reader.set_rname(namer); reader.set_rclass(classr); reader.set_rtel(telr); cout<<”nt是否真的修改該記錄(y/n?):“; char y; cin>>y; if(y=='y'||y=='Y') { rm.revise(reader,index); cout<<”nt修改成功!n“; } else cout<<”nt操作取消!n“; } system(”pause“); admin_menu(); } void delReader() //刪除讀者用戶函數(shù) { cout<<”nt請(qǐng)輸入您要?jiǎng)h除的讀者用戶的姓名:“< char namer[10]; cin>>namer; int index=rm.search(namer); if(index>=0) { cout<<”nt是否真的刪除該記錄(y/n?): “; char y; cin>>y; if(y=='y'||y=='Y') { rm.delete_reader(index); cout<<”nt刪除成功!n“; } else cout<<”nt操作取消!n“; } else cout<<”nt對(duì)不起,系統(tǒng)尚無該讀者記錄!“; system(”pause“); admin_menu(); } };//********主函數(shù)******** int main(){ system(”color fd“);Menu menu;//定義菜單結(jié)構(gòu)體對(duì)象menu cout<<”ttt 文計(jì)091-1 龐麗萍 200990514125 “;cout<<”ttt 當(dāng)前日期:2011-6-22 星期三“;cout<<”ttt 當(dāng)前時(shí)間:08:00 “;cout<<”nttt ★ 歡 “;cout<<”★ 迎 “; } cout<<”★ 進(jìn) “;cout<<”★ 入 ★nn";menu.log_menu();return 0;四.程序正確性驗(yàn)證 1主頁面 2.管理員登陸頁面 3.圖書添加 五.課程設(shè)計(jì)過程中出現(xiàn)的問題、原因及解決方法 1.用戶登錄密碼時(shí),不能使用暗碼來保護(hù)密碼。(未解決成功)2.每個(gè)界面都能退出到主頁面,而不是直接跳出系統(tǒng)。(以解決)3.書名字長(zhǎng)太多影響書籍、作者、數(shù)量等之間的一一對(duì)應(yīng)關(guān)系。(為解決成功) 六.課程設(shè)計(jì)的主要收獲 通過這幾天學(xué)習(xí)設(shè)計(jì)圖書信息管理系統(tǒng),認(rèn)識(shí)到一切看似簡(jiǎn)單的事情只有自己動(dòng)手做,明白了其中的原理才會(huì)更好的把它變成自己的東西。圖書管理系統(tǒng)主要用到了文件的輸入輸出,以及利用簡(jiǎn)單的順序查找知識(shí),加深了對(duì)數(shù)據(jù)結(jié)構(gòu)的理解與應(yīng)用。對(duì)于這次的課程設(shè)計(jì),首先,許多知識(shí)不僅僅只是課本上的,需要我們自己去圖書館或網(wǎng)上收集資料。其次,編程過程終遇到各種錯(cuò)誤,需要我們耐心分析,討論,最后得出正確結(jié)果。第三,程序無錯(cuò),進(jìn)行調(diào)試,然后進(jìn)行加工修改優(yōu)化。 七.對(duì)今后課程設(shè)計(jì)的建議 希望老師可以分小組做課程設(shè)計(jì),題目可以相應(yīng)的增大難度。分組可以鍛煉團(tuán)對(duì)合作能力,隊(duì)員可以相互討論解決問題,彼此能夠激發(fā)更多的思想,做出更完善的作品,同時(shí)也防止了互相拷貝的情況,讓每個(gè)同學(xué)都積極的參與到設(shè)計(jì)中,而不是坐享其成。 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告 課程名稱:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì) 課設(shè)題目: 西文圖書管理系統(tǒng) 教師姓名: 郭 艷 本科生姓名: 王瑞林 本科生學(xué)號(hào): 20121002932 班 號(hào): 191124 日 期:2014年6月20日 題號(hào):十 題目:西文圖書管理 1.需求分析 圖書管理系統(tǒng)對(duì)象有兩個(gè),包括讀者和管理員。 讀者的需求:借書,還書,續(xù)借,查詢當(dāng)前所借書籍還書截至日期,查詢借閱歷史,修改登陸密碼。其中借書可以根據(jù)書號(hào)和書名兩種方式查詢借閱。 管理員的需求:采編入庫,清除庫存,注冊(cè)讀者,刪除讀者,根據(jù)書號(hào)查詢書籍,修改管理員用戶名和密碼。 2.設(shè)計(jì) 2.1設(shè)計(jì)思想 (1)數(shù)據(jù)與操作特性: 有搜索,插入,刪除操作。而數(shù)據(jù)有:讀者信息,書籍信息,讀者借閱書籍歷史信息,書籍讀者借閱歷史信息,讀者當(dāng)前所借書籍信息。(2)數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì): 數(shù)據(jù)的邏輯結(jié)構(gòu)有線性結(jié)構(gòu)和樹形結(jié)構(gòu)。 根據(jù)書號(hào)和書名建立兩個(gè)B-樹,便于讀者查詢借閱,其中關(guān)鍵字設(shè)置為書籍指針,便于找到書籍 后直接進(jìn)行修改書籍信息。 讀者和書籍的信息從文件中讀取,由于會(huì)不斷注冊(cè)和刪除讀者以及新增刪除書籍,因此書籍和讀者的信息采用單鏈表存儲(chǔ)。 讀者的借閱歷史和書籍的讀者歷史,都采用數(shù)組的形式存儲(chǔ),為了節(jié)省存儲(chǔ)空間,每個(gè)借閱歷史數(shù)組最大空間為15。超過15個(gè)借閱歷史,則刪除最早的借閱歷史。2.2設(shè)計(jì)表示(1)數(shù)據(jù)類型定義 typedef struct //日期結(jié)構(gòu)體類型 { int year;//記錄年 int month;//記錄月 int day;//記錄日 }Date;//記錄借閱者所借書籍的信息結(jié)構(gòu)體 typedef struct { char bookID[15];//書號(hào) char name[15];//書名 char writer[15];//作者 Date bordate;//借閱時(shí)間 Date backdate;//還書時(shí)間 int flag;//是否續(xù)借,續(xù)借為1.否則為0 }BookHistory;//記錄借閱者當(dāng)前所借書籍的信息結(jié)構(gòu)體 typedef struct { char bookID[15];//書號(hào) char name[15];//書名 char writer[15];//作者 Date bordate;//借閱時(shí)間 Date lastdate;//最后還書期限 int flag;//是否續(xù)借,續(xù)借為1.否則為0 }BookRec;//記錄書籍被借閱的讀者記錄 typedef struct { char readerID[15];//記錄讀者的借閱證號(hào) char readername[15];//讀者的名字 Date bor;//記錄讀者的借書日期 Date back;//記錄讀者的還書日期 int flag;//借閱者是否有續(xù)借跡象(flag取值0或者1)}ReaderHistory;//記錄讀者信息的結(jié)構(gòu)體類型(允許讀者同時(shí)借閱五本書,每本書支持續(xù)借一次)typedef struct { char readerID[12];//記錄讀者的借書證號(hào),一般是學(xué)號(hào) //記錄書的信息的結(jié)構(gòu)體類型 typedef struct { char bookID[15];//書號(hào) char title[15];//記錄書名 char writer[15];//記錄著者 int currentnum;//書現(xiàn)存量 int totalnum;//書總存量 int bortimes;//被借的歷史總次數(shù) //B_LQueue *B_LQH; ReaderHistory RH[15];//借書者記錄,規(guī)定鏈?zhǔn)疥?duì)列的最大節(jié)點(diǎn)個(gè)數(shù)為15,來節(jié)省空間 char name[15];//讀者的名字 char password[16];//讀者登陸密碼 BookRec rec[5];//讀者現(xiàn)在所借書籍 int hn;//總借閱數(shù)量 //R_LQueue *R_LQH; BookHistory bh[15];//記錄讀者的借閱記錄,規(guī)定鏈?zhǔn)疥?duì)列的最大節(jié)點(diǎn)個(gè)數(shù)為15,來節(jié)省空間 int bn;//讀者現(xiàn)在所借書籍?dāng)?shù)量,最大數(shù)量為5本 }Reader;}Book;//根據(jù) 書名為關(guān)鍵字的B-樹的結(jié)構(gòu)體類型 typedef struct Namenode //根據(jù)書名為關(guān)鍵字建立的B樹 { typedef struct///根據(jù)書名建立的B樹的搜索結(jié)果 { //根據(jù)書號(hào)為關(guān)鍵字的B-樹的結(jié)構(gòu)體類型 typedef struct IDnode //根據(jù)書號(hào)為關(guān)鍵字建立的B樹 { typedef struct///根據(jù)書號(hào)建立的B樹的搜索結(jié)果 { //從文件中讀取書籍?dāng)?shù)據(jù)后存儲(chǔ)在單鏈表里 typedef struct BookNode { //從文件中讀取學(xué)生數(shù)據(jù)后存儲(chǔ)在單鏈表里 typedef struct ReaderNode { Book SLbook;struct BookNode *next;BTIDnode *pt;////指向找到的節(jié)點(diǎn)指針 int i;//所找關(guān)鍵字在節(jié)點(diǎn)里的位置 int tag;//查找成功值為1,查找失敗值為0 int n;//記錄結(jié)點(diǎn)中的關(guān)鍵字(即書號(hào))個(gè)數(shù) Book *key[MAXM];//key[0...n-1],Maxsize個(gè)關(guān)鍵字(即書號(hào))域 struct IDnode *chd[MAXM];//ptr[0...n],MAXM個(gè)指向子結(jié)點(diǎn)的指針域 BTNamenode *pt;////指向找到的節(jié)點(diǎn)指針 int i;//所找關(guān)鍵字在節(jié)點(diǎn)里的位置 int tag;//查找成功值為1,查找失敗值為0 int n;//記錄結(jié)點(diǎn)中的關(guān)鍵字(即書號(hào))個(gè)數(shù) Book *key[MAXM];//key[0...n-1],Maxsize個(gè)關(guān)鍵字(即書名)域 struct Namenode *chd[MAXM];//ptr[0...n],MAXM個(gè)指向子結(jié)點(diǎn)的指針域 struct Namenode *par;//指向父結(jié)點(diǎn)的指針域 }BTNamenode;}NameResult;struct IDnode *par;//指向父結(jié)點(diǎn)的指針域 }BTIDnode;}IDResult;}BookSLNode;Reader SLreader;struct ReaderNode *next;}ReaderSLNode;2.3詳細(xì)設(shè)計(jì) (1)登陸界面login():有管理員和讀者登陸,都必須輸入密碼和用戶名。 (2)管理員登陸adminer_login():管理員需輸入登錄名和密碼,為了安全登錄,將輸入密碼錯(cuò)誤次數(shù)限制在5次。其中管理員密碼和用戶名以及初始用戶名和密碼從管理員文件里讀出賦值給全局變量。當(dāng)輸入正確時(shí),管理員功能界面函數(shù)admin_menu();當(dāng)密碼輸入錯(cuò)誤達(dá)6次以上,將調(diào)用鎖定系統(tǒng)函數(shù)lock_admin_menu(),將系統(tǒng)鎖定,下次進(jìn)入系統(tǒng)時(shí)將不再顯示登陸界面,而是初始管理員登陸。 (3)管理員采編入庫insert_stock():輸入新書的信息,調(diào)用SearchBTree_ID()按照書號(hào)在B-樹搜索書籍,如果沒有找到,返回書籍插入的位置,然后調(diào)用插入函數(shù)InsertBTree_Name(),InsertBTree_ID(),分別將書籍按書名和書號(hào)插入到相應(yīng)的樹中,同時(shí)將書籍信息插入到書籍鏈表里調(diào)用ListInsert_Book();同時(shí)將全局變量書籍總數(shù)booknum加1。 (4)管理員清除庫存deletestock():根據(jù)書號(hào)書名搜索到書籍,在B-樹中刪除書籍,同時(shí)在書籍信息鏈表里刪除。并將書籍總數(shù)booknum減1。 (5)管理員讀者模塊adminer_reader():有刪除讀者和注冊(cè)讀者兩個(gè)功能,刪除讀者,按讀者的ID查找到,在讀者信息鏈表里刪除讀者,讀者總數(shù)readernum減1;注冊(cè)讀者,初始密碼為讀者ID后6位,同時(shí)讀者總數(shù)readernum加1。 (6)管理員修改用戶名和密碼adminer_change_password():連續(xù)兩次輸入新密碼,兩次結(jié)果一樣,修改成功。 (7)學(xué)生登陸student_login():輸入密碼成功,調(diào)用 stu_menu()功能界面。(8)學(xué)生借書borrow():有兩種搜索所借書籍的方式,按書名搜索,按書號(hào)搜索,使用相應(yīng)的B-樹搜索功能。借書成功后,將書籍信息寫到讀者當(dāng)前所借書籍里面。并將書籍當(dāng)前存量減1.(9)學(xué)生還書back():進(jìn)入還書界面,將顯示出讀者當(dāng)前所借書籍,讓讀者選擇歸還書籍。歸還后將書籍從讀者當(dāng)前所借書籍里刪除,此書當(dāng)前存量加1,并將書籍信息寫到讀者借閱歷史里面。 (10)學(xué)生續(xù)借renew():顯示當(dāng)前所借書籍信息,讀者選擇續(xù)借書目,當(dāng)書籍信息的續(xù)借標(biāo)志為0時(shí)可以續(xù)借,否則 不能續(xù)借,續(xù)借成功,將對(duì)應(yīng)的讀者當(dāng)前所借書籍的續(xù)借標(biāo)志置為1.(11)學(xué)生查詢最后還書期限deadline():進(jìn)入之后顯示當(dāng)前所借書籍信息,里面包含最后還書期限。 (12)學(xué)生查詢借閱歷史history():顯示讀者信息里面的借閱歷史。 (13)學(xué)生修改密碼change_reader_password():兩次新密碼輸入一致,修改成功。(14)鎖定系統(tǒng)admin_lock(),鎖定系統(tǒng)后登陸lock_admin_menu():全局變量m_lock,當(dāng)其值為1時(shí)解鎖,值為0時(shí)鎖定。 (15)建立讀者書籍鏈表readreader(),readbook():首先從文件中讀取讀者總數(shù),采用for循環(huán),將每個(gè)讀者信息寫到鏈表里,在循環(huán)中,讀取讀者的ID、姓名、密碼,然后讀取讀者當(dāng)前所借書籍,采用for循環(huán),將所借書籍信息寫到數(shù)組里面,依次讀取所借書籍信息。之后讀取讀者歷史所借書籍?dāng)?shù)量,當(dāng)數(shù)量大于15時(shí),使用for循環(huán),循環(huán)15次,依次讀取書籍信息;如果 數(shù)量小于等于 15,采用for循環(huán),循環(huán)當(dāng)前借閱歷史書籍?dāng)?shù)量次,將書籍信息寫道數(shù)組中。然后將每個(gè)讀者插入到鏈表里。書籍鏈表類似讀者鏈表的建立。 (16)B-樹的搜索插入刪除功能(以按書名建立的B-樹為例);搜索,SearchBTree_ID(),搜索成功返回搜索到的位置,搜索失敗,返回插入的位置。Search_Name()函數(shù)將在當(dāng)前節(jié)點(diǎn)搜索到關(guān)鍵字的位置。 插入,InsertBTree_Name(),如果為空,調(diào)用NewRoot_name()函數(shù),建立根節(jié)點(diǎn)。如果不為空,將調(diào)用Insert_Name()將插入到節(jié)點(diǎn)里,判斷是否大于最大關(guān)鍵字個(gè)數(shù),如果大于,調(diào)用Split_Name()進(jìn)行分裂。刪除,并非自己完成,參考網(wǎng)上代碼。 (16)建立B-樹newBT():按書名建立,使用B樹搜索功能,沒有找到,將根據(jù)返回的位置進(jìn)行插入。按書號(hào)的類似。 (17)打印文件printftxt():分別將書籍和讀者 信息寫到文件里,同時(shí)將管理員信息也寫道文件中。在每個(gè)退出系統(tǒng)的接口中都進(jìn)行調(diào)用此函數(shù),保證文件不丟失,同時(shí)更新文件信息。 3.調(diào)試分析 在進(jìn)行調(diào)試時(shí),有很多內(nèi)存讀寫錯(cuò)誤,問題的根本原因是在進(jìn)行結(jié)構(gòu)體賦值前,沒有將結(jié)構(gòu)體里面包含的結(jié)構(gòu)體或者數(shù)組鏈表進(jìn)行初始化,導(dǎo)致問題十分嚴(yán)重普遍。 4.用戶手冊(cè) 首先登陸時(shí)有兩種登陸:讀者和管理員。然后管理員登陸功能有采編入庫,清除庫存,讀者模塊,書籍查詢,修改密碼和用戶名。讀者登陸有借書,還書,續(xù)借,修改密碼,查詢借閱歷史,查詢截至日期。 管理員登陸用戶名:123456,密碼:123456 管理員初始用戶名:20121002932,初始密碼:167350 讀者的ID和密碼請(qǐng)到reader.txt文件中查詢,文件格式見下面說明。文件的格式: 1.reader.txt: 其中第一行的數(shù)字“4”為當(dāng)前讀者總數(shù),第二行為: ID 名字 密碼 第三行的數(shù)字”0“為當(dāng)前所借書籍?dāng)?shù)量,之后為所借書籍信息: 書號(hào) 名稱 作者 借閱時(shí)間年 月 日 最后還書日期年 月 日 是否續(xù)借 第三行數(shù)字 “0”為歷史所借書籍?dāng)?shù)量,之后為所借書籍信息: 書號(hào) 名稱 作者 借閱時(shí)間年 月 日 還書日期年 月 日 是否續(xù)借 2.book.txt: 第一行數(shù)字”4“為當(dāng)前書籍總數(shù) 第二行為書籍信息: 書號(hào) 書名 作者 現(xiàn)存量 總存量 第三行數(shù)字”0“為讀者借閱歷史,以《飛鳥集》為例: ID 姓名 借閱時(shí)間年 月 日 還書時(shí)間年 月 日 是否續(xù)借 20121002932 王瑞林 114 17 5 17 1 3.a(chǎn)dminer.txt: 第一行:管理員名稱; 第二行:管理員登陸密碼; 第三行:管理員初始用戶名; 第四行:管理員初始密碼; 第五行:鎖定系統(tǒng)標(biāo)志,此時(shí)為未鎖定狀態(tài)。 5.測(cè)試數(shù)據(jù)及測(cè)試結(jié)果 初始登陸界面: 管理員登陸界面: 采編入庫: 清除庫存: 讀者模塊: 刪除讀者: 此時(shí)刪除讀者后,讀者文件中應(yīng)該不存在該讀者。書籍查詢: 修改用戶名和密碼: 修改用戶名: 修改密碼: 修改用戶名和密碼后,退出系統(tǒng)后,查看adminer.txt文件,第一行和第二行為用戶名和密碼,將改變?yōu)?567890。讀者登陸: 讀者借書: 當(dāng)讀者借書成功之后退出系統(tǒng),在reader.txt文件中對(duì)應(yīng)讀者的ID信息的縮進(jìn)的第二級(jí)為讀者當(dāng)前所借書籍?dāng)?shù)量和所借書籍信息,在此之后可以看到讀者現(xiàn)在所借書籍信息 讀者還書: 讀者還書后,在reader.txt文件中,縮進(jìn)的第三級(jí)為讀者歷史借閱書籍?dāng)?shù)量和書籍信息,此時(shí)應(yīng)該看到剛才還書的信息。 讀者續(xù)借: 當(dāng)讀者還書成功后,對(duì)應(yīng)的當(dāng)前所借書籍的flag值為1.查詢借閱歷史: 查詢截至日期: 修改登錄密碼: 當(dāng)修改成功之后,reader.txt文件中對(duì)應(yīng)讀者的信息密碼修改為當(dāng)前密碼。 6.致謝 感謝郭老師的指導(dǎo),讓我們?cè)趯?shí)踐中提高了合理設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)的能力,鞏固了課堂所學(xué)。同時(shí)感謝王鑫學(xué)姐,幫助我們調(diào)試程序,并傳輸經(jīng)驗(yàn)。 7.參考文獻(xiàn) 《數(shù)據(jù)結(jié)構(gòu)—使用C語言》第四版 朱站立編著 《C程序設(shè)計(jì)》第四版 譚浩強(qiáng)編著第二篇:通訊錄管理系統(tǒng)-數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告
第三篇:個(gè)人通訊錄管理系統(tǒng),java源代碼
第四篇:圖書管理系統(tǒng) 數(shù)據(jù)結(jié)構(gòu) 課程設(shè)計(jì)
第五篇:數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)—西文圖書管理系統(tǒng)