此代码添加了密码进入功能。源代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<windows.h>
struct person
{
char number[20]; //手机号
char name[20]; //姓名
char remarks[20]; //备注
char email[20]; //邮箱
char address[50]; //地址
};
int menu()
{
int x;
system("cls"); //清屏处理(使得运行时给人感觉进入了下一页)
printf("\t\t\t\t**********************************************************\n");
printf("\t\t\t\t| 欢迎使用通讯录管理系统 |\n");
printf("\t\t\t\t----------.........--------------------.........----------\n");
printf("\t\t\t\t| 1-新添加联系人信息 |\n");
printf("\t\t\t\t----------.........--------------------.........----------\n");
printf("\t\t\t\t| 2-删除联系人信息 |\n");
printf("\t\t\t\t----------.........--------------------.........----------\n");
printf("\t\t\t\t| 3-修改联系人信息 |\n");
printf("\t\t\t\t----------.........--------------------.........----------\n");
printf("\t\t\t\t| 4-按名字查询联系人信息 |\n");
printf("\t\t\t\t----------.........--------------------.........----------\n");
printf("\t\t\t\t| 5-按号码查询联系人信息 |\n");
printf("\t\t\t\t----------.........--------------------.........----------\n");
printf("\t\t\t\t| 6-显示全部联系人的信息 |\n");
printf("\t\t\t\t---------.........--------------------.........----------\n");
printf("\t\t\t\t| 7-保存文件 |\n");
printf("\t\t\t\t----------.........--------------------.........----------\n");
printf("\t\t\t\t| 0-退出程序 |\n");
printf("\t\t\t\t**********************************************************\n"); //直接使得菜单这一页打印出系统功能的界面
printf("\t\t\t\t请选择想要执行的功能:");
scanf("%d",&x);
return x; //输入选择好的功能前面的数字,在主函数中运用switch---case 来达到选择数字几就行使对应的功能
}
void main()
{
system("color df"); // 借助#include<windows.h> 头文件,运用system实现对控制台的界面以及上面数字的颜色进行调控(在此选择的是紫色的背景亮白色的字体 )
SetConsoleTitle("叶芽的通讯录");
int i;
char s1[7]="1234521"; //此密码可根据心情进行更改
char s2[10];
for(i=1;i<=3;i++)
{
printf("请输入进入通讯录的个人密码:");
gets(s2);
if(strcmp(s1,s2)==0) //运用strcmp函数,通过判断输入的字符串是否与源代码中设置好的字符串是否相等以达到验证密码的功能
{
printf("登陆成功,欢迎进入通讯录通讯录管理系统!\n");
break;
}
else
{
printf("密码错误,请重新输入密码:\n");
}
}
if(i==4)
{
printf("登录失败,退出程序!");
exit(0);
} //设置三次登录输入密码的机会,机会用光则退出程序
int x;
int len=0; //记录结构体数组的长度
struct person per[100]; //定义结构体数组
len=read_file(per);
do
{
x=menu(); //使得每次选择功能前都先进入通讯录的功能页面
switch(x)
{
case 1:
len=function1(per,len); //添加 len=n
break;
case 2:
function2(per,len); //删除联系人的功能函数
break;
case 3:
function3(per,len); //修改联系人的功能函数
break;
case 4:
function4(per,len); //按名字查找联系人的功能函数
break;
case 5:
function5(per,len); //按号码查找联系人的功能函数
break;
case 6:
system("cls"); //清屏处理
function6(per,len);
system("pause"); //使得系统页面暂停
break;
case 7:
system("cls"); //清屏
save_file(per,len);
printf("保存信息成功!");
system("pause"); //系统暂停
break;
case 0:
printf("\t感谢本次使用,祝您生活愉快!\n"); // “\t”在这里的作用是空八格,转义字符,水平制表符 。
exit(0);
}
}
while(x!=0);
return ; //无声明
}
int function1(struct person b[],int n) //添加联系人函数
{
system("cls"); //清屏
printf("请输入新添加联系人姓名:");
scanf("%s",b[n].name);
printf("请输入新添加联系人手机号:");
scanf("%s",b[n].number);
printf("请输入新添加联系人备注:");
scanf("%s",b[n].remarks);
printf("请输入新添加联系人邮箱:");
scanf("%s",b[n].email);
printf("请输入新添加联系人地址:");
scanf("%s",b[n].address);
printf("添加联系人成功!\n"); //依次执行添加新建联系人的姓名,手机号,备注,邮箱,地址
system("pause"); //暂停界面
return n+1;
}
int function2(struct person b[],int n) //删除联系人函数
{
int i,j;
char temp[20];
system("cls");
printf("请输入要删除的联系人:");
scanf("%s",temp);
for(i=0;i<n;i++)
{
if(!strcmp(temp,b[i].name))
break;
}
if(i==n) //借助for循环使得当i达到与n的值相等时,证明遍历了文件中所有的联系人信息,未能找到与所想查找的联系人的姓名相同的,即无该联系人。
{
printf("没有该联系人的信息!");
system("pause"); //暂停界面
return n;
}
function6(&b[i],1);
printf("是否删除'Yes'or'No'或者'yes'or'no':");
scanf("%s",&temp);
if(strcmp(temp,"yes")==0||strcmp(temp,"Yes")==0)
{
for(j=i;j<n;j++)
{
b[j]=b[j+1];
}
printf("删除该联系人信息成功!\n");
}
system("pause"); //暂停界面
return n-1;
printf("取消删除\n");
system("pause"); //暂停界面
return n;
}
void function3(struct person b[],int n) //修改联系人信息
{
int i;
char ye[20];
struct person b0; //临时储存
system("cls"); //清屏
printf("请输入要修改的联系人的姓名:");
scanf("%s",ye);
for(i=0;i<n;i++)
{
if(strcmp(ye,b[i].name)==0)
break;
}
if(i==n)
{
printf("无该联系人!");
system("pause");
return ;
} //要想修改联系人的信息需要先找到该联系人
function6(&b[i],1);
printf("请输入修改后联系人的姓名:") ;
scanf("%s",b0.name);
printf("请输入修改后联系人手机号:");
scanf("%s",b0.number);
printf("请输入修改后联系人备注:");
scanf("%s",b0.remarks);
printf("请输入修改后联系人邮箱:");
scanf("%s",b0.email);
printf("请输入修改后联系人地址:");
scanf("%s",b0.address);
printf("是否确认修改'Yes'or'No'或者'yes'or'no'?: ");
scanf("%s",ye);
if(strcmp(ye,"yes")==0||strcmp(ye,"Yes")==0) //利用strcmp函数判断两字符串是否相等
{
strcpy(b0.name,b[i].name);
b[i]=b0;
printf("修改联系人信息成功!\n");
system("pause");
return ;
}
else
{
printf("已取消修改!");
system("pause");
return ;
}
}
void function4(struct person b[],int n) //根据名字查找联系人函数
{
int i;
char ya[20];
system ("cls");
printf("请输入要查询的联系人的姓名:");
scanf("%s",ya);
for(i=0;i<n;i++)
{
if(strcmp(b[i].name,ya)==0)
{
break;
}
}
if(i==n)
{
printf("未查找到该联系人!\n");
system("pause");
return ;
}
function6(&b[i],1);
system("pause");
return;
}
void function5(struct person b[],int n) //根据电话号码查找联系人信息函数
{
int i;
char ye[20];
system("cls");
printf("请输入要查询的联系人的电话号码:");
scanf("%s",ye);
for(i=0;i<n;i++)
{
if(strcmp(b[i].number,ye)==0)
break;
}
if(i==n)
{
printf("未查找到该联系人!\n");
system("pause");
return;
}
function6(&b[i],1);
system("pause");
}
void function6(struct person b[],int n)
{
int i;
printf("%-25s%-25s%-25s%-25s%-25s\n","姓名","手机号","备注","邮箱","地址"); //左对齐打印出每25空格中制成表格的第一行中的信息
for(i=0;i<n;i++)
{
printf("%-25s",b[i].name);
printf("%-25s",b[i].number);
printf("%-25s",b[i].remarks);
printf("%-25s",b[i].email);
printf("%-25s",b[i].address);
printf("\n");
}
}
void save_file(struct person b[],int n) //信息存入文件函数
{
int i;
FILE *hh; //定义文件指针
hh=fopen("叶芽.txt","w+"); //fopen函数是指打开一个文件,调用的一般形式为:文件指针名=fopen(文件名,使用文件的方式)注意:这里的txt只是文件的一种格式,她和本程序的叶芽组成的整体"叶芽.txt" 构成文件名 ----打开文件
if(hh==NULL) //当该指针是空指针
{
return;
}
for(i=0;i<n;i++) //依次将结构体中的信息写入到文件中
{
fprintf(&b[i],sizeof(struct person),1,hh); //写文件
}
fclose(hh); //关闭文件
} //由于在该代码中,将打开读写文件和新建立读写文件设置的是同一个文件,因此,每当退出该程序后,原来存入的联系人的信息还会保留,从而实现保存联系人信息功能 。
int read_file(struct person b[]) //读取文件内容的函数
{
int i=0;
FILE* hh; //每一个被使用的文件都要在内存中开辟一个领域,用来存放包括文件名称,文件状态,文件当前位置的相关信息。这些信息被保存在一个结构变量中,该结构类型被系统定义为FILE,放在"stdio.h"文件中。
hh=fopen("叶芽.txt","r+"); //接着上述对文件名的解释,我们来解释下使用文件的方式:根据C语言课本288页(源于中国铁道出版社有限公司《C语言程序设计(第二版)》)常用的文件的打开方式参数表可知,"r+"打开读/写文件,"w+"建立读/写新文件。
if(hh==NULL)
{
return 0; //当该指针是空指针
}
while(fread(&b[i++],sizeof(struct person),1,hh));
fclose(hh); //关闭文件
if(i>=1)
{
return i-1;
}
return 0;
}
若转载请附上出处,谢谢!