文章目录
- 项目需求分析
- 放码过来
项目需求分析
时间过得是真的快啊,这么快C语言的基础语法就讲过去了,是时候开始讲项目了。
那就进项目吧,需求分析。
代码语言:javascript复制1、需要有操作界面。最好能有光标定位的。
2、实现登录注册功能,其中账号限制六位数字,密码限制八位数字与英文结合。
3、实现存取款功能
4、实现转账功能,双方的数据都需要有改变
5、实现账户信息搜索功能,分精确搜索和模糊搜索。搜索账户、搜索存取款、搜索转账。时间搜索、账号搜索等。
6、以上这些功能都需要持久化,即程序重启之后之前的操作都还在。
各位可以先自行实现,如果对需求有不清楚的可以发在评论区。
几张大图过后放上我当初写的代码,那可是我的处女作啊!!!
单纯写代码多枯燥啊,这都是某些人给我发来的桌面大图。
放码过来
代码语言:javascript复制// main.c
#include "public.h"
#include "master.h"
#include "supermaster.h"
#include "user.h"
#include "other.h"
int main ()
{
mymes();
newuser("info.txt");
newreport("repo.txt");
_login(head,3);
return 0;
}
代码语言:javascript复制//public.h
#ifndef _PUBLIC_H_
#define _PUBLIC_H_
/*
为了节约字数,此处省略内容请前往第三篇中获取
https://blog.csdn.net/qq_43762191/article/details/116189876
*/
typedef struct reported
{
int amount;//交易金额
int rflag; //交易方式 1、存款 2、取款 3、转账转出 4、转账转入
int lastmoney;//余额
int lastmoney2;//收款者的余额
int number1;//付款账户
int number2;//入款账户
char time[12];//操作时间
} REPORT_T;
typedef struct point
{
void *pData; //指向数据域
struct point *next; //指向下一个节点
} POINT_T;
FILE * fp;
FILE * rfp;
POINT_T * pTemp;
REPORT_T * rTemp;
POINT_T * pNode;
POINT_T * rNode;
POINT_T * head ;
POINT_T * rhead;
extern FILE * fp;
extern FILE * rfp;
extern POINT_T * head; //用户的头
extern POINT_T * rhead; //账单的头
extern POINT_T * pTemp; //用户临时指针
extern REPORT_T * rTemp; //账单临时指针
extern POINT_T * pNode; //接用户的头
extern POINT_T * rNode; //接账单的头
//打开文件
FILE * open(char * filename);
//用户信息链表写入文件
void List_to_file(POINT_T * head,FILE * fp,int size);
//账户链表写入文件
void rList_to_file(POINT_T * head,FILE * fp,int size);
//文件写入链表
POINT_T * File_to_list(FILE * fp,int size);
//初始化用户
void newuser();
//初始化账单
void newreport(char * filename);
//创建头结点
POINT_T * creat(TEST_T *data );
//新增节点
void add (POINT_T * head,TEST_T *data );
#endif
代码语言:javascript复制// initiaze.c
#include "public.h"
void newuser(char * filename)
{
TEST_T * pData = NULL;
fp=fopen(filename,"r ");
if (fp==NULL)
{
fp=fopen(filename,"w ");
head=creat(NULL);
pData=(TEST_T *)malloc(sizeof(TEST_T));
if(pData==NULL)
{
gotoxy(36,14);
printf("申请内存失败");
exit(1);
}
memset(pData,0,sizeof(TEST_T));
strcpy(pData->name,"admin");
strcpy(pData->pwd,"123456");//填充第一个数据
pData->number=10000001;
pData->flag=0;
add(head,pData);
pData=(TEST_T *)malloc(sizeof(TEST_T));
if(pData==NULL)
{
gotoxy(36,14);
printf("申请内存失败");
exit(1);
}
memset(pData,0,sizeof(TEST_T));
strcpy(pData->name,"fck");
strcpy(pData->pwd,"123456");
pData->number=10000002;
pData->flag=1;
add(head,pData);
pData=(TEST_T *)malloc(sizeof(TEST_T));
if(pData==NULL)
{
gotoxy(36,14);
printf("申请内存失败");
exit(1);
}
memset(pData,0,sizeof(TEST_T));
strcpy(pData->name,"lzx");
strcpy(pData->pwd,"123456");
pData->number=10000003;
pData->flag=2;
pData->money=500;
add(head,pData);
pData=(TEST_T *)malloc(sizeof(TEST_T));
if(pData==NULL)
{
gotoxy(36,14);
printf("申请内存失败");
exit(1);
}
memset(pData,0,sizeof(TEST_T));
strcpy(pData->name,"lml");
strcpy(pData->pwd,"123456");
pData->number=10000004;
pData->flag=3;
add(head,pData);
pData=(TEST_T *)malloc(sizeof(TEST_T));
if(pData==NULL)
{
gotoxy(36,14);
printf("申请内存失败");
exit(1);
}
memset(pData,0,sizeof(TEST_T));
strcpy(pData->name,"lzk");
strcpy(pData->pwd,"123456");
pData->number=10000005;
pData->flag=2;
pData->money=500;
add(head,pData);
List_to_file(head,fp,sizeof(TEST_T));
pNode = head ;
}
else
{
head = File_to_list(fp,sizeof(TEST_T));
pNode = head ;
}
}
//初始化账单
void newreport(char * filename)
{
REPORT_T * rData = NULL;
rfp=fopen(filename,"r ");
if (rfp==NULL)
{
rfp=fopen(filename,"w ");
rhead=creat(NULL);
//add(rhead,rData);
}
else
{
rhead = File_to_list(rfp,sizeof(REPORT_T));
rNode = rhead;
}
}
代码语言:javascript复制//file.c
#include"public.h"
//打开文件
FILE * open(char * filename)
{
FILE *fp=NULL;
fp=fopen(filename,"r ");
if (fp==NULL)
{
fp=fopen(filename,"w ");
}
return fp;
}
//用户链表写入文件
void List_to_file(POINT_T * head,FILE * fp,int size)
{
POINT_T * pNode=head;
rewind(fp);
while(pNode->next!=NULL)
{
pNode=pNode->next;
//将数据写入文件
fwrite(pNode->pData,size,1,fp);
}
fflush(fp);
}
//账户链表写入文件
void rList_to_file(POINT_T * rhead,FILE * rfp,int size)
{
REPORT_T * rTemp=NULL;
POINT_T * rNode=rhead;
rewind(rfp);
while(rNode->next!=NULL)
{
rNode=rNode->next;
rTemp=rNode->pData;
//将数据写入文件
fwrite(rTemp,size,1,fp);
}
fflush(rfp);
}
//文件写入链表
POINT_T * File_to_list( FILE* p, int size)
{
void * data = NULL;
POINT_T * head = NULL;
int ret = -1;
// 创建链表头节点
head = creat(NULL);
rewind(p);
// 对数据域开辟空间
data = malloc(size);
memset(data, 0, sizeof(size));
while (1)
{
// 读取大小为size的数据内容
ret = fread(data, size, 1, p);
if (ret < 1)
{
// 未读取到数据内容,表示文件已到结尾
break;
}
// 添加到链表
add(head, data);
data = malloc(size);
memset(data, 0, sizeof(size));
}
return head;
}
代码语言:javascript复制//other.h
#ifndef _OTHER_H_
#define _OTHER_H_
//统一登录页面
void face();
void face1();
void face2();
//光标定位
void gotoxy(int x,int y);
//打星星
void flouwer(int i);
//光标移动和它的辅助函数
int key_press();
int kreturn();
//显示我的个人信息
void mymes();
//计算节点数
int Count(POINT_T * head);
//查找用户数据
POINT_T * find(POINT_T *head,int index);
//用户名模糊查询
void fuzzyreserch(POINT_T * head);
//辅助函数
char* my_strstr(const char* dest, const char* src);
//输入函数
void getstr(char str[],int maxLen,int type,int isplainText);
//统一登录函数
void _login(POINT_T * head,int p);
//登录选择
void login_choose();
//打印链表
void print(POINT_T * head);
//获取系统当前时间、年、月、日
void getLocalTime(char szTime[]);
#endif
代码语言:javascript复制//other.c
#include "public.h"
#include "master.h"
#include "supermaster.h"
#include "user.h"
#include "other.h"
// 辅助函数
//光标
void gotoxy(int x,int y)
{
COORD pos={x,y};
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOut,pos);
}
//计算节点数
int Count(POINT_T * head)
{
int count=0;
POINT_T *pNode1=head;
while (pNode1->next!=NULL)
{
if(pNode1->next!=NULL)
{
pNode1=pNode1->next;
count ;
}
}
return count;
}
//输入输出函数
/*
为了节约字数,这个函数请前往第二篇寻找,太长了不给发
https://blog.csdn.net/qq_43762191/article/details/116176611
*/
//统一登录界面
void face()
{
printf("学号: XXXXXXXXXX n");
printf("姓名: XXX ");
gotoxy(8,5);
flouwer(80);
gotoxy(36,9);
printf("ATM机系统统一登录界面");
gotoxy(43,10);
printf("版本1.0");
gotoxy(8,12);
flouwer(80);
gotoxy(100,25);
printf("按ESC键退出");
gotoxy(20,16);
printf("1、用户名登录");
gotoxy(20,17);
printf("2、账号登录");
}
/账号登录页面
void face1()
{
system("cls");
gotoxy(8,5);
flouwer(80);
gotoxy(36,9);
printf("ATM机系统统一登录界面");
gotoxy(43,10);
printf("版本1.0");
gotoxy(8,12);
flouwer(80);
gotoxy(100,25);
printf("按ESC键退出");
gotoxy(20,16);
printf("账号(8位):");
gotoxy(20,17);
printf("密码(6位):");
}
///用户名登录页面//
void face2()
{
system("cls");
gotoxy(8,5);
flouwer(80);
gotoxy(36,9);
printf("ATM机系统统一登录界面");
gotoxy(43,10);
printf("版本1.0");
gotoxy(8,12);
flouwer(80);
gotoxy(100,25);
printf("按ESC键退出");
gotoxy(20,16);
printf("用户名 :");
gotoxy(20,17);
printf("密码(6位):");
}
统一登录函数
void _login(POINT_T * head,int p)//p用于限制输入次数
{
char i[1]={0};
int j=0;
int inum=0;
char anum[8]={0};
int count=0;
int q=0;
char name[8]={0};
char pwd[6]={0};
POINT_T *pNode1=head;
TEST_T * tTemp = NULL;
q=p;
if(q<=0)
{
printf("无法登录");
exit(-1);
}
count=Count(pNode1);
face();
gotoxy(20,18);
printf("你的选择是:");
getstr(i,2,1,0);
switch(i[0])
{
case 49:
{
face2();
gotoxy(32,16);
getstr(name,9,0,0);
while(pNode1->next!=NULL)
{
pNode1 = pNode1->next;
tTemp = pNode1->pData;
if (strcmp(tTemp->name,name)==0)
{
pTemp = pNode1;
gotoxy(32,17);
getstr(pwd,7,0,1);
gotoxy(32,19);
printf("登录验证中,请稍等······");
if(strcmp(pwd,tTemp->pwd)==0)
{
Sleep(300);
system("cls");
gotoxy(40,10);
printf("登陆成功");
Sleep(300);
system("cls");
if (tTemp->flag==0)
{
supermaster_fuction_choose(head);
}
else if(tTemp->flag==1)
{
master_fuction_choose(head);
}
else if(tTemp->flag==2)
{
user_fuction_choose(pTemp,head,rhead);
}
else
{
Sleep(300);
system("cls");
gotoxy(40,10);
printf("无效用户,登录失败");
gotoxy(40,11);
q=q-1;
printf("你还有%d次机会",q);
Sleep(1000);
system("cls");
_login(head,q);
}
}
else
{
Sleep(300);
system("cls");
gotoxy(40,10);
printf("密码错误,登录失败");
gotoxy(40,11);
q=q-1;
printf("你还有%d次机会",q);
Sleep(1000);
system("cls");
_login(head,q);
}
}
}
Sleep(300);
system("cls");
gotoxy(40,10);
printf("用户名错误,登录失败");
gotoxy(40,11);
q=q-1;
printf("你还有%d次机会",q);
Sleep(1000);
system("cls");
_login(head,q);
}break;
case 50:
{
face1();
gotoxy(32,16);
getstr(anum,9,1,0);
inum=atoi(anum);
while(pNode1->next!=NULL)
{
pNode1 = pNode1->next;
tTemp = pNode1->pData;
if (tTemp->number==inum)
{
pTemp = pNode1;
gotoxy(32,17);
getstr(pwd,7,0,1);
gotoxy(32,19);
printf("登录验证中,请稍等······");
if(strcmp(pwd,tTemp->pwd)==0)
{
Sleep(300);
system("cls");
gotoxy(40,10);
printf("登陆成功");
Sleep(300);
system("cls");
if (tTemp->flag==0)
{
supermaster_fuction_choose(head);
}
else if(tTemp->flag==1)
{
master_fuction_choose(head);
}
else if(tTemp->flag==2)
{
user_fuction_choose(pTemp,head,rhead);
}
else
{
Sleep(300);
system("cls");
gotoxy(40,10);
printf("无效用户,登录失败");
gotoxy(40,11);
q=q-1;
printf("你还有%d次机会",q);
Sleep(1000);
system("cls");
_login(head,q);
}
}
else
{
Sleep(300);
system("cls");
gotoxy(40,10);
printf("密码错误,登录失败");
gotoxy(40,11);
q=q-1;
printf("你还有%d次机会",q);
Sleep(1000);
system("cls");
_login(head,q);
}
}
}
Sleep(300);
system("cls");
gotoxy(40,10);
printf("用户名错误,登录失败");
gotoxy(40,11);
q=q-1;
printf("你还有%d次机会",q);
Sleep(1000);
system("cls");
_login(head,q);
}break;
default:
{
system("cls");
_login(head,q);
}
}
}
//打星星
void flouwer(int i)
{
int j=0;
for(j=0;j<i;j )
{
printf("*");
}
}
//个人信息
void mymes()
{
gotoxy(36,12);
printf("学号: DX190221 ");
gotoxy(36,14);
printf("姓名: 吴林锋 ");
gotoxy(56,15);
printf("按任意键继续");
getch();
system("cls");
}
/*
为了节约字数,此处省略内容请前往第三篇中获取
https://blog.csdn.net/qq_43762191/article/details/116189876
*/
//光标移动和它的辅助函数
int key_press()
{
int key;//接收键盘位移键
int k;
int xpos=36;//这个数据还有待进一步调整
int ypos=9;
gotoxy(xpos,ypos);
while(key = getch())
{
if(key=='n')
{
printf("tuichu");
exit(-1);
}
switch(key)
{
case 0xE0:
switch(key=getch())
{
case 72:
{
ypos--;
gotoxy(xpos,ypos);
k=kreturn(xpos,ypos);
return k;
};break;
case 80:
{
ypos ;
gotoxy(xpos,ypos);
k=kreturn(xpos,ypos);
return k;
};break;
case 75:
{
xpos-=16;
gotoxy(xpos,ypos);
k=kreturn(xpos,ypos);
return k;
};break;
case 77:
{
xpos =16;
gotoxy(xpos,ypos);
k=kreturn(xpos,ypos);
return k;
};break;
}
}
}
}
int kreturn(int xpos,int ypos)
{
if(xpos==36&&ypos==10)
{
return 1;
}
if(xpos==52&&ypos==10)
{
return 2;
}
if(xpos==68&&ypos==10)
{
return 3;
}
if(xpos==36&&ypos==11)
{
return 4;
}
}
/查找用户数据//
POINT_T * find(POINT_T *head,int index)
{
int f=0;
POINT_T *pNode=NULL;
int count=0;
pNode=head;
count=Count(head);
system("cls");
gotoxy(8,3);
flouwer(83);
gotoxy(8,14);
flouwer(83);
if(count<index)
{
gotoxy(28,8);
printf("查无此人");
Sleep(300);
system("cls");
master_fuction_choose(head);
}
while(pNode->next!=NULL)
{
if(index==f)
{
return pNode;
}
pNode=pNode->next;
f ;
}
}
/不能直接返回继续输账号//
//获取系统当前时间、年、月、日
void getLocalTime(char szTime[])
{
time_t now ;
struct tm *tm_now ;
time(&now) ;
tm_now = localtime(&now) ;
sprintf(szTime, "%d-d-dn",tm_now->tm_year 1900, tm_now->tm_mon 1, tm_now->tm_mday) ;
}
//用户名模糊查询
void fuzzyreserch(POINT_T * head)
{
char r[12]={0};//用来接收收入的名字
char s[12]={0};//用来接收数据域中的名字
POINT_T * pTempp = head;
TEST_T * tTempp = NULL;
system("cls");
printf("请输入用户名中的连续一串");
getstr(r,7,0,0);
while(pTempp->next!=NULL)
{
pTempp=pTempp->next;
tTempp=pTempp->pData;
s[12]=NULL;
strcpy(s,tTempp->name);
if (my_strstr(s,r) == NULL)
{
printf("");
}
else if (my_strstr(s,r) != NULL)
{
printf("n");
printf("用户名:%st用户账号:%dt用户密码:%st用户余额:t",tTempp->name,tTempp->number,tTempp->pwd,tTempp->money);
if (tTempp->flag==0)
{
printf("超级管理员n");
}
else if(tTempp->flag==1)
{
printf("普通管理员n");
}
else if (tTempp->flag==2)
{
printf("普通用户n");
}
else
{
printf("已被注销用户n");
}
}
}
printf("此为所有查询结果n按任意键继续");
getch();
}
//辅助函数
char* my_strstr(const char* dest, const char* src)
{
char* start = (char*)dest;//在这里需要强制类型转换成char*
char* substart = (char*)src;
char* cp = (char*)dest;//cp就是用来保存首地址的
assert(dest != NULL);
assert(src != NULL);
while (*cp)
{
start = cp;
while (*start != '