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();
	        }
	    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");
        }

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
一、题目:通讯录管理 二、目的与要求 1. 目的: (1)基本掌握面向过程程序设计的基本思路和方法; (2)达到熟练掌握C语言的基本知识和技能; (3)能够利用所学的基本知识和技能,解决简单的程序设计问题 2. 要求 基本要求: 1. 要求利用C语言面向过程的编程思想来完成系统的设计; 2. 突出C语言的函数特征,以多个函数实现每一个子功能; 3. 画出功能模块图; 4. 具有清晰的程序流程图和数据结构的详细定义; 5. 熟练掌握C语言对文件的各种操作。 创新要求: 在基本要求达到后,可进行创新设计,如系统用户功能控制,对管理员级和一般级别的用户系统功能操作不同 三、信息描述 有关该系统基本信息的描述,如:姓名、电话、城市和邮编等。 四、功能描述 1. 名单基本信息(姓名,城市,电话,邮编等)的录入,并存放在文件当中。 2. 基本信息的查询与修改。 3. 记录的添加和删除。 4. 对同一类型记录的查找:如查找同一城市的记录或同一省份的记录。 五、解决方案 1. 分析程序的功能要求,划分程序功能模块。 2. 画出系统流程图。 3. 代码的编写。定义数据结构和各个功能子函数。 4. 程序的功能调试。 5. 完成系统总结报告以及使用说明书 六、进度安排 此次课程设计时间为一周或两周,分四个阶段完成: 1. 分析设计阶段。指导教师应积极引导学生自主学习和钻研问题,明确设计要求,找出实现方法,按照需求分析、总体设计、详细设计这几个步骤进行。 2. 编码调试阶段:根据设计分析方案编写C代码,然后调试该代码,实现课题要求的功能。 3. 总结报告阶段:总结设计工作,写出课程设计说明书,要求学生写出需求分析、总体设计、详细设计、编码、测试的步骤和内容。 4. 考核阶段。 七、撰写课程设计报告或课程设计总结 课程设计报告要求: 总结报告包括需求分析、总体设计、详细设计、编码(详细写出编程步骤)、测试的步骤和内容、课程设计总结、参考资料等,不符合以上要求者,则本次设计以不及格记。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘络三金

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值