c语言的经典题目 通讯录的实现
要求
通讯录可以用来存储个人的信息,每个人的信息包括:
姓名、性别、年龄、电话、住址
提供方法:
1. 添加联系人信息
2. 删除指定联系人信息
3. 查找指定联系人信息
4. 修改指定联系人信息
5. 显示所有联系人信息
6. 清空所有联系人
7. 以名字排序所有联系人
上代码 代码中包含注释 读者可以通过注释理解学习
1.头文件
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include <string.h>
//结构体的声明
typedef struct PeoInfo //存放用户数据的结构体
{
char name[20];
char sex[10];
int age;
char tele[20];
char address[20];
/*char *name;
char *sex;
int age;
char *tel;
char *address;*/
}PeoInfo;
//常用的一种定义方法 PenInfo 相当于stuct PenInfo
typedef struct Contact //存放创立的结构体的结构体
{
PeoInfo* sizeIt;//静态建立结构体数组
int culCount;//当前个数
int capacity;//保存最大容量
}Contact, *pContact;
//第一个是 起了一个别名 第二个是 直接定义了一个指针 指向结构体
//对调用函数的声明
//pContact pc 是自己创立的结构体的类型
void initContact(pContact pc);//初始化
void addContact(pContact pc);//增加联系人
void deletContact(pContact pc);//删除联系人
int findContact(pContact pc,char* name);//查找联系人是否存在
void searchContact(pContact pc);//查找联系人信息
void movContact(pContact pc);//修改联系人信息
void showAllContact(pContact pc);//显示所有联系人
void sortContact(pContact pc);//按照名字进行排序
void resetContact(pContact pc);//销毁所有联系人
void dilataionContact(pContact pc);//动态扩容
2.函数实现 将函数实现存放在另一个文件当中 便于修改与理解
#define _CRT_SECURE_NO_WARNINGS 1
#include "contacts.h"
void initContact(pContact pc)//初始化
{
pc->capacity = 1;
pc->sizeIt=(PeoInfo*)malloc(pc->capacity*sizeof(PeoInfo));
pc->culCount = 0;//count为当前个数
}
void addContact(pContact pc)//增加联系人
{
if (pc->culCount == pc->capacity)
{
printf("存不下来啦 已经存满了\n");
printf("。。。。。。。。。。\n");
printf("扩容成功\n");
dilataionContact(pc);
}
printf("name\n");
scanf("%s", pc->sizeIt[pc->culCount].name);
printf("sex\n");
scanf("%s", pc->sizeIt[pc->culCount].sex);
printf("age\n");
scanf("%d", &(pc->sizeIt[pc->culCount].age));
printf("tele\n");
scanf("%s", pc->sizeIt[pc->culCount].tele);
printf("address\n");
scanf("%s", pc->sizeIt[pc->culCount].address);
(pc->culCount)++;
}
void deletContact(pContact pc)//删除联系人
{
printf("输入姓名\n");
char name[20]; //此处的初始化听该如何初始化
scanf("%s", name);
int ret = findContact(pc, name);
if (ret == -1)
{
printf("不存在\n");
}
else
{
for (int i = ret; i < pc->culCount; i++)
{
pc->sizeIt[i] = pc->sizeIt[i + 1]; //此处是否越界
}
pc->culCount--;
printf("删除成功");
}
}
int findContact(pContact pc, char* name)//查找联系人是否存在
{
for (int i=0;i<pc->culCount;i++)
{
if (strcmp(pc->sizeIt[i].name,name)==0)
{
printf("这是%d个元素\n", i);
return i;//存在直接返回下标
}
}
return -1;
}
void movContact(pContact pc)//修改联系人信息
{
printf("输入姓名\n");
char name[20];
scanf("%s", name);
int ret=findContact(pc, name);
if (ret==-1)
{
printf("不存在哦\n");
}
else
{
printf("请输入修改内容\n");
printf("name\n");
scanf("%s", pc->sizeIt[pc->culCount].name);
printf("sex\n");
scanf("%s", pc->sizeIt[pc->culCount].sex);
printf("age\n");
scanf("%d", &(pc->sizeIt[pc->culCount].age));
printf("tele\n");
scanf("%s", pc->sizeIt[pc->culCount].tele);
printf("address\n");
scanf("%s", pc->sizeIt[pc->culCount].address);
printf("修改成功\n");
}
}
void showAllContact(pContact pc)//显示所有联系人
{
for (int i=0;i<pc->culCount;i++)
{
printf("%s\t",pc->sizeIt[i].name);
printf("%s\t", pc->sizeIt[i].sex);
printf("%d\t", pc->sizeIt[i].age);
printf("%s\t", pc->sizeIt[i].tele);
printf("%s\t", pc->sizeIt[i].address);
printf("\n");
}
printf("输出完毕\n");
}
void sortContact(pContact pc)//按照名字进行排序
{//由大到小
for (int i=0;i<pc->culCount;i++)
{
for (int j=i;j<pc->culCount-1;j++)
{
if (strcmp(pc->sizeIt[j].name,pc->sizeIt[j+1].name)==-1)
{
//交换
PeoInfo tme = pc->sizeIt[j];
pc->sizeIt[j] = pc->sizeIt[j + 1];
pc->sizeIt[j + 1] = tme;
}
}
}
printf("排序成功\n");
}
void resetContact(pContact pc)//销毁所有联系人
{
pc->culCount = 0; //静态销毁
}
void searchContact(pContact pc)
{
printf("请输入姓名\n");
char name[20];
scanf("%s", name);
int ret=findContact(pc, name);
if (ret==-1)
{
printf("no one\n");
}
else
{
printf("%s\n",pc->sizeIt->name);
printf("%s\n", pc->sizeIt->sex);
printf("%d\n", pc->sizeIt->age);
printf("%s\n", pc->sizeIt->tele);
printf("%s\n", pc->sizeIt->address);
}
}
void dilataionContact(pContact pc)
{
if (pc->culCount==pc->capacity)
{
pc->sizeIt = (PeoInfo*)realloc(pc->sizeIt, 2 * pc->capacity);
pc->capacity = 2 * pc->capacity;
printf("当前容量为%d\n",pc->capacity);
}
}
3.主函数
主函数中对于通讯录的增加 删除 等函数的调用有两种方式
swich case 语句
函数指针的调用
在这里我采用了第二种方式 也是我更加倾向的一种方式
第一种方式以注释形式存放在了代码中
#define _CRT_SECURE_NO_WARNINGS 1
#include"contacts.h"
enum menuIt
{
ADD = 0,
DELET,
SEARCH,
MOV,
SHOW,
SORT,
RESET,
EXIT,
};
void menu()
{
printf("6666666666666666请输入操作6666666666666666666666\n");
printf("666666666666666666666666666666666666666666666666\n");
printf("0 ADD,1 DELET,2 FIND,3 MOV,4 SHOW,5 SORT,6 RESET,7 EXIT\n");
printf("666666666666666666666666666666666666666666666666\n");
printf("请输入您的操作6666666666666666666666666666666666\n");
}//菜单输出
typedef void(*functionS)(pContact);//此处声明一个函数指针类型
typedef struct simpleit //定义了一个结构体类型 成员含有函数指针类型
{
int a;
functionS b; //函数指针
}simpleit;
simpleit fun[10]; //结构体数组存放指针函数
int main()
{
fun[0].a = ADD;
fun[1].a = DELET;
fun[2].a = SEARCH;
fun[3].a = MOV;
fun[4].a = SHOW;
fun[5].a = SORT;
fun[6].a = RESET;
fun[0].b = addContact;
fun[1].b = deletContact;
fun[2].b = searchContact;
fun[3].b = movContact;
fun[4].b = showAllContact;
fun[5].b = sortContact;
fun[6].b = resetContact;
Contact allIt;//创建空间
initContact(&allIt);
int opNum;//操作数定义
while (1)
{
menu();
scanf("%d", &opNum);
for (int i=0;i<6;i++)
{
if (opNum==i)
{
fun[opNum].b(&allIt);
}
if(opNum==7)
{
return 0;
}
}
/*switch (opNum)
{
case ADD:addContact(&allIt);
break;
case DELET:deletContact(&allIt);
break;
case SEARCH:
searchContact(&allIt);
break;
case MOV:movContact(&allIt);
break;
case SHOW:showAllContact(&allIt);
break;
case SORT:sortContact(&allIt);
break;
case RESET:resetContact(&allIt);
break;
case EXIT: return 0;
break;
default:printf("输入有误\n");
break;
}*/
}
system("pause");
return 0;
}