https://github.com/sunlitao
一. 实验1通讯录管理系统
通讯录中的联系人包含以下信息项:姓名、手机、办公电话、家庭电话、电子邮箱、所在省市、工作单位、家庭住址,群组分类(亲属、同事、同学、朋友、其他)。
系统的主要功能包括:
1. 输入联系人的信息,要求:至少输入10个联系人的数据,且注意数据的多样性。
2. 按姓名对联系人信息进行排序,并将排序后信息存放到一个文本文件中。
3. 添加联系人的信息,在已经存在的通讯录文件中添加若干个联系人。要求:添加后仍按联系人的姓名排序,并保存至原文件。
4. 删除联系人的信息,输入一个姓名,若通讯录中有该联系人的信息,则删除该联系人,否则输出提示信息,并提示用户选择是否继续进行删除操作。
5. 修改联系人的信息,输入一个姓名,根据具体需要修改该联系人的某一项信息,将修改后的信息重新保存到通讯录文件中,并提示用户选择是否继续进行修改操作。
6. 按不同条件对通讯录进行查询操作,输出满足条件的联系人的信息。
(1) 按姓名查询,包括精确查询(输入全名),模糊查询(输入姓);
(2) 按手机号码查询,输入全部号码或号码位段(如输入130、133、139等);
(3) 按群组分类查询,输入分类名称,输出该群组的全部联系人信息。
7. 输出联系人的信息,按一定格式输出信息,保证信息排列整齐美观。
程序如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct{
char num[5];
char name[9];
char sex[3];
char phone[13];
char addr[31];
}DataType;
typedef struct node{
DataType data;
struct node * next;
}ListNode;
typedef ListNode * LinkList;
LinkList head;
ListNode *p;
int menu_select();
LinkList CreateList(void);
void InsertNode(LinkList head,ListNode *p);
ListNode * ListFind(LinkList head);
void DelNode(LinkList head);
void PrintList(LinkList head);
int main()
{
for( ; ; ){
switch(menu_select())
{
case 1:
printf("***********************************\n");
printf("* 通 讯 录 链 表 的 建 立 *\n");
printf("***********************************\n");
head=CreateList();
break;
case 2:
printf("***********************************\n");
printf("* 通 讯 者 信 息 的 添 加 *\n");
printf("***********************************\n");
printf("编号(4) 姓名(8) 性别 电话(11) 地址(31)\n");
printf("***********************************\n");
p=(ListNode *)malloc(sizeof(ListNode));
scanf("%s%s%s%s%s",p->data.num,p->data.name,p->data.sex,
p->data.phone,p->data.addr);
InsertNode(head,p);
break;
case 3:
printf("***********************************\n");
printf("* 通 讯 录 信 息 的 查 询 *\n");
printf("***********************************\n");
p=ListFind(head);
if(p!=NULL){
printf("编号 姓 名 性别 联系电话 地 址\n");
printf("-------------------------------------\n");
printf("%s,%s,%s,%s,%s\n",p->data.num,p->data.name,p->data.sex,
p->data.phone,p->data.addr);
printf("-------------------------------------\n");
}
else
printf("没查到要查询的通讯者!\n");
break;
case 4:
printf("***********************************\n");
printf("* 通 讯 录 信 息 的 删 除 *\n");
printf("***********************************\n");
DelNode(head);
break;
case 5:
printf("***********************************\n");
printf("* 通 讯 录 链 表 的 输 出 *\n");
printf("***********************************\n");
PrintList(head);
break;
case 0:
printf("\t 再 见! \n");
return 0;
}
}
}
int menu_select()
{
int sn;
printf(" 通讯录管理系统\n");
printf("==============================\n");
printf(" 1.通讯录链表的建立\n");
printf(" 2.通讯者结点的插入\n");
printf(" 3.通讯者结点的查询\n");
printf(" 4.通讯者结点的删除\n");
printf(" 5.通讯录链表的输出\n");
printf(" 0.退 出 管 理 系统\n");
printf("==============================\n");
printf(" 请 选 择0-5:");
for( ; ; )
{
scanf("%d",&sn);
if(sn<0 || sn>5)
printf("\n\t输出错误,重选0-5: ");
else
break;
}
return sn;
}
LinkList CreateList(void)
{
LinkList head=(ListNode *)malloc(sizeof(ListNode));
ListNode *p,*rear;
int flag=0;
rear=head;
while(flag==0)
{ p=(ListNode *)malloc(sizeof(ListNode));
printf("编号(4) 姓名(8) 性别 电话(11) 地址(31)\n");
printf("---------------------------------------------------\n");
scanf("%s%s%s%s%s",p->data.num,p->data.name,p->data.sex,
p->data.phone,p->data.addr);
rear->next=p;
rear=p;
printf("结束建表吗? (1/0):");
scanf("%d",&flag);
}
rear->next=NULL;
return head;
}
void InsertNode(LinkList head,ListNode *p)
{
ListNode *p1,*p2;
p1=head;
p2=p1->next;
while(p2!=NULL && strcmp(p2->data.num,p->data.num)<0)
{
p1=p2;
p2=p2->next;
}
p1->next=p;
p->next=p2;
}
ListNode * ListFind(LinkList head)
{
ListNode *p;
char num[5];
char name[9];
int xz;
printf("=====================\n");
printf(" 1.按编号查询 \n");
printf(" 2.按姓名查询 \n");
printf("=====================\n");
printf(" 请选择 : ");
p=head->next;
scanf("%d",&xz);
if(xz==1) {
printf("请输入要查询者的编号: ");
scanf("%s",num);
while(p && strcmp(p->data.num,num)<0)
p=p->next;
if(p==NULL || strcmp(p->data.num,num)>0)
p=NULL;
}
else
if(xz==2) {
printf("请输入要查询者的姓名: ");
scanf("%s",name);
while(p && strcmp(p->data.name,name)!=0)
p=p->next;
}
return p;
}
void DelNode(LinkList head)
{
int jx;
ListNode *p,*q;
p=ListFind(head);
if(p==NULL) {
printf("没有查到要删除的通讯者!\n");
return;
}
printf("真的要删除该结点吗?(1/0): ");
scanf("%d",&jx);
if(jx==1)
{
q=head;
while(q!=NULL && q->next!=p)
{q=q->next; }
p=q->next;
q->next=p->next;
free(p);
return;
printf("通讯者已被删除!\n");
}
}
void PrintList(LinkList head)
{
ListNode *p;
p=head->next;
printf("编号 姓 名 性别 联系电话 地 址\n");
printf("---------------------------------------\n");
while(p!=NULL)
{
printf("%s,%s,%s,%s,%s\n",p->data.num,p->data.name,p->data.sex,
p->data.phone,p->data.addr);
printf("----------------------------------------------------\n");
p=p->next;
}
}
一 通讯表的建立
二 通讯者结点的插入
在次添加一名通讯者信息
三 通讯者节点的查询
① 按姓名查询张三
四 通讯者节点的删除
五 通讯录链表的输出
六 管理系统的退出
总结和心得
在这个程序中,了解到往往拿到一个问题是要先分析总体框架并分为小块进行,注意指针与链表的选用和比较哪种较优,使程序更为简单,效率更高,更加要了解那些函数有着怎样的功能,怎么运用是很重要的,从程序中也知道要学习的东西还有很多很多。
设计过程中出现的问题,当输入相同序号时没有提出重复提示,改进
1.个人项目 Individual Project的更多相关文章
-
1415-2个人项目Individual Project
作业要求: 个人独立完成,实践PSP相关知识. 时 间: 两周. (本来截止4月30日,考虑到刚迁移平台,延缓至5月7日) 实践目标: Github基本源代码控制方法 利用Junit4进行程序模块的测 ...
-
个人项目 Individual Project
通讯录中的联系人包含以下信息项:姓名.手机.办公电话.家庭电话.电子邮箱.所在省市.工作单位.家庭住址,群组分类(亲属.同事.同学.朋友.其他). 系统的主要功能包括: 1. 输入联系人的信息,要求: ...
-
个人项目Individual Project:迷宫求解
源码的github链接: https://github.com/zhangxue520/test 1.1问题描述: a.问题描述:以一个m * n的长方阵表示迷宫,0和1分别表示迷 ...
-
个人项目Individual Project:n皇后问题
源码的github链接: https://github.com/luhan420/test/tree/master 1.需求分析 在本次的课程设计中,用到的知识点主要有:类.函数.选择结构里的条件语 ...
-
Note: SE Class&#39;s Individual Project
虽然第一个Project还有点小问题需要修改,但是大体已经差不多了,先把blog记在这里,算是开博第一篇吧! 1.项目预计的用时 本来看到这个题的时候想的并不多,但是看了老师的要求才觉得如此麻烦ORZ ...
-
Individual Project - Word frequency program-11061171-MaoYu
BUAA Advanced Software Engineering Project: Individual Project - Word frequency program Ryan Mao (毛 ...
-
.NET: 谈谈共享项目 (Shared Project) 的使用
从 Visual Studio 2015 起,共享项目 (Shared Project) 作为新的一种项目类型被添加到项目模板列表中,它的主要目的是使多个不同类型的项目之间可以共享代码或资源.相比它的 ...
-
错误 : 资产文件“项目\obj\project.assets.json”没有“.NETCoreApp,Version=v2.0”的目标。确保已运行还原,且“netcoreapp2.0”已包含在项目的 TargetFrameworks 中。
升级 vs201715.6.3之后发布出现 错误 : 资产文件“项目\obj\project.assets.json”没有“.NETCoreApp,Version=v2.0”的目标.确保已运行还原,且 ...
-
结对项目 Pair Project
结对项目 Pair Project 一人编程,一人操作,共同检查. 源码 https://github.com/dpch16303/test/blob/master/%E5%AE%9E%E8%B7%B ...
随机推荐
-
Android入门开发时注意的两个问题
android开发中的问题: . 开发应用时要访问网络往往会忘记添加网络权限 <uses-permission android:name="android.permission.INT ...
-
DalekJS – 基于 JavaScript 实现跨浏览器的自动化测试
在 Web 项目中,浏览器兼容以及跨浏览器测试是最重要的也是最费劲的工作.DalekJS 是一个基于 JavaScript(或 Node.js) 的免费和开源的自动化测试接口.它能够同时运行测试一组流 ...
-
1-1 Windows应用程序的特点
主要内容:介绍Windows应用程序的特点,并附加了消息和事件的一些区别 //以后该分类中字体均采用 隶书 4(14pt) 1. 面向对象 <1>针对Windows应用本身,如记事本界面, ...
-
php学习笔记6--php中的文件包含 include,require,include_once,require_once
php中的文件包含 include,require,include_once,require_once 文件包含:是指将一个文件的内容包含进另外一个文件,有利于代码的复用等.php中文件包含指令有4个 ...
-
linux 私房菜 CH7 Linux 档案与目录管理
路径 ``` . 此层目录 .. 上一级目录 前一个工作目录 ~ 当前用户的家的目录 ``` 变换目录 cd 显示目录 pwd [-P] -P 显示出确实的路径,而非使用链接 (link) 路径. 创 ...
-
redis集群添加删除节点
Redis3.0集群添加节点 1:首先把需要添加的节点启动 cd /usr/local/cluster/ mkdir 7006 cp /usr/local/cluster/redis.conf /u ...
-
Asp.Net Web API(六)
Asp.Net Web API不可以需要IIS.可以自己在主机上承载一个Web API 创建WebAPI.Server项目 创建一个控制器项目的服务端 在Nuget中添加Microsoft.AspNe ...
-
绑定DDL控件方法
刚刚写的,用在项目中,先记下来,备忘: 下面是调用方式:
-
org.eclipse.jdt.internal.compiler包下的类找不到
到maven库上下载jar包:org.eclipse.jdt.core-3.13.jar <!-- https://mvnrepository.com/artifact/org.eclipse. ...
-
netty 基础知识
http://my.oschina.net/bieber/blog/406799 线程模型 http://hongweiyi.com/2014/01/netty-4-x-thread-model/ h ...