2021-01-12

系统设计-设计思路

定义结构体来保存通讯录中联系人的各项信息

使用主菜单实现对通讯录主要功能的管理,不同功能对应着不同的编号

使用结构体数据来存储多个联系人

采用文件来保存联系人的数据,提高操作效率

系统的数据输入包括输入功能编号以及联系人的各项信息。数据输出主要指显示联系人的信息

系统设计-模块划分

主模块:该模块主要用来完成整个系统的流程,在主模块中调用其他函数,实现整个系统的功能。

新增联系人信息模块:该模块分别根据提示信息输入联系人的姓名、职业、电话、电子邮件、地址,输入结束后,自动将联系人信息保存在磁盘文件中。

        该模块根据提示信息输入联系人信息并保存到磁盘文件中。 

        文件处理函数:fopen、feof、fread、fwrite、fclose。

        字符串处理函数:strcmp。

查询联系人信息模块:该模块用于在通讯录中根据姓名查找指定的联系人,并根据系统提示决定是否显示该信息

         根据姓名查找指定的联系人,并根据系统提示决定是否显示该信息。

修改联系人信息模块:该模块用来修改通讯录中指定联系人的信息。(根据姓名)

删除联系人信息模块:该模块将指定联系人的信息从通讯录中删除。(根据姓名)

排序模块:该模块将通讯录中的所有联系人按照姓名的字母顺序进行排序。

显示联系人信息模块:该模块用来显示通讯录中所有的联系人信息。

系统设计-数据结构设计

