目录
一 .总览。
1. tongxunlu.h文件
2.然后就是main.c文件
3.然后就是 tongxunlu.c 文件
4.最后makefile
二.菜单
三.函数调用
四.添加联系人
五,查看所有联系人 并按首字母排序
六.查找练习人
七.删除联系人
八.修改联系人信息
九.退出程序
十.strcmp 等 封装的4个函数
一 .总览。
有什么不够详细或者有问题的地方欢迎私信
封装的strcmp等 4个函数在本文最后面
该项目分四个文件 全程 无一指针 绝对够简单
main.c tongxunlu.c //所有的函数在此编写 封装 tongxunlu.h // 所有的函数在此进行声明 同时包含所需头文件 makefile //编译规则 当然不嫌麻烦的可以不用这个文件
初学 写的第一个项目
先大概总览一下吧 每个文件作用吧
所有的分析都在注释里面
1. tongxunlu.h文件
所有的函数声明在此
#ifndef _TONGXUN_H_ //防止重复声明 这是tongxunlu.h 文件 #define _TONGXUN_H_ //防止重复声明 #include#include #include #define SIZE 100 //保存联系人的最大数量 //结构体数组 联系人信息保存 struct person //定义一个全局变量 结构体数组 { // 可以避免传参问题 降低难度 char name[32]; int age; char adress[32]; int tel; }; struct person p[SIZE];//结构体数组 //下面使用的4个函数全为自己封装 //也可以直接包含#include //直接调用 //mystrcpy void mystrcpy(char *str,char *ptr); //mystrlen int mystrlen(char *str); //mystrncmp int my_strncmp(const char *str,const char *str1,int n); //mystrcmp int my_strcmp(const char *str,const char *str1); void menu();//菜单 void myswitch();//子函数调用 void addinform();//添加联系人信息 void view_det();//查看所有联系人信息 void Find_person();//查找联系人 void del_person();//删除联系人 void change_infor();//修改联系人信息 void endp();//退出程序 #endif//与开头作用相同
2.然后就是main.c文件
#include "tongxun.h"//头文件 所有函数声明在里面 这是main.c 文件内容
int main(int argc, char const *argv[])
{
while (1)//这个循环可以实现 功能结束返回菜单
{
menu(); //菜单
myswitch(); //这里在tongxunlu.c封装好了也可直接在main.c里写
}
return 0;
}
3.然后就是 tongxunlu.c 文件
所有的函数都在此编写 先看下图片吧 具体分析和源码在后面
4.最后makefile
应该没有 更简单的了吧 当然不写也行
二.菜单
好了接下来详细介绍
//mymenu 菜单 第一个菜单 就不必多说了 全程printf打印
void menu()
{
printf("**************欢迎使用通讯录*****************n");
printf("*********************************************n");
printf("** 1.添加联系人 2.查看联系人 **n");
printf("** 3.搜索联系人 4.删除联系人 **n");
printf("** 5.修改用户信息 6.退出通讯录 **n");
printf("*********************************************n");
printf("*********************************************n");
}
三.函数调用
然后就是switch case 输入数字调用对应函数实现对应功能
void myswitch()
{
int num;//定义整形 数字
scanf("%d",&num); //输入数字 调用对应功能
getchar(); //吞噬垃圾字符 防止出现错误
while(1) //此处用循环可以为下面连续使用对应功能
{
switch (num)
{
case 1:
printf("正在添加联系人.....n");
putchar(10);//没什么作用为了让终端显示的不那么拥挤
addinform();//添加联系人函数调用
break;
case 2:
printf("正在查看联系人.....n");
putchar(10);
view_det();//查看联系人函数调用
break;
case 3:
printf("正在搜索联系人.....n");
putchar(10);
Find_person();//搜索联系人函数调用
break;
case 4:
printf("正在删除联系人.....n");
putchar(10);
del_person();//删除联系人函数调用
break;
case 5:
printf("正在修改联系人.....n");
putchar(10);
change_infor();//修改联系人函数调用
break;
case 6:
printf("正在退出通讯录.....n");
endp();//退出函数调用
break;
default:
printf("对不起您输入有误,请重新输入n");
break;
}
break;
}
}
四.添加联系人
然后开始看第一个功能 详细的分析都用注释来解释 注释有点长 下个功能写短点
void addinform()
{
printf("请输入姓名:n");
scanf("%s",p[mm].name); //tongxunlu.h 定义了一个结构体数组 此处联系人信息全存在结构体数组中
//注意p[mm] 里面的 mm 很关键后面都要用到 tongxunlu.c最上面定义了一个全局变量int = 0 统计添加联系人的个数
printf("请输入年龄:n");//这里相当于 把输入信息存到p[0] 这个结构体里面
scanf("%d",&p[mm].age);
printf("请输入住址:n");
scanf("%s",p[mm].adress);
printf("请输入电话号码:n");
scanf("%d",&p[mm].tel);
putchar(10);
printf("*****联系人添加完成*****n");
mm++; //添加完成mm+1 下次再添加就是存到屁p[1]这个结构体里面了
int num = 0;
printf("*请选择是否继续添加联系人*n");
printf("*1.继续添加* 2.返回菜单*n");
scanf("%d",&num);
getchar();
if(num == 1)
{
addinform();//继续添加就在此调用函数
}
else
{
return; //不添加就结束 把程序流程从被调函数转向主调函数 main.c在此循环进入菜单
}
}
五,查看所有联系人 并按首字母排序
第二个功能 //查看用户信息并按名字首字母进行排序
//查看用户信息并按名字首字母进行排序
void view_det()
{//这里采用冒泡排序 将添加的联系人按名字首字母进行排序 不强调的可以不用
for(int j = 0;j < mm-1 ;j++)
{
for(int k = 0;k0 ) //这里就是strncmp函数 n=1 比较名字首字母大小
{
struct person tmp = p[k]; // 定义第三个变量也就一个结构体 进行交换
//整个结构体进行交换省了很多麻烦
p[k] = p[k+1];
p[k+1] = tmp;
}
}
}
for(int j =0;j < mm;j++) // 遍历 循环打印用户信息 mm为添加的练习人个数 第一个功能有介绍
{
printf("╔════════════════════════════════════════════════════════╗n");
printf("*姓名%s__年龄:%d___住址:%s__电话%d*n",p[j].name,p[j].age,p[j].adress,p[j].tel);
printf("╚════════════════════════════════════════════════════════╝n");
putchar(10);
}
}
六.查找练习人
第三个功能 按地址 或者姓名 查找联系人
//按地址 或者姓名 查找联系人
void Find_person()
{
char s1[32]={0};//定义一个字符串数组 用于保存你输入想要查找联系人的名字
while (1)
{
printf("********************************n");
printf("请输入您所查找联系人的姓名或者住址n");
printf("********************************n");
int i;
scanf("%s",s1);
for(i= 0;i
七.删除联系人
第四个功能 删除联系人
void del_person()
{
printf("**请输入你想删除联系人的名字**n");
char s2[32] = {0};
scanf("%s",s2); //定义一个字符串数组保存 想要删除联系人的名字
// 下面注释掉的是判断是否存存联系人的结构体体是否为空 不够完善
{ int n;
for(n=0; n
八.修改联系人信息
第五个功能修改联系人信息
void change_infor() //修改用户信息
{
printf("**请输入您所要修改信息的人名**n");
char s3[32] = {0};
scanf("%s",s3);
int g;
for(g=0;g < mm;g++)
{
if(my_strcmp(s3,p[g].name) == 0) //遍历到你想要修改信息的哪个用户
{ //strcmp 比较名字是否相同如果相同
printf("请输入新的姓名n");//下面直接进行覆盖就行了
scanf("%s",p[g].name); //把新的信息覆盖旧的信息
printf("请输入新的年龄n");
scanf("%d",&p[g].age);
printf("请输入新的住址n");
scanf("%s",p[g].adress);
printf("请输入新的电话n");
scanf("%d",&p[g].tel);
printf("修改成功n");
return; //修改完 返回主函数 循环进入菜单
}
}
if(mm==g) //如果一直没有遍历到 那么g==mm 也就是没有这个用户
{
printf("**对不起,您输入有误,未找到此联系人**n");
putchar(10);
}
}
九.退出程序
第六个工功能 这个没啥好说的直接结束进程
//退出程序
void endp()
{
exit(0);//结束整个进程
}
如何调用函数 可以看看上面switch case 输入对应数字执行对应函数
能力有限只能 这样了 第一次写的没有进行修改 可能有些地方可以进行删减
然后就是 表达能力也就这样了 哈哈哈 有什么不了解的地方可以私信
十.strcmp 等 封装的4个函数
然后就是 4个封装好的函数 就放在下面
//mystrlen 计算字符串长度
int mystrlen(char *str)
{
int i = 0;
while( *str!=' ' )
{
str++;
i++;
}
return i;
}
//mystrcpy 字符串覆盖 后面的覆盖前面的
void mystrcpy(char *str,char *ptr)
{
while(*ptr!=' ')
{
*str = *ptr;
ptr ++;
str ++;
}
*str = *ptr;
}
//mystrcmp 比较字符串大小 相等返回值为0
int my_strcmp(const char *str,const char *str1)
{
char *p = (char *)str;
char *q = (char *)str1;
while(*p!=' '&&*p==*q)
{
p++;
q++;
}
if (*p > *q)
{
return 1;
}
else if (*p < *q)
{
return -1;
}
else
{
return 0;
}
}
//mystrncmp 比较字符串 前n个字符的大小 使用strncmp(目的字符串,源字符串,前n个字符)
int my_strncmp(const char *str,const char *str1,int n)
{
char *p = (char *)str;
char *q = (char *)str1;
while(n--)
{
if(*p == *q)
{
p++;
q++;
}
else
{
return (*p - *q);
}
}
return 0;
}



