手機通訊錄課程設計
① 課程設計,急!!簡單的通訊錄管理系統!!
//chuangyong 頭文件模塊 chuangyong.h
const int MaxLen=200; //最多可存放200個聯系人信息
char fName[20]="tel.dat";//磁碟文件:通信錄文件名
int Len; //全局變數,通信錄中當前聯系人總數
//1. 通訊錄數據結構設計
typedef struct Telephone
{
char name[20]; //姓名
int group;//群組:1.朋友 2.同事 3.家人 4.其他
char home[15];//住宅電話
char mobile[15];//手機
char email[20];//Email
char add[20];//地址
char memo[20];//備注
}Tel;
//指針數組結構,排序時用
typedef struct index
{
int len; //數組長度
Tel *tel[MaxLen]; //指針數組,
}Index;
//顯示模塊 xuanshi.cpp
void List(Tel tel[],Index lianxren); //按lianxren中指針數組的排序方式顯示所有聯系人。
void dayingbiaotou(void); //列印表頭
void dayingbiaowei(void);//列印表尾
void PrintOne(Tel r,int i); //僅列印一個聯系人r的信息,序號為i
void Print(Tel r); //列印表頭及一個聯系人的信息
void huanyin();//歡迎界面
int Menu(void); //主菜單,顯示第一級菜單:查看通信錄(1)、更新通信錄(2)、備份通信錄(3)、退出(0)。
int Menu2(void); //更新通信錄子菜單,顯示:新增聯系人(21)、編輯聯系人(22)、刪除聯系人(23)、返回主菜單(20)。
//文件處理模塊 wenjiancl.cpp
void New(Tel tel[],Index *lianxren); //新增聯系人。加到數組中第一個空著的位置。之後需要重新排序
void Edit(Tel tel[],Index *lianxren); //編輯聯系人。需要重新排序
void Delete(Tel tel[],Index *lianxren); // 刪除聯系人。邏輯刪除,僅將姓名賦空串。刪除後需要重新排序
void Input(Tel *r,Tel tel[],int menu); //輸入一個聯系人的信息,由menu識別:是新增(11)還是修改(13)
int chongcha(char *name,Tel tel[],char *orignal);//查重。在新增聯或編輯系人前,檢查是否有重名的情況。
int Select(); //選擇聯系人序號,避免出錯
int Load(Tel tel[],Index *lianxren); //讀取。將通信錄文件fName讀入內存。排序
int Save(Tel tel[]); //保存。將通信錄以fName(全局變數)為名保存到磁碟。此時做物理刪除:姓名為空串的聯系人表示已刪除,不存入通信錄文件。
int Copy(void); //備份通信錄。復制通信錄文件。
void pingypaix(Tel tel[],Index *lianxren); //按音序排序。
void xuanzpaixi(Index *p); //對指針數組選擇排序
//主文件模塊 zhuwenjian.cpp
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#include "chuangyong.h"
#include "xuanshi.cpp"
#include "wenjiancl.cpp"
int main()
{
huanyin();
int select=0;
Tel tel[MaxLen]; //最多存放200個聯系人
Index lianxren;//按音序排序的指針數組
Load(tel,&lianxren); //從通信錄文件讀取信息
//循環顯示菜單,供用戶選擇
do{
if(select<10 || select==20)//選的是主菜單項<10,或由子菜單返回20。接著顯示主菜單
select=Menu();
else if(select>20 && select<30)//選的是子菜單2的項,繼續顯示子菜單2
select=Menu2();
switch(select)
{
case 1://按音序查看通信錄
List(tel,lianxren);
printf("\n\n\t按任意鍵繼續... ...");
getch(); //等待用戶看清屏幕,conio.h
break;
case 21: //新增聯系人
New(tel,&lianxren);
break;
case 22: //編輯聯系人
Edit(tel,&lianxren);
break;
case 23: //刪除聯系人
Delete(tel,&lianxren);
break;
case 20: //返回主菜單
break;
case 3: //備份通信錄
system("cls"); //沒有子菜單,先清除上一級菜單,stdlib.h
Save(tel); //用戶可能更新過,先保存當前tel到通信錄文件
Copy();
break;
case 0: //退出程序
break;
}
}while(select!=0);
Save(tel); //退出系統前,將內存數據存入通信錄文件
return 0;
}
//xuanshi.cpp 菜單模塊。與程序其他模塊獨立。通過返回的菜單代碼與操作對應
// 歡迎部分
void huanyin()
{
char A[100]={"歡迎使用本通訊錄 本程序由 飛堯 編寫 o(∩_∩)o...!回車進入!"};
int i,j,k;
for(i=0;i<6;i++)
{
printf("\n");
}
puts(" ******************************************************\n");
printf("\t\t");
for(i=0;A[i]!='\0';i++)
{
if(i==49)printf("\n\n\t\t\t");
printf("%c",A[i]);
for(j=0;j<10000;j++)
for(k=0;k<2000;k++)
;
}
puts("\n\n\n\t\t\t 07計科C班 王崇堯");
puts("\n ******************************************************\a");
getch();
}
//主菜單,顯示第一級菜單:查看通信錄(1)、更新通信錄(2)、備份通信錄(3)、退出(0)。
int Menu(void)
{
int i;
char menu;
do{
system("cls"); //清屏,stdlib.h
for(i=0;i<6;i++)
{
printf("\n");
}
puts("\n **********主菜單*********");
puts(" * *");
puts(" * 1. 查看通信錄 *");
puts(" * 2. 更新通信錄 *");
puts(" * 3. 備份通信錄 *");
puts(" * 0. 退出程序 *");
puts(" * *");
puts(" *************************\n");
printf("\t 請選擇:");
menu = getche();
switch( menu )
{
case '0':
puts("\n\n\t退出程序!");
menu=menu-'0';
break; // 跳出循環
case '1':
case '3':
menu=menu-'0';
break;
case '2':
menu=Menu2();
break;
default:
puts("\n\n\t選擇錯誤!");
menu='9';
}
}while(menu=='9');//要返回菜單代碼,'0'、'1'、20,21,22,23、'3'都是有效值
return menu;
}
//更新通信錄子菜單,顯示:新增聯系人(21)、編輯聯系人(22)、刪除聯系人(23)、返回(20)。
int Menu2()
{
char menu;
int i;
do{
system("cls"); //清屏,stdlib.h
for(i=0;i<6;i++)
{
printf("\n");
}
puts("\n ********更新通信錄*******");
puts(" * *");
puts(" * 1. 新增聯系人 *");
puts(" * 2. 編輯聯系人 *");
puts(" * 3. 刪除聯系人 *");
puts(" * 0. 返回主菜單 *");
puts(" * *");
puts(" *************************\n");
printf("\t 請選擇:");
menu = getche(); //輸入一個字元,不回顯,不需要敲入回車,conio.h
switch( menu )
{
case '0':
puts("\n\n\t返回主菜單!");
break;// 跳出循環
case '1':
case '2':
case '3':
break;
default:
puts("\n\n\t選擇錯誤!");
menu='9';
}
}while(menu=='9'); //要返回菜單代碼,'0'、'1'、'2'、'3'都是有效值
return 20+menu-'0';
}
//瀏覽部分
void List(Tel tel[],Index lianxren) //按lianxren的排序方式顯示所有結點。
{
int i; //i:數組下標
if(Len==0)
{
printf("\n\t沒有聯系人");
return ;
}
dayingbiaotou();
for(i=0; i<Len; i++) //按音序遍歷所有聯系人,序號為i+1
PrintOne( *(lianxren.tel[i]), i+1);
dayingbiaowei();
}
void dayingbiaotou(void) //列印表頭
{
printf("\n\n\t通信錄 * 聯系人");
printf("\n\t----------------------------------------------------------------------");
printf("\n\t%-10s%-6s%-10s%-10s", "姓名", "群組", "住宅電話", "手機");
printf("%-10s%-10s%-10s", "Email", "地址", "備注");
printf("\n\t----------------------------------------------------------------------");
}
void dayingbiaowei(void)//列印表尾
{
printf("\n\t----------------------------------------------------------------------\n");
}
void PrintOne(Tel r,int i) //僅列印一個聯系人r的信息,序號為i
{
if(i!=0) //聯系人前加序號
printf("\n%6d\t%-10s",i,r.name);
else //聯系人前不加序號
printf("\n\t%-10s",r.name);
//群組:1.朋友 2.同事 3.家人 4.其他
switch(r.group)
{
case 1:
printf("%-6s","朋友");
break;
case 2:
printf("%-6s","同事");
break;
case 3:
printf("%-6s","家人");
break;
default:
printf("%-6s","其他");
}
printf("%-10s%-10s%-10s", r.home , r.mobile , r.email);
printf("%-10s%-10s",r.add , r.memo );
}
void Print(Tel r) //列印表頭及一個聯系人的信息
{
dayingbiaotou();
PrintOne(r,0);//只列印一人,不輸出序號(第二個參數為0)
dayingbiaowei();
}
//文件處理模塊 wenjiancl.cpp
//文件處理部分
int Load(Tel tel[],Index *lianxren) //讀取。將通信錄文件fName讀入內存。排序
{
FILE *fin;
int i=0;
fin=fopen(fName,"rb");
if(!fin)
{
printf("\n\t通信錄不存在,請先新增聯系人!\n\n按任意鍵繼續... ...");
getch();
return 0;
}
while(1)
{
fread(&tel[i],sizeof(Tel),1,fin);
if(feof(fin))
break;
i++;
}
fclose(fin);
Len=i;//更新通信錄總人數
pingypaix(tel,lianxren); //按音序排序
return i;
}
int Save(Tel tel[]) //保存。將通信錄以fName(全局變數)為名保存到磁碟。此時做物理刪除:姓名為空串的聯系人表示已刪除,不存入通信錄文件。
{
FILE* fout;
int i,j;//i:tel數組的下標,j:通信錄中實際人數計數(不含tel中name為空的元素)
fout=fopen(fName,"wb");
if(!fout)
{
printf("\n\t不能正確保存通信錄!按任意鍵繼續... ...");
getch();
return 0;
}
//i為tel數組下標,j為實際人數計數(tel數組中有已邏輯刪除的聯系人,姓名為空串)
for(i=0,j=0; j<Len; )
{
//找到一個有效的聯系人,排出邏輯刪除者(姓名為空串)
while( strcmp(tel[i].name,"") == 0 )
i++;
fwrite(&tel[i],sizeof(Tel),1,fout);
i++;
j++;
}
fclose(fout);
return j;
}
int Copy(void) //備份通信錄。復制通信錄文件。
{
FILE *fout,*fin;
Tel *p=(Tel*)malloc(sizeof(Tel)); //存放從通信錄讀入的臨時數據
char name[20];
fin=fopen(fName,"rb");
if(!fin)
{
printf("\n\t沒有聯系人!");
return 0;
}
do{
printf("\n\t請輸入備份文件名:");
scanf("%s",name);
strcat(name,".bak");
fout=fopen(name,"wb");
if(!fout)
printf("\t無效文件名或路徑!\n");
}while(!fout);
while(1)
{
fread(p,sizeof(Tel),1,fin);
if(feof(fin))
break;
fwrite(p,sizeof(Tel),1,fout);
}
printf("\n\t備份成功!");
free(p);
return 1;
}
//基本操作部分
void New(Tel tel[],Index *lianxren) //新增聯系人。加到數組中第一個空著的位置。之後需要重新排序
{
int t=0; //找到tel中第一個空的位置,存放新輸入的聯系人
if(Len>=MaxLen)
{
printf("\n\n\t通信錄已滿!");
return ;
}
//找到tel中第一個空的位置t
while( strcmp(tel[t].name,"")!=0 )
t++;
Input(&tel[t],tel,21);//新增聯系人(21),輸入聯系人信息
Len++; //聯系人增1
pingypaix(tel,lianxren);//重新排序
}
void Edit(Tel tel[],Index *lianxren) //編輯聯系人。需要重新排序
{
int i;
List(tel,*lianxren);//按音序排序的順序修改
if(Len==0) return ;
i=Select();
Print( *(lianxren->tel[i]) ); //顯示用戶選中的聯系人i
Input( lianxren->tel[i] ,tel,23); //編輯(23)時輸入聯系人信息
pingypaix(tel,lianxren); //重新排序
}
void Delete(Tel tel[],Index *lianxren) // 刪除聯系人。邏輯刪除,僅將姓名賦空串。刪除後需要重新排序
{
int i;
char select; //用戶選擇:是否繼續輸入除姓名以外的信息
List(tel,*lianxren);//按音序排序的順序刪除
if(Len==0) return ;
i=Select();
Print( *(lianxren->tel[i]) );//顯示用戶選中的聯系人i
printf("\n\t確定要刪除此人?(y/n)");
select=getche();
if(select=='Y' || select=='y')
{
strcpy(lianxren->tel[i]->name,"");//刪除聯系人信息(邏輯刪除):將姓名賦空串,表示無人
Len--; //聯系人減1
pingypaix(tel,lianxren);//重新排序
}
}
void Input(Tel *r,Tel tel[],int menu) //輸入一個聯系人的信息,由們menu識別:是新增(11)還是修改(13)
{
int select;
char name[20],orignal[20];
if(menu==21)//新增,原來沒名字
strcpy(orignal,"");
else //編輯,原來有名字
strcpy(orignal,r->name );
printf("\n\n\t請輸入聯系人姓名:");
do{
scanf("%s", name);
}while(chongcha(name,tel,orignal)); //重名檢查。修改時,可以與原來的姓名相同
strcpy(r->name,name);
printf("\t是否繼續輸入(y/n)?");
select=getche();
if(select=='y' || select=='Y')
{
//群組
printf("\n\t群組(1.朋友 2.同事 3.家人 4.其他),請輸入序號:");
scanf("%d",& (r->group));
while( r->group<1 ||r->group>4)
{
printf("\n\t輸入錯誤!請重新輸入群組序號(1.朋友 2.同事 3.家人 4.其他):");
scanf("%d",& (r->group));
}
printf("\t住宅電話:");
scanf("%s",r->home );
printf("\t手機:");
scanf("%s",r->mobile );
printf("\tEmail:");
scanf("%s",r->email );
printf("\t地址:");
scanf("%s",r->add);
printf("\t備註:");
scanf("%s",r->memo );
}
else if(menu==21) //新增聯系人(menu=21)時,用戶未輸入,設置預設值
{
r->group=4; //預設群組:其他
strcpy(r->home , "");
strcpy(r->mobile , "");
strcpy(r->email , "");
strcpy(r->add , "");
strcpy(r->memo , "");
}
}
int chongcha(char *name,Tel tel[],char *original)//查重。在新增或編輯聯系人前,檢查是否有重名的情況。
{
int i,j; //i:數組下標 j: 除姓名為空串以外的實際人數
int p=0; //重名標志:1 重名,0沒有重名
if(strcmp(name,original)!=0)//name不是原來的名字,
for(i=0,j=0; j<Len; ) //遍歷所有聯系人
{
//找到一個有效的聯系人,排出邏輯刪除者(姓名為空串)
while( strcmp(tel[i].name,"") == 0 )
i++;
if( strcmp(name,tel[i].name)==0 ) //name不是原來的名字,但與通信錄中名字重復
{
p=1;
printf("\n\t重名!請重新輸入:");
break;
}
i++;
j++;
}
return p;
}
int Select() //選擇聯系人序號,避免出錯
{
int i=0;
int c; //c: scanf()輸入的返回值,輸入成功,返回1;否則,返回0
printf("\n\t請按序號選擇聯系人:");
c=scanf("%d",&i);
while(i<1 || i>Len)
{
printf("\n\t輸入錯誤!請按序號選擇聯系人:");
if(c==0) fflush(stdin); //輸入不成功,清空與輸入流stdin有關的輸入緩沖區的內容,stdio.h
c=scanf("%d",&i);
}
return i-1;
}
//排序部分
void pingypaix(Tel tel[],Index *lianxren) //按音序排序。
{
int i,j; //i:數組下標 j: 除姓名為空串以外的實際人數
if( Len==0 )
return ;
//初始化排序指針數組
lianxren->len=0;
for(i=0,j=0; j<Len; )
{
//找到一個有效的聯系人,排出邏輯刪除者(姓名為空串)
while( strcmp(tel[i].name,"") == 0 )
i++;
lianxren->tel[j]=&tel[i];
j++;
i++;
lianxren->len++;
}
//選擇排序
xuanzpaixi( lianxren );
}
void xuanzpaixi(Index *p) //對指針數組選擇排序
{
int i,j,n=p->len;
int min;
Tel *temp;
if( n==0 ) return ;//沒有聯系人,不需要排序
//選擇排序
for(i=0; i<n-1; i++)
{
//找最小元素
min=i;
for(j=i+1; j<n; j++)
{
if(strcmp( p->tel[j]->name , p->tel[min]->name )<0)
min=j;
}
//交換 最小元素min,當前無序序列第一個元素i
if(min!=i)
{
temp=p->tel[i];
p->tel[i]=p->tel[min];
p->tel[min]=temp;
}
}//end of for i
}
把以上模塊 分別按模塊名建立文件 在編譯器上調試就可以用了……
② 誰有通訊錄管理系統的課程設計報告啊 謝謝了~~~
//chuangyong 頭文件模塊 chuangyong.h
const int MaxLen=200; //最多可存放200個聯系人信息
char fName[20]="tel.dat";//磁碟文件:通信錄文件名
int Len; //全局變數,通信錄中當前聯系人總數
//1. 通訊錄數據結構設計
typedef struct Telephone
{
char name[20]; //姓名
int group;//群組:1.朋友 2.同事 3.家人 4.其他
char home[15];//住宅電話
char mobile[15];//手機
char email[20];//Email
char add[20];//地址
char memo[20];//備注
}Tel;
//指針數組結構,排序時用
typedef struct index
{
int len; //數組長度
Tel *tel[MaxLen]; //指針數組,
}Index;
//顯示模塊 xuanshi.cpp
void List(Tel tel[],Index lianxren); //按lianxren中指針數組的排序方式顯示所有聯系人。
void dayingbiaotou(void); //列印表頭
void dayingbiaowei(void);//列印表尾
void PrintOne(Tel r,int i); //僅列印一個聯系人r的信息,序號為i
void Print(Tel r); //列印表頭及一個聯系人的信息
void huanyin();//歡迎界面
int Menu(void); //主菜單,顯示第一級菜單:查看通信錄(1)、更新通信錄(2)、備份通信錄(3)、退出(0)。
int Menu2(void); //更新通信錄子菜單,顯示:新增聯系人(21)、編輯聯系人(22)、刪除聯系人(23)、返回主菜單(20)。
//文件處理模塊 wenjiancl.cpp
void New(Tel tel[],Index *lianxren); //新增聯系人。加到數組中第一個空著的位置。之後需要重新排序
void Edit(Tel tel[],Index *lianxren); //編輯聯系人。需要重新排序
void Delete(Tel tel[],Index *lianxren); // 刪除聯系人。邏輯刪除,僅將姓名賦空串。刪除後需要重新排序
void Input(Tel *r,Tel tel[],int menu); //輸入一個聯系人的信息,由menu識別:是新增(11)還是修改(13)
int chongcha(char *name,Tel tel[],char *orignal);//查重。在新增聯或編輯系人前,檢查是否有重名的情況。
int Select(); //選擇聯系人序號,避免出錯
int Load(Tel tel[],Index *lianxren); //讀取。將通信錄文件fName讀入內存。排序
int Save(Tel tel[]); //保存。將通信錄以fName(全局變數)為名保存到磁碟。此時做物理刪除:姓名為空串的聯系人表示已刪除,不存入通信錄文件。
int Copy(void); //備份通信錄。復制通信錄文件。
void pingypaix(Tel tel[],Index *lianxren); //按音序排序。
void xuanzpaixi(Index *p); //對指針數組選擇排序
//主文件模塊 zhuwenjian.cpp
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
#include "chuangyong.h"
#include "xuanshi.cpp"
#include "wenjiancl.cpp"
int main()
{
huanyin();
int select=0;
Tel tel[MaxLen]; //最多存放200個聯系人
Index lianxren;//按音序排序的指針數組
Load(tel,&lianxren); //從通信錄文件讀取信息
//循環顯示菜單,供用戶選擇
do{
if(select<10 || select==20)//選的是主菜單項<10,或由子菜單返回20。接著顯示主菜單
select=Menu();
else if(select>20 && select<30)//選的是子菜單2的項,繼續顯示子菜單2
select=Menu2();
switch(select)
{
case 1://按音序查看通信錄
List(tel,lianxren);
printf("\n\n\t按任意鍵繼續... ...");
getch(); //等待用戶看清屏幕,conio.h
break;
case 21: //新增聯系人
New(tel,&lianxren);
break;
case 22: //編輯聯系人
Edit(tel,&lianxren);
break;
case 23: //刪除聯系人
Delete(tel,&lianxren);
break;
case 20: //返回主菜單
break;
case 3: //備份通信錄
system("cls"); //沒有子菜單,先清除上一級菜單,stdlib.h
Save(tel); //用戶可能更新過,先保存當前tel到通信錄文件
Copy();
break;
case 0: //退出程序
break;
}
}while(select!=0);
Save(tel); //退出系統前,將內存數據存入通信錄文件
return 0;
}
//xuanshi.cpp 菜單模塊。與程序其他模塊獨立。通過返回的菜單代碼與操作對應
// 歡迎部分
void huanyin()
{
char A[100]={"歡迎使用本通訊錄 本程序由 飛堯 編寫 o(∩_∩)o...!回車進入!"};
int i,j,k;
for(i=0;i<6;i++)
{
printf("\n");
}
puts(" ******************************************************\n");
printf("\t\t");
for(i=0;A[i]!='\0';i++)
{
if(i==49)printf("\n\n\t\t\t");
printf("%c",A[i]);
for(j=0;j<10000;j++)
for(k=0;k<2000;k++)
;
}
puts("\n\n\n\t\t\t 07計科C班 王崇堯");
puts("\n ******************************************************\a");
getch();
}
//主菜單,顯示第一級菜單:查看通信錄(1)、更新通信錄(2)、備份通信錄(3)、退出(0)。
int Menu(void)
{
int i;
char menu;
do{
system("cls"); //清屏,stdlib.h
for(i=0;i<6;i++)
{
printf("\n");
}
puts("\n **********主菜單*********");
puts(" * *");
puts(" * 1. 查看通信錄 *");
puts(" * 2. 更新通信錄 *");
puts(" * 3. 備份通信錄 *");
puts(" * 0. 退出程序 *");
puts(" * *");
puts(" *************************\n");
printf("\t 請選擇:");
menu = getche();
switch( menu )
{
case '0':
puts("\n\n\t退出程序!");
menu=menu-'0';
break; // 跳出循環
case '1':
case '3':
menu=menu-'0';
break;
case '2':
menu=Menu2();
break;
default:
puts("\n\n\t選擇錯誤!");
menu='9';
}
}while(menu=='9');//要返回菜單代碼,'0'、'1'、20,21,22,23、'3'都是有效值
return menu;
}
//更新通信錄子菜單,顯示:新增聯系人(21)、編輯聯系人(22)、刪除聯系人(23)、返回(20)。
int Menu2()
{
char menu;
int i;
do{
system("cls"); //清屏,stdlib.h
for(i=0;i<6;i++)
{
printf("\n");
}
puts("\n ********更新通信錄*******");
puts(" * *");
puts(" * 1. 新增聯系人 *");
puts(" * 2. 編輯聯系人 *");
puts(" * 3. 刪除聯系人 *");
puts(" * 0. 返回主菜單 *");
puts(" * *");
puts(" *************************\n");
printf("\t 請選擇:");
menu = getche(); //輸入一個字元,不回顯,不需要敲入回車,conio.h
switch( menu )
{
case '0':
puts("\n\n\t返回主菜單!");
break;// 跳出循環
case '1':
case '2':
case '3':
break;
default:
puts("\n\n\t選擇錯誤!");
menu='9';
}
}while(menu=='9'); //要返回菜單代碼,'0'、'1'、'2'、'3'都是有效值
return 20+menu-'0';
}
//瀏覽部分
void List(Tel tel[],Index lianxren) //按lianxren的排序方式顯示所有結點。
{
int i; //i:數組下標
if(Len==0)
{
printf("\n\t沒有聯系人");
return ;
}
dayingbiaotou();
for(i=0; i<Len; i++) //按音序遍歷所有聯系人,序號為i+1
PrintOne( *(lianxren.tel[i]), i+1);
dayingbiaowei();
}
void dayingbiaotou(void) //列印表頭
{
printf("\n\n\t通信錄 * 聯系人");
printf("\n\t----------------------------------------------------------------------");
printf("\n\t%-10s%-6s%-10s%-10s", "姓名", "群組", "住宅電話", "手機");
printf("%-10s%-10s%-10s", "Email", "地址", "備注");
printf("\n\t----------------------------------------------------------------------");
}
void dayingbiaowei(void)//列印表尾
{
printf("\n\t----------------------------------------------------------------------\n");
}
void PrintOne(Tel r,int i) //僅列印一個聯系人r的信息,序號為i
{
if(i!=0) //聯系人前加序號
printf("\n%6d\t%-10s",i,r.name);
else //聯系人前不加序號
printf("\n\t%-10s",r.name);
//群組:1.朋友 2.同事 3.家人 4.其他
switch(r.group)
{
case 1:
printf("%-6s","朋友");
break;
case 2:
printf("%-6s","同事");
break;
case 3:
printf("%-6s","家人");
break;
default:
printf("%-6s","其他");
}
printf("%-10s%-10s%-10s", r.home , r.mobile , r.email);
printf("%-10s%-10s",r.add , r.memo );
}
void Print(Tel r) //列印表頭及一個聯系人的信息
{
dayingbiaotou();
PrintOne(r,0);//只列印一人,不輸出序號(第二個參數為0)
dayingbiaowei();
}
//文件處理模塊 wenjiancl.cpp
//文件處理部分
int Load(Tel tel[],Index *lianxren) //讀取。將通信錄文件fName讀入內存。排序
{
FILE *fin;
int i=0;
fin=fopen(fName,"rb");
if(!fin)
{
printf("\n\t通信錄不存在,請先新增聯系人!\n\n按任意鍵繼續... ...");
getch();
return 0;
}
while(1)
{
fread(&tel[i],sizeof(Tel),1,fin);
if(feof(fin))
break;
i++;
}
fclose(fin);
Len=i;//更新通信錄總人數
pingypaix(tel,lianxren); //按音序排序
return i;
}
int Save(Tel tel[]) //保存。將通信錄以fName(全局變數)為名保存到磁碟。此時做物理刪除:姓名為空串的聯系人表示已刪除,不存入通信錄文件。
{
FILE* fout;
int i,j;//i:tel數組的下標,j:通信錄中實際人數計數(不含tel中name為空的元素)
fout=fopen(fName,"wb");
if(!fout)
{
printf("\n\t不能正確保存通信錄!按任意鍵繼續... ...");
getch();
return 0;
}
//i為tel數組下標,j為實際人數計數(tel數組中有已邏輯刪除的聯系人,姓名為空串)
for(i=0,j=0; j<Len; )
{
//找到一個有效的聯系人,排出邏輯刪除者(姓名為空串)
while( strcmp(tel[i].name,"") == 0 )
i++;
fwrite(&tel[i],sizeof(Tel),1,fout);
i++;
j++;
}
fclose(fout);
return j;
}
int Copy(void) //備份通信錄。復制通信錄文件。
{
FILE *fout,*fin;
Tel *p=(Tel*)malloc(sizeof(Tel)); //存放從通信錄讀入的臨時數據
char name[20];
fin=fopen(fName,"rb");
if(!fin)
{
printf("\n\t沒有聯系人!");
return 0;
}
do{
printf("\n\t請輸入備份文件名:");
scanf("%s",name);
strcat(name,".bak");
fout=fopen(name,"wb");
if(!fout)
printf("\t無效文件名或路徑!\n");
}while(!fout);
while(1)
{
fread(p,sizeof(Tel),1,fin);
if(feof(fin))
break;
fwrite(p,sizeof(Tel),1,fout);
}
printf("\n\t備份成功!");
free(p);
return 1;
}
//基本操作部分
void New(Tel tel[],Index *lianxren) //新增聯系人。加到數組中第一個空著的位置。之後需要重新排序
{
int t=0; //找到tel中第一個空的位置,存放新輸入的聯系人
if(Len>=MaxLen)
{
printf("\n\n\t通信錄已滿!");
return ;
}
//找到tel中第一個空的位置t
while( strcmp(tel[t].name,"")!=0 )
t++;
Input(&tel[t],tel,21);//新增聯系人(21),輸入聯系人信息
Len++; //聯系人增1
pingypaix(tel,lianxren);//重新排序
}
void Edit(Tel tel[],Index *lianxren) //編輯聯系人。需要重新排序
{
int i;
List(tel,*lianxren);//按音序排序的順序修改
if(Len==0) return ;
i=Select();
Print( *(lianxren->tel[i]) ); //顯示用戶選中的聯系人i
Input( lianxren->tel[i] ,tel,23); //編輯(23)時輸入聯系人信息
pingypaix(tel,lianxren); //重新排序
}
void Delete(Tel tel[],Index *lianxren) // 刪除聯系人。邏輯刪除,僅將姓名賦空串。刪除後需要重新排序
{
int i;
char select; //用戶選擇:是否繼續輸入除姓名以外的信息
List(tel,*lianxren);//按音序排序的順序刪除
if(Len==0) return ;
i=Select();
Print( *(lianxren->tel[i]) );//顯示用戶選中的聯系人i
printf("\n\t確定要刪除此人?(y/n)");
select=getche();
if(select=='Y' || select=='y')
{
strcpy(lianxren->tel[i]->name,"");//刪除聯系人信息(邏輯刪除):將姓名賦空串,表示無人
Len--; //聯系人減1
pingypaix(tel,lianxren);//重新排序
}
}
void Input(Tel *r,Tel tel[],int menu) //輸入一個聯系人的信息,由們menu識別:是新增(11)還是修改(13)
{
int select;
char name[20],orignal[20];
if(menu==21)//新增,原來沒名字
strcpy(orignal,"");
else //編輯,原來有名字
strcpy(orignal,r->name );
printf("\n\n\t請輸入聯系人姓名:");
do{
scanf("%s", name);
}while(chongcha(name,tel,orignal)); //重名檢查。修改時,可以與原來的姓名相同
strcpy(r->name,name);
printf("\t是否繼續輸入(y/n)?");
select=getche();
if(select=='y' || select=='Y')
{
//群組
printf("\n\t群組(1.朋友 2.同事 3.家人 4.其他),請輸入序號:");
scanf("%d",& (r->group));
while( r->group<1 ||r->group>4)
{
printf("\n\t輸入錯誤!請重新輸入群組序號(1.朋友 2.同事 3.家人 4.其他):");
scanf("%d",& (r->group));
}
printf("\t住宅電話:");
scanf("%s",r->home );
printf("\t手機:");
scanf("%s",r->mobile );
printf("\tEmail:");
scanf("%s",r->email );
printf("\t地址:");
scanf("%s",r->add);
printf("\t備註:");
scanf("%s",r->memo );
}
else if(menu==21) //新增聯系人(menu=21)時,用戶未輸入,設置預設值
{
r->group=4; //預設群組:其他
strcpy(r->home , "");
strcpy(r->mobile , "");
strcpy(r->email , "");
strcpy(r->add , "");
strcpy(r->memo , "");
}
}
int chongcha(char *name,Tel tel[],char *original)//查重。在新增或編輯聯系人前,檢查是否有重名的情況。
{
int i,j; //i:數組下標 j: 除姓名為空串以外的實際人數
int p=0; //重名標志:1 重名,0沒有重名
if(strcmp(name,original)!=0)//name不是原來的名字,
for(i=0,j=0; j<Len; ) //遍歷所有聯系人
{
//找到一個有效的聯系人,排出邏輯刪除者(姓名為空串)
while( strcmp(tel[i].name,"") == 0 )
i++;
if( strcmp(name,tel[i].name)==0 ) //name不是原來的名字,但與通信錄中名字重復
{
p=1;
printf("\n\t重名!請重新輸入:");
break;
}
i++;
j++;
}
return p;
}
int Select() //選擇聯系人序號,避免出錯
{
int i=0;
int c; //c: scanf()輸入的返回值,輸入成功,返回1;否則,返回0
printf("\n\t請按序號選擇聯系人:");
c=scanf("%d",&i);
while(i<1 || i>Len)
{
printf("\n\t輸入錯誤!請按序號選擇聯系人:");
if(c==0) fflush(stdin); //輸入不成功,清空與輸入流stdin有關的輸入緩沖區的內容,stdio.h
c=scanf("%d",&i);
}
return i-1;
}
//排序部分
void pingypaix(Tel tel[],Index *lianxren) //按音序排序。
{
int i,j; //i:數組下標 j: 除姓名為空串以外的實際人數
if( Len==0 )
return ;
//初始化排序指針數組
lianxren->len=0;
for(i=0,j=0; j<Len; )
{
//找到一個有效的聯系人,排出邏輯刪除者(姓名為空串)
while( strcmp(tel[i].name,"") == 0 )
i++;
lianxren->tel[j]=&tel[i];
j++;
i++;
lianxren->len++;
}
//選擇排序
xuanzpaixi( lianxren );
}
void xuanzpaixi(Index *p) //對指針數組選擇排序
{
int i,j,n=p->len;
int min;
Tel *temp;
if( n==0 ) return ;//沒有聯系人,不需要排序
//選擇排序
for(i=0; i<n-1; i++)
{
//找最小元素
min=i;
for(j=i+1; j<n; j++)
{
if(strcmp( p->tel[j]->name , p->tel[min]->name )<0)
min=j;
}
//交換 最小元素min,當前無序序列第一個元素i
if(min!=i)
{
temp=p->tel[i];
p->tel[i]=p->tel[min];
p->tel[min]=temp;
}
}//end of for i
}
③ 求一份完整的正確的資料庫課程設計之手機通訊錄系統,不僅有程序,還有完整的報告模板,求助~~~急~~~
合肥經濟技術職業學院
電子信息系
課程設計報告
課程:資料庫課程設計
題目:學生管理系統
班級:09計 用
成員:
指導老師:
日期:
目錄
第一章 前言 3
1.1 課題簡介 3
1.2 設計目的 3
1.3 需求分析 4
第二章 資料庫實例的分析及應用 4
2.1 題目和E-R圖 4
2.2 資料庫的實現 5
2.3 資料庫結構屬性 8
2.3.1主鍵(主鍵約束PRIMARYKEY;索引設置) 8
2.3.2資料庫的默認值和規則 13
2.3.3 視圖和存儲過程 15
2.3.4 觸發器 17
第三章 總結報告 19
參考文獻 19
第一章 前言
1.1 課題簡介
資料庫技術是計算機科學技術發展最快,應用最為廣泛的技術之一。其在計算機設計,人工智慧,電子商務,企業管理,科學計算等諸多領域均得到了廣泛的應用,已經成為計算機信息系統和應用的核心技術和重要基礎。
本文主要介紹學生成績管理系統的資料庫設計,從需求分析到資料庫的運行與維護都進行詳細的敘述。本系統是利用SQL開發出來的。通過SQL建立學生成績管理系統,大大方便和簡化了數據的查詢和處理,管理員可以通過SQL語言對表內數據進行添加,刪除,修改,查詢等操作,還可以建立多用戶,對其使用許可權進行分配和回收。隨著數據處理的不斷進步和計算機網路的迅速發展,使資料庫應用系統不僅在功能而且在結構上都有了深刻的變化,而且運用在生活的每一個方面。通過學習關系代數,關系演算,函數依賴,關系模式分解,關系模式的規范化讓我們建立了扎實的關系資料庫理論基礎。而在掌握基本理論的基礎上掌握關系資料庫的設計方法,掌握現代信息系統的開發方法也顯得尤為必要。目前在關系資料庫中用得最多的SQL資料庫,開發資料庫的語言工具多數用C++.。所以對於計算機專業的學生來說掌握資料庫應用的基本技術,熟悉編程語言與SQL資料庫的結合運用是我們計算機專業學生之必備本領。本次課程設計是以學生信息管理系統為模擬模型,運用C++編程語言結合SQL資料庫所開發系統。
1.2 設計目的
隨著學生數量的日益增多,學校對學生的管理要求也越來越高,為了使信息技術與學生信息更好的結合在一起以及使學生成績的管理更加系統化,數字化,因此我們設計了該學生信息管理系統。運用基於E-R模型的資料庫設計方法和關系規范化理論做指導完成從系統的分析到設計直至系統的最終實現,開發學生成績管理系統,完成學生成績管理系統的全部功能。首先做好需求分析,並完成數據流圖,其次做概念分析,利用實體聯系的方法將需求分析的用戶需求抽象為信息結構,得到E-R圖,然後就是邏輯結構設計,將E-R圖轉換為計算機系統所支持的邏輯模型。最後利用SQL完成具體的實例。
1.3 需求分析
1、問題的提出:為了高效率的完成學生的管理,決定開發學生管理系統。
2、需完成的功能:
(1)能錄入、修改、查詢、輸出學生的檔案信息,這些信息包括學生的成績、課程、個人信息等。
(2)觸發器,索引,約束,規則,默認值,,視圖,存儲過程的建立及使用。
第二章 資料庫實例的分析及應用
2.1 題目和E-R圖
隨著學生數量的日益增多,學校對學生的管理要求也越來越高,為了使信息技術與學生信息更好的結合在一起以及使學生成績的管理更加系統化,數字化,因此我們設計了該學生信息管理系統。以下是次學生信息管理系統的E-R圖,進一步詳細的說明資料庫的結構以及用途。實體和屬性的定義:
學生表(學生學號,姓名,班級編號)
班級表(班級編號,班級名稱,系部編號)
系部表(系部編號,系部名)
教師表(教師名,課程編號,系部編號)
課程表(課程編號,課程名,學分,教師,系部號)
下面是E-R圖,用來進一步說明資料庫的作用和用途:
2.2 資料庫的實現
運用SQL Server 2000數據設計表格的物理結構如下:
班級表:
學生表:
系部表:
課程表:
教師表:
各表關系圖:
設計表格的具體填入數據是:
班級表:
學生表:
教師表:
系部表:
課程表:
2.3 資料庫結構屬性
2.3.1主鍵(主鍵約束PRIMARYKEY;索引設置)
1.索引與書目錄相似,可以快速找到指定內容。索引通過記錄表中的關鍵值來指向表中的記錄,這樣資料庫就不用掃描而能定位到相關的記錄。以下是對各表進行索引的實現。
學生表的設置如圖:
班級表的設計如下:
教師表的設計如下:
課程表的設計如下:
系部表的設置如下:
2.約束定義了關於允許什麼數據進入資料庫的規則,是分配給表或表中某列的一個屬性。使用約束的目的在於防止列中出現非法的數據,可以自動維護資料庫的數據完整性。下面是用企業管理器對class表實現的主鍵約束:
2.3.2資料庫的默認值和規則
1.使用默認可以實現當用戶在向數據表中插入新紀錄時,如果沒有給出某列的輸入值,則由SQL Server自動為該列輸入默認值。下面是對class表進行實現默認的功能:
實現默認值:
2.規則也是實現數據完整性的方法之一,作用與CHECK約束類似,在向表的某列插入或更新數據時,用它來限制輸入值的取值范圍。下面我們運用對Course表進行規則的實現:
2.3.3 視圖和存儲過程
1.視圖的作用相當於一個虛擬表,是用戶查看資料庫表中數據的一種方式使用戶通過他能夠以需要的方式瀏覽表中的部分或全部數據,而數據的物理存放位置仍然在資料庫的表中。我們通過在企業管理器中創建視圖管理視圖應用視圖,更加形象具體的說明了視圖的作用。
添加表格到視圖:
添加數據並運行:
運行結果,具體視圖呈現:
2.存儲過程是一組編譯在單個執行計劃中的Transact-SQL語句,它將一些固定的操作集中起來交給SQL-Server資料庫伺服器完成,以實現某個任務。首先我們在查詢管理器中創建存儲過程:
並且執行存儲過程:
在企業管理器中也可以體現出存儲過程:
2.3.4 觸發器
觸發器的作用是強制執行業務規則。SQL Server主要提供了兩種機制來強制業務規則和數據完整性:約束和觸發器。觸發器在指定的表中數據發生變化時被調用以響應INSERT、UPDATE或DELETE事件。觸發器可以查詢其他表,並可以包含復雜的語句。SQL Server將觸發器和觸發它的語句作為可在觸發器內回滾的單個事物對待,如果檢測到嚴重錯誤,則整個事物即自動回滾。首先我們在查詢管理器中新建觸發器:
新建觸發器:
管理觸發器:
第三章 總結報告
這次的課程設計真的做起來困難重重,深刻體會到做一個軟體,裡面需要的很多知識我們沒有接觸過,去圖書館找書的時候發現,我們學的僅僅是皮毛,還有很多東西需要我們去發掘,就算是借一本書看完它,我們還是會發現還有很多知識沒有吃透,這需要我們不斷的實踐,不斷地自學習,不斷地發現問題去思考問題。
經過不斷地測試,不斷地改進,其中還是發現了不少問題,第一次做這些工作,沒有任何經驗,甚至無從下手,還是很謝謝老師和同學的幫忙,從中也學到了一些代碼的寫法,為什麼要這樣寫,通過和同學的討論,找到一些書本上沒有的方法,如何數據綁定等等,怎樣從資料庫中將數據提取出來放到一個文本框或者標簽內,這些東西是組成界面的東西,雖然小,但是可以體現整個軟體的水平,其實並不需要建多少資料庫的表,寫多少復雜的存儲過程,是不是用了資料庫函數,觸發器等等,但是至少要弄明白這些東西如果操作,清晰思路才能將功能分清晰。
經過一段時間的學習與實踐,學生信息管理系統基本上開發好了。該系統具備了:添加、修改、刪除、瀏覽、查詢、輸出日程信息,實現了根據用戶需求查看日程等功能。作為一個個人日程管理系統,本系統所提供的功能的確太少了一些,僅僅只實現了一些基本的功能,有很多地方還有待擴展和改良。
人如果沒有自信,沒有目標,沒有信心就不可能把事情做好,當其他人都在迷茫的時候,自己一定要堅信目標,大學畢業出去即是面臨找工作,從學習這個專業,到以後做這方面的工作都需要不斷地去學習去實踐,這次實踐可以給我們敲一個警鍾,我們面臨畢業,面臨擇業,需要這些實踐經驗,在困難面前要勇於嘗試,這是這次課程設計給我的最大感想。在此特別感謝老師的辛苦指導和教育!
參考文獻
黃維通編《SQL Server2000 簡明教程》
徐人鳳 曾建華編《SQL Server2000資料庫及應用》
④ 通訊錄管理系統課程設計
你要什麼語言的?C C++ java ...
還有具體的功能要求呢
⑤ c語言課程設計:手機通訊錄管理系統整個系統更可以設計為數據查看、數據添加、數據修改,數據刪除模塊,急
我寫了一個容量為N=20個聯系人的程序 N的值可以在代碼中改
我的郵箱[email protected] 發給你了 請採納吧