#include"stdio.h"
#include"stdlib.h"
#include"conio.h"
#include"dos.h"
#include"string.h"/*系统化输出*/
#define LEN sizeof(struct addritem)
#define FORMAT "%-10s%-10s%-15s%-25s%-30s%\n"
#define DATA addrinfo[i].name,addrinfo[i].occu,addrinfo[i].tel,addrinfo[i].email,addrinfo[i].address/*定义通讯录条目结构体*/
struct addritem
{char name[30];     /*联系人姓名*/char occu[30];     /*联系人职业*/char tel[15];      /*联系人电话*/char email[30];    /*联系人邮箱*/char address[30];  /*联系人地址*/
};/*结构体数组*/
struct addritem addrinfo[100];/*声明函数*/
void input();
void search();
void update();
void del();
void display();
void sort();  //按照联系人姓名排序
void menu();void menu() {system("cls");printf("\n\n\n\n\n\n");printf("\t\t-----------------------CONTACT-----------------------|\n");printf("\t\t| 0.exit                                          |\n");printf("\t\t| 1.input record                                  |\n");printf("\t\t| 2.search record                                 |\n");printf("\t\t| 3.update record                                 |\n");printf("\t\t| 4.delete record                                 |\n");printf("\t\t| 5.sort record                                   |\n");printf("\t\t| 6.display                                       |\n");printf("\t\t-----------------------------------------------------|\n\n");printf("\t\t\tchoose(0-6):");
}
//增加联系人
void input() {int i, count = 0;char ch[2]; //记录用户输入FILE *fp;  //文件指针变量if ((fp = fopen("data.txt", "a+")) == NULL) {   //a+ 以附加的方式打开文件printf("can not open!\n");return;}while (!feof(fp)) {   //feof 检测流上的结束符 eof 返回零值或非零值if (fread(&addrinfo[count], LEN, 1, fp) == 1)//第一个参数 指定用于接收数据的内存地址 //第二个参数 指定每个数据项的字节数	                                     //第三个参数 指定每次读取数据项的个数//第四个参数 代表输入流count++;}fclose(fp);if (count == 0) {printf("No contact record!\n");}else {system("cls");display();}if ((fp = fopen("data.txt", "wb")) == NULL) {   //wb 只写的方式printf("can not open address list\n");return;}for (i = 0; i < count; i++) {fwrite(&addrinfo[i], LEN, 1, fp);}printf("please input(y/n)");scanf("%c", ch);while (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) {printf("name:");scanf("%s", &addrinfo[count].name);for (i = 0; i < count; i++) {if (strcmp(addrinfo[i].name, addrinfo[count].name) == 0) {printf("The name already exists,press any key to continue");getch();fclose(fp);return;}}printf("occupation:");scanf("%s", &addrinfo[count].occu);printf("telephone:");scanf("%s", &addrinfo[count].tel);printf("email:");scanf("%s", &addrinfo[count].email);printf("address:");scanf("%s", &addrinfo[count].address);if (fwrite(&addrinfo[count], LEN, 1, fp) != 1) {printf("can not save the record");}else {printf("%s saved!\n", addrinfo[count].name);count++;}fclose(fp);printf("continue?(y/n)");scanf("%s", ch);}fclose(fp);printf("OK!\n");
}//查询联系人
void search() {FILE *fp;int i, count = 0;char ch[2], name[15];if ((fp = fopen("data.txt", "rb")) == NULL) {printf("can not open!\n");return;}//读取联系人信息while (!feof(fp))if (fread(&addrinfo[count], LEN, 1, fp) == 1)count++;fclose(fp);if (count == 0) {print("no record!\n");return;}printf("please input the name:");scanf("%s", name);for (i = 0; i < count; i++) {if (strcmp(name, addrinfo[i].name) == 0) {print("find the contact,display?(y/n)");scanf("%s", ch);if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) {printf("name      occupation      telephone      email      address\t\n");printf(FORMAT, DATA);}break;}if (i == count) {printf("can not find the contact!\n");}}
}//修改通讯录
void update() {FILE *fp;int i, j, count = 0;char name[15];if (fp = fopen("data.txt", "r+") == NULL) {printf("can not open\n");return;}while (!feof(fp)) {if (fread(&addrinfo[count], LEN, 1, fp) == 1) {count++;}}if (count == 0) {printf("no record!\n");fclose(fp);return;}display();printf("please input the name of the contact which you want to update\n");printf("update name:");scanf("%s", name);for (i = 0; i < count; i++) {if (strcmp(name, addrinfo[i].name) == 0) {printf("find the contact! you can update!\n");printf("name:");scanf("%s", &addrinfo[i].name);printf("occupation:");scanf("%s", &addrinfo[i].occu);printf("telephone:");scanf("%s", &addrinfo[i].tel);printf("email:");scanf("%s", &addrinfo[i].email);printf("address:");scanf("%s", &addrinfo[i].address);}if (fp = fopen("data.txt", "wb") == NULL) {printf("can not ioen\n");return;}for (j = 0; j < count; j++) {if (fwrite(&addrinfo[j], LEN, 1, fp) != 1) {printf("can not save!");getch();}fclose(fp);return;}	}printf("can not find the contact!\n");
}//删除联系人
void del() {FILE *fp;int i, j, count = 0;char ch[15],name[15];if (fp = fopen("data.txt", "r+") == NULL) {printf("can not open\n");return;}while (!feof(fp)) {if (fread(&addrinfo[count], LEN, 1, fp) == 1) {count++;}}fclose(fp);if (count == 0) {printf("no record!\n");return;}display();printf("please input the name of the contact which you want to delete\n");printf("delete name:");scanf("%s", name);for (i = 0; i < count; i++) {if (strcmp(name, addrinfo[i].name) == 0) {printf("find the contact! del(y/n)!\n");scanf("%s", ch);if (strcmp(ch, "Y") == 0 || strcmp(ch, "y") == 0) {for (j = i; j < count; j++) {  //将i之后的纪录前移addrinfo[j] = addrinfo[j + 1];}}count--;if (fp = fopen("data.txt", "wb") == NULL) {printf("can not open\n");return;}for (j = 0; j < count; j++) {if (fwrite(&addrinfo[j], LEN, 1, fp) != 1) {printf("can not save!");getch();}}fclose(fp);printf("del sucessfully!\n");return;}printf("not find the contact!\n");}
}void sort() {FILE *fp;struct addritem t;int i = 0, j = 0, count = 0;if ((fp = fopen("data.txt", "r+")) == NULL) {printf("can not open!\n");return;}while (!feof(fp)) if (fread(&addrinfo[count], LEN, 1, fp) == 1) count++;fclose(fp);if (count == 0) {printf("no record!\n");return;}for (i = 0; i < count - 1; i++) for(j=0;j<count;j++)if (strcmp(addrinfo[i].name, addrinfo[i].name) > 0){t = addrinfo[i];addrinfo[i] = addrinfo[j];addrinfo[j] = t;}if (fp = fopen("data.txt", "wb") == NULL) {printf("can not open\n");return;}for (j = 0; j < count; j++) if (fwrite(&addrinfo[j], LEN, 1, fp) != 1) {printf("can not save!");getch();}fclose(fp);printf("save successfully");
}void display() {FILE *fp;int i = 0, count = 0;fp = fopen("data.txt", "r+");while (!feof(fp))if (fread(&addrinfo[count], LEN, 1, fp) == 1)count++;fclose(fp);printf("name      occupation      telephone      email      address\t\n");if (count == 0) {printf("no record to display!\n");return;}for(i=0;i<count;i++)printf(FORMAT, DATA);	
}void main() {int n;menu();scanf("%d",&n);while (n){switch (n){case 1:input();   break;case 2:search();  break;case 3:update();  break;case 4:del();     break;case 5:sort();    break;case 6:display(); break;default:break;}getch();menu();scanf("%d", &n);}
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/567595.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2020-11-20

ln -s /bis_data/mysql/tmp/mysql.sock /tmp/ find / -name mysql.sock 2>/dev/null

未能找到程序集“platform.winmd_应用程序崩溃后 微软错误报告工具到底是如何联机检查解决方案的?...

在 Windows 应用意外崩溃后&#xff0c;系统似乎会努力地寻找解决方案。但是在绝大多数情况下&#xff0c;这一切都是徒劳的&#xff0c;并不会向用户给出任何结果。即便如此&#xff0c;很多人还是想要知道这个无效的过程期间到底都发生了什么。好消息是&#xff0c;近日微软 …

python升级到最新版本windows64位安装哪个包_手把手windows64位配置安装python2.7

这几天公司要用到python的一些算法&#xff0c;让我调研一番&#xff0c;之前对Python一次没接触的我在安装配置环境的时候由于版本的问题&#xff0c;折腾了好久&#xff0c;这里简单介绍一下我的安装方法&#xff0c;需要安装pyhton的朋友可以不再向我一样安装的那么纠结。。…

python连接服务器sql server_python – 无法通过pymssql连接到SQL Server

我试图通过pymssql从本地服务器上的* nix系统连接到运行在Windows XP系统上的SQL Server.但是,连接失败,如下所示db pymssql.connect(host192.168.1.102,userwww,passwordtest,databaseTestDB)Traceback (most recent call last):File "", line 1, in File "py…

pycharm 配置qt

在cmd中 pip install pyqt5-tools

python 网络编程 异步io_异步IO实现 小例(程序+驱动程序)

结合阻塞与非阻塞访问、poll 函数可以较好地解决设备的读写&#xff0c;但是如果有了异步通知就更方便了。异步通知的意思是&#xff1a;一旦设备就绪&#xff0c;则主动通知应用程序&#xff0c;这样应用程序根本就不需要查询设备状态&#xff0c;这一点非常类似于硬件上“中断…

mysql索引创建和使用注意事项

总结&#xff1a; 1、在使用索引时&#xff0c;一般情况下不建议使用like操作。如果使用&#xff0c;则%放在后面。否则不会使用索引。like ‘%abd%’不会使用索引,而like ‘aaa%’可以使用索引.&#xff08;最左缀原则&#xff09; 2、单列索引的使用&#xff1a; 《1》 只…

不同存储结构的文件磁盘io操作次数_MySQL InnoDB存储引擎

第1章 MySQL体系结构和存储引擎1.1数据库和实例数据库&#xff1a;物理操作系统文件或其他形式文件类型的集合。实例&#xff1a;MySQL数据库由后台线程以及一个共享内存区组成。共享内存可以被运行 的后台线程所共享。数据库实例才是真正用于操作数据库文件的。启动MySQL数据库…

我的模型--

from skimage import io, transform # skimage模块下的io transform(图像的形变与缩放)模块 import glob # glob 文件通配符模块 import os # os 处理文件和目录的模块 import tensorflow as tf import numpy as np # 多维数据处理模块 import time import matplotlib.pypl…

python蚁群算法 路径规划_蚁群算法(1) - Python实现

1 importnumpy as np2 importmatplotlib.pyplot as plt345 #建立“蚂蚁”类6 classAnt(object):7 def __init__(self, path):8 self.path path #蚂蚁当前迭代整体路径9 self.length self.calc_length(path) #蚂蚁当前迭代整体路径长度1011 def calc_length(self, path_): #pa…

win10-PC端无法输入中文

试过 任务管理器中&#xff0c;的 MscCtfMonitor任务&#xff0c;先选择结束&#xff0c;然后再选择运行。关闭后输入法就可重新使用了---不行 当出现Win10无法输入中文汉字时&#xff0c;首先我们需要重启一下“输入法”程序&#xff1a; 右击桌面“Windows”图标&#xff0c…

python变量和数据类型_python的变量和数据类型

1.Python的变量不用定义类型,每个语句后面也不用使用分号结束语句(不像java,C,C#要在变量声明后加上分号)如:message"hello python world"print(message)-----------------------------------age19print(age)2.字符串(1).在Python中用引号括起来的都是字符串, 其中的…

函数声明是形参类型省略

如果参数类型省略&#xff0c;默认为int类型。&#xff08;此为古老写法&#xff09; #include<stdio.h>float average(a,n) int a[]; {int j;float s0;float aver;for(j0;j<0;j){sa[j];}avers/n;return aver; }main() {int a[12]{10,4,2,7,3,12,5,34,5,9,6,8};print…

因果图中的约束关系

E:互斥&#xff0c;exclude&#xff0c;表示abc最多只能有一个1&#xff0c;即abc000&#xff0c;100&#xff0c;010&#xff0c;001&#xff0c;只能有1个1或者全0&#xff08;可不选&#xff0c;要选最多选一个&#xff09;。I:包含&#xff0c;include&#xff0c;表示abc不…

如何销毁一个实例化对象_JAVA中如何创建和销毁对象

第1条 考虑用静态方法代替构造器类可以通过静态工厂方法来提供它的客户端&#xff0c;而不是通过构造器。提供静态工厂方法而不是公有构造器&#xff0c;这样做具有几大优势。1.静态工厂方法与构造器不同的第一大优势在于&#xff0c;它们有名称。例如&#xff0c;构造器BigInt…

因果图-交通一卡通自动充值软件系统-实例分析

因果图法测试用例的设计步骤 &#xff08;1&#xff09;确定软件规格(需求)中的原因和结果 &#xff08;2&#xff09;确定原因和结果之间的逻辑关系 &#xff08;3&#xff09;确定因果图中的各个约束(constraints) &#xff08;4&#xff09;画出因果图并转换为决策表 &…

如何区分电梯卡为id卡ic卡_电梯刷卡系统基本属性

电梯刷卡控制系统的发展是十分迅速的&#xff0c;在这点上相信大家都有所体会。但是为了节约成本费用&#xff0c;很多地产商都是安装的基本常见的电梯刷卡控制系统&#xff0c;这种常见的电梯&#xff0c;能够满足基本上的用户需求&#xff0c;在零件上面也是能够与大多数的零…

python应用体系_python-大型django应用程序体系结构

如何适当地构建一个较大的Django网站,以保持可测试性和可维护性&#xff1f;本着最好的django精神(我希望),我们开始时不太关心网站不同部分之间的去耦.我们确实将其分为不同的应用程序,但是通过共同使用模型类和直接方法调用,它们直接相互依赖.这变得越来越纠结.例如,我们的一…

Postman入门到精通01

1、什么是接口&#xff1f; 电脑&#xff1a;USB&#xff0c;投影仪 作用&#xff1a;数据传输 软件&#xff1a;API&#xff08;application Program Interface&#xff09;&#xff0c;微信提现和充值接口&#xff0c;支付宝支付&#xff0c;银联支付接口&#xff08;鉴权…

python oracle orm_Python ORM

本章内容ORM介绍如果写程序用pymysql和程序交互&#xff0c;那是不是要写原生sql语句。如果进行复杂的查询&#xff0c;那sql语句就要进行一点一点拼接&#xff0c;而且不太有重用性&#xff0c;扩展不方便。而且写的sql语句可能不高效&#xff0c;导致程序运行也变慢。为了避免…