一、实验题目
采用结构体数组或链表存储数据,设计一个小型的隐私信息管理系统。
二、实验目的
通过小型管理系统的开发,引导学生熟悉模块化程序设计方法,培养学生综合运用知识解决实际问题的能力。重点训练知识点包括函数、数组、指针、结构体、文件等。
三、总体设计
首先考虑到每个用户需要保存的隐私信息都具有相同的属性,并且具有顺序,因此考虑用顺序表的数据结构,本程序选择使用结构体数组的方法进行存储,以便于对每个用户的隐私信息进行各种必要的操作。
用户进行人机交互的界面采用printf语句进行显示,将本程序具有的所有功能模块依次打印在窗口上,并经过后期的排版使得窗口更加美观。每个功能模块至少使用一个子函数实现,选择功能模块使用switch语句来实现。
本程序的具体功能包括:密码验证、输入信息、修改信息、删除信息、查询信息、输出信息、保存信息、信息加密(采用改变输入信息的每个字符的ASCII码加密)、文件读入和文件写出,用户输入的被保护的隐私信息有帐号位置、帐号描述、帐号名和密码。针对人机交互过程中可能产生的各种问题,本程序进行了一定的改进设计,优化了人机交互的舒适性和容错性。
本程序的模块图如下:
四、详细设计
1、结构体数组成员参数的意义
struct Data {
int Number; /*编号*/
char Account_Location[100]; /*帐号位置*/
char Account_Description[50]; /*账号描述*/
char Account_Name[50]; /*账号名*/
char Password[20]; /*密码*/
} Account[100], temp; /*用户最大数目*/,/*临时结构体*/
2、系统自定义函数说明
int Password_Verification(); /*密码验证*/
int Search_Number(int inumber); /*检索编号*/
void Input_Information(); /*输入信息*/
void Modify_Information(); /*修改信息*/
void Delete_Information(); /*删除信息*/
void Query_Information(); /*查询信息*/
void Output_Information(); /*输出信息*/
void File_Reading(); /*文件读入*/
void File_Writing(); /*文件写出*/
自定义函数之间和主函数的调用关系图示如下:
3、系统功能流程说明
4、程序代码分析
(1)主函数模块及密码验证函数模块分析
主函数模块实现密码验证功能、选择功能、验证信息保存状态功能和退出系统功能,密码验证部分提供三次输入机会,若三次均未正确输入内置登陆密码则程序自动关闭。验证信息保存状态通过检测变量save的真值状态判断,若执行对隐私信息的操作后未保存信息则会弹出提示,告知用户对信息的操作未保存。
int main(void) {
int option;
if (Password_Verification()) /*判断密码是否输入正确*/
return 0;
File_Reading(); /*文件读入*/
system("pause"); /*继续进行*/
system("cls"); /*刷新界面*/
while (1) { /*打印主界面*/
printf("————————————————欢迎使用隐私信息管理系统————————————————\n");
printf("******主菜单******\n");
printf("1——输入信息\n");
printf("2——修改信息\n");
printf("3——删除信息\n");
printf("4——查询信息\n");
printf("5——输出信息\n");
printf("6——保存信息\n");
printf("7——退出系统\n");
printf("请输入选项编号:");
scanf("%d", &option); /*输入选项*/
getchar();
printf("\n");
switch (option) { /*读取选项*/
case 1:
Input_Information(); /*输入信息*/
break;
case 2:
Modify_Information(); /*修改信息*/
break;
case 3:
Delete_Information(); /*删除信息*/
break;
case 4:
Query_Information(); /*查询信息*/
break;
case 5:
Output_Information(); /*输出信息*/
break;
case 6:
File_Writing(); /*文件写出*/
break;
case 7:
if (!save) { /*若信息未保存则弹出警告*/
printf("当前的信息未保存,确定要直接退出系统吗(否定-->N):");
if (getchar() == 'N')
goto x;
}
printf("已成功退出隐私信息管理系统!\n\n");
system("pause"); /*继续进行*/
exit(0);
default:
printf("暂无该选项!\n\n");
}
x:
system("pause"); /*继续进行*/
system("cls"); /*刷新界面*/
}
return 0;
}
int Password_Verification() { /*密码验证*/
int i = 3, flag = 1;
char Password[50];
printf("————————————————欢迎使用隐私信息管理系统————————————————\n");
printf("请输入登录密码(共有3次机会):");
while (i--) {
scanf("%s", Password);
if (strcmp(Password, "2005010106") == 0){/*设置默认登录密码*/
printf("口令正确!\n\n");
flag = 0;
break;
} else {
if (i != 0)
printf("密码错误,请再次输入(还有%d次机会):", i);
}
}
if (flag) {
printf("您是非法用户!");
return 1;
}
else
return 0;
}
效果演示:
(2)输入信息函数模块分析:
该模块将用户隐私信息导入程序中的结构体数组中,在实验要求的基础上增加了判断编号是否重复的代码,可以给后续代码对信息处理尤其是排序的过程带来方便。输入每组信息后可以根据实际需求选择是否需要继续输入信息,并在最后加入了屏幕刷新代码以保证屏幕上不会出现大量冗余信息,输入结束后将自动返回到主菜单。
void Input_Information() { /*输入信息*/
int i, n, flag;
char code[20], location[100], description[50], name[50];
while (1){
printf("请输入编号:");
x:
flag = 0;
scanf("%d", &n);
getchar();
if (num != 0){
for (i = 0;i < num; i++){
if (Account[i].Number == n) { /*判断是否输入重复编号*/
flag++;
break;
}
}
if (flag) { /*判断是否输入重复编号*/
printf("系统中已存在该编号,请再次输入编号:");
goto x;
}
}
Account[num].Number = n;
printf("请输入帐号位置:");
scanf("%s", location);
getchar();
for (i = 0; i < strlen(location); i++)
Account[num].Account_Location[i] = location[i] + 17;
Account[num].Account_Location[i] = '\0';
printf("请输入帐号描述:");
scanf("%s", description);
getchar();
for (i = 0; i < strlen(description); i++)
Account[num].Account_Description[i] = description[i] + 17;
Account[num].Account_Description[i] = '\0';
printf("请输入帐号名:");
scanf("%s", name);
getchar();
for (i = 0; i < strlen(name); i++)
Account[num].Account_Name[i] = name[i] + 17;
Account[num].Account_Name[i] = '\0';
printf("请输入密码:");
scanf("%s", code);
getchar();
for (i = 0; i < strlen(code); i++)
Account[num].Password[i] = code[i] + 17;
Account[num].Password[i] = '\0'; /*对所有信息进行加密储存*/
num++;
save = 0; /*更新为信息未保存状态*/
printf("该信息已录入且密码已完成加密,是否需要继续输入下一条信息(否定-->N):");
if (getchar() == 'N') {
printf("\n");
break;
}
printf("\n");
}
}
效果演示:
(3)修改信息函数模块分析
该模块实现对已存在的用户隐私信息进行选择性修改,首先会判断程序中是否含有编号对应的信息,如果有则打印修改菜单,其中可以对部分信息或全部信息进行修改,修改后的信息自动加密并存入程序内的结构体数组中,并包含屏幕刷新功能。
void Modify_Information() { /*修改信息*/
int i, inumber, tnumber, option, flag = 0;
char code[20], name[50], location[100], description[50];
while (1) {
printf("请输入修改信息的编号:");
scanf("%d", &inumber);
getchar();
tnumber = Search_Number(inumber); /*检索输入编号判断是否有该信息*/
if (tnumber == -1) {
printf("系统中暂无该信息!\n\n");
break;
}
else {
printf("系统中有该信息!\n\n");
x:
printf("******修改菜单******\n"); /*打印修改菜单*/
printf("1——帐号位置\n");
printf("2——账号描述\n");
printf("3——账号名\n");
printf("4——密码\n");
printf("5——全部信息\n");
printf("6——返回主菜单\n");
printf("请输入选项编号:");
scanf("%d", &option);
printf("\n");
switch (option) {
case 1:
printf("请输入新帐号位置:");
scanf("%s", location);
getchar();
for (i = 0; i < strlen(location); i++)
Account[tnumber].Account_Location[i] = location[i] + 17;
Account[tnumber].Account_Location[i] = '\0';
break;
case 2:
printf("请输入新帐号描述:");
scanf("%s", description);
getchar();
for (i = 0; i < strlen(description); i++)
Account[tnumber].Account_Description[i] = description[i] + 17;
Account[tnumber].Account_Description[i] = '\0';
break;
case 3:
printf("请输入新帐号名:");
scanf("%s", name);
getchar();
for (i = 0; i < strlen(name); i++)
Account[tnumber].Account_Name[i] = name[i] + 17;
Account[tnumber].Account_Name[i] = '\0';
break;
case 4:
printf("请输入新密码:");
scanf("%s", code);
getchar();
for (i = 0; i < strlen(code); i++)
Account[tnumber].Password[i] = code[i] + 17;
Account[tnumber].Password[i] = '\0';
break;
case 5:
printf("请输入新编号:");
scanf("%d", &Account[tnumber].Number);
getchar();
printf("请输入新帐号位置:");
scanf("%s", location);
getchar();
for (i = 0; i < strlen(location); i++)
Account[num].Account_Location[i] = location[i] + 17;
Account[num].Account_Location[i] = '\0';
printf("请输入新帐号描述:");
scanf("%s", description);
getchar();
for (i = 0; i < strlen(description); i++)
Account[num].Account_Description[i] = description[i] + 17;
Account[num].Account_Description[i] = '\0';
printf("请输入新帐号名:");
scanf("%s", name);
getchar();
for (i = 0; i < strlen(name); i++)
Account[num].Account_Name[i] = name[i] + 17;
Account[num].Account_Name[i] = '\0';
printf("请输入新密码:");
scanf("%s", code);
getchar();
for (i = 0; i < strlen(code); i++)
Account[num].Password[i] = code[i] + 17;
Account[num].Password[i] = '\0';/*对所有信息进行加密储存*/
break;
case 6:
flag++;
break;
default:
printf("暂无该选项!\n\n");
goto x;
}
if (flag)
break;
save = 0; /*更新为信息未保存状态*/
printf("该信息已修改且密码已完成加密,是否需要继续修改下一条信息(否定-->N):");
if (getchar() == 'N'){
printf("\n");
break;
}
printf("\n");
}
}
}
效果演示:
(4)删除信息函数模块分析
该模块实现对已存在的用户信息进行删除,首先会判断程序中是否含有编号对应的信息,如果有则提示是否确定删除信息,删除后信息将被抹除,并包含屏幕刷新功能。
void Delete_Information() { /*删除信息*/
int i, inumber, tnumber;
while (1) {
printf("请输入删除信息的编号:");
scanf("%d", &inumber);
getchar();
tnumber = Search_Number(inumber); /*判断程序内是否有该编号*/
if (tnumber == -1) {
printf("系统中暂无该信息!\n\n");
break;
} else {
printf("系统中有该信息!\n");
printf("请再次确认是否要删除该信息(否定-->N):");
if (getchar() == 'N') {
printf("\n");
break;
} else {
for (i = tnumber; i < num - 1; i++)
Account[i] = Account[i + 1];
num--; /*采用信息平移的方法填充删除部分*/
}
getchar();
save = 0; /*更新为信息未保存状态*/
printf("该信息已删除,是否需要继续删除下一条信息(否定-->N):");
if (getchar() == 'N') {
printf("\n");
break;
}
printf("\n");
}
}
}
效果演示:
(5)查询信息函数模块分析
该模块实现对用户隐私信息的查询,通过输入查询信息的(部分)账号名和程序内已存在的用户信息账号名进行子串搜索以实现查询,采用临时解密的方式打印相应信息,实际信息依然保持加密状态以确保隐私信息的安全性,并包含屏幕刷新功能。
void Query_Information() { /*查询信息*/
int i, j, count;
char names[50], namess[50], code[20], name[50], location[100], description[50];
while (1) {
printf("请输入查询信息的(部分)账号名:");
scanf("%s", names);
getchar();
for (i = 0; i < strlen(names); i++)
namess[i] = names[i] + 17;
namess[i] = '\0'; /*读入内容加密以便与已加密信息比对*/
count = 0;
for (i = 0; i < num; i++) { /*调用strstr函数判断读入内容是否为查询内容的子串*/
if (strstr(Account[i].Account_Name, namess)) {
count++;
if (count == 1) {
printf("系统中有该信息!\n\n");
printf("————————————————————————————————————————————\n");
printf("%-5s%-30s%-20s%-20s%-10s\n", "编号", "账号位置", "账号描述", "账号名", "密码");
printf("————————————————————————————————————————————\n");
} /*信息临时解密并显示原始信息*/
for (j = 0; j < strlen(Account[i].Account_Location); j++)
location[j] = Account[i].Account_Location[j] - 17;
location[strlen(Account[i].Account_Location)] = '\0';
for (j = 0; j < strlen(Account[i].Account_Description); j++)
description[j] = Account[i].Account_Description[j] - 17;
description[strlen(Account[i].Account_Description)] = '\0';
for (j = 0; j < strlen(Account[i].Account_Name); j++)
name[j] = Account[i].Account_Name[j] - 17;
name[strlen(Account[i].Account_Name)] = '\0';
for (j = 0; j < strlen(Account[i].Password); j++)
code[j] = Account[i].Password[j] - 17;
code[strlen(Account[i].Password)] = '\0';
printf("%-5d%-30s%-20s%-20s%-10s\n", Account[i].Number, location, description, name, code);
printf("————————————————————————————————————————————\n");
}
}
if (count == 0)
printf("系统中暂无该信息!\n\n");
printf("是否需要继续查询下一条信息(否定-->N):");
if (getchar() == 'N') {
printf("\n");
break;
}
printf("\n");
}
}
效果演示:
(6)输出信息函数模块分析
该模块实现对全部用户隐私信息的显示打印,采用临时解密的方式打印全部信息,实际信息依然保持加密状态以确保隐私信息的安全性,并包含屏幕刷新功能。
void Output_Information() { /*输出信息*/
int i, j, index;
char code[20], name[50], location[100], description[50];
for (i = 0; i < num - 1; i++) { /*编码排序*/
temp = Account[i];
index = i;
for (j = i + 1; j < num; j++) {
if (Account[j].Number < temp.Number) {
temp = Account[j];
index = j;
}
}
Account[index] = Account[i];
Account[i] = temp;
}
printf("————————————————————————————————————————————\n");
printf("%-5s%-30s%-20s%-20s%-10s\n", "编号", "账号位置", "账号描述", "账号名", "密码");
printf("————————————————————————————————————————————\n");
for (i = 0; i < num; i++) {
for (j = 0; j < strlen(Account[i].Account_Location); j++)
location[j] = Account[i].Account_Location[j] - 17;
location[strlen(Account[i].Account_Location)] = '\0';
for (j = 0; j < strlen(Account[i].Account_Description); j++)
description[j] = Account[i].Account_Description[j] - 17;
description[strlen(Account[i].Account_Description)] = '\0';
for (j = 0; j < strlen(Account[i].Account_Name); j++)
name[j] = Account[i].Account_Name[j] - 17;
name[strlen(Account[i].Account_Name)] = '\0';
for (j = 0; j < strlen(Account[i].Password); j++)
code[j] = Account[i].Password[j] - 17;
code[strlen(Account[i].Password)] = '\0';
printf("%-5d%-30s%-20s%-20s%-10s\n", Account[i].Number, location, description, name, code);
printf("————————————————————————————————————————————\n");
} /*全部信息临时解密并显示原始信息*/
printf("\n");
}
效果演示:
(7)文件读入和文件写出函数模块分析
两模块分别实现用户隐私信息从文本文档中读入程序和将用户隐私信息存入文本文档,前者可以读取指定文件内的全部用户隐私信息并保存在内存中,读取时注意到格式一致,以及对文件指针操作的处理,该部分采用二进制文件存储的方式,首先输入读取文件的存储路径再进行查找。程序包含判断文件是否存在和信息数读取的功能,若未找到文件则显示无法打开文件,找到文件后显示文件内储存的信息数,并及时关闭文件;后者与前者类似,包含对文件指针操作的处理、打开二进制文件、根据信息数写入程序内结构体数组中的所有用户隐私信息并显示文件内储存的信息数,最后关闭文件,并包含屏幕刷新功能。
void File_Reading() { /*文件读入*/
int i;
FILE* fp;
char infile[20];
printf("请输入信息文件名:");
scanf("%s", infile);
if ((fp = fopen(infile, "rb")) == NULL) { /*打开二进制文件*/
printf("无法打开文件!\n");
exit(0);
}
i = 0;
while (!feof(fp)) { /*循环读数据直到文件尾结束*/
if (fread(&Account[i], sizeof(struct Data), 1, fp) != 1)
break; /*如果没读到数据,跳出循环*/
i++;
}
num = i;
fclose(fp); /*关闭文件*/
printf("文件信息读入成功,当前共有%d条信息!\n", num);
}
void File_Writing() { /*文件写出*/
int i = 0;
FILE* fp;
char outfile[20];
printf("请输入保存文件名:");
scanf("%s", outfile);
if ((fp = fopen(outfile, "wb")) == NULL) {/*打开二进制文件*/
printf("无法打开文件!\n");
exit(1);
}
while (i < num){
fwrite(&Account[i], sizeof(struct Data), 1, fp);/*写入记录*/
i++;
}
fclose(fp); /*关闭文件*/
save = 1;
printf("文件信息保存成功,当前共有%d条信息!\n", num);
}
效果演示:
(8)完整代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
struct Data {
int Number; /*编号*/
char Account_Location[100]; /*帐号位置*/
char Account_Description[50]; /*账号描述*/
char Account_Name[50]; /*账号名*/
char Password[20]; /*密码*/
} Account[100], temp; /*用户最大数目*/ /*临时结构体*/
int num = 0, save = 1;
int Password_Verification(); /*密码验证*/
int Search_Number(int inumber); /*检索编号*/
void Input_Information(); /*输入信息*/
void Modify_Information(); /*修改信息*/
void Delete_Information(); /*删除信息*/
void Query_Information(); /*查询信息*/
void Output_Information(); /*输出信息*/
void File_Reading(); /*文件读入*/
void File_Writing(); /*文件写出*/
int Password_Verification() {
int i = 3, flag = 1;
char Password[50];
printf("————————————————欢迎使用隐私信息管理系统————————————————\n");
printf("请输入登录密码(共有3次机会):");
while (i--) {
scanf("%s", Password);
if (strcmp(Password, "2005010106") == 0) { /*设置默认登录密码*/
printf("口令正确!\n\n");
flag = 0;
break;
} else {
if (i != 0)
printf("密码错误,请再次输入(还有%d次机会):", i);
}
}
if (flag) {
printf("您是非法用户!");
return 1;
}
else
return 0;
}
int Search_Number(int inumber) { /*检索编号*/
int i;
for (i = 0; i < num; i++)
if (Account[i].Number == inumber)
return i;
return -1;
}
void Input_Information() { /*输入信息*/
int i, n, flag;
char code[20], location[100], description[50], name[50];
while (1){
printf("请输入编号:");
x:
flag = 0;
scanf("%d", &n);
getchar();
if (num != 0) {
for (i = 0;i < num; i++) {
if (Account[i].Number == n) {
flag++;
break;
}
}
if (flag) {
printf("系统中已存在该编号,请再次输入编号:");
goto x;
}
}
Account[num].Number = n;
printf("请输入帐号位置:");
scanf("%s", location);
getchar();
for (i = 0; i < strlen(location); i++)
Account[num].Account_Location[i] = location[i] + 17;
Account[num].Account_Location[i] = '\0';
printf("请输入帐号描述:");
scanf("%s", description);
getchar();
for (i = 0; i < strlen(description); i++)
Account[num].Account_Description[i] = description[i] + 17;
Account[num].Account_Description[i] = '\0';
printf("请输入帐号名:");
scanf("%s", name);
getchar();
for (i = 0; i < strlen(name); i++)
Account[num].Account_Name[i] = name[i] + 17;
Account[num].Account_Name[i] = '\0';
printf("请输入密码:");
scanf("%s", code);
getchar();
for (i = 0; i < strlen(code); i++)
Account[num].Password[i] = code[i] + 17;
Account[num].Password[i] = '\0';
num++;
save = 0;
printf("该信息已录入且密码已完成加密,是否需要继续输入下一条信息(否定-->N):");
if (getchar() == 'N') {
printf("\n");
break;
}
printf("\n");
}
}
void Modify_Information() { /*修改信息*/
int i, inumber, tnumber, option, flag = 0;
char code[20], name[50], location[100], description[50];
while (1){
printf("请输入修改信息的编号:");
scanf("%d", &inumber);
getchar();
tnumber = Search_Number(inumber);
if (tnumber == -1) {
printf("系统中暂无该信息!\n\n");
break;
} else {
printf("系统中有该信息!\n\n");
x:
printf("******修改菜单******\n");
printf("1——帐号位置\n");
printf("2——账号描述\n");
printf("3——账号名\n");
printf("4——密码\n");
printf("5——全部信息\n");
printf("6——返回主菜单\n");
printf("请输入选项编号:");
scanf("%d", &option);
printf("\n");
switch (option) {
case 1:
printf("请输入新帐号位置:");
scanf("%s", location);
getchar();
for (i = 0; i < strlen(location); i++)
Account[tnumber].Account_Location[i] = location[i] + 17;
Account[tnumber].Account_Location[i] = '\0';
break;
case 2:
printf("请输入新帐号描述:");
scanf("%s", description);
getchar();
for (i = 0; i < strlen(description); i++)
Account[tnumber].Account_Description[i] = description[i] + 17;
Account[tnumber].Account_Description[i] = '\0';
break;
case 3:
printf("请输入新帐号名:");
scanf("%s", name);
getchar();
for (i = 0; i < strlen(name); i++)
Account[tnumber].Account_Name[i] = name[i] + 17;
Account[tnumber].Account_Name[i] = '\0';
break;
case 4:
printf("请输入新密码:");
scanf("%s", code);
getchar();
for (i = 0; i < strlen(code); i++)
Account[tnumber].Password[i] = code[i] + 17;
Account[tnumber].Password[i] = '\0';
break;
case 5:
printf("请输入新编号:");
scanf("%d", &Account[tnumber].Number);
getchar();
printf("请输入新帐号位置:");
scanf("%s", location);
getchar();
for (i = 0; i < strlen(location); i++)
Account[num].Account_Location[i] = location[i] + 17;
Account[num].Account_Location[i] = '\0';
printf("请输入新帐号描述:");
scanf("%s", description);
getchar();
for (i = 0; i < strlen(description); i++)
Account[num].Account_Description[i] = description[i] + 17;
Account[num].Account_Description[i] = '\0';
printf("请输入新帐号名:");
scanf("%s", name);
getchar();
for (i = 0; i < strlen(name); i++)
Account[num].Account_Name[i] = name[i] + 17;
Account[num].Account_Name[i] = '\0';
printf("请输入新密码:");
scanf("%s", code);
getchar();
for (i = 0; i < strlen(code); i++)
Account[num].Password[i] = code[i] + 17;
Account[num].Password[i] = '\0';
break;
case 6:
flag++;
break;
default:
printf("暂无该选项!\n\n");
goto x;
}
if (flag)
break;
save = 0;
printf("该信息已修改且密码已完成加密,是否需要继续修改下一条信息(否定-->N):");
if (getchar() == 'N') {
printf("\n");
break;
}
printf("\n");
}
}
}
void Delete_Information() { /*删除信息*/
int i, inumber, tnumber;
while (1) {
printf("请输入删除信息的编号:");
scanf("%d", &inumber);
getchar();
tnumber = Search_Number(inumber);
if (tnumber == -1) {
printf("系统中暂无该信息!\n\n");
break;
} else {
printf("系统中有该信息!\n");
printf("请再次确认是否要删除该信息(否定-->N):");
if (getchar() == 'N') {
printf("\n");
break;
} else {
for (i = tnumber; i < num - 1; i++)
Account[i] = Account[i + 1];
num--;
}
getchar();
save = 0;
printf("该信息已删除,是否需要继续删除下一条信息(否定-->N):");
if (getchar() == 'N') {
printf("\n");
break;
}
printf("\n");
}
}
}
void Query_Information() { /*查询信息*/
int i, j, count;
char names[50], namess[50], code[20], name[50], location[100], description[50];
while (1) {
printf("请输入查询信息的(部分)账号名:");
scanf("%s", names);
getchar();
for (i = 0; i < strlen(names); i++)
namess[i] = names[i] + 17;
namess[i] = '\0';
count = 0;
for (i = 0; i < num; i++) {
if (strstr(Account[i].Account_Name, namess)) {
count++;
if (count == 1) {
printf("系统中有该信息!\n\n");
printf("————————————————————————————————————————————\n");
printf("%-5s%-30s%-20s%-20s%-10s\n", "编号", "账号位置", "账号描述", "账号名", "密码");
printf("————————————————————————————————————————————\n");
}
for (j = 0; j < strlen(Account[i].Account_Location); j++)
location[j] = Account[i].Account_Location[j] - 17;
location[strlen(Account[i].Account_Location)] = '\0';
for (j = 0; j < strlen(Account[i].Account_Description); j++)
description[j] = Account[i].Account_Description[j] - 17;
description[strlen(Account[i].Account_Description)] = '\0';
for (j = 0; j < strlen(Account[i].Account_Name); j++)
name[j] = Account[i].Account_Name[j] - 17;
name[strlen(Account[i].Account_Name)] = '\0';
for (j = 0; j < strlen(Account[i].Password); j++)
code[j] = Account[i].Password[j] - 17;
code[strlen(Account[i].Password)] = '\0';
printf("%-5d%-30s%-20s%-20s%-10s\n", Account[i].Number, location, description, name, code);
printf("————————————————————————————————————————————\n");
}
}
if (count == 0)
printf("系统中暂无该信息!\n\n");
printf("是否需要继续查询下一条信息(否定-->N):");
if (getchar() == 'N') {
printf("\n");
break;
}
printf("\n");
}
}
void Output_Information() { /*输出信息*/
int i, j, index;
char code[20], name[50], location[100], description[50];
for (i = 0; i < num - 1; i++) { /*编码排序*/
temp = Account[i];
index = i;
for (j = i + 1; j < num; j++){
if (Account[j].Number < temp.Number){
temp = Account[j];
index = j;
}
}
Account[index] = Account[i];
Account[i] = temp;
}
printf("————————————————————————————————————————————\n");
printf("%-5s%-30s%-20s%-20s%-10s\n", "编号", "账号位置", "账号描述", "账号名", "密码");
printf("————————————————————————————————————————————\n");
for (i = 0; i < num; i++){
for (j = 0; j < strlen(Account[i].Account_Location); j++)
location[j] = Account[i].Account_Location[j] - 17;
location[strlen(Account[i].Account_Location)] = '\0';
for (j = 0; j < strlen(Account[i].Account_Description); j++)
description[j] = Account[i].Account_Description[j] - 17;
description[strlen(Account[i].Account_Description)] = '\0';
for (j = 0; j < strlen(Account[i].Account_Name); j++)
name[j] = Account[i].Account_Name[j] - 17;
name[strlen(Account[i].Account_Name)] = '\0';
for (j = 0; j < strlen(Account[i].Password); j++)
code[j] = Account[i].Password[j] - 17;
code[strlen(Account[i].Password)] = '\0';
printf("%-5d%-30s%-20s%-20s%-10s\n", Account[i].Number, location, description, name, code);
printf("————————————————————————————————————————————\n");
}
printf("\n");
}
void File_Reading() { /*文件读入*/
int i;
FILE* fp;
char infile[20];
printf("请输入信息文件名:");
scanf("%s", infile);
if ((fp = fopen(infile, "rb")) == NULL) { /*打开二进制文件*/
printf("无法打开文件!\n");
exit(0);
}
i = 0;
while (!feof(fp)) { /*循环读数据直到文件尾结束*/
if (fread(&Account[i], sizeof(struct Data), 1, fp) != 1)
break; /*如果没读到数据,跳出循环*/
i++;
}
num = i;
fclose(fp); /*关闭文件*/
printf("文件信息读入成功,当前共有%d条信息!\n", num);
}
void File_Writing() { /*文件写出*/
int i = 0;
FILE* fp;
char outfile[20];
printf("请输入保存文件名:");
scanf("%s", outfile);
if ((fp = fopen(outfile, "wb")) == NULL) { /*打开二进制文件*/
printf("无法打开文件!\n");
exit(1);
}
while (i < num) {
fwrite(&Account[i], sizeof(struct Data), 1, fp); /*写入记录*/
i++;
}
fclose(fp); /*关闭文件*/
save = 1;
printf("文件信息保存成功,当前共有%d条信息!\n", num);
}
int main(void) {
int option;
if (Password_Verification())
return 0;
File_Reading();
system("pause");
system("cls");
while (1) {
printf("————————————————欢迎使用隐私信息管理系统————————————————\n");
printf("******主菜单******\n");
printf("1——输入信息\n");
printf("2——修改信息\n");
printf("3——删除信息\n");
printf("4——查询信息\n");
printf("5——输出信息\n");
printf("6——保存信息\n");
printf("7——退出系统\n");
printf("请输入选项编号:");
scanf("%d", &option);
getchar();
printf("\n");
switch (option) {
case 1:
Input_Information();
break;
case 2:
Modify_Information();
break;
case 3:
Delete_Information();
break;
case 4:
Query_Information();
break;
case 5:
Output_Information();
break;
case 6:
File_Writing();
break;
case 7:
if (!save) {
printf("当前的信息未保存,确定要直接退出系统吗(否定-->N):");
if (getchar() == 'N')
goto x;
}
printf("已成功退出隐私信息管理系统!\n\n");
system("pause");
exit(0);
default:
printf("暂无该选项!\n\n");
}
x:
system("pause"); /*继续进行*/
system("cls"); /*刷新界面*/
}
return 0;
}
五、实验结果与分析
输入信息并执行操作后显示如下:
实验结果表明,程序已基本实现题目要求的全部功能,能够较好的对隐私信息进行各种处理,保存的文本文档内信息也完成加密,达到了隐私信息管理的要求。
六、小结与心得体会
通过本次程序设计,C语言编程能力得到了提高,在指针、数组、函数、结构体和文件等知识点的运用能力得到了一定的提高,同时也巩固了课本内容,尤其是以结构体数组的使用来实现数据管理,初步感受了模块化编程的方法,同时更注重对人机交互过程的优化,提高了程序的实用性。