|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
1、隐私信息管理系统
本题要求采用结构体数组(或链表)存储数据。具体要求如下:
1) 程序执行时,首先要进行密码检测,以不让非法用户使用本程序。标准密码预先在程序中设定,程序运行时,若用户的输入密码和标准密码相同,则显示“口令正确!”并转去执行后续程序;若不相等,重新输入,3次都不相等则显示“您是非法用户!”并终止程序的执行。
2) 现在每个人在不同网站都有用户名和密码等信息,还有银行卡号及密码信息,众多的信息经常忘记,最好的方法是将这些信息用文件的形式保存起来。但是很多私密数据(特别是密码)不能明文存储,比较保险的办法是采用密文存储,即先将密码明文加密成密文后,再进行存储。加密方法自行设计,例如输入密码明文为字符1,但存储时却存储的是其密文字符a,这只要通过ASCII值加一个整数值即可实现。
3) 需要保护的数据信息包括编号,帐号位置,帐号描述,帐号名,密码等
4) 系统具体提供以下功能:
Ø 系统以菜单方式工作。开始运行程序时要进行密码验证。
Ø 信息的录入功能、浏览功能。
Ø 信息的查询功能。按帐号名查询,如输入“acm”可查出上表第2条记录。
Ø 信息的删除、修改功能。
Ø 信息存入文件。信息中的密码必须要加密后才能存入文件,建议先输入一串字符作为加密密钥,对信息中的密码加密后再进行存储,即确保存入文件中的信息里面,“密码”是加密后的字符串。
Ø 将文件中的信息导入。与信息存入文件的过程相反,将密码解密后导入。
文件部分希望既可以写入也可以输出
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct user
{
int number;
char position[100];
char description[100];
char name[100];
char word[100];
} use[10000];
int num=0;
int password();
void menue();
void message_insert();
void message_search();
void message_modify();
void message_delete();
void message_search_id();
void message_search_name();
void display_all();
void display_single();
void FILE_read();
void FILE_write();
int password()//密码验证
{
int flag=1;
char original[55];
strcpy(original,"1008611");
char user_word[55];
printf("*******请输入密码***********\n");
int i=3;
for(i=1; i<=3; i++)
{
scanf("%s",user_word);
if(i<3)
{
if(strcmp(user_word,original)==0)
{
printf("*****密码正确·,进入系统******\n");
return 1;
break;
}
else
{
printf("*******密码错误,请重新输入**********\n");
}
}
else if(i==3)
{
printf("********多次输入错误,已退出系统**********\n");
flag=0;
}
}
return flag;
}
void menue()
{
printf("*******请输入您所需功能的序号*********\n");
printf("1.录入账号信息\n");
printf("2.查询账号信息\n");
printf("3.删除账号信息\n");
printf("4.修改账号信息\n");
printf("5.浏览当前保存的账号信息\n");
printf("6.退出系统\n");
}
void message_insert()
{
int i;
char str[20];
printf("***请输入编号****\n");
scanf("%d",&use[num].number);
getchar();
printf("***请输入账号位置***\n");
scanf("%s",use[num].position);
getchar();
printf("****请输入账号的描述****\n");
scanf("%s",use[num].description);
getchar();
printf("*****请输入账号名*****\n");
scanf("%s",use[num].name);
getchar();
printf("****请输入该账号密码*****\n");
scanf("%s",str);
getchar();
for(i=0; i<strlen(str); i++)
use[num].word[i]=str[i]+48;
use[num].word[strlen(str)]='\0';
num++;
}
void message_search_id()
{
int id;
printf("请输入您要查询的编号\n");
scanf("%d",&id);
int flag=0;
int i;
for(i=0; i<num; i++)
{
if(use[i].number==id)
{
display_single(i);
flag=1;
break;
}
}
if(!flag)printf("信息查询失败\n");
}
void message_search_name()
{
int flag=0;
char name_use[100];
printf("***请输入您要查询的账号名***\n");
scanf("%s",name_use);
int i;
for(i=0; i<num; i++)
{
if(strcmp(name_use,use[i].name)==0)
{
display_single(i);
flag=1;
break;
}
}
if(!flag)printf("***该账号名不存在,请重新输入***\n");
}
void message_delete()
{
int id;
int i;
int flag=0;
int k;
char ans_2[20];
printf("****请输入您要修改的编号****\n");
scanf("%d",&id);
for(i=0; i<num; i++)
{
if(use[i].number==id)
{
k=i;
printf("****请确定您要修改的信息****\n");
display_single(i);
flag=1;
break;
}
}
if(!flag)printf("未找到信息\n");
else
{
printf("****是否需要删除,请选择yes/no\n");
scanf("%s",ans_2);
if(strcmp(ans_2,"yes")==0)
{
for(i=k; i<num; i++)
use[i]=use[i+1];
}
}
printf("删除成功\n");
num--;
}
void message_modify()
{
int num_1;
int id;
int i;
int j;
char str_word[100];
printf("****请输入您要修改信息的编号****\n");
scanf("%d",&id);
if(id<1||id>num)
printf("***该信息不存在***\n");
for(j=0; j<num; j++)
{
if(use[j].number==id)
{
num_1=j;
break;
}
}
printf("*****您要修改的信息为*****\n");
display_single(num_1);
printf("请重新输入编号\n");
scanf("%d",&use[num_1].number);
getchar();
printf("请重新输入账号位置\n");
scanf("%s",use[num_1].position);
printf("请重新输入账号描述\n");
scanf("%s",use[num_1].description);
getchar();
printf("请重新输入账号名\n");
scanf("%s",use[num_1].name);
getchar();
printf("请重新输入密码\n");
scanf("%s",str_word);
for(i=0; i<strlen(str_word); i++)
use[num_1].word[i]=str_word[i]+48;
}
void message_search()
{
int s;
printf("本系统提供有两种查询方式\n");
printf("1.编号查询\n");
printf("2.账号名查询\n");
printf("请选择查询方式\n");
scanf("%d",&s);
switch(s)
{
case 1:
message_search_id();
break;
case 2:
message_search_name();
break;
}
}
void display_single(int id)
{
int i;
char str_1[20];
printf("%-5s%-25s%-20s%-18s%-10s\n","编号","账号位置","账号描述","账号名","密码");
printf("========================================================================\n");
for(i=0; i<strlen(use[id].word); i++)
str_1[i]=use[id].word[i]-48;
str_1[strlen(use[id].word)]='\0';
printf("No.%-5d%-25s%-20s%-18s%-10s\n",use[id].number,use[id].position,use[id].description,use[id].name,str_1);
}
void display_all()
{
int i,j;
while(1)
{
printf("%-5s%-25s%-20s%-18s%-10s\n","编号","账号位置","账号描述","账号名","密码");
printf("-------------------------------------------------------------------------\n");
for(i=0; i<num; i++)
{
char str[20];
for(j=0; j<strlen(use[i].word); j++)
{
str[j]=use[i].word[j]-48;
}
str[strlen(use[i].word)]='\0';
printf("%-5d%-25s%-20s%-18s%-10s\n",use[i].number,use[i].position,
use[i].description,use[i].name,str);
}
break;
}
}
void FILE_write()
{
FILE *fp;
int i;
if((fp = fopen("exper.txt","wb"))==NULL)
{
return;
}
if(fwrite(&num, sizeof(int),1,fp) != 1)
printf("无法写入文件\n");
else
{
for(i = 0; i < num; i++)
{
if( fwrite(&use[i], sizeof(struct user),1,fp)!=1)
printf("无法写入文件\n");
}
}
fclose(fp);
}
void FILE_read()
{
FILE *fp;
int i;
if((fp = fopen("exper.txt","rb"))==NULL)
{
return;
}
if(fread(&num,sizeof(int),1,fp)!=1)
num = 1;
else
{
for(i = 0; i < num; i++)
fread(&use[i],sizeof(struct user),1,fp);
}
num = 0;
fclose(fp);
}
int main()
{
if(!password())
return 0;
int n;
FILE_read();
while(1)
{
menue();
scanf("%d",&n);
getchar();
switch(n)
{
case 1:
message_insert();
break;
case 2:
message_search();
break;
case 3:
message_delete();
break;
case 4:
message_modify();
break;
case 5:
display_all();
break;
case 6:
return 0;
}
FILE_write();
}
}
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define USER_MAX 10000 // 程序能保存的最大用户数
struct user
{
char number[10]; // 编号用字符串更合理
int position; // 信息在数组中的位置 10000 int型足够了
char description[50];
char name[20];
char word[20];
} use[USER_MAX]={0}; // 全初始化为0
int num=0;
// 加密
void encode(char str[])
{
int i;
for(i=0; i<strlen(str); i++)
str[i]=str[i]+48;
}
// 解密
void decode(char str[])
{
int i;
for(i=0; i<strlen(str); i++)
str[i]=str[i]-48;
}
int password()//密码验证
{
int flag=1;
char original[55];
strcpy(original,"1008611");
char user_word[55]="1008611";
printf("*******请输入密码***********\n");
int i=3;
for(i=1; i<=3; i++)
{
// scanf("%s",user_word);
if(i<3)
{
if(strcmp(user_word,original)==0)
{
printf("*****密码正确·,进入系统******\n");
return 1;
break;
}
else
{
printf("*******密码错误,请重新输入**********\n");
}
}
else if(i==3)
{
printf("********多次输入错误,已退出系统**********\n");
flag=0;
}
}
return flag;
}
void menue()
{
printf("*******请输入您所需功能的序号*********\n");
printf("1.录入账号信息\n");
printf("2.查询账号信息\n");
printf("3.删除账号信息\n");
printf("4.修改账号信息\n");
printf("5.浏览当前保存的账号信息\n");
printf("6.退出系统\n");
}
void message_insert()
{
int i;
char str[20]={'\0'};
if(num==USER_MAX-1)
{
printf("信息已满!");
return;
}
printf("***请输入编号****\n");
scanf("%s",&use[num].number);
getchar();
printf("****请输入账号的描述****\n");
scanf("%s",use[num].description);
getchar();
printf("*****请输入账号名*****\n");
scanf("%s",use[num].name);
getchar();
printf("****请输入该账号密码*****\n");
scanf("%s",str);
encode(str); // 加密
strcpy(use[num].word, str);
use[num].position = num+1;
num++;
}
// 按编号查询出用户所在位置
int user_position(char number[])
{
int i;
for(i=0; i<num; i++)
{
if(strcmp(use[i].number, number)==0)
{
return i;
break;
}
}
return -1;
}
void message_search_number()
{
char number[10]={'\0'};
int i;
printf("请输入您要查询的编号\n");
scanf("%s", &number);
i = user_position(number);
if (i==-1)
{
printf("未查询到编号为 %s 的信息。\n", number);
return;
}
display_single(i);
}
void message_search_name()
{
int flag=0;
char name[20];
printf("***请输入您要查询的账号名***\n");
scanf("%s",name);
int i;
for(i=0; i<num; i++)
{
if(strcmp(name,use[i].name)==0)
{
display_single(i);
flag=1;
}
}
if(!flag)printf("未查询到帐号名为 %s 的信息。\n", name);
}
void message_delete()
{
char number[20]={'\0'};
int i, k;
char ans_2[20];
if(num==0)
{
printf("当前已无数据。");
return;
}
printf("****请输入您要删除的编号****\n");
scanf("%s", &number);
k = user_position(number);
if(k==-1)
{
printf("未找到信息\n");
return;
}
printf("****请确定您要删除的信息****\n");
display_single(k);
printf("****是否需要删除,请选择yes/no\n");
scanf("%s",ans_2);
if(strcmp(ans_2,"yes")==0)
{
// 最后一位,直接清0
if(k==num-1)
{
memset(&use[k], 0, sizeof(struct user));
}
else // 首位和中间处理方式一样
{
int j; // 临时保存删除位置
if(k==0)
{
j = 0;
}
else // 中间
{
j=k;
}
for(i=j; i<num; i++)
{
use[i]=use[i+1];
use[i].position=i+1;
}
memset(&use[i+1], 0, sizeof(struct user));
}
printf("删除成功\n");
num--;
}
}
void message_modify()
{
char number[10]={'\0'};
int k;
char str[20];
if(num==0)
{
printf("当前已无数据。");
return;
}
printf("****请输入您要修改信息的编号****\n");
scanf("%s", &number);
k = user_position(number);
if(k==-1)
{
printf("未找到信息\n");
return;
}
printf("*****您要修改的信息为*****\n");
display_single(k);
printf("新编号:");
scanf("%s",&use[k].number);
getchar();
printf("新账号描述:");
scanf("%s",use[k].description);
getchar();
printf("新账号名:");
scanf("%s",use[k].name);
getchar();
printf("新密码:");
scanf("%s",str);
encode(str);
strcpy(use[k].word, str);
}
void message_search()
{
int s;
printf("本系统提供有两种查询方式\n");
printf("1.编号查询\n");
printf("2.账号名查询\n");
printf("请选择查询方式\n");
scanf("%d",&s);
switch(s)
{
case 1:
message_search_number();
break;
case 2:
message_search_name();
break;
}
}
void display_single(int i)
{
char str[20];
strcpy(str, use[i].word);
decode(str);
printf("%-5s%-25s%-20s%-18s%-10s\n","编号","账号位置","账号描述","账号名","密码");
printf("========================================================================\n");
printf("No.%-5s%-25d%-20s%-18s%-10s\n", use[i].number, use[i].position, use[i].description, use[i].name, str);
}
void display_all()
{
int i,j;
printf("%-5s%-25s%-20s%-18s%-10s\n","编号","账号位置","账号描述","账号名","密码");
printf("-------------------------------------------------------------------------\n");
for(i=0; i<num; i++)
{
char str[20]={'\0'};
strcpy(str, use[i].word);
decode(str);
printf("%-5s%-25d%-20s%-18s%-10s\n",use[i].number, use[i].position, use[i].description, use[i].name, str);
}
}
void FILE_write()
{
FILE *fp;
int i;
if((fp = fopen("exper.txt","wb"))==NULL)
{
return;
}
if(num==0)
{
return;
}
for(i=0; i<num; i++)
{
if( fwrite(&use[i], sizeof(struct user),1,fp)!=1)
printf("无法写入文件\n");
}
fclose(fp);
}
void FILE_read()
{
FILE *fp;
if((fp = fopen("exper.txt","rb"))==NULL)
{
return;
}
num = 0; // 记录用户数量
while(1)
{
if(fread(&use[num],sizeof(struct user),1,fp)!=1) // 读取失败退出
break;
num++;
}
fclose(fp);
}
int main()
{
if(!password())
return 0;
int n;
FILE_read();
while(1)
{
menue();
scanf("%d",&n);
getchar();
switch(n)
{
case 1:
message_insert();
break;
case 2:
message_search();
break;
case 3:
message_delete();
break;
case 4:
message_modify();
break;
case 5:
display_all();
break;
case 6:
break;
}
if(n==6) break;
}
// 退出保存
FILE_write();
return 0;
}
|
|