手机通讯录课程设计
① 课程设计,急!!简单的通讯录管理系统!!
//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] 发给你了 请采纳吧