「今天是学习C语言第 166 天」
纸上学来终觉浅,绝知此事要躬行。—— 陆游「冬夜读书示子聿」# 题外话
C语言课程设计,对于初学者来说,主要是综合运用C语言基础知识,以实际项目的形式锻炼编程能力。从今天开始,一起轻松学做C语言课程设计常见项目,建议先运行代码,再一步步理解其实现。
PS:大家也可以直接留言提供一些课程设计选题,有可能根据大家的题目提供新的示例程序。
一般课程设计考察的知识点:结构体、链表、文件读写、简单排序和查找。
往期课程设计:
轻松学做C语言课程设计:图书管理系统-数组实现
轻松学做C语言课程设计:图书管理系统-链表实现
轻松学做C语言课程设计:学生成绩管理系统-链表实现
备注:
1.不同C编译器,对C语言程序编译有差别,建议大家选择相同的编译器。
2.代码手机不方便看,可以收藏使用电脑查看,注意各种标点符号。
3.采用Dev-C++集成开发环境,为简化初学者学习,这里尽量简单,省去一些错误处理、高级算法等代码。
# 学生通讯录管理系统
设计一个同学通讯录,实现以下功能:
- 通讯录添加、删除、修改;
- 按不同的项进行查找;
- 将通讯录写入文本文件;
- 从文本文件读入通讯录。
备注:本示例程序未实现通讯录去重功能,不检查重复添加相同姓名的情况。
# 运行效果
*************欢迎使用学生通讯录管理系统************* * 1:添加通讯录 2:修改同学录 * * 3:删除通讯录 4:显示通讯录 * * 5:查找通讯录 6:保存通讯录 * * 7:读入通讯录 0:退出通讯录 * ************************************************** 请输出0-7,回车结束!1请您按提示依次输入通讯录信息(以空格分隔):姓名 手机号码 家庭地址 电子邮件张三 18099998888 中国北京 zhangsan@126.com信息添加成功!请输出0-7,回车结束!1请您按提示依次输入通讯录信息(以空格分隔):姓名 手机号码 家庭地址 电子邮件李四 13811112222 中国上海 lisi@163.com信息添加成功!请输出0-7,回车结束!4姓名 手机号码 家庭地址 电子邮件张三 18099998888 中国北京 zhangsan@126.com李四 13811112222 中国上海 lisi@163.com当前通讯录总共有2条信息。请输出0-7,回车结束!5请输入要查询通讯录姓名或电话号码:王五王五的通讯录未找到。请输出0-7,回车结束!6文件总共保存2条通讯信息。请输出0-7,回车结束!0是否要保存通讯录?请输入Y或N。n程序正常退出。--------------------------------Process exited after 71.37 seconds with return value 0请按任意键继续. . .
# 代码
/* ========================================== 名称 :C语言课程设计 学生通讯录管理系统 功能 :使用链表实现 环境 :Windows 10 + Dev-C++编译 作者 :一只会C的猫 公众号 :C语言大全(coderpointer) 时间 :2020.11.5 ==========================================*/#include #include #include #define HEAD_INFO "姓名\t手机号码\t家庭地址\t电子邮件\n"// 定义通讯录信息结构体 struct contact{ // 姓名 char name[20]; // 手机 char phone[20]; // 地址 char addr[50]; // 邮箱 char mail[50];};// 定义通讯录联系人链表结点typedef struct contact_node{ struct contact contact; struct contact_node *next;}Contacts;/* 定义各种功能函数 备注:这里允许通讯录出现相同的项目 */// 显示菜单void showMenu(); // 添加 void addContact(Contacts *head);// 删除void deleteContact(Contacts *head); // 查询 void queryContact(Contacts *head); // 修改void modifyContact(Contacts *head);// 显示void showContact(Contacts *head);// 保存通讯录 void saveContact(Contacts *head); // 读入通讯录 void readContact(Contacts *head); // 退出程序 void exitProgram(Contacts *head); int main() { // 创建通讯录带头结点的空链表 Contacts *head = (Contacts *)malloc(sizeof(Contacts)); head->next = NULL; if(head == NULL) { printf("创建通讯录失败,退出。\n"); exit(-1); } // 显示主菜单 showMenu(); char a[10]; while (1) { printf("\n请输出0-7,回车结束!\n"); if (fgets(a, 10, stdin) != NULL) { switch (a[0]) { case '0': exitProgram(head); break; case '1': addContact(head); break; case '2': modifyContact(head); break; case '3': deleteContact(head); break; case '4': showContact(head); break; case '5': queryContact(head); break; case '6': saveContact(head); break; case '7': readContact(head); break; default: printf("请重新输入正确的功能数字0-7!\n"); } } } return 0;}void showMenu() { printf("\t*************欢迎使用学生通讯录管理系统*************\t\n"); printf("\t* 1:添加通讯录 2:修改同学录 *\t\n"); printf("\t* 3:删除通讯录 4:显示通讯录 *\t\n"); printf("\t* 5:查找通讯录 6:保存通讯录 *\t\n"); printf("\t* 7:读入通讯录 0:退出通讯录 *\t\n"); printf("\t**************************************************\t\n");}// 添加 void addContact(Contacts *head){ if(head == NULL) return; printf("请您按提示依次输入通讯录信息(以空格分隔):\n"); printf(HEAD_INFO); char a[512]; Contacts *c = (Contacts *)malloc(sizeof(Contacts)); if (fgets(a, 512, stdin) != NULL && \ sscanf(a, "%s%s%s%s", c->contact.name, \ c->contact.phone, c->contact.addr, \ c->contact.mail) >= 4) { c->next = NULL; // 这里未检测相同姓名的通讯录 Contacts *t = head; while(t->next != NULL) t = t->next; t->next = c; printf("信息添加成功!\n"); } else { printf("输入格式有误,请重新输入!\n"); }} // 删除void deleteContact(Contacts *head){ if(head == NULL) return; printf("请输入要删除通讯录姓名:"); char name[20]; scanf("%s", name); // 换行符舍掉 getchar(); // 查找通讯录 Contacts *t = head, *p; int flag = 0; while(t->next != NULL) { if(strcmp(t->next->contact.name, name) == 0) { p = t->next; t->next = t->next->next; free(p); flag = 1; break; } t = t->next; } if(flag) printf("%s的通讯录删除成功。\n", name); else printf("%s的通讯录未找到。\n", name);}// 查询 void queryContact(Contacts *head){ if(head == NULL) return; printf("请输入要查询通讯录姓名或电话号码:"); char input[20]; scanf("%s", input); // 换行符舍掉 getchar(); // 查找通讯录 Contacts *t = head; while(t->next != NULL) { if(strcmp(t->next->contact.name, input) == 0 || \ strcmp(t->next->contact.phone, input) == 0) break; t = t->next; } if(t->next != NULL) { printf("%s的通讯录已找到,信息如下:\n", input); printf(HEAD_INFO); printf("%s\t%s\t%s\t%s\t\n", t->next->contact.name, \ t->next->contact.phone, t->next->contact.addr, \ t->next->contact.mail); }else printf("%s的通讯录未找到。\n", input);}// 修改void modifyContact(Contacts *head){ if(head == NULL) return; printf("请输入要修改的通讯录姓名:"); char input[20]; scanf("%s", input); // 换行符舍掉 getchar(); // 查找通讯录 Contacts *t = head; while(t->next != NULL) { if(strcmp(t->next->contact.name, input) == 0) break; t = t->next; } if(t->next != NULL) { printf("%s的通讯录已找到,信息如下:\n", input); printf(HEAD_INFO); printf("%s\t%s\t%s\t%s\t\n", t->next->contact.name, \ t->next->contact.phone, t->next->contact.addr, \ t->next->contact.mail); printf("请依次输入修改后的手机号码、地址、电子邮件(以空格分隔):\n"); scanf("%s%s%s",t->next->contact.phone, t->next->contact.addr,\ t->next->contact.mail); getchar(); printf("%s的通讯录修改成功。\n", input); }else printf("%s的通讯录未找到。\n", input);}// 显示void showContact(Contacts *head){ if(head == NULL) return; printf(HEAD_INFO); int count = 0; Contacts *t = head; while(t->next != NULL) { printf("%s\t%s\t%s\t%s\t\n", t->next->contact.name, \ t->next->contact.phone, t->next->contact.addr, \ t->next->contact.mail); count++; t = t->next; } printf("当前通讯录总共有%d条信息。\n", count);}// 保存通讯录 void saveContact(Contacts *head){ if(head == NULL) return; FILE *fp = fopen("contacts.txt", "a"); if(fp == NULL) { printf("写入contacts.txt文件失败。\n"); return; } Contacts *t = head; int count = 0; while(t->next != NULL) { fprintf(fp,"%s\t%s\t%s\t%s\t\n", t->next->contact.name, \ t->next->contact.phone, t->next->contact.addr, \ t->next->contact.mail); t = t->next; count++; } printf("文件总共保存%d条通讯信息。\n", count); fclose(fp);}// 从文件中读入通讯录 void readContact(Contacts *head){ if(head == NULL) return; FILE *fp = fopen("contacts.txt", "r"); if(fp == NULL) { printf("读入contacts.txt文件失败,文件可能不存在。\n"); return; } // 读入的信息添加到通讯录末尾 Contacts *t = head; int count = 0; while(t->next != NULL) t = t->next; struct contact ctmp; while(fscanf(fp,"%s%s%s%s", ctmp.name, ctmp.phone, ctmp.addr, \ ctmp.mail) != EOF) { Contacts *c = (Contacts *)malloc(sizeof(Contacts)); strcpy(c->contact.name, ctmp.name); strcpy(c->contact.phone, ctmp.phone); strcpy(c->contact.addr, ctmp.addr); strcpy(c->contact.mail, ctmp.mail); c->next = NULL; t->next = c; t = c; count++; } printf("总共从文件读入%d条通讯信息。\n", count); fclose(fp);}// 退出程序 void exitProgram(Contacts *head){ if(head != NULL) { printf("是否要保存通讯录?请输入Y或N。\n"); char c = getchar(); if(c=='Y' || c=='y') saveContact(head); Contacts *t = head, *p; while(t->next != NULL) { head->next = t->next->next; free(t->next); t = head; } free(head); } printf("程序正常退出。\n"); exit(0);}
---------- End ----------
往期精彩推荐:
一万分钟C语言学习计划:2020开篇
C语言内存管理的两种方式
C89标准库功能简介
C语言链接与存储类型
C语言标准输入输出
C语言入门基本语法
更多请点击公众号历史文章...
「喜欢C请赏个 赞 点击右下角 在看」