逆向软件设计-会员管理系统
(1)来源:csdn一位博主的会员管理系统 https://blog.csdn.net/weixin_55245206/article/details/121226040?ops_request_misc=%257B%2522request%255Fid%2522%253A%25227a6b814b19e91d3c30f084dd38599ba1%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=7a6b814b19e91d3c30f084dd38599ba1&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-121226040-null-null.142v101pc_search_result_base7&utm_term=c%E8%AF%AD%E8%A8%80%E4%BC%9A%E5%91%98%E7%AE%A1%E7%90%86%E7%B3%BB%E7%BB%9F&spm=1018.2226.3001.4187
(2)运行环境和运行结果的截图(伸缩代码附上)
运行环境:dev
点击查看代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct VIP //定义结构体,存储会员账号、姓名、身份证号、联系方式、状态、余额
{
long no;
char name[20]; //姓名、身份证号含有字符,使用char定义
char IDcard[19];
char phone[12]; //联系电话有11位,超出了int的范围,使用字符串定义
int zhuangtai; //如果状态为1,则正常,若为0,则状态为挂失
int yue;
};
struct VIP s[50]; //定义结构体数组
int n=0; //n表示存入的会员数量
void init(); //含义见main主函数
void print();
struct VIP gete();
void add1();
void findbyno();
void findbyname();
void findbyIDcard();
void findbyphone();
void mod();
void del();
void sort();
void transaction();
void init() //初始化(唯一的6位会员账号)
{
int f=1; //1唯一 0不唯一
printf("请输入会员的账号,姓名,身份证号码,联系电话,余额,状态\n");
printf("当输入会员号为0时停止输入\n");
while(n<=50)
{
printf("请输入会员的账号:\n");
scanf("%ld",&s[n].no);
while(s[n].no!=0)
{
if(s[n].no/1000000==0 && s[n].no/100000!=0)
{
int i;
for(i=0;i<n&&f==1;i++)
{
if(s[n].no==s[i].no)
{
f=0;
printf("请输入唯一的6位会员账号\n");
}
}
if(f==1)
break;
}
else
{
printf("请输入6位会员账号\n");
printf("请重新输入会员的账号:\n");
scanf("%d",&s[n].no);
}
}
if(s[n].no==0)
break; //如果输入的账号为0,结束输入
printf("请输入会员的姓名:\n");
scanf("%s",s[n].name);
printf("请输入会员的身份证号,联系电话,余额,状态:\n");
scanf("%s%s%d%d",s[n].IDcard,s[n].phone,&s[n].yue,&s[n].zhuangtai);
n++;
}
}
void print() //输出
{
//|和=组合起来,使输出结果时有表格样式
//%t、空格使输出时数据对其
int j;
printf("会员信息记录如下:\n");
printf(" |===================================================================================|\n");
printf(" |账号\t姓名\t 身份证号 \t 联系电话 \t余额\t 状态 |\n");
printf(" |-----------------------------------------------------------------------------------|\n");
for(j=0;j<n;j++)
{
printf(" |%ld\t%s\t %s\t%s\t%d\t",s[j].no,s[j].name,s[j].IDcard,s[j].phone,s[j].yue);
if(s[j].zhuangtai==1)
printf(" 正常 |\n");
else
printf(" 挂失 |\n");
if(j<(n-1))
printf(" |-----------------------------------------------------------------------------------|\n");
}
printf(" |===================================================================================|\n");
}
struct VIP gete() //输入
{
struct VIP e;
printf("请输入账号:\n");
scanf("%d",&e.no);
int f=1;
while(e.no)
{
if(e.no/1000000==0 && e.no/100000!=0)
{
int i;
for(i=0;i<n&&f==1;i++)
{
if(e.no==s[i].no)
{
f=0;
printf("请输入唯一的6位会员账号\n");
scanf("%d",&e.no);
}
}
if(f==1)
break;
}
else
{
printf("请输入6位会员账号\n");
printf("请重新输入会员的账号:\n");
scanf("%d",&e.no);
}
}
printf("请输入姓名:\n");
scanf("%s",&e.name);
printf("请输入会员的身份证号,联系电话,余额,状态:\n");
scanf("%s%s%d%d",&e.IDcard,&e.phone,&e.yue,&e.zhuangtai);
return e;
}
void add1() //添加新的会员信息
{
struct VIP e = gete();
int i;
printf("请输入要插入的位置(1-%d):\n",n);
scanf("%d",&i);
while(i<1||i>n+1)
{
printf("您输入的位置有误!\n");
printf("请重新输入要插入的位置(1-%d):\n",n);
scanf("%d",&i);
}
for(int j=n-1;j>=i-1;j--)
{
s[j+1]=s[j];
}
s[i-1]=e;
n++;
}
void findbyno() //根据会员账号查找会员信息
{
int num,i;
int found=1;
char choice;
while(1)
{
printf("请输入要查找的会员的账号:\n");
scanf("%d",&num);
getchar();
for(i=0;i<n&&found==1;i++)
{
if(s[i].no==num)
{
found=0;
printf("%ld\t%s\t%d\t%d\t%d\t",s[i].no,s[i].name,s[i].IDcard,s[i].phone,s[i].yue);
if(s[i].zhuangtai==1)
printf("正常\n");
else
printf("挂失!\n");
}
}
if(found==1)
{
printf("未找到!\n");
}
found=1;
printf("是否继续查询(Y/N)\n");
choice=getchar();
if(choice=='N'|| choice=='n')
break;
}
}
void findbyname() //根据会员姓名查找会员信息
{
char name[20];
char choice;
int found=1;
int i;
while(1)
{
printf("输入要查询会员的姓名:\n");
scanf("%s",name);
getchar();
for(i=0;i<n&&found==1;i++)
{
if(strcmp(s[i].name,name)==0)
{
found=0;
printf("%ld\t%s\t%d\t%d\t%d\t",s[i].no,s[i].name,s[i].IDcard,s[i].phone,s[i].yue);
if(s[i].zhuangtai==1)
printf("正常\n");
else
printf("挂失!\n");
}
}
if(found==1)
{
printf("未找到!\n");
}
found=1;
printf("是否继续查询(Y/N)\n");
choice=getchar();
if(choice=='N'|| choice=='n')
break;
}
}
void findbyIDcard() //根据身份证号查找会员信息
{
char num[19];
int i;
int found=1;
char choice;
while(1)
{
printf("请输入要查找的会员的身份证号:\n");
scanf("%s",num);
getchar();
for(i=0;i<n&&found==1;i++)
{
if(strcmp(s[i].IDcard,num)==0)
{
found=0;
printf("%ld\t%s\t%d\t%d\t%d\t",s[i].no,s[i].name,s[i].IDcard,s[i].phone,s[i].yue);
if(s[i].zhuangtai==1)
printf("正常\n");
else
printf("挂失!\n");
}
}
if(found==1)
{
printf("未找到!\n");
}
found=1;
printf("是否继续查询(Y/N)\n");
choice=getchar();
if(choice=='N'|| choice=='n')
break;
}
}
void findbyphone() //根据联系电话查找会员信息
{
char num[12];
int i;
int found=1;
char choice;
while(1)
{
printf("请输入要查找的会员的联系电话:\n");
scanf("%s",num);
getchar();
for(i=0;i<n&&found==1;i++)
{
if(strcmp(s[i].phone,num)==0)
{
found=0;
printf("%ld\t%s\t%d\t%d\t%d\t",s[i].no,s[i].name,s[i].IDcard,s[i].phone,s[i].yue);
if(s[i].zhuangtai==1)
printf("正常\n");
else
printf("挂失!\n");
}
}
if(found==1)
{
printf("未找到!\n");
}
found=1;
printf("是否继续查询(Y/N)\n");
choice=getchar();
if(choice=='N'|| choice=='n')
break;
}
}
void mod() //修改已有的会员信息
{
int num,i;
int found=1;
char choice;
int opt;
while(1)
{
printf("请输入要修改的会员的账号(会员号无法修改):\n");
scanf("%d",&num);
getchar();
for (i=0;i<n&&found==1;i++)
{
if(s[i].no==num)
{
found=0;
printf("%ld\t%s\t%d\t%d\t%d\t",s[i].no,s[i].name,s[i].IDcard,s[i].phone,s[i].yue);
if(s[i].zhuangtai==1)
printf("正常\n");
else
printf("挂失\n");
printf("--请选择--1.修改身份证号 2.修改联系电话 3.修改状态\n");
scanf("%d",&opt);
getchar();
switch(opt)
{
case 1:
printf("请输入身份证号新值:\n");
scanf("%s",s[i].IDcard);
getchar();
break;
case 2:
printf("请输入联系电话新值:\n");
scanf("%s",s[i].phone);
getchar();
break;
case 3:
printf("请输入状态新值:\n");
scanf("%d",&s[i].zhuangtai);
getchar();
break;
}
}
}
if(found==1)
{
printf("未找到!\n");
}
found=1;
printf("是否继续修改(Y or N)\n");
choice=getchar();
getchar();
if(choice=='N'|| choice=='n')
break;
}
}
void del() //删除已有会员信息
{
int num,i,j;
int found=1;
char choice;
while(1)
{
printf("请输入要删除的会员的账号:\n");
scanf("%d",&num);
getchar();
for(i=0;i<n&&found==1;i++) //5 1-5
{
if(s[i].no==num)
{
found=0;
printf("你要删除的会员信息为:\n");
printf("会员账号 姓名 身份证号 联系电话 余额 状态\n");
printf("%ld\t%s\t%d\t%d\t%d\t",s[i].no,s[i].name,s[i].IDcard,s[i].phone,s[i].yue);
if(s[i].zhuangtai==1)
printf("正常\n");
else
printf("挂失!\n");
for(j=i;j<n-1;j++)
{
s[j]=s[j+1];
}
n--;
}
}
if(found==1)
{
printf("未找到!\n");
}
found=1;
printf("是否继续(Y/N)\n");
choice=getchar();
getchar();
if(choice=='N'|| choice=='n')
break;
}
}
void transaction() //消费或充值
{
int num,i,a,b;
int found=1;
char choice;
while(1)
{
printf("请输入会员的账号:\n");
scanf("%d",&num);
getchar();
for(i=0;i<n&&found==1;i++)
if(s[i].no==num)
{
found=0;
printf("%ld\t%s\t%d\t%d\t%d\t",s[i].no,s[i].name,s[i].IDcard,s[i].phone,s[i].yue);
if(s[i].zhuangtai==1)
printf("正常\n");
else
printf("挂失!\n");
printf("请选择类型:1.消费 2.充值\n");
scanf("%d",&a);
getchar();
printf("请输入金额:\n");
scanf("%d",&b);
getchar();
if(a==1)
{
s[i].yue=s[i].yue-b;
printf("%ld\t%s\t%s\t%s\t%d\t",s[i].no,s[i].name,s[i].IDcard,s[i].phone,s[i].yue);
if(s[i].zhuangtai==1)
printf("正常\n");
else
printf("挂失!\n");
}
else
{
s[i].yue=s[i].yue+b;
printf("%ld\t%s\t%s\t%s\t%d\t",s[i].no,s[i].name,s[i].IDcard,s[i].phone,s[i].yue);
if(s[i].zhuangtai==1)
printf("正常\n");
else
printf("挂失!\n");
}
}
if(found==1)
{
printf("未找到!\n");
}
found=1;
printf("是否继续(Y/N)\n");
choice=getchar();
getchar();
if(choice=='N'|| choice=='n')
break;
}
}
void sort() //根据会员账号从小到大排序
{
int i,j;
struct VIP temp;
for(i=0;i<n;i++)
{
for (j=i+1;j<n;j++)
{
if (s[i].no>s[j].no)
{
temp=s[i];
s[i]=s[j];
s[j]=temp;
}
}
}
printf("\n排序后的会员信息:\n");
}
int main()
{
int opt;
printf(" |*============================================*|\n");
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(" |* 8.删除已有会员记录 *|\n");
printf(" |* 9.根据会员账号排序并显示 *|\n");
printf(" |* 10.会员消费或充值 *|\n");
printf(" |* 0.退出会员信息管理系统 *|\n");
printf(" |*============================================*|\n");
while(1)
{
printf("请输入要完成的功能:0-10:");
scanf("%d",&opt);
getchar(); //吸收回车
switch(opt)
{
case 1:init();print();break; //初始化
case 2:add1();print();break; //添加
case 3:mod();print();break; //修改
case 4:findbyno();print();break; //根据账号查询
case 5:findbyname();print();break; //根据姓名查询
case 6:findbyIDcard();print();break; //根据身份证号查询
case 7:findbyphone();print();break; //根据联系电话查询
case 8:del();print();break; //删除
case 9:sort();print();break; //排序
case 10:transaction();print();break; //消费/充值
case 0:system("cls");exit(0);break; //退出
default:printf("请输入0-10中的数!\n");break;
}
}
}
点击查看代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
struct VIP {
long no;
char name[20];
char IDcard[19];
char phone[12];
int zhuangtai;
int yue;
};
struct VIP s[50];
int n = 0;
// 验证身份证号格式
int validateIDcard(const char *id) {
if (strlen(id) != 18) return 0;
for (int i = 0; i < 17; i++) {
if (!isdigit(id[i])) return 0;
}
if (!isdigit(id[17]) && id[17] != 'X' && id[17] != 'x') return 0;
return 1;
}
// 验证联系电话格式
int validatePhone(const char *phone) {
if (strlen(phone) != 11) return 0;
for (int i = 0; i < 11; i++) {
if (!isdigit(phone[i])) return 0;
}
return 1;
}
// 通用查询函数
void findGeneral(int (*compare)(struct VIP, void *), void *key) {
int found = 0;
char choice;
while (1) {
for (int i = 0; i < n; i++) {
if (compare(s[i], key)) {
found = 1;
printf("%ld\t%s\t%s\t%s\t%d\t", s[i].no, s[i].name, s[i].IDcard, s[i].phone, s[i].yue);
if (s[i].zhuangtai == 1)
printf("正常\n");
else
printf("挂失!\n");
}
}
if (!found) {
printf("未找到!\n");
}
found = 0;
printf("是否继续查询(Y/N)\n");
choice = getchar();
getchar();
if (choice == 'N' || choice == 'n')
break;
}
}
// 根据账号比较
int compareByNo(struct VIP vip, void *key) {
long *no = (long *)key;
return vip.no == *no;
}
// 根据姓名比较
int compareByName(struct VIP vip, void *key) {
char *name = (char *)key;
return strcmp(vip.name, name) == 0;
}
// 根据身份证号比较
int compareByIDcard(struct VIP vip, void *key) {
char *id = (char *)key;
return strcmp(vip.IDcard, id) == 0;
}
// 根据联系电话比较
int compareByPhone(struct VIP vip, void *key) {
char *phone = (char *)key;
return strcmp(vip.phone, phone) == 0;
}
void init() {
int f = 1;
printf("请输入会员的账号,姓名,身份证号码,联系电话,余额,状态\n");
printf("当输入会员号为0时停止输入\n");
while (n <= 50) {
printf("请输入会员的账号:\n");
scanf("%ld", &s[n].no);
while (s[n].no != 0) {
if (s[n].no / 1000000 == 0 && s[n].no / 100000 != 0) {
int i;
for (i = 0; i < n && f == 1; i++) {
if (s[n].no == s[i].no) {
f = 0;
printf("请输入唯一的6位会员账号\n");
}
}
if (f == 1)
break;
} else {
printf("请输入6位会员账号\n");
printf("请重新输入会员的账号:\n");
scanf("%ld", &s[n].no);
}
f = 1;
}
if (s[n].no == 0)
break;
printf("请输入会员的姓名:\n");
scanf("%s", s[n].name);
while (1) {
printf("请输入会员的身份证号,联系电话,余额,状态:\n");
scanf("%s%s%d%d", s[n].IDcard, s[n].phone, &s[n].yue, &s[n].zhuangtai);
if (validateIDcard(s[n].IDcard) && validatePhone(s[n].phone)) {
break;
} else {
printf("身份证号或联系电话格式错误,请重新输入!\n");
}
}
n++;
}
}
struct VIP gete() {
struct VIP e;
printf("请输入账号:\n");
scanf("%ld", &e.no);
int f = 1;
while (e.no) {
if (e.no / 1000000 == 0 && e.no / 100000 != 0) {
int i;
for (i = 0; i < n && f == 1; i++) {
if (e.no == s[i].no) {
f = 0;
printf("请输入唯一的6位会员账号\n");
scanf("%ld", &e.no);
}
}
if (f == 1)
break;
} else {
printf("请输入6位会员账号\n");
printf("请重新输入会员的账号:\n");
scanf("%ld", &e.no);
}
f = 1;
}
printf("请输入姓名:\n");
scanf("%s", e.name);
while (1) {
printf("请输入会员的身份证号,联系电话,余额,状态:\n");
scanf("%s%s%d%d", e.IDcard, e.phone, &e.yue, &e.zhuangtai);
if (validateIDcard(e.IDcard) && validatePhone(e.phone)) {
break;
} else {
printf("身份证号或联系电话格式错误,请重新输入!\n");
}
}
return e;
}
void findbyno() {
long num;
printf("请输入要查找的会员的账号:\n");
scanf("%ld", &num);
getchar();
findGeneral(compareByNo, &num);
}
void findbyname() {
char name[20];
printf("输入要查询会员的姓名:\n");
scanf("%s", name);
getchar();
findGeneral(compareByName, name);
}
void findbyIDcard() {
char num[19];
printf("请输入要查找的会员的身份证号:\n");
scanf("%s", num);
getchar();
findGeneral(compareByIDcard, num);
}
void findbyphone() {
char num[12];
printf("请输入要查找的会员的联系电话:\n");
scanf("%s", num);
getchar();
findGeneral(compareByPhone, num);
}
void transaction() {
long num;
int i, a, b;
int found = 1;
char choice;
while (1) {
printf("请输入会员的账号:\n");
scanf("%ld", &num);
getchar();
for (i = 0; i < n && found == 1; i++)
if (s[i].no == num) {
found = 0;
printf("%ld\t%s\t%s\t%s\t%d\t", s[i].no, s[i].name, s[i].IDcard, s[i].phone, s[i].yue);
if (s[i].zhuangtai == 1)
printf("正常\n");
else
printf("挂失!\n");
printf("请选择类型:1.消费 2.充值\n");
scanf("%d", &a);
getchar();
printf("请输入金额:\n");
scanf("%d", &b);
getchar();
if (a == 1) {
if (s[i].yue >= b) {
s[i].yue = s[i].yue - b;
printf("%ld\t%s\t%s\t%s\t%d\t", s[i].no, s[i].name, s[i].IDcard, s[i].phone, s[i].yue);
if (s[i].zhuangtai == 1)
printf("正常\n");
else
printf("挂失!\n");
} else {
printf("余额不足,无法消费!\n");
}
} else {
s[i].yue = s[i].yue + b;
printf("%ld\t%s\t%s\t%s\t%d\t", s[i].no, s[i].name, s[i].IDcard, s[i].phone, s[i].yue);
if (s[i].zhuangtai == 1)
printf("正常\n");
else
printf("挂失!\n");
}
}
if (found == 1) {
printf("未找到!\n");
}
found = 1;
printf("是否继续(Y/N)\n");
choice = getchar();
getchar();
if (choice == 'N' || choice == 'n')
break;
}
}
// 未修改部分省略,可结合原代码使用
int main() {
int opt;
printf(" |*============================================*|\n");
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(" |* 8.删除已有会员记录 *|\n");
printf(" |* 9.根据会员账号排序并显示 *|\n");
printf(" |* 10.会员消费或充值 *|\n");
printf(" |* 0.退出会员信息管理系统 *|\n");
printf(" |*============================================*|\n");
while (1) {
printf("请输入要完成的功能:0-10:");
scanf("%d", &opt);
getchar();
switch (opt) {
case 1:init();print();break;
case 2:add1();print();break;
case 3:mod();print();break;
case 4:findbyno();print();break;
case 5:findbyname();print();break;
case 6:findbyIDcard();print();break;
case 7:findbyphone();print();break;
case 8:del();print();break;
case 9:sort();print();break;
case 10:transaction();print();break;
case 0:system("cls");exit(0);break;
default:printf("请输入0-10中的数!\n");break;
}
}
}
初始化测试:输入会员信息时,若输入的会员账号不是 6 位或不唯一,会给出相应提示;输入身份证号或联系电话格式错误时,也会提示重新输入。
消费测试:当会员余额不足时,进行消费操作会提示 “余额不足,无法消费!”。
查询测试:使用不同的查询方式(账号、姓名、身份证号、联系电话)能正常查询会员信息,若未找到会提示 “未找到!”
(6)总结:
代码重构:将多个相似的查询函数封装成一个通用函数时,需要考虑如何设计合适的比较函数和传递参数,以保证代码的通用性和可扩展性。
数据验证:设计身份证号和联系电话的格式验证逻辑时,需要考虑多种情况,确保验证的准确性。
耗时较久的部分:
通用查询函数的设计:需要对原有的查询逻辑进行抽象和封装,经过多次尝试和调试才得到满意的结果。
数据验证逻辑的实现:身份证号和联系电话的格式验证需要考虑多种边界情况,花费了较多时间进行测试和优化。
逆向软件工程的思考
逆向软件工程是从现有软件系统中提取信息,理解其结构和功能,以便进行维护、改进或重构的过程。在本次代码分析和二次开发中,通过仔细阅读代码,找出了原代码存在的问题,并进行了相应的改进。逆向软件工程可以帮助我们更好地理解软件的实现细节,发现潜在的问题,从而提高软件的质量和可维护性。同时,在重构过程中,我们也可以借鉴原代码的优点,避免重复造轮子,提高开发效率。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架