第一篇:C++語言學生宿舍管理系統
#include
typedef struct
/*定義結構體數組*/ {
string roomnum;
/*房間號*/ string stunum;
/*學號*/ string name;
/*姓名*/ }Student;
Student stu[1000];
/*結構體數組變量*/ int menu_select()
/*菜單函數*/ { char c;
system(“cls”);
/*運行前清屏*/ cout<<“tt★★★★★★學生宿舍管理系統★★★★★★n”;cout<<“tt§1.輸入記錄
§n”;cout<<“tt§2.顯示記錄
§n”;
cout<<“tt§3.按房間號排序并顯示
§n”;
cout<<“tt§4.按學號排序并顯示
§n”;
cout<<“tt§5.插入一條記錄按學號排序顯示
§n”;
cout<<“tt§6.按姓名查找,刪除一條記錄
§n”;
cout<<“tt§7.查找并顯示一條記錄
§n”;
cout<<“tt§8.從文件中讀入數據
§n”;
cout<<“tt§9.循環寫入數據
§n”;
cout<<“tt§0.結束程序
§n”;
cout<<“tt★★★★★★★★★★★★★★★★★★★★n”;cout<<“tt請選擇你要運行的選項按(0-9):”;c=getchar();
/*讀入選擇*/ return c;
/*返回選擇*/ }
int Input()
/*輸入若干條記錄*/ { int i=0;
char flag,x[10];
/*x[10]為清除多余的數據所用*/
do{
cout<<“tt房間號:”;
/*交互輸入*/
cin>>stu[i].roomnum;
cout<<“tt學號:”;
cin>>stu[i].stunum;
/*菜單選擇*/
cout<<“tt姓名:”;
cin>>stu[i].name;
gets(x);
/*清除多余的輸入*/
cout<<“tt是否繼續輸入?(Y/N)”;
cin>>flag;
/*輸入判斷*/
i++;
} while(flag=='y'||flag=='y');
/*判斷*/
return i;}
void Display(int n)
/*顯示所有記錄*/ {
int i;
cout<<“tt-n”;
/*格式頭*/
cout<<“tt房間號
學號
姓名
n”;
cout<<“tt-n”;
for(i=0;i /*循環輸入*/ { cout<<“tt”< if(i>1&&i%10==0) /*每十個暫停*/ { cout<<”tt-n“; cout<<”tt“; system(”pause“); cout<<”tt-n“; } } cout<<”tt“;system(”pause“);} void Sort_by_stunum(int n) /*按學號排序*/ { int i,j; string t; for(i=0;i /*冒泡法排序*/ for(j=0;j if(stu[j].stunum>stu[j+1].stunum) { t=stu[j].stunum; stu[j].stunum=stu[j+1].stunum; stu[j+1].stunum=t; t=stu[j].roomnum; ”< stu[j].roomnum=stu[j+1].roomnum; stu[j+1].roomnum=t; t=stu[j].name; stu[j].name=stu[j+1].name; stu[j+1].name=t; } } void Sort_by_roomnum(int n) /*按房間號排序*/ { int i,j;string t; for(i=0;i /*冒泡法排序*/ for(j=0;j if(stu[j].stunum>stu[j+1].stunum) { t=stu[j].stunum; stu[j].stunum=stu[j+1].stunum; stu[j+1].stunum=t; t=stu[j].roomnum; stu[j].roomnum=stu[j+1].roomnum; stu[j+1].roomnum=t; t=stu[j].name; stu[j].name=stu[j+1].name; stu[j+1].name=t; } } int Insert_a_record(int n) /*插入一條記錄*/ { cout<<“tt學生房間號:”; /*交互輸入*/ cin>>stu[n].roomnum; cout<<“tt學生學號:”; cin>>stu[n].stunum; cout<<“tt學生姓名:”; cin>>stu[n].name; n++; Sort_by_roomnum(n); /*調用排序函數*/ cout<<“tt插入記錄成功!n”; /*返回成功信息*/ return n;} int Delete_a_record(int n) /*按姓名查找,刪除一條記錄*/ { string s; int i=0,j; cout<<“tt輸入他(她)的名字:”; /*交互式問尋*/ cin>>s;while(i { if(stu[i].name==s) break; else i++; }/*查找并判斷*/ if(i==n){ cout<<“tt對不起,沒找到該學生!n”; /*返回失敗信息*/ return n;} for(j=i;j /*刪除操作*/ { stu[j].stunum=stu[j+1].stunum; stu[j].roomnum=stu[j+1].roomnum; stu[j].name=stu[j+1].name;} cout<<“tt刪除記錄成功!n”; /*返回成功信息*/ return n-1;} void Query_a_record(int n) /*查找并顯示一條記錄*/ { string s; int i=0; cout<<“tt輸入他(她)的名字:”; /*交互式輸入*/ cin>>s; while(i { if(stu[i].name==s) break; else i++; }/*查找并判斷*/ if(i==n) { cout<<“tt對不起,沒找到該學生!n”;return; } cout<<“tt他(她)的房間號:n”< /*輸出該學生信息*/ cout< int ReadfromText(int n) /*從文件中讀入數據*/ { int i=0;ifstream in(“students.txt”);//ofstream out(“students.txt”);while(i in>>stu[i].roomnum>>stu[i].stunum>>stu[i].name; i++;} } cout<<“讀取成功!n”; /*返回成功信息*/ return n;void WritetoText(int n) /*將所有記錄寫入文件*/ { int i=0;//ifstream in(“students.txt”);ofstream out(“students.txt”);while(i out< i++;} cout<<“寫入成功!n”; /*返回成功信息*/ } int main(){ int n=0; while(1) { switch(menu_select()) /*選擇判斷*/ { case '1': cout<<“tt輸入記錄n”; /*輸入若干條記錄*/ n=Input(); break; case '2': cout<<“tt顯示記錄n”; /*顯示所有記錄*/ Display(n); break; case '3': cout<<“tt按房間號排序并顯示n”; Sort_by_roomnum(n); /*按房間號排序*/ cout<<“tt排序成功!n”; Display(n); cout<<“tt”; break; case '4': cout<<“tt按學號排序并顯示n”; Sort_by_stunum(n); /*按學號排序*/ cout<<“tt排序成功!n”; Display(n); cout<<“tt”; break; case '5': cout<<“tt插入一條記錄按學號排序并顯示n”; n=Insert_a_record(n); /*插入一條記錄*/ Display(n); cout<<“tt”; break; case '6': cout<<“tt按姓名查找,刪除一條記錄n”; n=Delete_a_record(n); /*按姓名查找,刪除一條記錄*/ cout<<“tt”; system(“pause”); break; case '7': cout<<“tt查找并顯示一條記錄n”; Query_a_record(n); /*查找并顯示一條記錄*/ cout<<“tt”; system(“pause”); break; case '8': cout<<“tt從文件中讀入數據n”; n=ReadfromText(n); /*從文件中讀入數據*/ cout<<“tt”; system(“pause”); break; case '9': cout<<“tt循環寫入數據n”; WritetoText(n); /*循環寫入數據*/ cout<<“tt”; system(“pause”); break; case '0': cout<<“tt謝謝使用,祝您好運,再見!n”; /*結束程序*/ cout<<“tt”; system(“pause”); exit(0); } } return 0;} 黑龍江工程學院 第一章 問題分析和任務定義 1.1 問題分析 問題: 編寫一個通訊錄管理系統。要求包括通訊錄建立、增加號碼、刪除號碼、查詢號碼(按姓名、按號碼)、修改號碼、號碼分組、打印通訊錄(全部或分組號碼)等功能,并設計主控菜單和子菜單供用戶選擇要執行的操作。 分析: 實現以下功能: 1)通訊錄編輯(添加、刪除); 2)按不同的項進行查找; 3)對已存在的通訊錄按不同的項排序; 4)將通訊錄寫入文件; 5)從文件讀入通訊錄。 1.2 任務定義 創建一個鏈表,每個節點有姓名和號碼以及關系三個信息。增加號碼操作為增加節點,刪除號碼操作為刪除節點,查找號碼為鏈表的遍歷。每個功能以函數的形式出現,由主控菜單控制。并以文件的形式對號碼信息進行保存。 第二章 詳細設計 主函數(main()函數)是通過一個多分支語句(switch(i)語句)實現的。顯示菜單函數(displaymenu()函數)顯示與用戶交互的界面。以下是各個模塊實現程序各項功能的函數的詳細設計: 1、插入新的記錄:insert()函數 定義變量,設計loop模塊,模塊的功能是用來輸入記錄:輸入姓名、性別、電話號碼、地址的信息。用for語句查找是否輸入了與原有記錄相同的記錄,用strcmp 函數比較,if 語句判斷,如果輸入了重復的記錄,提示信息:“此記錄已存在,請重新輸入!”并且用 goto語句返回到loop,重新輸入信息。設計一個a模塊:鍵盤輸入一個字符,必須是“Y”“y”“N”“n”,否則重新輸入。最后if 語句判斷變量的值是否重新輸入信息,如果輸入的是“Y”或“y”,返回到loop,黑龍江工程學院 用戶可以輸入下一條信息,直到用戶輸入“N”或“n”返回主界面。每插入一條記錄n的值加1。功能的實現見源程序: 2、示好友的信息:display()函數 定義整型變量i用來循環輸出記錄。分別輸出每條記錄,并輸出記錄的個數。 3、查找好友的信息search()函數 定義字符型變量c,字符型數組a,定義loop模塊,功能:通過鍵盤輸入要查找的信息。首先顯示提示信息:“輸入你要查找的好友的姓名”然后從鍵盤輸入姓名。For語句循環內嵌if語句,用strcmp 函數查找信息,并且顯示該記錄的所有信息,并跳出循環。再用for 語句內嵌if語句判斷,如果沒有查到顯示提示信息:“如果沒有查到相關語句,是否重新查找(Y/N)?定義abc模塊的功能輸入一個字符(“Y”或“y”“N”“n”)用來判斷是否重新查找。如果輸入“Y”或“y”,則用goto語句返回loop重新查找。否則令i的值為n跳出循環。最后返回主界面。 4、刪除好友信息:del()函數 首先定義字符數組、變量和a、b兩個goto標識符。在a模塊中用scanf函數輸入要刪除的好友的姓名,用for循環和if 語來實現對好友的查找,如果找到記錄末尾,提示查無此人。在b模塊中,用來實現刪除功能。先確認是否刪除,如果鍵盤輸入Y 或y來確認要刪除再執行for循環,通過strcmpy函數把后一條記錄復制到前一條記錄。進行刪除記錄后,并把原末尾記錄數據賦空字符,按任意鍵刪除,按任意鍵返回主菜單。 5、修改記錄:modify()函數 定義了a、b兩個goto標識符。在a模塊中,用scanf函數輸入要修改人的姓名,用for 循環、if語句及strcmp函數找到該姓名的記錄,若到記錄末尾提示“查無此人”是否繼續重新輸入姓名,黑龍江工程學院 如果重新輸入姓名再用goto語句再執行重新查找。在b模塊中,用于修改記錄,如果要修改記錄則從鍵盤輸入Y或y,用scanf函數來輸入新的記錄數據來實現修改記錄。 6、排序:sort()函數 選擇法排序的方法。定義變量i,j,用于循環,定義4個字符型數組,用于替換的中間變量;用兩個for循環語句,用strcmp函數比較。按姓名升序排序。比較前一條記錄和后一條記錄的姓名,如果strcmp函數值大于0,則將這兩條記錄的所有信息替換,4個字符型數組用作替換的中間變量。最后調用display()(顯示結果)顯示排序后的結果。 第三章 程序編碼 #include 黑龍江工程學院 void format();int back(){ cout<<“ 返回還是回到主菜單(T為退出,R為回到主菜單,不計大小寫): ”; char back; cin>>back; if(back=='R'||back=='r') return 1; else return 0;} void print(int i){ cout<<“學號:”< cout<<“姓名:”< cout<<“地址:”< cout<<“電話號碼:”< cout<<“郵編:”< cout<<“E_MAIL:”< <<“tt★★★★★★★★★★★★★★★★★★★★★★★★★★” < <<“tt※ ※” < <<“tt※ 通 迅 錄 ※” < <<“tt※ ※” < <<“tt※ 1.通訊錄編輯.4.按序排列.※” < <<“tt※ ※” < <<“tt※ 2.查詢聯系人.5.將文件讀入程序.※” < <<“tt※ ※” < <<“tt※ 3.將資料寫入文件.6.格式化(慎用).※” < <<“tt※ ※” < <<“tt★★★★★★★★★★★★★★★★★★★★★★★★★★” < <<“tt ”< <<“ttt選擇 :”;cin>>select1;switch(select1) 黑龍江工程學院 { case '1':cout<<“(1)添加:”< cout<<“(2)刪除:”< cout<<“(3)修改:”< char select2; cout<<“ 請選擇:”< cin>>select2; switch(select2) { case '1':cout<<“ 輸入添加的資料:”< char no[13];char name[20];char address[100];char tel_no[12];char post_code[7];char e_mail[40]; cout<<“ 輸入學號:”< cin>>no; cout<<“ 輸入姓名:”< cin>>name; cout<<“ 輸入地址:”< cin>>address; cout<<“ 輸入電話號碼:”< cin>>tel_no; cout<<“ 輸入郵編:”< cin>>post_code;cout<<“ 輸入E_mail:”< cin>>e_mail; a.add(no,name,address,tel_no,post_code,e_mail); cout<<“ 返回還是回到主菜單(T為退出,R為回到主菜單,不計大小寫): ”; char back_add; cin>>back_add; if(back_add=='R'||back_add=='r') goto top; else goto bottom; break; case '2':cout<<“ 輸入要刪除人的姓名:”< char name2[20]; cin>>name2; a.del(name2); cout<<“ 返回還是回到主菜單(T為退出,R為回到主菜單,不計大小寫): ”; 黑龍江工程學院 “; ”; char back_del; cin>>back_del; if(back_del=='R'||back_del=='r') goto top; else goto bottom; break;case '3':cout<<“ 輸入需要修改人的姓名:”< char name3[20]; cin>>name3; if(a.correct(name3)) goto top; else goto bottom; break;} break;case '2':cout<<“(1)根據姓名查找”< cout<<“ 輸入姓名: ”; cin>>name4; a.find2(name4); cout<<“ 返回還是回到主菜單(T為退出,R為回到主菜單,不計大小寫): char back_f1;cin>>back_f1;if(back_f1=='R'||back_f1=='r') goto top;else goto bottom;break;case '2':char no4[13];cout<<” 輸入學號: “;cin>>no4;a.find1(no4); cout<<” 返回還是回到主菜單(T為退出,R為回到主菜單,不計大小寫): char back_f2;cin>>back_f2; 黑龍江工程學院 “; ”; if(back_f2=='R'||back_f2=='r') goto top; else goto bottom; break;} break;case '3':a.write();cout<<“ 返回還是回到主菜單(T為退出,R為回到主菜單,不計大小寫): ”;char back_w;cin>>back_w;if(back_w=='R'||back_w=='r') goto top;else goto bottom;break;case '4':cout<<“(1)按學號排序:”< cout<<“ 返回還是回到主菜單(T為退出,R為回到主菜單,不計大小寫): char back;cin>>back;if(back=='R'||back=='r') goto top;else goto bottom;break;case '2':a.list2();cout<<” 返回還是回到主菜單(T為退出,R為回到主菜單,不計大小寫): } char back1;cin>>back1;if(back1=='R'||back1=='r')goto top;else goto bottom;break; 黑龍江工程學院 break;case '5':a.read(); cout<<“ 返回還是回到主菜單(T為退出,R為回到主菜單,不計大小寫): ”; char back_r; cin>>back_r; if(back_r=='R'||back_r=='r') goto top; else goto bottom; break;case '6':cout<<“ 請確認刪除所有資料!(Y/N)”; char select5; cin>>select5; if(select5=='Y'||select5=='y') a.format(); cout<<“ 返回還是回到主菜單(T為退出,R為回到主菜單,不計大小寫): ”; char back_f; cin>>back_f; if(back_f=='R'||back_f=='r') goto top; else goto bottom; break;} bottom:cout<<“ ★★★★★★★★★★★★★★★★★★★★★★★ ”< void inter::add(char no[13],char name[20],char address[100],char tel_no[12],char post_code[7],char e_mail[40]){ int x=1;for(int i=0;i<35;i++){ if(!strcmp(st[i].no,“0”)) { strcpy(st[i].address,address); strcpy(st[i].e_mail,e_mail); strcpy(st[i].name,name); strcpy(st[i].no,no); strcpy(st[i].post_code,post_code); strcpy(st[i].tel_no,tel_no); x=0; } 黑龍江工程學院 if(x==0) break;} } //刪除聯系人 void inter::del(char name[20]){ int x=1;for(int i=0;i<35;i++){ if(!strcmp(st[i].name,name)) { strcpy(st[i].address,“0”); strcpy(st[i].e_mail,“0”); strcpy(st[i].name,“0”); strcpy(st[i].no,“0”); strcpy(st[i].post_code,“0”); strcpy(st[i].tel_no,“0”); } else x=0;} if(x==0) cout<<“ error:輸入姓名錯誤!”< int inter::correct(char name[30]){ int x;for(int i=0;i<35;i++){ if(!strcmp(st[i].name,name)) x=i;} char select;cout<<“(1)修改姓名:”< 黑龍江工程學院 char name1[30]; cin>>name1; strcpy(st[x].name,name1); cout<<“ 修改成功!”< return back(); break;case '2':cout<<“ 輸入要修改的學號:”; char no1[13]; cin>>no1; strcpy(st[i].no,no1); cout<<“ 修改成功!”< return back(); break;case '3':cout<<“ 輸入要修改的地址:”; char address1[100]; cin>>address1; strcpy(st[x].address,address1); cout<<“ 修改成功!”< return back(); break;case '4':cout<<“ 輸入要修改的郵編:”; char post_code1[7]; cin>>post_code1; strcpy(st[x].post_code,post_code1); cout<<“ 修改成功!”< return back(); break;case '5':cout<<“ 輸入要修改的電話號碼:”; char tel_no1[12]; cin>>tel_no1; strcpy(st[x].tel_no,tel_no1); cout<<“ 修改成功!”< return back(); break;case '6':cout<<“ 輸入要修改的E_MAIL:”; char e_mail1[40]; cin>>e_mail1; strcpy(st[x].e_mail,e_mail1); cout<<“ 修改成功!”< return back(); break;} } //按學號查詢聯系人 黑龍江工程學院 void inter::find1(char no[13]){ int x,y=1,z=1;for(int i=0;i<35;i++){ if(!strcmp(st[i].no,no)) { x=i; z=0; } else y=0; if(z==0) break;} if(y==0) cout<<“ 輸入的學號查找不到?。 ? } //按姓名查詢聯系人 void inter::find2(char name[20]){ int x,y=1,z=1;for(int i=0;i<35;i++){ if(!strcmp(st[i].name,name)) { x=i; z=0; } else y=0; if(z==0) break;} if(y==0) cout<<“ 輸入的姓名查找不到??!”< void inter::read(){ char name1[20];cout<<“ 輸入你要導入的文件名: ”;cin>>name1; 黑龍江工程學院 strcat(name1,“.txt”);ifstream file(name1);char line[120];char no[120];char name[120];char address[120];char post_code[120];char tel_no[120];char e_mail[120];int time=0;file.getline(line,120);while(!file.eof()){ for(int k=0;k<35;k++){ if(time==0) { strcpy(no,line); time=1; for(int i=0;i<120;i++) { if(no[i]==':') { i++; for(int j=0;j<13;j++) { st[k].no[j]=no[i]; i++; } } } file.getline(line,120,'n'); } if(time==1){ strcpy(name,line); time=2; for(int i=0;i<120;i++) { if(name[i]==':') { i++; for(int j=0;j<20;j++) { 黑龍江工程學院 st[k].name[j]=name[i]; i++; } } } file.getline(line,120,'n');} if(time== 2){ strcpy(address,line);time=3;for(int i=0;i<120;i++){ if(address[i]==':') { i++; for(int j=0;j<100;j++) { st[k].address[j]=address[i]; i++; } } } file.getline(line,120,'n');} if(time==3){ strcpy(tel_no,line);time=4;for(int i=0;i<120;i++){ if(tel_no[i]==':') { i++; for(int j=0;j<12;j++) { st[k].tel_no[j]=tel_no[i]; i++; } } } file.getline(line,120,'n');} 黑龍江工程學院 if(time==4) { strcpy(post_code,line); time=5; for(int i=0;i<120;i++) { if(post_code[i]==':') { i++; for(int j=0;j<7;j++) { st[k].post_code[j]=post_code[i]; i++; } } } file.getline(line,120,'n'); } if(time==5) { strcpy(e_mail,line); time=0; for(int i=0;i<120;i++) { if(e_mail[i]==':') { i++; for(int j=0;j<40;j++) { st[k].e_mail[j]=e_mail[i]; i++; } } } file.getline(line,120,'n'); } } } file.close();} //寫入文件 void inter::write(){ char name[20]; 黑龍江工程學院 cout<<“ 輸入要保存的文件名 ”;cin>>name;strcat(name,“.txt”);ofstream savefile(name);for(int i=0;i<35;i++){ savefile << “學號:”< savefile << “姓名:”< savefile << “地址:”< savefile << “電話號碼:”< savefile << “郵編:”< savefile << “E_MAIL:”< void inter::list1(){ for(int i=0;i<34;i++){ for(int j=0;j<35-i;j++) { if(strcmp(st[j].no,st[j+1].no)>0) { char no[13];char name[20];char address[100];char tel_no[12];char post_code[7];char e_mail[40]; strcpy(no,st[j].no); strcpy(st[j].no,st[j+1].no); strcpy(st[j+1].no,no); strcpy(name,st[j].name); strcpy(st[j].name,st[j+1].name); strcpy(st[j+1].name,name); strcpy(address,st[j].address); strcpy(st[j].address,st[j+1].address); strcpy(st[j+1].address,address); strcpy(tel_no,st[j].tel_no); 黑龍江工程學院 strcpy(st[j].tel_no,st[j+1].tel_no); strcpy(st[j+1].tel_no,tel_no); strcpy(post_code,st[j].post_code); strcpy(st[j].post_code,st[j+1].post_code); strcpy(st[j+1].post_code,post_code); strcpy(e_mail,st[j].e_mail); strcpy(st[j].e_mail,st[j+1].e_mail); strcpy(st[j+1].e_mail,e_mail); } } } for(int k=0;k<35;k++){ int x=0; if(strcmp(st[k].no,“0”)) { print(k); x=1; } if(x==1) { cout< cout<<“---------------”< } } } //按姓名排序 void inter::list2(){ for(int i=0;i<34;i++){ for(int j=0;j<35-i;j++) { if(strcmp(st[j].name,st[j+1].name)>0) { char no[13];char name[20];char address[100];char tel_no[12];char post_code[7]; 黑龍江工程學院 char e_mail[40]; strcpy(no,st[j].no); strcpy(st[j].no,st[j+1].no); strcpy(st[j+1].no,no); strcpy(name,st[j].name); strcpy(st[j].name,st[j+1].name); strcpy(st[j+1].name,name); strcpy(address,st[j].address); strcpy(st[j].address,st[j+1].address); strcpy(st[j+1].address,address); strcpy(tel_no,st[j].tel_no); strcpy(st[j].tel_no,st[j+1].tel_no); strcpy(st[j+1].tel_no,tel_no); strcpy(post_code,st[j].post_code); strcpy(st[j].post_code,st[j+1].post_code); strcpy(st[j+1].post_code,post_code); strcpy(e_mail,st[j].e_mail); strcpy(st[j].e_mail,st[j+1].e_mail); strcpy(st[j+1].e_mail,e_mail); } } } for(int k=0;k<35;k++){ int x=0; if(strcmp(st[k].no,“0”)) { print(k); x=1; } if(x==1) { cout< cout<<“-------”< } } 黑龍江工程學院 } //格式化 void inter::format(){ for(int i=0;i<35;i++){ strcpy(st[i].address,“0”); strcpy(st[i].e_mail,“0”); strcpy(st[i].name,“0”); strcpy(st[i].no,“0”); strcpy(st[i].post_code,“0”); strcpy(st[i].tel_no,“0”);} } 第四章 程序調試與測試 運行程序,首頁顯示如下: 按1選擇通訊錄編輯,編輯通訊錄,顯示(1)添加,(2)刪除,(3)修改,運行后結果如下: 黑龍江工程學院 第一次使用,按1添加聯系人,填入相關信息,運行圖如下: 返回首頁,按2可以查找聯系人,可以根據姓名查找和學號查找,本次運用學號查找,運行如下: 返回首頁,按4可以進行排序,可以根據姓名和學號排序,按姓名排序需要自己編輯的姓氏排序規則才能使用,本次使用學號排序,運行如下: 將資料寫入文件功能是將編輯好的通訊錄寫入文本文件,文本文件的名字可以自己輸入。將文件讀入程序,是將文本文件中的信息讀入程序,進行添加,修改,刪除,排序等功能。 第五章 結果分析 總體上可以滿足一般的應用需求,但是還有一定的不足,程序運行流暢,沒有未知錯誤。 第六章 設計創新及心得 黑龍江工程學院 程設計是培養學生綜合運用所學知識 ,發現,提出,分析和解決實際問題,鍛煉實踐能力的重要環節,是對我們的實際工作能力的具體訓練和考察過程.隨著科學技術發展的日新月異,當今計算機應用在生活中可以說得是無處不在。因此作為二十一世紀的大學來說掌握程序開發技術是十分重要的,而C++語言又是最常見,功能最強大的一種高級語言,因此做好C++語言課程設計是十分必要的。 通過幾天的課程設計使我們懂得了理論與實際相結合是很重要的,只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結合起來,從理論中得出結論,才能真正為社會服務,從而提高自己的實際動手能力和獨立思考的能力。在設計的過程中遇到問題,可以說得是困難重重,這畢竟第一次真真的做程序設計,難免會遇到過各種各樣的問題,同時在設計的過程中發現了自己的不足之處,對一些前面學過的知識理解得不夠深刻,掌握得不夠牢固,比如說結構體,指針??通過這次課程設計之后,我們把前面所學過的知識又重新溫故了一遍。 我做的是班級通訊錄的課程設計,雖然是很簡單的一個小的程序,但對我來說卻是一個很大的困難。更加是第一次做課程設計,所以在機房做了一個下午卻絲毫沒有進展,最主要是不知從何開始,這個時候才知道上課老師們不厭其煩的教導是多么的寶貴,這個時候才后悔上課的時候沒有認真的聽講??墒乾F在一切都晚了,還好時間還算是充裕,只好拿出書本重新復習一下。 開始的時候真的感覺編程是一件很無聊的事情,不過當一個程序運行成功的時候那種喜悅是無法言語的,那種成就感是無法比擬的。又經過幾天的努力,終于把程序完成了,盡管程序還是有很多功能上的欠缺和漏洞,可我還是很高興的。無論如何是自己的勞動成果,是自己經過努力得到的成績,同時也是學習C++語言的一次實踐作業,自己進步的證明。 在課程設計過程中,收獲知識,提高能力的同時,我也學到了很多人生的哲理,懂得怎么樣去制定計劃,怎么樣去實現這個計劃,并掌握了在執行過程中怎么樣去克服心理上的不良情緒。因此在以后的生活和學習的過程中,我一定會把課程設計的精神帶到生活中,不畏艱難,勇往直前! 一、需求分析 軟件需求是軟件開發的基礎,每個軟件開發過程都是以獲取需求為目的的活動:理解客戶的基本需求和目標。準確獲取用戶的需求是項目開發成功的開端。然而,軟件工程所需要解決的問題十分復雜,尤其當軟件系統是全新的時,了解問題的本質是十分困難的過程。因此,對軟件需求的完全理解和系統描述,是保證軟件成功開發至關重要的前提。 軟件需求包括四個不同的層次:業務需求、用戶需求、功能需求和非功能需求。需求分析主要包括以下內容:理解客戶需要什么,分析要求,評價可行性,協商合理的方案,無歧義的說明方案,確認規格說明,管理需求以至將這些需求轉化為可行系統。 本系統的最終使用者是宿舍樓管理員和住宿學生,根據日常生活的經驗,結合對宿舍管理員和住宿學生的調查,得出用戶的下列需求: (一)宿舍樓的基本情況 學生住在宿舍樓中,每棟宿舍樓都會有若干名管理員負責本宿舍樓的日常管理。 1、學生的基本信息 入校時,每位學生都有唯一的學號,并被分配到指定的宿舍樓和指定的宿舍,會有一個固定的宿舍號,其入校時間就是入住時間。另外,為了管理上的方便,同一院系的學生的宿舍一般在一起,相應地會有其所在的院系名稱。 2、宿舍的基本信息 每個宿舍都有唯一的宿舍號,床號。每個宿舍的財產屬于學校,燈,床鋪,柜子,桌椅等,為了對不同的財產進行區分,為每種財產分配不同的財產號。這樣有利于財產的報修和管理。 3、報修的基本信息 宿舍樓中經常出現財產的損壞,比如燈泡壞了,這時,同學們需要將財產損壞情況報告,以便進行維修。這時,需要上報報修的宿舍號和損壞的財產編號,同時記錄報修的時間和損壞的原因。當損壞的財產維修完畢后,維修人員應記錄解決時間,表示該報修成功解決。 4、夜歸的基本信息 宿舍樓在指定的時間關門(晚上23:00),若有同學晚于關門時間會宿舍,需通知宿舍樓管理員,同時應登記晚歸學生姓名,宿舍號,時間和晚歸原因,以利于學校的管理和查證。 5、離校的基本信息 寒假或暑假時,同學們大部分都會回家,“元旦”、“五一”、“端午”等小長假時,同學們也有很多不會留在宿舍。這時,為加強學校對同學假期安全的管理,離校的同學應登記離校時間,返校后記錄返校時間,以便學校查證和管理。 6、衛生的基本信息 學生入住后,每個宿舍安排好衛生值日表,宿舍管理員每天對宿舍衛生進行檢查并及時上傳衛生情況,針對衛生不合格的宿舍,提出整改意見。學生可以查看衛生評分,針對宿舍衛生出現問題的,根據管理員的意見,及時打掃。出現多次衛生不合格的現象,宿舍管理員及時通知輔導員。 (二)用戶對系統的要求 1、宿舍樓管理員(1)信息要求 宿舍樓管理員能查詢到所管理宿舍樓的所有相關信息,包括某一學號的學生在宿舍樓中住宿的詳細信息,報修的所有信息,夜歸的詳細信息、學生離返校的信息和宿舍衛生信息。以利于對整個宿舍樓的全面管理。(2)處理要求 當學生基本信息發生變化時,宿舍樓管理員能對其進行修改。比如,某些同學搬到其他的宿舍中去,他們在本宿舍樓中相應的記錄就應該刪去;或者學生轉換專業,他們記錄中院系的信息也要作相應的修改;學生畢業后辦理離宿手續等等。 當宿舍樓的電話號碼發生變更時,宿舍樓管理員能根據有關證明做出修改。 當宿舍財產報修及時解決后,管理員應登記解決時間,表明該報修問題已成功解決。每天檢查宿舍衛生,并及時上傳檢查衛生情況。 2、宿舍樓的學生 (1)信息要求 本宿舍樓的學生能查詢其所在的宿舍的所有信息,能查詢本樓的指定宿舍的電話號碼以利于同樓宿舍間的通信,能查詢自己的夜歸記錄,離返校記錄和宿舍衛生情況。 (2)處理要求 本宿舍樓的學生能在報修信息表中插入報修信息,表示本宿舍的財產發生了損毀需要派人維修。 學生離校時,能在離返校記錄表中插入離校時間;學生返校后,能在離返校記錄表中插入返校時間,表示已經回校。 3、安全性要求 (1)系統應設置訪問用戶的標識以鑒別是否是合法用戶,并要求合法用戶設置其密碼,保證用戶身份不被盜用。 (2)系統應對不同的數據設置不同的訪問級別,限制訪問用戶可查詢和處理數據的類別和內容。 (3)系統應對不同用戶設置不同的權限,區分不同的用戶,如區分普通用戶(學生),管理員。 4、完整性要求 (1)各種信息記錄的完整性,信息記錄內容不能為空。(2)各種數據間相互的聯系的正確性。(3)相同的數據在不同記錄中的一致性。 二、系統功能設計和劃分 根據以上的需求分析,將本系統劃分為兩個部分:學生管理部分和管理員部分。 (一)學生管理部分 1、處理學生注冊。 2、處理學生登錄。 3、學生可以查詢自己的信息。 4、學生用戶可以提交與查詢報修信息。 5、學生可以插入與刪除自己的離返校信息。 6、學生可以修改自己的密碼。 (二)管理員管理部分 1、處理管理員登錄。 2、管理員可以查詢學生信息。 3、管理員可以插入、修改與查詢報修信息。 4、管理員可以插入與查詢學生夜歸信息。 5、管理員可以查詢在校與離校學生信息。 6、管理員可以修改管理員密碼。 三、結構化分析與建模 結構化分析方法是一種傳統的系統建模技術,其過程是創建描述信息內容和數據流的模型,依據功能和行為對系統進行劃分,并描述必須建立的系統要素。 (一)數據流圖 用數據流圖描述系統處理過程是一種很直觀的方式,在需求分中用它來建立現存目標系統的數據處理模型,描述數據流被(人工/計算機)處理或者轉換的加工過程。當數據流圖用于軟件設計時,這些處理或者轉換在最終生成的程序中將是若干個程序功能模塊。 1、宿舍管理系統頂層數據流圖 2、一層數據流圖 3、報修管理數據流圖 4、衛生管理數據流圖 5、離校管理數據流圖 6、夜歸管理數據流圖 四、用例圖 五、系統活動圖 1、學生登錄活動圖 2、添加學生信息活動圖 3、修改學生信息活動圖 4、刪除學生信息活動圖 六、系統順序圖 1、添加學生信息順序圖 2、刪除學生信息順序圖 3、管理員修改密碼順序圖 4、學生查詢信息順序圖 5、添加管理員順序圖 6、刪除管理員順序圖 7、管理員登陸順序圖 8、管理員給學生分配宿舍順序圖 七、心得體會 兩周的課程設計結束了,在這次的課程設計中不僅檢驗了我所學習的知識,也培養了我如何去把握一件事情,如何去做一件事情,又如何完成一件事情。在設計過程中,與同學分工設計,和同學們相互探討,相互學習,相互監督。學會了合作,學會了運籌帷幄,學會了寬容,學會了理解,也學會了做人與處世。 課程設計是我們專業課程知識綜合應用的實踐訓練,著是我們邁向社會,從事職業工作前一個必不少的過程.”千里之行始于足下”,通過這次課程設計,我深深體會到這句千古名言的真正含義.我今天認真的進行課程設計,學會腳踏實地邁開這一步,就是為明天能穩健地在社會大潮中奔跑打下堅實的基礎. C#項目開發實訓 總結報告 宿舍信息管理系統的設計 (項目名稱) Information Management System for Dormitory design 班 級 : 軟件092 學生姓名: 唐 坤 學號: 930505037 指導教師: 葛紅美 職稱: 講 師 所屬院(系): 信息管理技術學院 信息工程系 EMAI: 1196301423@qq.com XXXXXXXXXXXC/C++程序設計實訓 電話簿管理系統 學生姓名 ×××× 學 號 ×××× 所在學院 ×××× 專業名稱 ×××× 班 級 ×××× 指導教師 XXX XXXXXXXXXXXXXXXX XXXXXXXXXXXX 目 錄 1.前言··················································································································· 3 2.設計目的··········································································································· 3 3.功能描述··········································································································· 3 4.總體設計··········································································································· 4 1、功能模塊設計···························································································· 4 2、數據結構設計···························································································· 6 3、函數功能描述···························································································· 7 5.程序實現··········································································································· 7 1、源程序(略)···························································································· 7 2、運行結果···································································································· 7 6.小結··················································································································· 9 1.前言 隨著科技的進步和信息產業的飛速發展,電話簿成為了現代生活中一個重要的工具。本電話簿管理系統利用計算機對通訊錄進行統一管理,包括添加、修改、查詢記錄等功能,實現通訊錄管理工作的系統化、規范化和自動化,為人們的工作和生活提供便利。本程序是利用結構數組實現此電話簿管理系統。 2.設計目的 本程序旨在訓練基本編程能力,了解管理信息系統的開發流程,熟悉C語言的文件和結構數組的各種基本操作。本程序中涉及結構體、數組、文件等方面的知識。通過本程序的訓練,能對C語言的文件操作有一個更深刻的了解,掌握利用數組存儲結構實現電話簿管理的原理,為進一步開發出高質量的信息管理系統打下堅實的基礎。 3.功能描述 如圖1所示,電話簿管理系統主要利用數組來實現,其數組元素是結構體類型,整個系統由如下幾大功能模塊組成。 電話簿管理系統輸入記錄模塊查詢記錄模塊更新記錄模塊輸出記錄模塊從文件讀入從鍵盤讀入按姓名查詢按電話查詢修改記錄刪除記錄插入記錄排序記錄輸出至文件輸出至屏幕(1)輸入記錄模塊。輸入記錄模塊主要完成將數據存入數組中的工作。在此電話簿管理系統中,記錄可以從以文本形式存儲的數據文件中讀入,也可從鍵盤逐個輸入記錄。記錄由與聯系人有關的基本信息字段構成。當從數據文件中讀入記錄時,它就是在以記錄為單位存儲的數據文件中,將記錄逐條復制到結構體類型的數組元素中。 (2)查詢記錄模塊。查詢記錄模塊主要完成在數組中查找滿足相關條件的記錄。在此電話簿管理系統中,用戶可以按照聯系人姓名或聯系人電話號碼在數組中進行查找。若找到該記錄,則以表格形式打印出此記錄的信息;否則,返回一個-1的值,并打印出未找到該記錄的提示信息。 (3)更新記錄模塊。更新記錄模塊主要完成對記錄的維護。在此電話簿管理系統中,它實現對記錄的修改、刪除、插入和排序操作。一般而言,系統進行了這些操作之后,需要將修改的數據存入源數據文件。 (4)輸出記錄模塊。輸出記錄模塊主要完成兩個任務。第一,它實現對記錄的存盤操作,即將數組中各元素中存儲的記錄信息寫入數據文件中。第二,它實現將數組中存儲的記 圖1 電話簿管理系統功能模塊 錄信息以表格的形式在屏幕上打印顯示出來。 4.總體設計 1、功能模塊設計 (1)主控main()函數執行流程 電話簿管理系統執行主流程如圖2所示。它先以可讀寫的方式打開文本類型的數據文件,此文件默認為“c:telephon”,若該文件不存在,則新建此數據文件。當打開文件操作成功后,從文件中一次讀出一條記錄,添加到新建的數組中,然后執行顯示主菜單和進入主循環操作,進行按鍵判斷。值得一提的是,文本類型文件與二進制類型文件不同,它可以使用Windows自帶的記事本打開并查看到存儲的文件內容。 開始以可讀寫的方式打開一個數據文件將此文件的內容讀出,并存入一個新的結構體類型的數組中調用emnu()菜單函數進入while(1)主循環輸入0~8中的一個數值,選擇相應操作輸入是否為0?是否判斷鍵值,調用相應函數,完成相應功能是否已對修改進行了存盤?否調用Save()函數,進行寫數據文件操作是結束 圖2 主控函數執行流程圖 在判斷鍵值時,有效的輸入為0-8之間的任意數值,其他輸入都被視為錯誤按鍵。若輸入為0(即變量select=0),則會繼續判斷是否在對記錄進行了更新操作之后進行了存盤操作,若未存盤,則全局變量saveflag=1,系統會提示用戶是否需要進行數據存盤操作,用戶輸入 Y或y,系統會進行存盤操作。最后,系統執行退出電話簿管理系統的操作。 若選擇1,則調用Add()函數,執行增加記錄操作;若選擇2,則調用Disp()函數,執行將記錄以表格形式打印輸出至屏幕的操作;若選擇3,則調用Del()函數,執行刪除記錄操作;若選擇4,則調用Qur()函數,執行查詢記錄操作:若選擇5,則調用Modify()函數,執行修改記錄操作;若選擇6,則調用lnsert()函數,執行插入記錄操作;若選擇7,則調用SelectSort()函數,執行按升序排序記錄的操作;若選擇8,則調用Save()函數,執行將記錄存入磁盤中的數據文件的操作:若輸入為0-8之外的值,則調用Wrong()函數,給出按鍵錯誤的提示。 (2)輸入記錄模塊 輸入記錄模塊主要實現將數據存入數組中。當從數據文件中讀出記錄時,它調用fread(&tele[count],sizeof(TELEBOOK), l,fp)文件讀取函數,執行一次從文件中讀取一條電話簿記錄信息存入某個數組元素中的操作,并且這個操作在main()中調用執行,即在電話簿管理系統進入顯示菜單界面時,該操作己經執行了。若該文件中沒有數據,則系統會提示數組為空,沒有任何記錄可操作,此時,用戶應選擇1,調用Add()函數,進行記錄的輸入,即完成在數組中添加元素的操作。 (3)查詢記錄模塊 查詢記錄模塊主要實現在數組中按聯系人姓名或電話查找滿足條件的記錄。在查詢函數Qur()中,為了遵循模塊化編程的原則,對在數組中進行的記錄定位操作設計成了一個單獨的函數int Locate(TELEBOOK temp[],int n,char findmess[],char nameorphonenum[]),參數findmess[]保存要查找的具體內容,nameorphonenum[]保存要查找的字段(值為字特串類型的name或phonenum),若找到該記錄,則返回指向該記錄的數組元素的下標;否則,返回一個-1的值。 (4)更新記錄模塊 更新記錄模塊主要實現了對記錄的修改、刪除、插入和排序操作。因為記錄是以數組的結構形式存儲的,所以這些操作都在數組中完成。下面分別介紹這4個功能模塊。 1)修改記錄 修改記錄操作需要對數組中目標元素的數據域中的值進行修改,它分兩步完成。第一步,輸入要修改的聯系人姓名,輸入后調用定位函數Locate()在數組中逐個對聯系人姓名字段的值進行比較,直到找到該聯系人姓名的記錄;第二步,若找到該記錄,修改除記錄編號之外的各字段的值,并將存盤標記變saveflag置1,表示已經對記錄進行了修改,但還未執行存盤操作。 2)刪除記錄 刪除記錄操作完成刪除指定聯系人姓名或電話號碼的記錄,它也分兩步完成。第一步,輸入要修改的聯系人姓名或電話號碼,輸入后調用定位函數Locate()在數組中逐個對聯系人姓名或電話號碼字段的值進行比較,直到找到該聯系人姓名或電話號碼的記錄,返回指向該記錄的數組元素下標;第二步,若找到該記錄,則從該記錄所在元素的后續元素起,依次向前移一個元素位置,有值的數組元素個數減1,其具體過程如圖3所示,在刪除了數組元素A2后,數組元素A3和A4向前移動了一個位置 A0刪除A2前A0刪除A2后A1A1A2A3A3A4A4 圖3 數組中刪除記錄示意圖 3)插入記錄 插入記錄操作完成在指定記錄編號的隨后位置插入新的記錄。首先,它要求用戶輸入某個記錄編號,新的記錄將插入在該記錄之后、然后,提示用戶輸入一條新的記錄的信息,這些信息保存在新結構體類型的數組元素的各字段中;最后,將該元素插入在已經確認位置的記錄編號之后。它的具體插入執行過程如圖4所示,新元素B1準備插入至已有5個元素的數組中,插入位置為元素A2之后。這具體過程為:先調用Locate()函數找到A2在數組中的下標,從A4開始,往后移動,至A2停止移動,然后在原A3的位置插入元素B1。 插入B1A0插入B1前A0插入B1后A1A2B1A3A4A1A2A3A4 圖4 數組中插入記錄示意圖 4)排序記錄 選擇排序法也屬于內部排序法中的一種,它是運用字段值比較后,從欲排序的數組元素中,按指定規則選出其字段值最小的元素,并依原則交換數組元素位置后,更新欲排序的數組元素,以達到排序的目的。這里我們采用這種排序法來實現按照記錄編號或聯系人姓名字段的值從低到高對記錄進行升序排序。對按照記錄編號排序方式而言,我們將按其數值大小來排序;對按照聯系人姓名排序方式而言,我們將按其姓名字符ASCII碼的大小來排序。 選擇排序的方法為:從欲排序的n個數組元素中,以線性查找的方式找出最小的元素和第一個元素交換,再從剩下的(n-1)個數組元素中,找出最小的元素和第二個元素交換,以此類推,直到所有元素均已排序完成。 將相鄰的兩個數組元素的電話簿字段的值進行比較,若左邊的值小于右邊的值,則將此兩個元素的值進行交換;若左邊的值大于等于右邊的值,則此兩個值的位置不變。右邊的值繼續和下一個值做比較,重復此動作,直到比較到最后一個值,最終實現了升序排序。選擇排序法是最簡單的排序法,但選擇排序法所需的排序時間比其他排序法長。 (5)輸出記錄模塊 當把記錄輸出至文件時,調用fwrite(&temp[i],sizeof(TELEBOOK),L,fp)函數,將數組元素temp[i ]中各字段的值,寫入文件指針fp所指的文件:當把記錄輸出至屏幕時,調用void Disp()函數,將數組中存儲的記錄信息以表格的形式在屏幕上打印出來。 2、數據結構設計 本程序定義了結構體telebook,用于存放聯系人的基本信息。這里僅有3 個與聯系人有關的字段,讀者可以按照需要擴展相關字段。 typedef struct telebook { char num[4];char name[10];char phonenum[15];char address[20];}TELEBOOK;其各字段的值的含義如下: ? num[4]:保存記錄編號。? name[10]:保存聯系人姓名。? phonenum[15]:保存聯系人的電話號碼。? address[20]:保存聯系人地址。 3、函數功能描述 1)printheader()函數原型:void printheader()printheader()函數用于在表格形式顯示記錄時,打印輸出表頭信息。2)printdata()函數原型:void printdata(TELEBOOK pp)printdatan()數用于以表格顯示的方式,打印輸出單個數組元素pp中的記錄信息。3)Disp()函數原型:void Disp(TELEBOOK temp[],int n)Disp()函數用于顯示temp數組中存儲的n條記錄,內容為telebook結構中定義的內容。其余函數功能描述省略,請同學們在自己寫的時候寫完整。 5.程序實現 1、源程序(略) 2、運行結果 (1)主界面 圖5 主界面 當用戶剛進入電話簿管理系統時,其主界面如圖5所示。此時,系統己經將“c:telephon”文件打開,若文件不為空,則將數據從文件中逐條記錄讀出,并寫入數組中。用戶可選擇0-8之間的數值,調用相應功能進行操作。當輸入為0時,退出此管理系統。 (2)輸入記錄 當用戶輸入1并按Enter鍵后,即可進入數據輸入界面。其輸入記錄過程如圖6所示,這里輸入了3條記錄。當用戶輸入為0的記錄編號時,它會結束輸入過程,返回到主菜單界面。 (3)顯示記錄 當用戶執行了輸入記錄或已經從數據文件中讀取了記錄之后,即可輸入2并按Enter鍵,查看當前數組中的記錄情況,如圖7所示,此時表中有3條記錄。 圖6 輸入記錄 圖7 顯示記錄 (4)刪除記錄 當用戶輸入3并按Enter鍵后,即可進入記錄刪除界面。其刪除記錄過程如圖8所示,這里按聯系人姓名刪除了一條姓名為A1的記錄。 圖8 刪除記錄 (5)查找記錄 當用戶輸入4并按Enter鍵后,即可進入記錄查找界面。其查找記錄過程如圖9所示,8 用戶可按姓名或電話號碼進行記錄查找。 圖9 查找記錄 (6)修改記錄 當用戶輸入5并按Enter鍵后,即可進入記錄修改界面。其修改記錄過程如圖10所示,這里修改了姓名為a2的聯系電話和地址字段。 圖11 修改記錄 (7)插入記錄 當用戶輸入6并按Enter鍵后,即可進入記錄插入界面。其插入過程如圖11所示,這里在記錄編號為3的記錄后插入了一條記錄編號為5的記錄。 (8)排序記錄 當用戶輸入7并按Enter鍵后,即可進入記錄排序界面。用戶可以選擇按照記錄編號或聯系人姓名進行排序,圖12為按記錄編號進行記錄升序排序的結果。 (9)保存記錄 當用戶輸入8并按Enter鍵后,即可進入記錄保存界面。其保存結果提示信息如圖13所示,這里有3條記錄已經存儲至磁盤數據文件c:telephon中。 6.小結 本文介紹了電話簿管理系統的設計思路及其編程實現,重點介紹了功能模塊的設計原理和利用數組存儲結構實現電話簿管理的過程。通過本程序的開發使我熟悉C語言下的文件和數組操作,了解管理信息系統(MIS)的開發原理,并注意利用選擇排序法來實現數組元素 排序的特點。 利用本電話簿管理系統可以對通訊錄進行日常維護和管理。第二篇:C++通訊錄管理系統
第三篇:軟件工程 學生宿舍管理系統
第四篇:學生宿舍管理系統-小結
第五篇:C++程序設計—電話簿管理系統