h〉
定义函数
size_tfwrite(constvoid*ptr,size_tsize,size_tnmemb,FILE*stream);
函数说明
fwrite()用来将数据写入文件流中。
参数stream为已打开的文件指针,参数ptr指向欲写入的数据地址,总共写入的字符数以参数size*nmemb来决定.Fwrite()会返回实际写入的nmemb数目。
返回值
返回实际写入的nmemb数目。
4。
3.3查看函数模块
1—view(FILE*ptr)/*查看文档内容*/
本功能模块用到的函数有:
fseek(FILE*stream,longoffset,intwhence);
fread(从文件流读取数据)
相关函数
fopen,fwrite,fseek,fscanf
表头文件
#include〈stdio。
h>
定义函数
size_tfread(void*ptr,size_tsize,size_tnmemb,FILE*stream);
函数说明
fread()用来从文件流中读取数据.参数stream为已打开的文件指针,参数ptr指向欲存放读取进来的数据空间,读取的字符数以参数size*nmemb来决定。
Fread()会返回实际读取到的nmemb数目,如果此值比参数nmemb来得小,则代表可能读到了文件尾或有错误发生,这时必须用feof()或ferror()来决定发生什么情况。
返回值
返回实际读取到的nmemb数目。
4。
3。
4开户函数模块
2-add(FILE*ptr)/*添加一个帐目*/
添加账目,输入用户操作,
程序设计要求:
开新户时,用户只输入姓名、身份证号、金额、日期四个数据,由程序自动生成帐号并通知用户,并将相关数据同时插入上述两个链表中;
本程序账号由人工手动输入。
其余项目也有人工输入。
fseek(ptr,num*sizeof(structbankdata),SEEK_SET);
↓
fread(&data,sizeof(structbankdata),1,ptr);
↓
Scanf();
↓
fseek(ptr,data.num*sizeof(structbankdata),SEEK_SET);
↓
fwrite(&data,sizeof(structbankdata),1,ptr);
↓
实现对数据的输入,及存储。
通过函数嵌套操作实现对用户身份证号码的格式化操作。
getperson_num(char*person_num)/*函数功能:
读取用户身份证号码(15位或者18位)*/
4.3.5销户函数模块
3-delete(FILE*ptr)/*删除一个帐目*/
通过本功能实现销户操作,销户条件为用户姓名.
for(num=0;num<=15;num++)
{
fseek(ptr,num*(sizeof(structbankdata))+sizeof(int),SEEK_SET);
fread(name2,20,1,ptr);
if(strcmp(name1,name2)==0)num1[num]=num;
}
对输入用户进行查找,并与账目内容进行比较.
通过对num2的值进行判断,实现对不同账号下的同一用户进行操作,对未找到用户的提示。
4。
3.6修改帐目函数模块
4-modify(FILE*ptr){}/*修改帐目*/
程序设计要求:
本程序能够执行账户的借款、还款、存款操作。
由于单链表在功能实现上的限制,只能通过本功能对三项操作实现同一数据的修改操作。
输入余额为负数表示借款额,为正数表示存款额.
本功能对程序的综合能力要求较高,时间有限,待以后进一步完善.
4。
3.7查询函数模块
5-research(FILE*ptr)/*对所需账目内容进行查询*/
模块功能流图如下
打开界面,进入查询操作:
图6查询系统界面
查询功能包含三项子功能:
”0—count\n"/*查询所存有的账户个数*/
”1—Themax.depositoraccount\n"/*查询最大存款户*/
"2-Themax.borrowingaccount\n”/*查询最大借款户*/
"3—quite\n"/*退出查询*/
能够实现对账户信息的查询统计功能、按借款户的余额从大到小排序功能、按存款户的余额从大到小排序功能和按开户日期从小到大排序功能等。
能够按账号查询账户的基本信息和当前余额,能够列出最大借款额账户和最大存款额账户的基本信息和当前余额。
当前借款总额、当前还款总额以及借款总额与存款总额的差额。
本程序通过函数嵌套操作,应该可以很好的实现大部分功能,但是,由于指针参数传递过程中,程序调用总出现问题,个人对指针的学习掌握还不够熟练,所以通过在同一模块下的判断语句进行选项操作
1—操作和2-操作都是用选择排序法,分别找出最大存款户和最大借款户。
在冒泡排序、选择排序、快速排序、插入排序等当中选择排序最易理解,运行速度也比较快.所以用选择排序法进行查找操做。
五、源程序设计
#include〈stdio。
h>
#include〈string。
h〉
structbankdata{/*定义一个结构体*/
intnum;/*账户的账号*/
charname[20];/*姓名*/
charperson_num[19];/*身份证号*/
floatbalance;/*金额*/
intestablishtime;/*日期*/
}
create(FILE*ptr)/*创建具有结构体的空文档*/
{
intnum;
structbankdatadata={—1,”NONAME”,”NONUM”,0,0};
for(num=0;num〈=15;num++){
fseek(ptr,num*sizeof(structbankdata),SEEK_SET);
fwrite(&data,sizeof(structbankdata),1,ptr);
}
printf(”Blankaccountshavebeencreatedcomplete\n");
}
view(FILE*ptr)/*查看文档内容*/
{
intnum;
structbankdatadata;
clrscr();/*功能:
清除文本模式窗口清屏的意思就是把之前显示出的文字字符去掉*/
printf(”theaccountnum,theaccountperson_name,theperson_num,theblankdata,theestableshtime\n”);
for(num=0;num〈15;num++){
fseek(ptr,num*sizeof(structbankdata),SEEK_SET);
fread(&data,sizeof(structbankdata),1,ptr);
printf("%-10d%-16s%-20s%—10f%-15d\n",data.num,data。
name,data.person_num,data。
balance,data。
establishtime);
}
}
add(FILE*ptr)/*添加一个帐目*/
{
intnum;
structbankdatadata;
printf(”Enternewaccountnumber(0-15):
\n”);
scanf(”%d",&num);
fseek(ptr,num*sizeof(structbankdata),SEEK_SET);
fread(&data,sizeof(structbankdata),1,ptr);
if(data。
num!
=—1)
printf(”Account%dalreadycontainsinformaton.\n",num);
else{
printf("Entername。
\n");
scanf(”%s",data.name);
printf(”pleaseputintotheperson_num:
”);
getperson_num(data.person_num);
printf(”Enterbalance。
\n");
scanf("%f”,&data。
balance);
printf(”Enterestablishtime.\n”);
scanf("%d",&data.establishtime);
data.num=num;
}
fseek(ptr,data。
num*sizeof(structbankdata),SEEK_SET);
fwrite(&data,sizeof(structbankdata),1,ptr);
}
getperson_num(char*person_num)/*函数功能:
读取用户身份证号码(15位或者18位)*/
{
do{
inti,mark;
charch;
for(i=0;;i++)
{/*输入有效性判断(只能是数字)*/
if((ch=getchar())!
='\n’)
{
if(ch〈='9’&&ch>='0’)
{
person_num[i]=ch;
}
else
{break;
}
}else{break;}
}
person_num[i]=’\0';
if(strlen(person_num)!
=15&&strlen(person_num)!
=18)
printf(”IDnumbercanonlybe15,or18-bit,theperson_numshouldbeanum!
\n");
else
break;
}while
(1);/*循环以保证读入数据有效*/
}
delete(FILE*ptr)/*删除一个帐目*/
{
intnum,num2;
intnum1[16]={—1,—1,-1,-1,-1,—1,-1,-1,-1,—1,-1,-1,—1,—1,-1,-1};
charname1[20];
charname2[20];
structbankdatablankdata={—1,”NONAME",”NONUM",0,0};
structbankdatadata;
printf(”Enterdeletename。
\n”);
scanf(”%s”,name1);
for(num=0;num〈=15;num++)
{
fseek(ptr,num*(sizeof(structbankdata))+sizeof(int),SEEK_SET);
fread(name2,20,1,ptr);
if(strcmp(name1,name2)==0)num1[num]=num;
}
for(num=0,num2=0;num〈=15;num++)
{
if(num1[num]!
=-1)
{
fseek(ptr,num*sizeof(structbankdata),SEEK_SET);
fread(&data,sizeof(structbankdata),1,ptr);
printf(”%—10d%—16s%—20s%—15f%—15d\n",data。
num,data。
name,data.person_num,data。
balance,data.establishtime);
num2++;
}
}
if(num2〉1){
printf(”Whichaccountdoyouwanttodelete?
\n”);
scanf("%d”,&num);
fseek(ptr,num*sizeof(structbankdata),SEEK_SET);
fwrite(&blankdata,sizeof(structbankdata),1,ptr);
}
if(num2==1){
fseek(ptr,data。
num*sizeof(structbankdata),SEEK_SET);
fwrite(&blankdata,sizeof(structbankdata),1,ptr);
}
if(num2==0)printf("Thereisnoyourname.\n”);
}
modify(FILE*ptr)/*修改帐目*/
{
intnum,num2;
intnum3[16]={—1,—1,—1,-1,—1,—1,—1,-1,-1,—1,-1,—1,—1,—1,—1,-1};
floatnum1;
charname1[20];
charname2[20];
structbankdatadata;
printf("Entermodifyname。
\n”);
scanf(”%s",name1);
for(num=0;num<=15;num++)
{
fseek(ptr,num*(sizeof(structbankdata))+sizeof(int),SEEK_SET);
fread(name2,20,1,ptr);
if(strcmp(name1,name2)==0)num3[num]=num;
}
for(num=0,num2=0;num〈=15;num++){
if(num3[num]!
=-1)
{
fseek(ptr,num*sizeof(structbankdata),SEEK_SET);
fread(&data,sizeof(structbankdata),1,ptr);
printf("%—10d%—16s%-10f%—10d\n",data。
num,data。
name,data。
balance,data。
establishtime);
num2++;
}
}
printf("%d\n”,num2);
if(num2〉1){