通讯录项目 — 结构体数组
1.使用结构体来存放数据,使用数组来存放结构体
2.struct Data{
int id;
char name[10];
int phone; //注意11位数的整型范围用int能不能放
}
3.知识点
数据类型
数组
结构体
语句 for switch if break return
函数 尽可能的都用函数去写,可以先都在main函数里实现,最后改写为函数
字符串函数 strcpy strcmp等
随机数函数
等等
4.功能
增加联系人
删除联系人 --- 按电话、姓名删除
查找联系人 --- 按电话、姓名查找
修改联系人 --- 可以修改姓名、电话
显示联系人 --- 界面优美的打印出所有联系人
ID使用随机数生成,并且作为唯一的标识,
例如生成5位数作为ID,每一次生成,都去数组中查看,该ID有没有被使用,确保唯一性。
按ID从小到大排序
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
struct DATE
{
long telephone;
int id;
char name[20];
};
int myrand(int Rand_Max)//产生随机数
{
int test[100000]={0};
int i=0;
srand(time(NULL));
int rnum=rand()%Rand_Max;
test[rnum] += 1;
for(i=10000;i<100000;i++)
{
if(test[i]>1)
{
rnum=(rand()%Rand_Max)+10000;
}
}
return rnum;
}
void add_data(struct DATE num[],int *length)//输入信息
{
int p1 = *length;
while(1)
{
int ran = myrand(100000);
printf("输入tel : \n");
scanf("%ld",&num[p1].telephone);
printf("输入姓名: \n");
scanf("%s",num[p1].name);
num[p1].id = ran;
p1++;
*length = p1;
break;
}
}
void show_data(struct DATE num[],int *length)//显示信息
{
int i;
int len = *length;
for(i=0;i<len;i++)
{
printf("ID : %d\n",num[i].id);
printf("tel :%ld \t\n",num[i].telephone);
printf("name:\t %s\n",num[i].name);
}
}
void sort_data(struct DATE num[],int *length)//排序
{
int i,j;
int len = *length;
int tid = 0; //用来交换id
long ctel = 0;//用来交换号码
char name6[20]={0};//用来交换姓名
for(i=0;i<len;i++)
{
for(j=i+1;j<len;j++)
{
if(num[i].id>num[j].id)
{
tid = num[i].id;
num[i].id = num[j].id;
num[j].id = tid;
ctel = num[i].telephone;
num[i].telephone = num[j].telephone;
num[j].telephone = ctel;
strcpy(name6,num[i].name);
strcpy(num[i].name,num[j].name);
strcpy(num[j].name,name6);
}
}
}
}
void delete_data(struct DATE num[],int *length)//删除联系人
{
int i;
int len = *length;
int del=0;//判定通过何种方式删除
char name1[20]={0};
long a;
printf("1.通过电话删除\n");
printf("2.通过姓名删除\n");
scanf("%d",&del);
if(1 == del)
{
int k=0;
int p = 0;
printf("请输入要删除的tel");
scanf("%ld",&a);
for(i=0;i<len;i++)
{
if(num[i].telephone == a)
{
for(k=i;k<len;k++)
{
num[k].telephone = num[k+1].telephone;
strcpy(num[k].name,num[k+1].name);
p=1;
}
}
}
if(0 == p)
{
printf("未找到\n");
}
else
{
len--;
*length = len;
}
}
else if(2 == del)
{
int l=0;
printf("请输入要删除的姓名");
scanf("%s",name1);
int tmp = 0;//判定是否找到
for(i=0;i<len;i++)
{
if(!(strcmp(num[i].name,name1)))
{
for(l=i;l<len;l++)
{
num[l].telephone = num[l+1].telephone;
strcpy(num[l].name,num[l+1].name);
tmp=1;
}
}
}
if(0 == tmp)
{
printf("未找到\n");
}
else
{
len--;
*length = len;
}
}
}
void find_data(struct DATE num[],int *length)//查找联系人
{
int len = *length;
int te=0;//通过何种方式查找
int i;
char nam[20]={0};
long a;//存储键盘输入的要查找的号码
printf("1.通过电话查找\n");
printf("2.通过姓名查找\n");
scanf("%d",&te);
if(1 == te)
{
int h=0;//判断是否找到
printf("请输入要查找的tel");
scanf("%ld",&a);
for(i=0;i<len;i++)
{
if(num[i].telephone == a)
{
printf("Tel:%ld\n",num[i].telephone);
printf("name :%s\n",num[i].name);
h=1;
}
}
if(0 == h)
{
printf("未找到\n");
}
}
else if(2 == te)
{
printf("请输入要查找的姓名");
scanf("%s",nam);
int tmp = 0;//判断是否找到
for(i=0;i<len;i++)
{
if(!(strcmp(num[i].name,nam)))
{
printf("Tel:%ld\n",num[i].telephone);
printf("name :%s\n",num[i].name);
tmp =1;
}
}
if(0 == tmp)
{
printf("未找到\n");
}
}
}
void change_data(struct DATE num[],int *length) //修改联系人
{
int len = *length;
int i;
int change=0;//记录修改什么信息
char name2[20]={0};
printf("请输入要修改的联系人的信息\n");
printf("1.修改联系人电话\n");
printf("2.修改联系人姓名\n");
scanf("%d",&change);
if(1 == change)
{
int gh=0;//判定如何找到要修改的信息
printf("1.输入要修改人的电话查找\n");
printf("2.输入要修改人的姓名查找\n");
scanf("%d",&gh);
if(1 == gh)
{
int gp=0;//看是否找到
long b;
long new=0;//新电话
printf("请输入要查找的tel\n");
scanf("%ld",&b);
for(i=0;i<len;i++)
{
if(num[i].telephone == b)
{
printf("原来 Tel :%ld\n",num[i].telephone);
printf("原来 name :%s\n",num[i].name);
printf("输入新的tel\n");
scanf("%ld",&new);
num[i].telephone = new;
gp=1;
}
}
if(0 == gp)
{
printf("未找到\n");
}
}
if(2 == gh)
{
int gp=0;
long new;//新号码
char name2[20]={0};//记录要查找的姓名
printf("请输入要查找的姓名\n");
scanf("%s",name2);
int tmp = 0;
for(i=0;i<len;i++)
{
if(!(strcmp(num[i].name,name2)))
{
printf("原来 Tel :%ld\n",num[i].telephone);
printf("原来 name :%s\n",num[i].name);
printf("输入新的tel\n");
scanf("%ld",&new);
num[i].telephone = new;
gp=1;
}
}
if(0 == gp)
{
printf("未找到\n");
}
}
}
if(2 == change)
{
int gb=0;
printf("1.输入要修改人的电话查找\n");
printf("2.输入要修改人的姓名查找\n");
scanf("%d",&gb);
if(1 == gb)
{
int gp=0;
long c;
char new1[20]={0};
printf("请输入要查找的tel\n");
scanf("%ld",&c);
for(i=0;i<len;i++)
{
if(num[i].telephone == c)
{
printf("原来 Tel :%ld\n",num[i].telephone);
printf("原来name :%s\n",num[i].name);
printf("输入新的姓名\n");
scanf("%s",new1);
stpcpy(num[i].name,new1);
gp=1;
}
}
if(0 == gp)
{
printf("未找到\n");
}
}
if(2 == gb)
{
int gp=0;
long new;
char name3[20]={0};
printf("请输入要查找的姓名\n");
scanf("%s",name3);
int tmp = 0;
for(i=0;i<len;i++)
{
if(!(strcmp(num[i].name,name2)))
{
printf("原来Tel :%ld\n",num[i].telephone);
printf("原来name:%s\n",num[i].name);
printf("输入新的姓名\n");
scanf("%s",name3);
stpcpy(num[i].name,name3);
gp=1;
}
}
if(0 == gp)
{
printf("未找到\n");
}
}
}
}
void Menu()
{
struct DATE num[50]={0};
int length = 0;
//int *pl=&length;
int com = 0;
int i;
while(1)
{
printf("1.输入联系人信息\n");
printf("2.显示联系人信息\n");
printf("3.删除联系人信息\n");
printf("4.查找联系人信息\n");
printf("5.修改联系人信息\n");
scanf("%d",&com);
switch(com)
{
case 1:
{
add_data(num,&length);
break;
}
case 2:
{
sort_data(num,&length);
show_data(num,&length);
break;
}
case 3:
{
delete_data(num,&length);
break;
}
case 4:
{
find_data(num,&length);
break;
}
case 5:
{
change_data(num,&length);
break;
}
default:
printf("error\n");
break;
}
}
}
int main()
{
Menu();
return 0;
}