要求利用静态数组来实现通讯录管理,掌握数组、文件读写、函数等知识。
系统设计:
1、下面的功能要求通过菜单进行选择
2、记录录入:按照一定的格式,向通迅录中添加联系人的记录,要求首先输入准备输入的记 录数,然后输入记录。
3、显示全部记录:查看通讯录中的所有记录。
1)设计规范的输出格式
2)输出记录,每输出8个记录暂停,按任意键再继续输出。
4、查找记录(未排序)
1)输入查找的姓名
2)采用顺序查找法查找记录
3)如果没有找到,则输出提示信息
4)找到联系人后,显示找到的记录信息
5、删除记录
1)输入要删除记录的姓名
2)如果没有该记录,显示没有找到的信息
3)如果找到,显示记录信息
4)提示“是否确实要删除,请输入确认信息(Y///N)”
5)如果输入的是Y 或者y,则系统删除该条记录信息
6、插入信息
1)输入要插入的记录
2)找到新记录的插入位置
3)插入新纪录,记录数加1
7、文件保存
1)将记录保存到指定文件
2)根据数据是否保存成功,给出提示信息
8、从文件中读取记录
1)按指定文件将记录读入内存
2)根据是否读取成功,给出提示信息
9、按序号查找记录
1)打开指定的文件,输入查找的序号
2)判断查找的序号是否在文件记录范围内
3)若在,则找到该记录并输出
4)关闭文件
10、排序:采用冒泡(选择、插入)排序法,按姓名进行排序
11、快速查找: 在已按姓名排序的记录中,按照二分差战法,用姓名作为检索码,实现快速查询。
12、复制文件
1)打开源文件、目标文件
2)将源文件中的记录独处,写入目标文件中
3)关闭源文件、目标文件。
层次结构图:
代码实现:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define M 50
typedef struct add
{
char name[20]; //姓名
char units[30]; //单位
char tele[12]; //电话号码应大于11位,因字符型后有一个结尾符
struct add * next;
}Address;
int enter(Address * head);//输入记录的函数
void List(Address * head); //显示记录的函数
void search(Address * head); //按姓名查找记录
void Delete(Address *head); //删除记录
void add(Address *head); //插入记录函数
void save(Address *head); //将记录保存到文件中
int Load(Address *head); //从文件中读取记录函数
void display(Address *head); //按序号查找显示记录函数
void sort(Address *head); //按姓名排序
//void qseek(Address t[], int n); //快速查找记录函数
void Copy(); //文件复制函数
void print(Address temp); //显示单条记录
int menu_select(); //主菜单函数
int main()
{
int length;
Address * head;
head = (Address*)malloc(sizeof(Address));
system("cls"); //清屏
for (;;)
{
switch (menu_select())
{
case 0:length=enter(head ); break; //输入记录
case 1: List(head); break; //显示全部记录
case 2: search(head); break; //查找记录
case 3: Delete(head); break; //删除记录
case 4: add(head); break; //插入记录
case 5: save(head); break; //保存文件
case 6: length=Load(head); break; //读文件
case 7: display(head); break; //按序号显示记录
case 8: sort(head); break; //按姓名排序
case 9:Copy(); break; //复制文件
case 10: exit(0); //程序结束
}
}
return 0;
}
int menu_select(){
char s[80];
int c;
printf("Press any key enter menu……\n");
getchar();
system("cls");
printf("**********************************************\n\n");
printf("| 0.输入记录 \n");
printf("| 1.显示全部记录\n");
printf("| 2.按姓名查找记录\n");
printf("| 3.删除记录\n");
printf("| 4.插入记录\n");
printf("| 5.保存文件\n");
printf("| 6.读文件\n");
printf("| 7.按序号显示记录\n");
printf("| 8.按姓名排序\n");
printf("| 9.复制文件\n");
printf("| 10.退出\n");
printf("**************************************\n");
do{
printf("\n 请选择(0—11) :");
scanf("%s", s);
c=atoi(s); //将输入的字符串转化为整型数
} while (c<0||c>11);
return c;
}
int enter(Address * head){
int i, n;
Address *p,*pr;
pr = head;
system("cls");
printf("\n请输入要输入的记录数\n");
scanf("%d",&n);
printf("请输入记录\n");
printf("姓名 单位 电话号码\n");
printf("------------------------------------------------------------\n");
for (i = 0; i<n; i++){
p = (Address *)malloc(sizeof(Address));
scanf("%s%s%s",p->name, p->units, p->tele);
printf("--------------------------------------------------\n");
pr->next =p;
pr=p;
}
pr->next = NULL;
return n;
}
void List(Address * head){
int i=0;
Address *p;
p = head->next;
system("cls");
printf("\n\n--------------------开始---------------------------- - \n");
printf("姓名 单位 电话号码\n");
printf("------------------------------------------------------------\n");
while(p !=NULL){
printf("\n%-20s%-30s%-12s\n",p->name,p->units,p->tele);
p = p->next;
i++;
if (i % 10 == 0){
printf("按任意键继续….\n");
getchar();
getchar();
}
}
printf("************结束****************\n");
getchar();
}
void search(Address * head){
char s[20];
Address *p;
p =head->next;
system("cls");
printf("输入待查姓名\n");
scanf("%s",&s);
while(p!=NULL){
if(strcmp(s,p->name)==0){
printf("%s\n%-20s%-30s%-12s\n",p->name,p->units,p->tele,s);
p=p->next;
}
}
}
void Delete(Address *head){
Address *p,*pr;
char s[20];
int ch=0;
pr=head;
p=head->next;
printf("请输入姓名\n");
scanf("%s",s);
while(p!=NULL){
if(strcmp(s,p->name)==0){
printf("你确定要删除吗(1 / 0)?\n");
scanf("%d",&ch);
if (ch == 1){
pr->next=p->next;
free(p);
break;
}
}
else{
pr=p;
p=p->next;
}
}
}
void add(Address *head){
Address *temp,*p,*pr;
char s[20];
pr=head;
p=pr->next;
temp=(Address *)malloc(sizeof(Address));
printf("请输入记录信息\n");
printf("*********************************\n");
printf("姓名 单位 电话号码\n");
printf("-------------------------------------------------------------- - \n");
scanf("%s%s%s",temp->name, temp->units, temp->tele);
printf("------------------------------------------------------------\n");
printf("请输入插入位置的姓名\n");
scanf("%s", s);
while(p != NULL){
if(strcmp(s,p->name)!=0){
pr=p;
p=p->next;
}
else{
temp->next=p;
pr->next=temp;
printf("插入成功");
break;
}
}
}
void save(Address *head){
FILE *fp;
Address *p=head->next;
fp=fopen("c:\\record.txt", "w");
if (fp==NULL){
printf("不能打开文件\n");
exit(1);
}
printf("\n保存文件\n");
while(p!=NULL){
fprintf(fp, "%-20s % -30s % -12s",p->name, p->units,p->tele);
p=p->next;
}
fclose(fp);
printf("*******保存入c:\\record.txt文件成功*******\n");
getchar();
getchar();
}
int Load(Address *head){
int n,ret;
FILE *fp;
Address *p,*pr=head;
n=0;
if((fp=fopen("c:\\record.txt","r")) == NULL){
printf("不能打开文件\n");
exit(1);
}
while(!feof(fp)){
p = (Address *)malloc(sizeof(Address));
ret=fscanf(fp, "%20s%30s%12s",p->name, p->units,p->tele);
if(ret<3)
break;
pr->next=p;
pr=p;
n++;
}
pr->next=NULL;
//按格式读入文件
fclose(fp);
printf("你已成功从c:\\record.txt文件中读入信息\n");
getchar();
getchar();
return n;
}
void display(Address * head){
int id, n,i=1;
FILE *fp;
Address *p;
n=Load(head);
p=head->next;
if ((fp = fopen("c:\\record.txt","r")) == NULL){
printf("不能打开文件\n");
exit(1);
}
printf("请输入序号\n");
printf("共有%d个序号\n",n);
scanf("%d", &id);
if (id >= 1 && id<=n){ //判断序号是否在记录范围内
while(id!=i){
p=p->next;
i++;
}
printf("姓名 单位 号码\n");
printf("%-20s%-30s%-12s\n",p->name, p->units,p->tele);
//按格式读入文件
printf("\r\n");
getchar();
getchar();
}
else
printf("无%d序号记录\n", id);
fclose(fp);
}
void sort(Address *head){
int i, j,n=0, flag;
Address temp,*pr,*p=head->next;
while(p!=NULL){
n++;
p=p->next;
}
for (i = 0; i<n-1; i++){
flag = 0;
pr=head->next;
p=pr->next;
for (j = 0; j<n -i-1; j++){
if ((strcmp(p->name,pr->name))>0){
flag = 1;
strcpy(temp.name,p->name);
strcpy(temp.units,p->units);
strcpy(temp.tele, p->tele);
strcpy(p->name,pr->name);
strcpy(p->units, pr->units);
strcpy(p->tele,pr->tele);
strcpy(pr->name, temp.name);
strcpy(pr->units, temp.units);
strcpy(pr->tele, temp.tele);
}
pr=p;
p=p->next;
}
if (flag == 0)
break;
}
printf("排序成功\n");
}
void Copy(){
char outfile[20];
Address temp;
FILE *sfp, *tfp;
system("cls");
if ((sfp = fopen("c:\\record.txt","r")) == NULL){
printf("打开文件失败\n");
exit(1);
}
printf("请输入目标文件名,例如 c : \\f1\\tt.txt\n");
scanf("%s", outfile);
if ((tfp = fopen(outfile, "w")) == NULL){
printf("打开文件失败\n");
exit(1);
}
while(!feof(sfp)){
fscanf(sfp, "%20s%30s%12s\n", temp.name, temp.units,temp.tele);
fprintf(tfp, "%-20s%-30s%-12s\n", temp.name,temp.units, temp.tele);
fprintf(tfp, "\r\n");
}
fclose(sfp);
fclose(tfp);
printf("复制文件成功\n");
}