C语言—通讯录
要求利用静态数组来实现通讯录管理,掌握数组、文件读写、函数等知识。
系统设计:
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();}elseprintf("无%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");}总结
- 上一篇: 如何复制PDF文件中的文本和图片?
- 下一篇: pdf复制文字时对于回车的处理