通信录管理系统(C语言版本)
1.题目:通信录管理系统
题目说明:设计出模拟手机通信录管理系统,实现对手机中的通信录进行管理。
功能要求
(1)查看功能:选择此功能时,列出下列三类选择。 A 办公类 B 个人类 C 商务类 ,当选中某类时,显示出此类所有数据中的姓名和电话号码)
(2)增加功能:能录入新数据(一个结点包括:姓名、电话号码、分类(可选项有:A 办公类 B 个人类 C 商务类)、电子邮件。例如:杨春 13589664454 商务类 chuny@126.com
当录入了重复的姓名和电话号码时,则提示数据录入重复并取消录入;当通信录中超过15条信息时,存储空间已满,不能再录入新数据;录入的新数据能按递增的顺序自动进行条目编号。
(3)修改功能:选中某个人的姓名时,可对此人的相应数据进行修改
(4)删除功能:选中某个人的姓名时,可对此人的相应数据进行删除,并自动调整后续条目的编号。
3.各模块的功能
我将我的代码共分为5个模块:
- 界面模块:功能:提供基础界面,方便操作者输入
- 密码模块:功能:操作者使用前应该输入正确密码才能使用
- 查找模块:通过“名字”“分组”和“电话号码”可以对已经保存的数据进行查找
- 修改模块:通过操作者的输入对已经保存的数据进行重新修改
- 删除模块:通过操作者的输入对已经保存的数据进行重新修改
4.数据结构设计及用法说明
//初始化
sqline* Init_line();将要操作的结构体初始化
//文件保存
void Saveelem(); 将数据写入文件
void Readelem();从文件中读取数据
//判断通信录是否录满
int fixup(); 如果录满,返回1,否则返回-1
//录入数据
void push_line_1(); 单个单个的录入数据
void push_line_2(); 一次性录入全部数据
void scanf_name(int); 录入名字
void scanf_num(int); 录入电话号码
void scanf_rela(int);录入关系
void scanf_email(int);录入电子邮箱
//输出录入的信息
void put_1();
//光标移动
void gotoxy(int, int); 移动光标,在特殊位置输出
//窗口
void window(int startX, int startY, int width, int height);
- 界面功能
//初始加载密码界面void input_1();
//系统功能介绍界面void input_2();
//录入数据界面void input_3();
//基础边框void input_4();
- 搜索功能
//搜索名字void search_1(char*);
//搜索分类void search_2(char*);
- 修改功能
//通过序号重新编写void change(int);
- 删除功能
//删除用户信息void Delete(char*);
- 基础密码
void Savepwa_1();
char* pwa_2();
void pwa_3();
7.体会
此次程序设计我的体会颇深,我写代码时会发现自己掌握的C语言已经数据结构并没有想象中的那么好,以及自己在写代码时一定要有一个大概的思路,如果盲目乱写,到后面就会有很多的东西需要修改,这个过程无疑是十分痛苦的。在写代码时,一定要注意格式,外用函数和基本变量的命名,一个好的命名会大大增加我们代码的阅读性,并且代码中的注释是不可或缺的,当一段时间不去书写代码,自己对于自己写的代码也会有时看不懂,通过自己的代码注释可以快速了解其功能和作用。当我们面对一个实际问题,应该迅速根据问题性质和特点来选择合适的方法来解决问题,此外,对程序的测试应该要仔细,根据模块的特点和测试阶段,采用各种软件测试方法对 程序进行测试,确保各个模块的正确性和完整性,最后集成起来测试其是否正确和完整地实现了问题描述中要求的功能。通过这个程序设计,我们不仅提高 了动手操作能力,对 C 语言有了更深的认识,能够更好地运用 C 语言进行编 程设计,同时在思维、看待问题的全面性等方面也有了很大的提高。不过由于 时间、经验不够、对语言的掌握程度不深等问题,在这个系统设计还存在一些 问题,,希望可以在今后的设计上能够解决这些问题,做的更好。
8.参考文献
【1】konghouy光标的移动 【EB\OL】:
https://blog.csdn.net/konghouy/article/details/80230571?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168506839216800226585554%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168506839216800226585554&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-2-80230571-null-null.142^v88^control_2,239^v2^insert_chatgpt&utm_term=c%E8%AF%AD%E8%A8%80%E5%85%89%E6%A0%87%E7%A7%BB%E5%8A%A8&spm=1018.2226.3001.4187
【2】.韩曙亮 【C 语言】文件操作 ( fread 函数 )【EB\OL】:
【C 语言】文件操作 ( fread 函数 )_fread循环读取一个文件_韩曙亮的博客-CSDN博客
【3】 谭浩强,C 语言程序设计(第五版),清华大学出版社,2017,北京。
【4】. 严蔚敏,李冬梅,吴伟民,数据结构(C 语言版)(第二版),人民邮电出版 社,2015,北京。
9.附录(整段代码)
/*模拟手机通讯录管理系统,A办公B个人C商务*/
#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable:6031)
#include
#include
#include
#include //宏定义
#define maxd_1 20 //宏重定义,把宏名字写长一些
#define maxd_2 15 // 电话号码长度
#define maxd 3 // 组别
#define maxd_3 100 //边界的宽度
#define maxd_4 25 //边界的长度typedef struct Line
{char name[maxd_1]; //名字char num[maxd_1]; //号码char rela[maxd]; //关系char email[maxd_1]; //邮箱
}line;typedef struct
{line* elem; //elem 以此记录数据空间的基地址int length; //通信录的容量
}sqline;//全局使用sqline s;
//初始化
sqline* Init_line();
//文件保存
void Saveelem();
void Readelem();
//判断通信录是否录满
int fixup();
//录入数据
void push_line_1();
void push_line_2();
void scanf_name(int);
void scanf_num(int);
void scanf_rela(int);
void scanf_email(int);
//光标移动
void gotoxy(int, int);
//窗口
void window(int startX, int startY, int width, int height);
//初始加载密码界面
void input_1();
//系统功能介绍界面
void input_2();
//录入数据界面
void input_3();
//基础边框
void input_4();
//搜索名字
void search_1(char*);
//搜索分类
void search_2(char*);
//通过序号重新编写
void change(int);
//删除用户信息
void Delete(char*);
//输出录入的信息
void put_1();
//基础密码
void Savepwa_1();
char* pwa_2();
void pwa_3();//初始化建立一个线性表(由于容量较小直接使用顺序存储)
sqline* Init_line()
{s.elem =(line *) malloc(maxd_1 * sizeof(line));if (!s.elem) exit(0);s.length = 0;return 0;
}//读取联系人信息
void Readelem()
{//打开文件int i=0;//二进制文件读写两个重要的函数 , fread 和 fwrite , fread 用于读取文件 , fwrite 用于写出文件 ;FILE* fp = fopen("Address_book.txt", "r+");if (fp == NULL){printf("抱歉,不存在此文件");exit(0);}else{while (fscanf(fp, "%s %s %s %s", s.elem[i].name, s.elem[i].num, s.elem[i].rela, s.elem[i].email) == 4){ s.length = ++i;}}fclose(fp);
}//写入数据保存数据
void Saveelem()
{FILE* fp = fopen("Address_book.txt", "w");int i;if (fp == NULL){printf("抱歉,不存在此文件");exit(0);}else{for (i = 0; i < s.length; i++){fputs(s.elem[i].name, fp);fprintf(fp, " ");fputs(s.elem[i].num, fp);fprintf(fp, " ");fputs(s.elem[i].rela, fp);fprintf(fp, " ");fputs(s.elem[i].email, fp);fprintf(fp, "\n");}}fclose(fp);
}//判断通信录是否录满
int fixup()
{int k;if (s.length == maxd_2)return (k = -1);else return(k = 0);
}//移动光标位置
void gotoxy(int x, int y)
{HANDLE hOut;COORD pos = { x,y };hOut = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(hOut, pos);
}//手机格式
void window(int startX, int startY, int width, int height)
{int i = 0, j = 0;//画顶gotoxy(startX, startY);printf("*");for (i = 0; i < width; i++){printf("-");}printf("*");//左for (i = 0; i < height; i++){gotoxy(startX, startY + 1 + i);printf("|");}//右for (i = 0; i < height; i++){gotoxy(startX + 1 + width, startY + 1 + i);printf("|");}//底gotoxy(startX, startY + 1 + height); //去到左下角落printf("*");gotoxy(startX + 1, startY + 1 + height); //去到底部for (i = 0; i < width; i++){printf("-");}printf("*");//gotoxy(0, 0);
}//创建账户界面void input_1()
{gotoxy(26, 10);printf("欢迎使用本通信录");window(0, 0, maxd_3, maxd_4);window(24, 13, 20, 1);gotoxy(18, 14);printf("密码:");gotoxy(26, 14);
}//创建账户后界面
void input_2()
{ int j = maxd_3 / 4, i = maxd_4 / 3-4;window(0, 0, maxd_3, maxd_4);gotoxy(j, i);printf("本通信录可实现以下功能:");gotoxy(j, i+2);printf("【1】查看已存信息");gotoxy(j, i+4);printf("【2】输入用户信息");gotoxy(j, i+6);printf("【3】查找用户信息");gotoxy(j, i+8);printf("【4】修改用户信息");gotoxy(j, i+10);printf("【5】删除用户信息");gotoxy(j, i + 12);printf("【0】退出通信录");gotoxy(j, i + 14);printf("请输入需要实现的操作:"); window(j+22,i+13,5,1);
}//基本输入格式
void input_3()
{int j = maxd_3 / 4, i = maxd_4 / 3;window(0, 0, maxd_3, maxd_4);gotoxy(1, 1);printf("%-5s\t%-15s\t%-12s\t%-5s\t%-40s\n", "NO", "Name", "Number", "Group", "Email");
}//基本边框
void input_4()
{int j = maxd_3 / 4, i = maxd_4 / 3;window(0, 0, maxd_3, maxd_4);
}//功能区域//输出已经录入的数据
void put_1()
{int i = 0;input_3();//Initelem();if (s.length == 0){printf("|抱歉,通信录暂时无数据记录,请加入数据!!");}else{ while (i < s.length){printf("|%-5d\t", i + 1);printf("%-15s\t", s.elem[i].name);printf("%-12s\t", s.elem[i].num);printf("%-5s\t", s.elem[i].rela);printf("%-40s", s.elem[i].email);printf("\n");i++;}}system("pause");
}// 存入数据
void scanf_name(int l)
{int i;char temp[maxd_1];do{ int flag = 0; //用来判断输入的问题scanf("%s", s.elem[l].name);strcpy(temp, s.elem[l].name);for (i = 0; i < l; i++){if (strcmp(s.elem[l].name, s.elem[i].name) == 0 && i != l)flag = -1;} for (i = 0; temp[i] != '\0'; i++){ if ((temp[i] > 'A' && temp[i] < 'Z') || temp[i] > 'a' && temp[i] < 'z' || temp[i] == '_'){flag = -2;}else flag = 0;}if (flag == -1)printf("\n|抱歉!!!名字重复,请重新输入:");else if (flag == -2)break;elseprintf("\n|抱歉!!!名字格式错误,请重新输入:");} while (1);
}void scanf_num(int l)
{char temp[maxd_1];int i; do{int flag = 0; //用来判断输入的问题scanf("%s", s.elem[l].num);strcpy(temp, s.elem[l].num);for (i = 0; i < l; i++){if (strcmp(s.elem[l].num, s.elem[i].num ) == 0 && i!=l)flag = -1;}for (i = 0; temp[i] != '\0'; i++){if (temp[i] > '9' || temp[i] < '0'){flag = -2;break;}}if (flag == -1)printf("\n|抱歉!!!号码重复,请重新输入:");else if (strlen(s.elem[l].num) > 11)printf("\n|抱歉!!!号码过长,请重新输入:");else if (flag == -2)printf("\n|抱歉!!!号码格式错误,请重新输入:");elsebreak;} while (1);
}void scanf_rela(int l)
{do{int flag = 0; //用来判断输入的问题scanf("%s", s.elem[l].rela);if (strcmp(s.elem[l].rela, "A") == 0|| strcmp(s.elem[l].rela, "B") == 0|| strcmp(s.elem[l].rela, "C") == 0)break;else printf("\n|抱歉!!!分类错误,请重新输入:");} while (1);
}void scanf_email(int l)
{int i;do{int flag = 0,geshi =0; //用来判断输入的问题char ema[maxd_1];scanf("%s", s.elem[l].email);strcpy(ema, s.elem[l].email);for (i = 0; i < l; i++){if (strcmp(s.elem[l].email, s.elem[i].email) == 0 && i!=l)flag = -1;}for (i = 0; ema[i+3] != '\0'; i++){if((ema[i] == '@' ) || (ema[i] == '.' && ema[i+1] == 'c' && ema[i+2] == 'o' && ema[i+3] == 'm'))geshi++ ;}if (flag == -1)printf("\n|抱歉!!!邮箱重复,请重新输入:");else if (geshi == 2)break;else printf("\n|抱歉!!!邮箱格式错误,请重新输入:");} while (1);
}//逐个存入数据
void push_line_1()
{system("cls");input_4();int flag = 0,l=s.length,i=0,people;gotoxy(1, 1);printf("需要录入的人数:");scanf("%d", &people);gotoxy(0, 2);do //输入前先判断是否录满{if (fixup() == -1){ //每次录入数据都要判断是否录满printf("通讯录已满,添加失败!!!");exit(0); //退出}\printf("|please input Name:");scanf_name(l);printf("|please input Phone_number:");scanf_num(l);printf("|please input Group(A 办公 B 个人 C 商务):");scanf_rela(l);printf("|please input Email:");scanf_email(l);s.length++;l++; } while (l < people);Saveelem();printf("|保存成功!!!");system("pause");
}//一次性输入多组数据
void push_line_2()
{system("cls");input_4();int flag = 0, l = s.length, i = 0,people;char temp[maxd_1];gotoxy(1, 1);printf("需要录入的人数:");scanf("%d", &people);gotoxy(0, 2);printf("|please input [1]Name [2]Phone_number [3]Group [4]Email:\n");gotoxy(0, 3);do //输入前先判断是否录满{if (fixup() == -1){ //每次录入数据都要判断是否录满printf("通讯录已满,添加失败!!!");exit(0); //退出}scanf_name(l);scanf_num(l);scanf_rela(l);scanf_email(l);s.length++;l++;} while (l < people);Saveelem();printf("|保存成功!!!");system("pause");
}//通过输入名字来查找用户信息
void search_1(char* na)
{int i,flag = 0;for (i = 0; i < s.length; i++){if (strcmp(na, s.elem[i].name) == 0){flag = 1;printf("|已经查找到用户信息,如下:\n");printf("|%-5s\t%-15s\t%-12s\t%-5s\t%-40s\n", "NO", "Name", "Number", "Group", "Email");printf("|%-5d\t", i + 1);printf("%-15s\t", s.elem[i].name);printf("%-12s\t", s.elem[i].num);printf("%-5s\t", s.elem[i].rela);printf("%-40s", s.elem[i].email);printf("\n");break;}}if (flag == 0)printf("|抱歉,未找到该用户信息");system("pause");
}//通过类别来查找用户信息
void search_2(char* na)
{int i, flag = 0;for (i = 0; i < s.length; i++){if (strcmp(na, s.elem[i].rela) == 0){flag = 1;printf("|已经查找到用户信息,如下:\n");printf("|%-5s\t%-15s\t%-12s\t%-5s\t%-40s\n", "NO", "Name", "Number", "Group", "Email");printf("|%-5d\t", i + 1);printf("%-15s\t", s.elem[i].name);printf("%-12s\t", s.elem[i].num);printf("%-5s\t", s.elem[i].rela);printf("%-40s", s.elem[i].email);printf("\n");}}if (flag == 0)printf("|抱歉,未找到该组别用户信息");system("pause");
}//通过电话查找
void search_3(char* na)
{int i, flag = 0;for (i = 0; i < s.length; i++){if (strcmp(na, s.elem[i].num) == 0){flag = 1;printf("|已经查找到用户信息,如下:\n");printf("|%-5s\t%-15s\t%-12s\t%-5s\t%-40s\n", "NO", "Name", "Number", "Group", "Email");printf("|%-5d\t", i + 1);printf("%-15s\t", s.elem[i].name);printf("%-12s\t", s.elem[i].num);printf("%-5s\t", s.elem[i].rela);printf("%-40s", s.elem[i].email);printf("\n");}}if (flag == 0)printf("|抱歉,未找到该电话号码用户信息");system("pause");
}//输入需要修改的序号
void change_1(int l)
{l--;printf("|please intput name:");scanf_name(l);printf("|please input phone number:");scanf_num(l);printf("|please input group(A 办公 B 个人 C 商务):");scanf_rela(l);printf("|please input email:");scanf_email(l);printf("|修改成功");Saveelem();system("pause");
}//输入需要名字的序号
void change_2(char * na)
{int i, flag = 0,l;char temp[maxd_1];for (i = 0; i < s.length; i++){if (strcmp(na, s.elem[i].name) == 0){l = i;printf("|please intput name:");scanf_name(l);printf("|please input phone number:");scanf_num(l);printf("|please input group(A 办公 B 个人 C 商务):");scanf_rela(l);printf("|please input email:");scanf_email(l);printf("|修改成功");}elseprintf("|抱歉,未找到该用户信息");}Saveelem();system("pause");
}//输入需要删除的人名
void Delete(char * na)
{int i,ret = -1;for (i = 0; i < s.length; i++){if (strcmp(na, s.elem[i].name) == 0){ret = i;printf("|已经查找到用户信息,如下:\n");printf("|%-5s\t%-15s\t%-12s\t%-5s\t%-40s\n", "NO", "Name", "Number", "Group", "Email");printf("|%-5d\t", i + 1);printf("%-15s\t", s.elem[i].name);printf("%-12s\t", s.elem[i].num);printf("%-5s\t", s.elem[i].rela);printf("%-40s", s.elem[i].email);printf("\n|删除成功");break;}}if (ret != -1){for (i = ret; i 0){printf("|请输入想要修改用户的序号:");scanf("%d", &xuhao);change_1(xuhao);}break;}case 2:{system("cls");input_4();gotoxy(0, 2);put_1();if (s.length > 0){printf("|请输入想要修改用户的名字:");scanf("%s", na);change_2(na);}break;}case 0: break;}break;}case 5: //删除用户姓名{printf("\n|进行该操作前,请输入管理员权限密码:");window(maxd_3 / 4 + 12, maxd_4 / 3 + 12, 20, 1);gotoxy(maxd_3 / 4 + 14, maxd_4 / 3 + 13);scanf("%s", pwa);while (strcmp(pwa_2(), pwa) != 0){system("cls");input_4();gotoxy(26, 8);printf("抱歉密码错误,请输入正确的密码");system("pause");system("cls");input_1();scanf("%s", pwa);}system("cls");input_4();gotoxy(0, 2);put_1();if (s.length > 0){printf("|请输入想要删除用户的名字:");scanf("%s", na);Delete(na);}break;}case 0: //退出{system("cls");break;}case -1:{pwa_3();}default: printf("请输入正确的数字编号!");}}return 0;
}
目录
目录
1.题目:通信录管理系统
3.各模块的功能
4.数据结构设计及用法说明
5.各个函数流程图
//文件保存
//判断通信录是否录满int fixup();
//录入数据 PUSH_LINE()
//输出录入的信息void put_1();
搜索功能void search()
修改功能void change()
删除功能void Delete()
6.实验结果
初始界面,输入密码后进入
菜单界面:分别输入0,1,2,3,4,5 实现不同操作
输入1,查看录入的信息
输入2,录入信息,可选择两钟方式录入,并且可以选择退出
输入3,可查找
输入4,修改,
输入5,删除,需要输入管理员权限密码才能操作,可按名字进行删除,因为是管理员所以可以显示所有信息进行操作
输入0,退出程序
7.体会
8.参考文献
9.附录(整段代码)
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
