这是某次的作业,翻出来保存到博客园里。
#include
#include
#include
#include
#include
int shuzi(const char *ab,int is);/*验证数组合法性*/
char selectkey,creditmoney,debitmoney,mim[20]={'0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0','\0'},temp[50],tem[50],acoumt[50];
long moneyint;
int q=0,top=-1;
void anya(char mim[]);/*暗压函数*/
void (*p)(long int *money);
void query(long int *money);/*查询函数单据函数*/
void credit(long int *money);
void debit(long int *money);
void passchange(char mim[]);
int input_mima(char mi[]);/*密码输入函数*/
char *nuchange(long int num);
struct record
{
char rec[50];
struct record *next;
};
typedef struct record list;
list *st,*point;
int initaz(const char *x);
int save(const char *x,const char *m,list *pp);
main()
{
st=(list*) malloc (sizeof(list));
point=st;
st->next=NULL;
printf("请输入您的账号.\n");
scanf("%s",acoumt);
for(;initaz(acoumt);)
{
printf("\n账号输入错误,继续吗?(y/n)");
do
{
selectkey=(char)getche();
if((selectkey=='n')||(selectkey=='N')) return 0;
if((selectkey=='y')||(selectkey=='Y'))
{
printf("\n请再次输入账号!\n");
scanf("%s",acoumt);
}
else
{
printf("输入错误\n");
}
}while(!((selectkey=='n')||(selectkey=='N')||(selectkey=='y')||(selectkey=='Y')));
}
if (input_mima(mim)) return 0;
for(;;)
{
do
{
system("cls");/*lint !e534*/
puts("=========================");
puts("| 您要做什么? |");
puts("| 1. 查询以往单据 |");
puts("| 2. 取款 |");
puts("| 3. 转账 |");
puts("| 4. 密码修改 |");
puts("| 5. 退出 |");
puts("=========================");
selectkey =(char)getch();
}while( selectkey!='1' && selectkey!='2' && selectkey!='3' && selectkey!='4'&&selectkey!='5' );
switch(selectkey)
{
case '1':
p=query;
break;
case '2':
p=credit;
break;
case '3':
p=debit;
break;
case '4':
passchange(mim);
if(q&&input_mima(mim)) return 0;
q=0;
continue;
case '5':
system("cls");/*lint !e534*/
puts("正在储存信息,请稍后。。。。");
if(save(acoumt,mim,st)) printf("出现未知的文件写入错误,信息未能正确保存\n");
puts("================================");
puts("| 谢谢您的使用! |");
puts("| 再见! |");
puts("================================");
getch();/*lint !e534*/
return 0;
default:break;
}
(*p)(&moneyint);
}
}
int shuzi(const char *ab,int is)
{
int i;
for(i=0;i<=is;++i)
{
if ((ab[i]<'0')||(ab[i]>'9')) return 1;
}
return 0;
}
int input_mima(char *mi)
{
int count=1;
while(count<=3)
{
printf("请输入您的密码!!\n");
anya(temp);
if (strcmp(mi,temp))
{
printf("\n您输入了一个错误的密码,您还有 %d 次机会尝试。\n",3-count);
++count;
continue;
}
break;
}
if (count==4)
{
printf("您没有机会尝试了!!");
getch();/*lint !e534*/
return 1;
}
else return 0;
}/*lint !e818*/
void query (long int *money)
{
int i;
list *temppoint;
system("cls");/*lint !e534*/
if (top==-1)
{
printf("您的账户没有做任何事\n");
}
else
for(temppoint=st,i=1;temppoint->next!=0;temppoint=temppoint->next,i++)
printf("*%-5d%s\n",i,temppoint->rec);
puts("==========================================");
printf("| 您的余额还剩%-8d元人民币。 |\n",*money);
puts("| 请按任意键继续 |");
puts("==========================================");
getch();/*lint !e534*/
}/*lint !e818*/
void credit(long int *money)
{
long moneytem=*money;
long l;
char moneyl[13];
for(;;)
{
system("cls");/*lint !e534*/
puts("==================================");
puts("| 请选择取出的金额: |");
puts("| a. 50元 |");
puts("| b. 100元 |");
puts("| c. 500元 |");
puts("| d. 返回 |");
puts("|你也可以用键盘直接输入想要的金额|");
puts("==================================");
scanf("%s",moneyl);
l=(long)(strlen(moneyl)-1);
if(!shuzi(moneyl,l))
{
(*money)-=atoi(moneyl);
if (*money<0)
{
printf("您的余额不足!!\n");
getch();/*lint !e534*/
(*money)+=atoi(moneyl);
continue;
}
puts("============================================");
printf("| 您取出了%-7d元人民币! |\n",atoi(moneyl));
puts("| 按任意键继续 |");
puts("============================================");
getch();/*lint !e534*/
}
else
{
if (0rec,tem);
point->next=(list*) malloc(sizeof(list));
point=point->next;
point->next=0;
}
}
void debit(long int *money)
{
FILE *fp;
long moneytem=*money,moneye,t;
char t1[50],t2[50];
system("cls");/*lint !e534*/
printf("请输入您要转账的账户。\n");
anya(t1);
if(!strcmp(t1,acoumt))
{
printf("您不能给自己转账,按任意键退出。\n");
getch();/*lint !e534*/
return;
}
printf("请再次输入您要转账的账户。\n");
anya(t2);
if(strcmp(t1,t2))
{
printf("两次输入不一致,按任意键退出。");
getch();/*lint !e534*/
return;
}
fp=fopen(t1,"r+");
if (fp==NULL)
{
printf("没有这个账户,按任意键退出。");
getch();/*lint !e534*/
return;
}
for(;;)
{
printf("请输入您要转账的钱数。\n");
scanf("%s",t1);
if (shuzi(t1,(int)strlen(t1)-1)||atol(t1)>*money)
{
printf("错误的输入。");
continue;
}
break;
}
printf("您确定吗?输入y或Y继续。\n");
if(!(getch()=='y')&&!(getch()=='Y'))
{
printf("按任意键退出\n");
getch();/*lint !e534*/
return;
}
printf("再次确认?输入y或Y继续。\n");
if(!(getch()=='y')&&!(getch()=='Y'))
{
printf("按任意键退出\n");
getch();/*lint !e534*/
return;
}
*money-=atol(t1);
fscanf(fp,"%s\n",t2);
t=ftell(fp);
fscanf(fp,"%ld",&moneye);
fseek(fp,t,SEEK_SET);
fprintf(fp,"%-10ld\n",moneye+atol(t1));
fseek(fp,0L,SEEK_END);
fprintf(fp," 您的账号被转入了%ld元人民币。\n",atol(t1));
printf("您还剩%ld元人民币\n",*money);
getch();/*lint !e534*/
fflush(stdin);
++(top);
tem[0]='\0';
strcat(tem,"您已经转账");
strcat(tem,nuchange(moneytem-*money));
moneytem=*money;
strcat(tem,"元人民币,您还剩");
strcat(tem,nuchange(*money));
strcat(tem,"元人民币");
strcpy(point->rec,tem);
point->next=(list*) malloc(sizeof(list));
point=point->next;
point->next=NULL;
fclose(fp);
}
void passchange(char mimx[])
{
char temp1[50],temp2[50],judge='y';
int i,l;
system("cls");/*lint !e534*/
printf("===================================\n");
printf(" 请输入原本的密码! \n");
printf("===================================\n");
anya(temp1);
if (strcmp(temp1,mimx))
{
printf("**********************************************************\n");
printf(" 和原密码不相同,需要确认您的身份 \n");
printf("**********************************************************\n");
q=1;
return;
}
for(;;)
{
printf("==============================\n");
printf(" 请输入新密码\n");
printf("==============================\n");
anya(temp1);
printf("====================================\n");
printf(" 请再次输入新密码\n");
printf("====================================\n");
anya(temp2);
if (strcmp(temp1,temp2))
{
printf("两次输入的新密码不相同!!\n要放弃吗修改吗?(y/n)\n");
do
{
judge=(char)getch();
}while(judge!='Y' &&judge!='N'&&judge!='y'&&judge!='n');
if (judge=='y'||judge=='Y')
{
printf("您已经放弃了\n");
printf("输入任意键继续。。。。\n");
getch();/*lint !e534*/
return;
}
else
{
system("cls");/*lint !e534*/
continue;
}
}
else
{
l=(long)(strlen(temp1));
for(i=0;i<=l;++i)
{
mimx[i]=temp1[i];
}
mimx[i]='\0';
++(top);
tem[0]='\0';
strcat(tem,"您将密码修改成");
strcat(tem,mim);
strcpy(point->rec,tem);
point->next=(list*) malloc(sizeof(list));
point=point->next;
point->next=0;
printf("输入任意键继续");
getch();/*lint !e534*/
}
break;
}
}
void anya(char mimx[])
{
char temx[50];
int i;
for(i=0;(temx[i]=(char)getch())!=13;++i)
{
fflush(stdin);
if(temx[i]==8)
{
if (i!=0)
{
putch(8);/*lint !e534*/
putch(' ');/*lint !e534*/
putch(8);/*lint !e534*/
i-=2;
}
}
else putch('*');/*lint !e534*/
fflush(stdin);
fflush(stdout);
}
temx[i]='\0';
strcpy(mimx,temx);
printf("\n\n");
}
char *nuchange(long int nume)
{
static char tt[50];
int len,i;
len=(int)log10((double)nume);
tt[len+1]='\0';
for(i=len;i>=0;--i)
{
tt[i]=(nume%10)+48;
nume=(nume-(nume%10))/10;
}
return tt;
}
int initaz(const char *x)
{
FILE *fp;
char *em=(char*) calloc((unsigned int)50,sizeof(char));
if(em==NULL)
{
printf("内存不足");
getch();/*lint !e534*/
exit(1);
}
fp=fopen(x,"r");
if (fp==NULL)
{
fflush(stdin);
free(em);
return 1;
}
fgets(mim,20,fp);/*lint !e534*/
if (mim[strlen(mim)-1]=='\n') mim[strlen(mim)-1]='\0';/*本语句实现兼容手写文件*/
fscanf(fp,"%ld\n",&moneyint);
while(fgets(em,50,fp)!=NULL)
{
if(em[0]=='\n') continue;
++top;
strcpy(point->rec,em+6);
point->next=(list*) malloc(sizeof(list));
point=point->next;
point->next=NULL;
}
free(em);
fclose(fp);
return 0;
}
int save(const char *x,const char *m,list *pp)
{
FILE *fp;
int i;
fp=fopen(x,"w");
if (fp==NULL)
{
fflush(stdin);
return 1;
}
fprintf(fp,"%s\n",m);
fprintf(fp,"%-10ld\n",moneyint);
for(i=1;pp->next!=NULL;pp=pp->next,++i)
fprintf(fp,"*%-5d%s\n",i,pp->rec);
fclose(fp);
return 0;
}