- 结构体的创建和初始化
- 结构体数组的使用与增删改查
先在编译器中创建对应项目与文件
此处使用的是Microsoft Visual C++2010学习版编译器
首先打开任务栏中的’文件’ — ‘新建’ — ‘项目’ ,打开后选择’Win32控制台应用程序’ ,创建 ‘dianhuabu’ 项目。
随后在任务栏的左边这里,对源文件进行右击,‘添加’ — ‘新建项’
随后选择好C++文件后,在下方输入’dianhuabu’ 的文件名,文件便创建好了
将代码复制进去后,ctrl+f5即可执行。
#include#include #include #define N 10 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] != ' ') { count++; } else if(flag == 0) { size = num; flag = 1; } num++; } printf("电话簿一共有%d个位置,已经用了%d位,",N,count); printf("size的位置为:%dn",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("%sn",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] != ' ') { 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] != ' ') { p_info[k] = p_info[k+1]; k++; } p_info[k].name[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] != ' ') { p_info_name[j] = p_info[i].name[j]; } } if(strcmp(p_info_name,linkman_name)==0) { printf("联系人-- 姓名:%s,性别:%s,年龄:%s,电话:%s,住址:%sn",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("%sn",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] != ' ') { 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] == ' ') { continue; } else { printf("联系人-- 姓名:%s,性别:%s,年龄:%s,电话:%s,住址:%sn",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,住址:%sn",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] = ' '; } 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("添加联系人: -- 0n"); printf("删除指定联系人: -- 1n"); printf("更新指定联系人: -- 2n"); printf("查询指定联系人: -- 3n"); printf("清空所有联系人: -- 4n"); printf("显示所有联系人: -- 5n"); printf("对联系人排序: -- 6n"); 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。 - 部分运行展示:



