不是有一句话叫做学生给学生当老师,学生最容易听懂明白吗?没错,我这个菜鸟给你讲讲这个通讯录项目的实现,让你更能清楚明白其中的奥秘。
这个代码没有经过过多的优化,只是为了代码能够让更多的人读懂,所以也不是最好的代码,你们可以理解了以后自己去做做优化。
代码用的知识就是C语言中最基本的操作。
项目要求:
实现一个通讯录;
通讯录可以用来存储1000个人的信息,每个人的信息包括:
姓名、性别、年龄、电话、住址
提供方法:
1. 添加联系人信息
2. 删除指定联系人信息
3. 查找指定联系人信息
4. 修改指定联系人信息
5. 显示所有联系人信息
6. 清空所有联系人
7. 以名字排序所有联系人
代码实现:
AddRess.h
#ifndef __ADDRESS_H__ #define __ADDRESS_H__ #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <string.h> #define MAX 10 //这里我为了调试方便取了一个较小的数值 enum OP { EXIT = 0,//退出 ADD, //增加联系人 DEL, //删除联系人 SEEK, //查找联系人 REVISE, //修改联系人 SHOW, //显示所有联系人 EMPTY, //清空所有联系人 SORT, //以名字排序所有联系人 }; //姓名、性别、年龄、电话、住址 typedef struct PesonMessage { char name[20]; char sex[5]; int age; char tel[15]; char address[20]; }PesonMessage; //通讯录成员结构体; typedef struct Peson { PesonMessage people[MAX]; int size; }Peson,*pPeson; void Print_AddRess(); void Add_AddRess(pPeson peson); void Show_AddRess(pPeson peson); void Empty_AddRess(pPeson peson); void Del_AddRess(pPeson peson); void Seek_AddRess(pPeson peson); void Revise_AddRess(pPeson peson); void Sort_AddRess(pPeson peson); void Cheak(pPeson peson); #endif//__ADDRESS_H__
AddRess.c
#define _CRT_SECURE_NO_WARNINGS 1 #include "AddRess.h" void Print_AddRess() { printf("**************************\n");//输出的时候要保证屏幕上干净整齐 printf("*****0. 退出系统 *****\n");//让别人有读下去的兴趣 printf("*****1.添加联系人信息*****\n"); printf("*****2.删除联系人信息*****\n"); printf("*****3.查找联系人信息*****\n"); printf("*****4.修改联系人信息*****\n"); printf("*****5.显示联系人信息*****\n"); printf("*****6.清空所有联系人*****\n"); printf("*****7.名字排序联系人*****\n"); printf("**************************\n"); } void Add_AddRess(pPeson peson) { assert(peson);//断言指针是否有效 if(peson->size < MAX)//判断peson->size是否合法 { //简单的输入输出 printf("添加联系人信息\n");//姓名、性别、年龄、电话、住址 printf("请输入联系人姓名:\n"); scanf("%s",&(peson->people[peson->size].name)); printf("请输入联系人的性别:\n"); scanf("%s",&(peson->people[peson->size].sex)); printf("请输入联系人的年龄:\n"); scanf("%d",&(peson->people[peson->size].age)); printf("请输入联系人的电话:\n"); scanf("%s",&(peson->people[peson->size].tel)); printf("请输入联系人的住址:\n"); scanf("%s",&(peson->people[peson->size].address)); peson->size++;//每次增加一个联系人,有效的size都要+1 } else { printf("通讯录已满\n");//如果peson->size >= MAX } } void Show_AddRess(pPeson peson) { int i = 0; assert(peson);//断言指针是否有效 printf("%5s\t","name");//%Xs 的方式使字符串从最右边开始打印对齐 X可是是随意的值,这里的取了一个较小的数字 printf("%5s\t","sex"); printf("%5s\t","age"); printf("%5s\t","tel"); printf("%5s\t","address"); printf("\n"); for (i = 0;i <peson->size;i++) { printf("%5s\t",peson->people[i].name); printf("%5s\t",peson->people[i].sex); printf("%5d\t",peson->people[i].age); printf("%5s\t",peson->people[i].tel); printf("%5s\t",peson->people[i].address); printf("\n"); } } void Empty_AddRess(pPeson peson) { assert(peson);//断言指针是否有效 peson->size = 0; } void Del_AddRess(pPeson peson) { char name[20] = {0}; int i = 0; assert(peson);//断言指针是否有效 if (peson->size == 0) { printf("通讯录已空\n"); } printf("请输入需要删除联系人的姓名"); scanf("%s",&name); for (i = 0;i < peson->size; i++) { if (strcmp(name,peson->people[i].name) == 0)//判断输入的姓名和通讯录的姓名是否一致 { for (;i < peson->size;i++) { peson->people[i] = peson->people[i + 1];//发现一致的名字后,从当前下标的后一个下标的所有有效值赋值给前一个 } //覆盖掉需要删除的值,注意这里不能从最后一个有效值开始往前赋值,会丢失数据的 peson->size--;//每次删除一个数据,有效size要减掉一个 } } if (i == peson->size) { printf("对不起,找不到您所要删除的联系人\n"); } } void Seek_AddRess(pPeson peson) { char name[20] = {0}; int i = 0; assert(peson);//断言指针是否有效 if (peson->size == 0) { printf("通讯录已空\n"); } printf("请输入需要查找联系人的姓名"); scanf("%s",&name); for (i = 0;i < peson->size; i++) { if (strcmp(name,peson->people[i].name) == 0) { printf("%5s\t","name"); printf("%5s\t","sex"); printf("%5s\t","age"); printf("%5s\t","tel"); printf("%5s\t","address"); printf("\n"); printf("%5s\t",peson->people[i].name); printf("%5s\t",peson->people[i].sex); printf("%5d\t",peson->people[i].age); printf("%5s\t",peson->people[i].tel); printf("%5s\t",peson->people[i].address); printf("\n"); } } } void Revise_AddRess(pPeson peson) { char name[20] = {0}; char Char_Tmp[20] = {0}; int Int_Tmp = 0; int i = 0; int num = 0; assert(peson);//断言指针是否有效 if (peson->size == 0) { printf("通讯录已空\n"); } printf("请输入需要修改的联系人的姓名"); scanf("%s",&name); for (i = 0;i < peson->size; i++) { if (strcmp(name,peson->people[i].name) == 0) { printf("1.name\n"); printf("2.sex\n"); printf("3.age\n"); printf("4.tel\n"); printf("5.address\n"); printf("请输入需要修改的对应序号:\n"); scanf("%d",&num); switch (num) { case 1: printf("请输入联系人姓名\n"); scanf("%s",&Char_Tmp); strcpy(peson->people[i].name,Char_Tmp); break; case 2: printf("请输入联系人性别\n"); scanf("%s",&Char_Tmp); strcpy(peson->people[i].sex,Char_Tmp); break; case 3: printf("请输入联系人年龄\n"); scanf("%d",&Int_Tmp); peson->people[i].age = Int_Tmp; break; case 4: printf("请输入联系人电话\n"); scanf("%s",&Char_Tmp); strcpy(peson->people[i].tel,Char_Tmp); break; case 5: printf("请输入联系人住址\n"); scanf("%s",&Char_Tmp); strcpy(peson->people[i].address,Char_Tmp); break; default: printf("对不起,输入错误\n"); break; } } } } void Sort_AddRess(pPeson peson)//冒泡排序 { char name[20] = {0}; int i = 0; int j = 0; PesonMessage tmp; assert(peson);//断言指针是否有效 if (peson->size == 0) { printf("通讯录已空\n"); } for (i = 0; i < peson->size-1; i++)//排序的趟数 { for (j = 0;j < peson->size - i - 1;j++)//比较的个数 { if (strcmp(peson->people[j].name,peson->people[j + 1].name) < 0) { //strcpy(tmp,peson->people[j].name); //刚开始欠缺考虑只是交换了两组姓名而已 //strcpy(peson->people[j].name,peson->people[j + 1].name); //strcpy(peson->people[j + 1].name,tmp); tmp = peson->people[j]; peson->people[j] = peson->people[j+1]; peson->people[j+1] = tmp; } } } } void Cheak(pPeson peson) { int index = 0; while(1) { Print_AddRess(); printf("请选择:\n"); scanf("%d",&index); switch(index) { case EXIT: exit(0); break; case ADD: Add_AddRess(peson); break; case DEL: Del_AddRess(peson); break; case SEEK: Seek_AddRess(peson); break; case REVISE: Revise_AddRess(peson); break; case SHOW: Show_AddRess(peson); break; case EMPTY: Empty_AddRess(peson); break; case SORT: Sort_AddRess(peson); break; default: printf("输入有误\n"); break; } } }
test.c
#define _CRT_SECURE_NO_WARNINGS 1 #include "AddRess.h" int main() { Peson peson; peson.size = 0; Cheak(&peson); system("pause"); return 0; }
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。