结构体是c语言又一个存储数据的类型,那么用结构体怎么实现一个简单的可以存储1000个人信息的电话本呢?
一.首先需要定义一个结构体,包含一个人的信息(比如姓名,性别,年龄,电话,住址等等)。我们先来定义一个结构体。
typedef struct Pdhb-info { char name[5]; char sex[3]; int age; char tele[12]; char addr[30]; }Pdhb-info;
二.需要存储1000个人的信息,那么意思就是定义一个结构体,成员为Pdhb-info类型的数组,大小是1000。
typedef struct Dhb { Pdhb-info pinfo[MAX]; //定义一个Pdhb-info类型的数组,大小1000,数组名为pinfo int count; //将作为数组下标来访问数组元素 }Dhb,*pDhb; //定义一个这个结构体的指针
三.主函数如何实现
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include<stdlib.h> #include"contact.h" //添加自己写的头文件 int main() { Dhb dhb; //创建数组的那个结构体的对象 int input = 1; init_dhb(&dhb); while (input) { menu(); //打印一个开始菜单 scanf("%d", &input);//获取用户输入的数字 switch (input) //选择执行的程序 { case ADD: add_dhb(&dhb); break; case DEL: del_dhb(&dhb); break; case SEARCH: search_dhb(&dhb); break; case MODIFY: modify_dhb(&dhb); break; case SHOW: show_dhb(&dhb); break; case CLEAR: clear_dhb(&dhb); break; case SORT: sort_dhb(&dhb); break; case EXIT: exit(EXIT_SUCCESS); break; } } return 0; }
四.头文件的内容
#ifndef __CONTACT_H__ #define __CONTACT_H__ 定义头文件 #define MAX_NAME 20 #define MAX_SEX 3 #define MAX_TELE 13 #define MAX_ADDR 20 #define MAX 1000 enum OP 枚举类型 { EXIT, //0 ADD, //1 DEL, //2 SEARCH, //3 MODIFY, //4 SHOW, //5 CLEAR, //6 SORT //7 }; typedef struct Peo_Info { char name[MAX_NAME]; char sex[MAX_SEX]; int age; char tele[MAX_TELE]; char addr[MAX_ADDR]; }Peo_Info; typedef struct Dhb { Peo_Info pinfo[MAX]; int count; }Dhb,*pDhb; void menu(); //函数的声名 void init_dhb(pDhb pdhb); void add_dhb(pDhb pdhb); void del_dhb(pDhb pdhb); void search_dhb(pDhb pdhb); void modify_dhb(pDhb pdhb); void show_dhb(pDhb pdhb); void clear_dhb(pDhb pdhb); void sort_dhb(pDhb pdhb); #endif //__CONTACT_H__
五.函数的实现
#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #include"contact.h" void menu() //菜单函数的实现 { printf("***************************************\n"); printf("**** 1.add ********** 2.del ******\n"); printf("**** 3.search ********** 4.modify*****\n"); printf("****5.show ********** 6.clear*****\n"); printf("****7.sort ********** 0.exit******\n"); printf("***************************************\n"); } static int find_entry(pDhb pdhb, const char*name) //查找下标的函数实现 { int i = 0; for (i = 0; i < pdhb->count; i++) { if (0 == strcmp(name, pdhb->pinfo[i].name)) { return i; } } return -1; } void init_dhb(pDhb pdhb) //初始化 { pdhb->count = 0; } void add_dhb(pDhb pdhb) //添加函数的实现 { if (pdhb->count >= MAX) //判断人数是否大于1000 { printf("电话本已经满了\n"); return; } printf("请输入信息\n"); printf("名字:->"); //向数组元素中赋值 scanf("%s", pdhb->pinfo[pdhb->count].name); printf("性别:->"); scanf("%s", pdhb->pinfo[pdhb->count].sex); printf("年龄:->"); scanf("%d", &pdhb->pinfo[pdhb->count].age); printf("电话:->"); scanf("%s", pdhb->pinfo[pdhb->count].tele); printf("住址:->"); scanf("%s", pdhb->pinfo[pdhb->count].addr); pdhb->count++; printf("添加成功\n"); } void del_dhb(pDhb pdhb) //删除函数的实现 { char name[MAX_NAME]; int ret = 0; printf("输入要删除的名字\n"); scanf("%s", name); ret = find_entry(pdhb, name); //找到对应的下标,这个程序的bug在于重名的只会删除下标靠前的名字 if (ret == -1) { printf("名字不存在\n"); return; } else //用被找到的下标的后面元素直接覆盖掉前面元素的内容 { int j = 0; for (j = ret; j < pdhb->count-1; j++) { pdhb->pinfo[j] = pdhb->pinfo[j + 1]; } pdhb->count--; printf("删除成功\n"); } } void search_dhb(pDhb pdhb) //查找函数的实现 { char name[MAX_NAME]; int ret = 0; printf("输入寻找的名字\n"); scanf("%s", name); ret = find_entry(pdhb, name); //同样先找到下标 if (ret == -1) { printf("名字不存在\n"); return; } else 将找到下标所对应的元素输出 { printf("%10s\t%5s\t%4s\t%10s\t%10s\n", "name", "sex", "age", "tele", "addr"); printf("%10s\t%5s\t%3d\t%10s\t%10s\n", pdhb->pinfo[ret].name, pdhb->pinfo[ret].sex, pdhb->pinfo[ret].age, pdhb->pinfo[ret].tele, pdhb->pinfo[ret].addr); } } void modify_dhb(pDhb pdhb) //改个人信息 { char name[MAX_NAME]; int ret = 0; printf("输入要修改的名字\n"); scanf("%s", name); ret = find_entry(pdhb, name); //首先找到下标 if (ret == -1) { printf("名字不存在\n"); return; } else //让重新赋值就好了 { printf("名字:->"); scanf("%s", pdhb->pinfo[ret].name); printf("性别:->"); scanf("%s", pdhb->pinfo[ret].sex); printf("年龄:->"); scanf("%d", &pdhb->pinfo[ret].age); printf("电话:->"); scanf("%s", pdhb->pinfo[ret].tele); printf("住址:->"); scanf("%s", pdhb->pinfo[ret].addr); printf("修改成功"); } } void show_dhb(pDhb pdhb) //展示存储的信息 { int i = 0; printf("%10s\t%5s\t%4s\t%10s\t%10s\n", "name", "sex", "age", "tele", "addr"); for (i = 0; i < pdhb->count; i++) { printf("%10s\t%5s\t%3d\t%10s\t%10s\n", pdhb->pinfo[i].name, pdhb->pinfo[i].sex, pdhb->pinfo[i].age, pdhb->pinfo[i].tele, pdhb->pinfo[i].addr); } } void clear_dhb(pDhb pdhb) //清除电话本 ,只需要将conunt设置为0; { pdhb->count = 0; } void sort_dhb(pDhb pdhb) //冒泡排序,排序名字 { int i = 0; int j = 0; for (i = 0; i < pdhb->count; i++) { for (j = 0; j < pdhb->count - 1 - i; j++) { if (strcmp(pdhb->pinfo[j].name, pdhb->pinfo[j + 1].name) >0 ) { Peo_Info tmp = pdhb->pinfo[j]; pdhb->pinfo[j] = pdhb->pinfo[j+1]; pdhb->pinfo[j + 1] = tmp; } } } }
以上就是本人在学习过程中的一些经验总结。当然,本人能力有限,难免会有纰漏,希望大家可以指正。
时间: 2024-10-23 08:10:49