不要抄,抄对你没有好处!
不要抄,抄对你没有好处!
不要抄,抄对你没有好处!
隐私信息管理系统
本题要求采用结构体数组(或链表)存储数据。具体要求如下:
1) 程序执行时,首先要进行密码检测,以不让非法用户使用本程序。标准密码预先在程序中设定,程序运行时,若用户的输入密码和标准密码相同,则显示“口令正确!”并转去执行后续程序;若不相等,重新输入,3次都不相等则显示“您是非法用户!”并终止程序的执行。
2) 现在每个人在不同网站都有用户名和密码等信息,还有银行卡号及密码信息,众多的信息经常忘记,最好的方法是将这些信息用文件的形式保存起来。但是很多私密数据(特别是密码)不能明文存储,比较保险的办法是采用密文存储,即先将密码明文加密成密文后,再进行存储。加密方法自行设计,例如输入密码明文为字符1,但存储时却存储的是其密文字符a,这只要通过ASCII值加一个整数值即可实现。
3) 需要保护的数据信息包括编号,帐号位置,帐号描述,帐号名,密码等,如:
|
帐号位置 |
帐号描述 |
帐号名 |
密码 |
|
https://next.xuetangx.com |
学堂在线 |
xiangdesheng |
123456 |
|
http://acm.hdu.edu.cn |
杭电OJ |
acm002 |
654321 |
|
https://www.icourse163.org |
中国大学MOOC |
123456 |
此表仅为示例,设计时请根据自己的设计确定由哪些信息组成结构体。
4) 系统具体提供以下功能:
Ø 系统以菜单方式工作。开始运行程序时要进行密码验证。
Ø 信息的录入功能、浏览功能。
Ø 信息的查询功能。按帐号名查询,如输入“acm”可查出上表第2条记录。
Ø 信息的删除、修改功能。
Ø 信息存入文件。信息中的密码必须要加密后才能存入文件,建议先输入一串字符作为加密密钥,对信息中的密码加密后再进行存储,即确保存入文件中的信息里面,“密码”是加密后的字符串。
Ø 将文件中的信息导入。与信息存入文件的过程相反,将密码解密后导入。
5) 训练的主要知识点:数组、指针、结构体、文件。
上面的功能需求为编者提供的建议性方案,同学们可进行完善性修改。
本程序数据使用链表存储;
#include
#include
#include
//启动状态
static int keyopen=0;
//默认管理员密码
static char savekey[9]="1234";
//密码加密字符串,如果更改,以前的数据将会无法读取
static char savefilekey[20]="hjfzjskhghhbgjza";
static char tempfilekey[100];
static char killfilekey[100];
//结构体,链表
static struct ListNode *head=NULL,*temp=NULL;
struct ListNode
{
int num;
char https[100];
char adds[100];
char name[100];
char key_hide[100];
struct ListNode *next;
} map,*sky;
//函数初定义
int opensystem();
struct ListNode *readlist();
struct ListNode *changelist();
struct ListNode *scanlist();
struct ListNode *oldlist();
struct ListNode *filelist();
struct ListNode *openfilelist();
struct ListNode *deletelist();
struct ListNode *listtwo(struct ListNode *p1,struct ListNode *p2);
void printlist( struct ListNode *L );
void changekey();
int hash(char n[]);
int openhash();
int safeexit();
void beikeyopen();
//主函数
int main()
{
int a,b=1,c;
char mainopen;
printf("这是隐私信息管理系统\n\n");
opensystem();
if(!keyopen)return 0;
oldlist();
do
{
mainopen='0';
printf("\n ***********主菜单*********\n");
printf(" 1.信息录入\n");
printf(" 2.信息查询\n");
printf(" 3.信息删除\n");
printf(" 4.信息修改\n");
printf(" 5.信息浏览\n");
printf(" 6.读取文件\n");
printf(" 7.存入文件\n");
printf(" 8.更改密码\n");
printf(" *********************\n\n");
printf("请输入序号(如“1”):\n");
scanf("%d",&a);
switch(a)
{
case 1:
{
if(head==NULL)
head=readlist();
else
{
temp=readlist();
head=listtwo(head,temp);
}
filelist();
break;
}
case 5:
{
printlist(head);
break;
}
case 6:
{
openfilelist();
break;
}
case 7:
{
filelist();
break;
}
case 2:
{
scanlist();
break;
}
case 4:
{
printlist(head);
changelist();
break;
}
case 3:
{
deletelist();
break;
}
case 8:
{
changekey();
opensystem();
if(!keyopen)return 0;
break;
}
default:
{
printf("\n****输入错误****\n");
printf("\n是否重新进入主菜单(Y/N)\n");
scanf("%s",&mainopen);
}
}
printf("\n是否重新进入主菜单(Y/N)\n");
scanf("%s",&mainopen);
}
while(mainopen=='Y'||mainopen=='y');
safeexit();
return 0;
}
//启动状态
int opensystem()
{
char in[100];
int a;
FILE *fp3;
if(fopen("key.txt","r")==NULL)
{
fp3=fopen("key.txt","w");
hash(savekey);
fprintf(fp3,"%s",tempfilekey);
fclose(fp3);
}
fp3=fopen("key.txt","r");
fscanf(fp3,"%s",tempfilekey);
openhash();
fclose(fp3);
printf("\n开始进行密码检测\n");
printf("请输入管理员密码:\n");
for(a=0; a<3; a++)
{
scanf("%s",in);
if(!strcmp(in,killfilekey))
{
printf("\n****密码正确****\n\n");
keyopen=1;
return 0;
}
if(2-a>0)
printf("\n密码错误,你还有%d次机会,请重新输入密码:\n",2-a);
}
printf("\n密码错误,非法使用本程序\n");
return 0;
}
int safeexit()
{
printf("是否安全退出(Y/N)\n");
getchar();
if(getchar()=='n'||getchar()=='N')
return 0;
printf("\n*******安全退出需存入文件*******\n");
filelist();
printf("\n\n*******安全退出成功*******\n");
keyopen=0;
}
//创建群体
struct ListNode *readlist()
{
int number=0;
struct ListNode *p,*bei=NULL,*tail;
tail=bei;
//printf("\n输入编号,位置,描述,用户名,密码\n");
printf("\n编号 位置 描述 用户名 密码\n");
printf("-------------------------------------------------------------------------\n");
printf(" 1 https://next.xuetangx.com 学堂在线 xiangdesheng 123456\n\n");
printf("编号输入0以结束\n\n");
do
{
p=(struct ListNode*)malloc(sizeof(struct ListNode));
printf("\n*=================*\n");
printf("请输入编号:\n");
scanf("%d",&p->num);
number=p->num;
if(number<=0)
{
printf("\n****输入结束****\n\n");
return bei;
}
printf("请输入位置:\n");
scanf("%s",p->https);
printf("请输入描述:\n");
scanf("%s",p->adds);
printf("请输入用户名:\n");
scanf("%s",p->name);
printf("请输入用户名密码:\n");
scanf("%s",p->key_hide);
p->next=NULL;
if(tail)
{
tail->next=p;
}
else bei=p;
tail=p;
}
while(number>0);
return bei;
}
//输出内容
void printlist( struct ListNode *L )
{
struct ListNode *p = L;
printf("\n\n");
printf(" **********所有成员信息**********");
printf("\n编号 位置 描述 用户名 密码\n");
printf("-------------------------------------------------------------------------\n");
while (p)
{
printf("%d %s %s %s %s \n", p->num,p->https,p->adds,p->name,p->key_hide);
p = p->next;
}
printf("\n");
}
//合并链表
struct ListNode *listtwo(struct ListNode *p1,struct ListNode *p2)
{
struct ListNode *a,*b;
a=p1;
b=p2;
if(a==NULL)
{
head=p2;
return p2;
}
while (1)
{
if(a->next==NULL)
{
a->next=b;
break;
}
a= a->next;
}
return p1;
}
//更改密码
void changekey()
{
keyopen=0;
FILE *fp2;
printf("\n请输入旧的管理员密码");
opensystem();
if(keyopen)
{
printf("\n请更改新的管理员密码:\n");
scanf("%s",savekey);
fp2=fopen("key.txt","w");
hash(savekey);
fprintf(fp2,"%s",tempfilekey);
fclose(fp2);
printf("\n****更改完成****\n");
}
keyopen=0;
}
//查询指定项
struct ListNode *scanlist()
{
struct ListNode *a;
char scanone[99];
int n=0;
printf("\n请输入查询的账号:\n");
scanf("%s",&scanone);
a=head;
printf("\n编号 位置 描述 用户名 密码\n");
printf("-------------------------------------------------------------------------\n");
while (a)
{
if(strstr(a->name,scanone))
printf("%d %s %s %s %s \n", a->num,a->https,a->adds,a->name,a->key_hide);
a=a->next;
}
printf("\n****查询完成****\n\n");
}
//删除功能
struct ListNode *deletelist()
{
int n=0;
struct ListNode *a,*b=NULL,*c=NULL;
a=head;
char delopen;
do
{
delopen='0';
printf("\n请输入需要删除的成员编号:\n");
scanf("%d",&n);
printf("\n删除的成员有:\n");
printf("\n编号 位置 描述 用户名 密码\n");
printf("-------------------------------------------------------------------------\n");
while (a)
{
if(a->num==n)
{
printf("%d %s %s %s %s \n", a->num,a->https,a->adds,a->name,a->key_hide);
if(a==head)
{
if(a->next!=NULL)
head=a->next;
else head=NULL;
}
else
{
b->next=a->next;
}
}
b=a;
a=a->next;
}
printf("\n****删除完成****\n");
printf("\n是否再次删除成员(Y/N)\n");
scanf("%s",&delopen);
}
while(delopen=='Y'||delopen=='y');
}
//修改功能
struct ListNode *changelist()
{
int n=0;
char chaopen;
struct ListNode *a;
a=head;
do
{
chaopen='0';
printf("\n请输入需要修改的成员编号:\n");
scanf("%d",&n);
printf("\n请输入新的成员内容:\n");
while (a)
{
if(a->num==n)
{
printf("\n编号 位置 描述 用户名 密码\n");
printf("-------------------------------------------------------------------------\n");
scanf("%d%s%s%s%s", &a->num,a->https,a->adds,a->name,a->key_hide);
}
a=a->next;
}
printf("\n****修改结束****\n");
printf("\n是否再次修改成员(Y/N)\n");
scanf("%s",&chaopen);
}
while(chaopen=='Y'||chaopen=='y');
}
struct ListNode *filelist()
{
FILE *fp1;
struct ListNode *p =head;
printf("\n是否存入文件(Y/N)\n");
getchar();
if(getchar()=='n'||getchar()=='N')
return 0;
fp1=fopen("data.txt","w+");
while (p)
{
hash(p->key_hide);
fprintf(fp1,"%d %s %s %s %s\n",p->num,p->https,p->adds,p->name,tempfilekey);
p = p->next;
}
fclose(fp1);
printf("\n已存入Data.txt\n");
printf("\n****存入完成****\n");
}
//读取文件
struct ListNode *openfilelist()
{
FILE *fp;
char a;
int number=0,i;
struct ListNode *p,*bei=NULL,*tail=NULL;
fp=fopen("data.txt","r");
if(fopen("data.txt","r")==NULL)
{
printf("\n*****读取失败,文件不存在!*****\n");
printf("\n你可以先创建信息,再存入文件\n");
return bei;
}
p=(struct ListNode*)malloc(sizeof(struct ListNode));
p->next=NULL;
while(fscanf(fp,"%d %s %s %s %s\n",&p->num,p->https,p->adds,p->name,tempfilekey)!=EOF)
{
openhash();
for(i=0;killfilekey[i]!='\0';i++)
{
p->key_hide[i]=killfilekey[i];
}
p->key_hide[i]='\0';
bei=listtwo(bei,p);
p=(struct ListNode*)malloc(sizeof(struct ListNode));
p->next=NULL;
}
head=bei;
fclose(fp);
printf("\n已读取到系统\n");
// printlist(head);
printf("\n****读取结束****\n\n");
}
struct ListNode *oldlist()
{
FILE *fp;
fp=fopen("data.txt","r");
if(fopen("data.txt","r")!=NULL)
{
printf("\n*****存在旧文件!*****\n");
printf("\n是否存入系统(Y/N)\n");
getchar();
if(getchar()=='n'||getchar()=='N');
else
openfilelist();
}
}
int hash(char n[])
{
int i;
for(i=0;n[i]!='\0';i++)
{
tempfilekey[i]=n[i]+savefilekey[i];
}
tempfilekey[i]='\0';
}
int openhash()
{
int i;
for(i=0;tempfilekey[i]!='\0';i++)
{
killfilekey[i]=tempfilekey[i]-savefilekey[i];
}
killfilekey[i]='\0';
}
主页面
功能
谢谢观看。