课程设计,急!!简单的通讯录管理系统!!

通讯录管理系统设计
通讯信息包括:姓名、工作单位、办公电话、住宅电话、家庭住址。试设计一通讯信息管理系统,使之能提供以下功能:
1通讯信息录入、修改、删除功能;
2信息排序及浏览功能,按姓名排序;
3按姓名查询。

我们是大一学生,要求用C语言编,各位帮帮忙!
要求用VC6.0,在WINDOWS的环境下,最简单的C语言,不是C++,也不在TB下编译,在VC6.0下面编译!!!

此外最好加点注释,用最简单的做,我是学生,只要做到上面的要求就可以了.谢谢!

在网上找我也会找,我只要里面说的功能,其他的不要,要最简单.而且是在VC6.0下编译的!

//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 dup=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不是原来的名字,但与通信录中名字重复
{
dup=1;
printf("\n\t重名!请重新输入:");
break;
}

i++;
j++;
}

return dup;
}

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
}

把以上模块 分别按模块名建立文件 在编译器上调试就可以用了……
温馨提示:答案为网友推荐,仅供参考