目标:通过编写c语言电话簿小系统掌握结构体与结构体数组的使用方式
个人学习记录
- 结构体的创建和初始化
- 结构体数组的使用与增删改查
先在编译器中创建对应项目与文件
此处使用的是Microsoft Visual C++2010学习版编译器
首先打开任务栏中的’文件’ — ‘新建’ — ‘项目’ ,打开后选择’Win32控制台应用程序’ ,创建 ‘dianhuabu’ 项目。
随后在任务栏的左边这里,对源文件进行右击,‘添加’ — ‘新建项’
随后选择好C++文件后,在下方输入’dianhuabu’ 的文件名,文件便创建好了
将代码复制进去后,ctrl+f5即可执行。
c语言电话簿小系统代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 10
/*
实现一个电话簿;
通讯录可以用来存储10个人的信息,每个人的信息包括:
姓名、性别、年龄、电话、住址
提供方法:
1. 添加联系人信息
2. 删除指定联系人信息
3. 查找指定联系人信息
4. 修改指定联系人信息
5. 显示所有联系人信息
6. 清空所有联系人
7. 以名字排序所有联系人
--8. 保存联系人到文件
--9. 加载联系人
*/
struct personInfo
{
char name[10]; //姓名
char sex[10]; //性别
char age[4]; //年龄
char phone[12]; //电话
char adress[200]; //地址
};
int i = 0;
struct personInfo p_info[N];
int sz = sizeof(p_info) / sizeof(personInfo);
void add_linkman()
{
int num = 0,count = 0,flag = 0,size = 0;
struct personInfo stu;
while(num < N)
{
if(p_info[num].name[0] != '\0')
{
count++;
}
else if(flag == 0)
{
size = num;
flag = 1;
}
num++;
}
printf("电话簿一共有%d个位置,已经用了%d位,",N,count);
printf("size的位置为:%d\n",size);
if(count == N)
{
printf("数组已满\n");
}
else
{
printf("请输入联系人信息:\n");
printf("联系人姓名:\n");
scanf("%s",stu.name);
printf("联系人性别:\n");
scanf("%s",stu.sex);
printf("联系人年龄:\n");
scanf("%s",stu.age);
printf("联系人电话:\n");
scanf("%s",stu.phone);
printf("联系人地址:\n");
scanf("%s",stu.adress);
fflush(stdin);
p_info[size] = stu;
if(strcmp(p_info[size].name,stu.name) == 0){
printf("联系人已添加\n");
}
else
{
printf("添加失败\n");
}
}
}
int delete_appoint_linkman()
{
fflush(stdin);
char linkman_name[10];
char p_info_name[10];
printf("您要删除的联系人是:\n");
gets(linkman_name);
printf("您输入的联系人是:\n");
printf("%s\n",linkman_name);
int i,j;
for(i = 0;i < 10;i++)
{
//字符数组的字符串值与结构体中的字符串数组值进行比对
//将数组p_info_name进行置空
memset(p_info_name,0,sizeof(p_info_name));
for (j = 0; j < 10; j++)
{
if(p_info[i].name[j] != '\0')
{
p_info_name[j] = p_info[i].name[j];
}
}
if(strcmp(p_info_name,linkman_name)==0)
{
int k = i;
while(p_info[k+1].name[0] != '\0')
{
p_info[k] = p_info[k+1];
k++;
}
p_info[k].name[0] = '\0';
printf("删除结束\n");
return 1;
}
}
return 0;
}
int find_appoint_linkman()
{
fflush(stdin);
char linkman_name[10];
char p_info_name[10];
printf("您要查找的联系人是:\n");
gets(linkman_name);
printf("您输入的联系人是:\n");
puts(linkman_name);
//i用来表示结构体数组的长度,j用来表示结构体数组中name字符串数组的长度
int i,j;
for(i = 0;i < sz;i++)
{
//字符数组的字符串值与结构体中的字符串数组值进行比对
//将数组p_info_name进行置空
memset(p_info_name,0,sizeof(p_info_name));
for (j = 0; j < 10; j++)
{
if(p_info[i].name[j] != '\0')
{
p_info_name[j] = p_info[i].name[j];
}
}
if(strcmp(p_info_name,linkman_name)==0)
{
printf("联系人-- 姓名:%s,性别:%s,年龄:%s,电话:%s,住址:%s\n",i+1,p_info[i].name,p_info[i].sex,p_info[i].age,p_info[i].phone,p_info[i].adress);
printf("查询结束\n");
return 1;
}
}
printf("未找到相关联系人\n");
return 0;
}
int update_appoint_linkman()
{
fflush(stdin);
char linkman_name[10];
char p_info_name[10];
printf("您要更新的联系人是:\n");
gets(linkman_name);
printf("您输入的联系人是:");
puts(linkman_name);
printf("%s\n",linkman_name);
int i,j;
for(i = 0;i < sz; i++)
{
//字符数组的字符串值与结构体中的字符串数组值进行比对
//将数组p_info_name进行置空
memset(p_info_name,0,sizeof(p_info_name));
for (j = 0; j < sz; j++)
{
if(p_info[i].name[j] != '\0')
{
p_info_name[j] = p_info[i].name[j];
}
}
if(strcmp(p_info_name,linkman_name)==0)
{
printf("已查询到您输入的联系人\n");
struct personInfo stu;
printf("请输入新联系人信息:\n");
printf("联系人姓名:\n");
scanf("%s",stu.name);
printf("联系人性别:\n");
scanf("%s",stu.sex);
printf("联系人年龄:\n");
scanf("%s",stu.age);
printf("联系人电话:\n");
scanf("%s",stu.phone);
printf("联系人地址:\n");
scanf("%s",stu.adress);
p_info[i] = stu;
return 1;
}
}
return 0;
}
void find_all_linkman()
{
int i = 0;
for(;i < sz;i++)
{
if(p_info[i].name[0] == '\0')
{
continue;
}
else
{
printf("联系人-- 姓名:%s,性别:%s,年龄:%s,电话:%s,住址:%s\n",p_info[i].name,p_info[i].sex,p_info[i].age,p_info[i].phone,p_info[i].adress);
}
//printf("联系人-- 姓名:%s,性别:%s,年龄:%s,电话:%s,住址:%s\n",i+1,p_info[i].name,p_info[i].sex,p_info[i].age,p_info[i].phone,p_info[i].adress);
}
printf("已输出所有联系人!\n");
}
void delete_all_linkman()
{
for (int i = 0; i < sz; i++ )
{
p_info[i].name[0] = '\0';
}
printf("已删除所有联系人\n");
}
//对联系人进行排序
void sort_linkman_byname()
{
struct personInfo p_info_temp;
p_info_temp = p_info[0];
for (int i = 0; i < sz; i++)
for(int j = 0; j < sz - i - 1; j++)
{
if(p_info[j].name[0] > p_info[j+1].name[0])
{
p_info_temp = p_info[j];
p_info[j] = p_info[j+1];
p_info[j+1] = p_info_temp;
}
}
printf("排序结束\n");
}
int main() {
printf("============*开始*============\n");
struct personInfo stu1 = {"ycy","female","20","15958163105","江苏常州"};
struct personInfo stu2 = {"hkl","female","21","15958163106","江苏常州"};
struct personInfo stu3 = {"hxy","female","22","15958163107","江苏常州"};
struct personInfo stu4 = {"ch","female","23","15958163108","江苏常州"};
p_info[0] = stu1;
p_info[1] = stu2;
p_info[2] = stu3;
p_info[3] = stu4;
char code = '*'; //此处初始化code值
printf("***********指令列表***********\n");
printf("添加联系人: -- 0\n");
printf("删除指定联系人: -- 1\n");
printf("更新指定联系人: -- 2\n");
printf("查询指定联系人: -- 3\n");
printf("清空所有联系人: -- 4\n");
printf("显示所有联系人: -- 5\n");
printf("对联系人排序: -- 6\n");
printf("结束选择: -- #\n");
printf("***********指令列表***********\n");
while(code != '#')
{
printf("请输入您要执行的指令(输入#退出):\n");
fflush(stdin);
scanf("%c",&code);
switch(code)
{
case '0':
printf("*****分隔符*****\n");
add_linkman();
printf("*****分隔符*****\n"); break;
case '1':
printf("*****分隔符*****\n");
delete_appoint_linkman();
printf("*****分隔符*****\n"); break;
case '2':
printf("*****分隔符*****\n");
update_appoint_linkman();
printf("*****分隔符*****\n"); break;
case '3':
printf("*****分隔符*****\n");
find_appoint_linkman();
printf("*****分隔符*****\n"); break;
case '4':
printf("*****分隔符*****\n");
delete_all_linkman();
printf("*****分隔符*****\n"); break;
case '5':
printf("*****分隔符*****\n");
find_all_linkman();
printf("*****分隔符*****\n"); break;
case '6':
printf("*****分隔符*****\n");
sort_linkman_byname();
printf("*****分隔符*****\n"); break;
default:
printf("您未执行任何操作!\n"); break;
}
}
printf("============*结束*============\n");
return 0;
}
此次记录主要涉及的是c语言中的结构相关内容,因此涉及到文件操作的方法8与9还尚未实现,等下次再做补充。
总结:
- 上述小系统的代码中,以结构体personInfo来充当联系人的主要信息的数据形式,存放在结构体数组p_info[10]中(模拟数据库的作用),主要实现对数组中的信息进行增删改查,以及指定联系人的查询、删除与修改等功能。
- 所遇到的问题有:
i.注意到在执行输入方法gets或者scanf方法时,存在跳过而直接运行了下一步的问题,核查后原因在于数据输入时存在缓存空间,需要及时执行fflush(stdin)方法,即可清除缓存,不至于再对下一次的输入产生影响。
ii.将数组置空时,需要采用memset(p_info_name,0,sizeof(p_info_name));方法,而不是单纯的将其赋值于NULL。 - 部分运行展示: