|
|
1、使用文件管理整个收费信息,内容有:客户姓名C16,电话号码N11,市话费F7.2长途费F7.2,信息费F7.2,ADSL费F7.2,费用合计F8.2,对应年月N6,收费状态C(0――未收,1――已收),收费日期D,银行帐号N20,收费人编姓名。
2、提供的功能:(注:所有输出送显示器)
按月统计总的收费情况和按天统计每天的收费金额;收费、退费的处理及相应单据的输出;提供按姓名和电话号码查询收费状况及费用明细,要求对姓名按顺序插入排序(稳定排序),对电话号码按折半插入排序。
3、整个开发分为三个阶段:
1)先画出各模块的流程图和模块的关系图
2)编码与测试
3)调试、演示和程序讲解
部分源代码如下:
#include stdafx.h
#include stdio.h
#include string.h
#include math.h
#define NN 30
//客户姓名C16---Name,电话号码N12---TelNo,市话费F7.2---City,长途费F7.2---LongF,
信息费F7.2---Message,ADSL费F7.2---ADSL,
//费用合计F8.2---Total,对应年月N6---YearMon,收费状态C---Status(0――未收,1――已收),
收费日期D---RecvDate,银行帐号N20---BankNo,收费人编姓名C8---RecvNM
//NN表示总记录数
struct telphone
{char name[17],telNo[13];
float city,longf,message,ADSL,total;
int yearmon;
char status;
long RecvDate;
char BankNo[21],RecvNM[9];
}Tel[NN];
struct TelOrd
{char telNo[13];
int RecordNo;
}Ord[NN+1];
struct NameOrd
{char name[17];
int RecordNo;
}Ordn[NN+1],tttn;
//函数说明
int readData(),OrderTel(),OrderName(),InquirdTel(),InquirName(),MonthStat(),DayStat();
void report(),RecvName(),RecvTel();//DelSpCpy(char *,char *,int);//该函数的功能相当于memcpy
int Records; //用于保存实际读入的记录个数
char password[7]= 123456
int main(int argc, char* argv[])
{char i;
char s[7];
int n;
int flag=0;
for(n=3;n n--)
{
printf( 请你输入密码:\n"

;
scanf( %s ,s);
if(!strcmp(s,password))//若密码正确
{
printf( 恭喜你成功登陆了\n\n\n"

;
flag=1;
break;
}
else
printf( 输入有错误请重新输入:\n"

;
}
if(n==0)
printf( 你的输入次数已到再见\n"

;
else
{
//char t;
if (readData()) return 0;
if(OrderTel()) return 0; //按电话号码去排序
if(OrderName()) return 0; //按姓名去排序
for(;

{printf( \n-------------------银行代收电话费管理系统1.0------------------\n"

;
printf( \n 1.报表 2.收费与退费 3.查询 0.结束 "

;
printf( \n"

;
printf( \n-----copyright(c) 2005 飞龙Technology.All Rights Reserved-----\n"

;
scanf( %s ,
//----------------------------------报表-----------------------------------------
if (i=='1')
{printf( \n1.按天统计收费 2.按月统计收费 3.备注 0.结束\n"

;
scanf( %s ,
for(;;)
{if(i=='1') {DayStat();break;}
else
if(i=='2') {MonthStat();break;}
else
if(i=='3') {report();break;}
else
if(i=='0') break;
{printf( \n选择错误,请重新输入!\n scanf( \n%s , }
}
}
//-------------------------------收费与退费-----------------------------------
else
if (i=='2')
{printf( \n1.按姓名 2.按电话号码 0.结束\n
scanf( %s ,
for(;;)
{if(i=='1') {RecvName();break;}
else
if(i=='2') {RecvTel();break;}
else
if(i=='0') break;
{printf( \n选择错误,请重新输入!\n scanf( \n%s , }
}
}
//-----------------------------------查询-------------------------------------------
else
if (i=='3')
{printf( \n1.按姓名查找 2.按电话号码查找 0.结束\n
scanf( %s ,
for(;;)
{ if(i=='1')
{ if((i= InquirName()) -1) //按姓名查找
{printf( \n 姓名:%s\n 电话号码:%s\n ,Tel.name,Tel.telNo);
printf( 市话费:%7.2f\n ,Tel.city);
printf( 长途费:%7.2f\n ,Tel.longf);
printf( 信息费:%7.2f\n ,Tel.message);
printf( ADSL: %7.2f\n ,Tel.ADSL);
printf( 合计:%8.2f\n ,Tel.total);
printf( 年月:%d\n ,Tel.yearmon);
}
break;
}
else
if(i=='2')
{if((i= InquirdTel()) -1) //InquirdTel();按电话号码查找
{printf( \n 姓名:%s\n 电话号码:%s\n ,Tel.name,Tel.telNo);
printf( 市话费:%7.2f\n ,Tel.city);
printf( 长途费:%7.2f\n ,Tel.longf);
printf( 信息费:%7.2f\n ,Tel.message);
printf( ADSL: %7.2f\n ,Tel.ADSL);
printf( 合计:%8.2f\n ,Tel.total);
printf( 年月:%d\n ,Tel.yearmon);
}
break;
}
else
if(i=='0') break;
else
{printf( \n选择错误,请重新输入!\n scanf( \n%s , }
}
}
//-----------------------------------结束-----------------------------------------
else
if (i=='0') break;
else
printf( \n 选择错误,请重新输入\n
}
printf( \n程序正常结束!
return 0;
}
return 0;
}
//--------------------------读取数据--------------------------------------------
int readData()//函数定义
{//若出错,则返回1;否则返回0
FILE *pf; int i=0; char cc[110];
if ((pf=fopen( Bank.txt , r ))==NULL)//打开代收费数据文件
{printf( \n Open DataFile Error! return 1;}
//printf( \n 姓名 电话号码 合计 年月 状态 收费日期 收费人
while(!feof(pf) (i NN)) //判断文件是否结束或已读的记录数是否达到所定义的空间
{ fgets(cc,110,pf); //一次读入整行的内容
//以下处理所读入的行,转换成结构数组中的内容
memcpy(Tel.name,cc,16); memcpy(Tel.telNo, cc[16],12);
Tel.city=(float) atof( cc[28]); Tel.longf =(float) atof( cc[35]);
Tel.message =(float) atof( cc[42]); Tel.ADSL =(float) atof( cc[47]);
Tel.total =(float) atof( cc[54]);
Tel.status=cc[70]; cc[70]=' '; //需先处理,否则年月会变成7位数字
Tel.yearmon =(int)atof( cc[64]);
memcpy(Tel.BankNo, cc[79],20); cc[79]=' ';
Tel.RecvDate=(long)atof( cc[71]);
memcpy(Tel.RecvNM, cc[99],8);
i++;
}
Records=i;
fclose(pf);//(char *)Tel[i++],sizeof(struct Telphone )
return 0;
}
//---------------DelSpCpy函数的功能相当于memcpy--------------------
/*void DelSpCpy(char *Pdes, char *PSource,int llen)
{
while (*PSource==' ') //去掉前面的空格
{PSource++; llen--;}
while ((*PSource ' ') (llen 0))//取非空格字符送Pdes
{ *Pdes++ = *PSource++; llen--; }
*Pdes=0;
}
*/
//-------------------------报表---------------------------------
int DayStat() //按天统计收费
{return 0;
}
//------------------------------------------------------------
int MonthStat() //按月统计收费
{return 0;
}
//---------------------------------------------------------
void report() //备注
{
int i,Recv=0,NoRV=0; float Recvjj=0,NoRVjj=0;
//printf( \n Run report!
for(i=0; i Records ;i++)
{ if (Tel.status=='0')
{ NoRV++; NoRVjj+=Tel.total;//累计未收费
}
else
{ Recv++; Recvjj+=Tel.total;//累计已收费
}
}
printf( \n 类型 户数 金额 占比%
printf( \n 已收费 %4d %7.2f %5.2f ,Recv,Recvjj,Recvjj/(Recvjj+NoRVjj)*100);
printf( \n 未收费 %4d %7.2f %5.2f\n ,NoRV,NoRVjj,NoRVjj/(Recvjj+NoRVjj)*100);
/*-----------------------------未收费备注---------------------------------*/
printf( \n ★未收费备注★:\n
for(i=0;i Records;i++)
if(Tel.status=='0')
{printf( \n 姓名:%s\n 电话号码:%s\n ,Tel.name,Tel.telNo);
printf( 市话费:%7.2f\n ,Tel.city);
printf( 长途费:%7.2f\n ,Tel.longf);
printf( 信息费:%7.2f\n ,Tel.message);
printf( ADSL: %7.2f\n ,Tel.ADSL);
printf( 合计:%8.2f\n ,Tel.total);
printf( 年月:%d\n ,Tel.yearmon);
}
/*-----------------------------已收费备注-----------------------------------*/
printf( \n
printf( \n ★已收费备注★:\n
for(i=0;i Records;i++)
if(Tel.status=='1')
{
printf( \n 姓名:%s\n 电话号码:%s\n ,Tel.name,Tel.telNo);
printf( 市话费:%7.2f\n ,Tel.city);
printf( 长途费:%7.2f\n ,Tel.longf);
printf( 信息费:%7.2f\n ,Tel.message);
printf( ADSL: %7.2f\n ,Tel.ADSL);
printf( 合计:%8.2f\n ,Tel.total);
printf( 年月:%d\n ,Tel.yearmon);
}
}
//-----------------------按电话号码排序(折半排序)--------------------------
int OrderTel()
{ int i,k,Low,Last;
Ord[0].telNo[0]='0';
strcpy(Ord[1].telNo, Tel[0].telNo);
Ord[1].RecordNo =0;
for (i=1; i Records ;i++)
{
Low=0; Last=i; //寻找插入位置
while (Low =Last)
{
k =(Low+ Last) /2;//计算中间位置
if (strcmp(Ord[k].telNo, Tel.telNo ) 0)//把Ord[k]的值与Tel比较
Low =k+1;
else
if (strcmp(Ord[k].telNo,Tel.telNo) 0)
Last =k-1;
else
{printf( \n 存在重复的电话号码 return 1;}
}
if (strcmp(Ord[k].telNo,Tel.telNo) 0)
//移动
{for(Low=i; Low Low--)
Ord[Low+1]=Ord[Low];
k++;
}
else
for(Low=i; Low Low--)
Ord[Low+1]=Ord[Low];
// k=i+1;
//插入Tel
strcpy(Ord[k].telNo, Tel.telNo);
Ord[k].RecordNo = i;
}
/*printf( \n 排序结果如下:\n
for (i=1; i = Records;i++)
printf( %s ,Ord.telNo);*/
return 0;
}
//-----------------------按姓名排序--------------------------------
int OrderName()
{int i,j,k;
for(i=0;i Records;i++)
{strcpy(Ordn.name,Tel.name);Ordn.RecordNo=i;}
for(i=0;i Records-1;i++) //在Ordn,Ordn[i+1],Ordn[Records-1]中选键值最小的Ordn[k]
{
for(k=i,j=i+1;j Records;j++)//如果存在有同名字的怎么办???
if(strcmp(Ordn[k].name,Ordn[j].name) 0) k=j;
if(k!=i) {tttn=Ordn[k]; Ordn[k]=Ordn; Ordn=tttn;}//交换
}
/*printf( \n排序结果如下:\n
for(i=0;i Records;i++)
printf( %s ,Ordn.name);*/
return 0;
}
//----------------------按姓名收费------------------------------------
void RecvName()
{int i;
if((i= InquirName()) -1) //查找姓名
{//Tel.total=Tel.city+Tel.longf+Tel.message+Tel.ADSL;//合计
if(Tel.status=='0')
{
printf( \n收费信息如下: \n
printf( \n 姓名:%s\n 电话号码:%s\n ,Tel.name,Tel.telNo);
printf( 市话费:%7.2f\n ,Tel.city);
printf( 长途费:%7.2f\n ,Tel.longf);
printf( 信息费:%7.2f\n ,Tel.message);
printf( ADSL: %7.2f\n ,Tel.ADSL);
printf( 合计:%8.2f\n ,Tel.total);
printf( 年月:%d\n ,Tel.yearmon);
}
else
if(Tel.status=='1')
{
printf( \n 退费信息如下: \n
printf( \n 姓名:%s\n 电话号码:%s\n ,Tel.name,Tel.telNo);
printf( 市话费:%7.2f\n ,Tel.city);
printf( 长途费:%7.2f\n ,Tel.longf);
printf( 信息费:%7.2f\n ,Tel.message);
printf( ADSL: %7.2f\n ,Tel.ADSL);
printf( 合计:%8.2f\n ,Tel.total);
printf( 年月:%d\n ,Tel.yearmon);
}
else return;
}
}
//--------------------按电话号码收费----------------------------------
void RecvTel()
{int i;//t;
//FILE *fp;
if((i= InquirdTel()) -1) //查找电话号码
{//Tel.total=Tel.city+Tel.longf+Tel.message+Tel.ADSL;//合计
if(Tel.status=='1')
{
printf( 该用户已收费,退费信息如下: \n //加上单引号有影响吗????
printf( \n 姓名:%s\n 电话号码:%s\n ,Tel.name,Tel.telNo);
printf( 市话费:%7.2f\n ,Tel.city);
printf( 长途费:%7.2f\n ,Tel.longf);
printf( 信息费:%7.2f\n ,Tel.message);
printf( ADSL: %7.2f\n ,Tel.ADSL);
printf( 合计:%8.2f\n ,Tel.total);
printf( 年月:%d\n ,Tel.yearmon);
}
else
if(Tel.status=='0')
{
printf( 收费信息如下: \n
printf( \n 姓名:%s\n 电话号码:%s\n ,Tel.name,Tel.telNo);
printf( 市话费:%7.2f\n ,Tel.city);
printf( 长途费:%7.2f\n ,Tel.longf);
printf( 信息费:%7.2f\n ,Tel.message);
printf( ADSL: %7.2f\n ,Tel.ADSL);
printf( 合计:%8.2f\n ,Tel.total);
printf( 年月:%d\n ,Tel.yearmon);
}
else return;
/*if(Tel.status=='0')
{printf( 要对该用户收费吗(y/n)? scanf( %s ,
if(t='y')
{
if((fp=fopen( bank.txt , w+ ))==NULL)
{
printf( 不能够打开这个文件\n
return;
}
Tel.status='1';printf( \n成功收费\n
}
}
*/
}
}
//----------------------按姓名查找------------------------------------
/*--------------------无序线性表的顺序查找----------------------------*/
int InquirName()
{int i,NameLen; char Name[17];
printf( \n Name= scanf( %s ,Name);NameLen=strlen(Name);
for(i=0;i Records;i++)
//return memcmp(Name, Ordn.name,NameLen)==0?Ordn.RecordNo:-1; // i NN?i:-1;
if((NameLen 17) memcmp(Name, Ordn.name,NameLen)==0)
return Ordn.RecordNo; //i
printf( \n 没有找到此用户!
return -1;
}
/*---------------------------有序存储线性表的查找--------------------------
int InquirName()
{int i,NameLen;char Name[17];
printf( \n Name= scanf( %s ,Name);NameLen=strlen(Name);
for(i=0;;i++)
if(i Records (memcmp(Name, Ordn.name,NameLen)==0)) return Ordn.RecordNo;
printf( \n 没有找到此号码!
return -1;
}*/
//--------------------按电话号码查找(折半查找)------------------------
int InquirdTel()
{ int Mid ,Low, Last,TelLen; char Telphone[13];
printf( \n Tel= scanf( %s ,Telphone);
Low=1; Last=Records; TelLen=strlen(Telphone);
while (Low = Last)
{ Mid= (Low +Last) /2;
//printf( \n Mid=%d , TelNo=%s ,Mid,Ord[Mid].telNo);
if (memcmp(Telphone, Ord[Mid].telNo,TelLen)==0)//加上单引号有何不同?//strcmp?
return Ord[Mid].RecordNo;//Mid;
else
if(memcmp(Telphone, Ord[Mid].telNo,TelLen) 0)
Low= Mid+1;
else
Last= Mid-1;
}
printf( \n 没有找到此号码!
return -1;
最初由 xuangxing 发布
[B]上学的时候老师给我们提这样的需求做联系,大虾们能不能把这个需求给补充一下:
1、使用文件管理整个收费信息,内容有:客户姓名C16,电话号码N11,市话费F7.2长途费F7.2,信息费F7.2,ADSL费F7.2,费用合计F8.2,对应年月N6,收费状态C(0――未收,1――已收),收费日期D,银行帐号N20,收费人编姓名。
2、提供的功能:(注:所有输出送显示器)
按月统计总的收费情况和按天统计每天的收费金额;收费、退费的处理及相应单据的输出;提供按姓名和电话号码查询收费状况及费用明细,要求对姓名按顺序插入排序(稳定排序),对电话号码按折半插入排序。
3、整个开发分为三个阶段:
1)先画出各模块的流程图和模块的关系图
2)编码与测试
3)调试、演示和程序讲解
部分源代码如下:
#include stdafx.h
#include stdio.h
#include string.h
#include math.h
#define NN 30
//客户姓名C16---Name,电话号码N12---TelNo,市话费F7.2---City,长途费F7.2---LongF,
信息费F7.2---Message,ADSL费F7.2---ADSL,
//费用合计F8.2---Total,对应年月N6---YearMon,收费状态C---Status(0――未收,1――已收),
收费日期D---RecvDate,银行帐号N20---BankNo,收费人编姓名C8---RecvNM
//NN表示总记录数
struct telphone
{char name[17],telNo[13];
float city,longf,message,ADSL,total;
int yearmon;
char status;
long RecvDate;
char BankNo[21],RecvNM[9];
}Tel[NN];
struct TelOrd
{char telNo[13];
int RecordNo;
}Ord[NN+1];
struct NameOrd
{char name[17];
int RecordNo;
}Ordn[NN+1],tttn;
//函数说明
int readData(),OrderTel(),OrderName(),InquirdTel(),InquirName(),MonthStat(),DayStat();
void report(),RecvName(),RecvTel();//DelSpCpy(char *,char *,int);//该函数的功能相当于memcpy
int Records; //用于保存实际读入的记录个数
char password[7]= 123456
int main(int argc, char* argv[])
{char i;
char s[7];
int n;
int flag=0;
for(n=3;n n--)
{
printf( 请你输入密码:\n"

;
scanf( %s ,s);
if(!strcmp(s,password))//若密码正确
{
printf( 恭喜你成功登陆了\n\n\n"

;
flag=1;
break;
}
else
printf( 输入有错误请重新输入:\n"

;
}
if(n==0)
printf( 你的输入次数已到再见\n"

;
else
{
//char t;
if (readData()) return 0;
if(OrderTel()) return 0; //按电话号码去排序
if(OrderName()) return 0; //按姓名去排序
for(;

{printf( \n-------------------银行代收电话费管理系统1.0------------------\n"

;
printf( \n 1.报表 2.收费与退费 3.查询 0.结束 "

;
printf( \n"

;
printf( \n-----copyright(c) 2005 飞龙Technology.All Rights Reserved-----\n"

;
scanf( %s ,
//----------------------------------报表-----------------------------------------
if (i=='1')
{printf( \n1.按天统计收费 2.按月统计收费 3.备注 0.结束\n"

;
scanf( %s ,
for(;;)
{if(i=='1') {DayStat();break;}
else
if(i=='2') {MonthStat();break;}
else
if(i=='3') {report();break;}
else
if(i=='0') break;
{printf( \n选择错误,请重新输入!\n scanf( \n%s , }
}
}
//-------------------------------收费与退费-----------------------------------
else
if (i=='2')
{printf( \n1.按姓名 2.按电话号码 0.结束\n
scanf( %s ,
for(;;)
{if(i=='1') {RecvName();break;}
else
if(i=='2') {RecvTel();break;}
else
if(i=='0') break;
{printf( \n选择错误,请重新输入!\n scanf( \n%s , }
}
}
//-----------------------------------查询-------------------------------------------
else
if (i=='3')
{printf( \n1.按姓名查找 2.按电话号码查找 0.结束\n
scanf( %s ,
for(;;)
{ if(i=='1')
{ if((i= InquirName()) -1) //按姓名查找
{printf( \n 姓名:%s\n 电话号码:%s\n ,Tel.name,Tel.telNo);
printf( 市话费:%7.2f\n ,Tel.city);
printf( 长途费:%7.2f\n ,Tel.longf);
printf( 信息费:%7.2f\n ,Tel.message);
printf( ADSL: %7.2f\n ,Tel.ADSL);
printf( 合计:%8.2f\n ,Tel.total);
printf( 年月:%d\n ,Tel.yearmon);
}
break;
}
else
if(i=='2')
{if((i= InquirdTel()) -1) //InquirdTel();按电话号码查找
{printf( \n 姓名:%s\n 电话号码:%s\n ,Tel.name,Tel.telNo);
printf( 市话费:%7.2f\n ,Tel.city);
printf( 长途费:%7.2f\n ,Tel.longf);
printf( 信息费:%7.2f\n ,Tel.message);
printf( ADSL: %7.2f\n ,Tel.ADSL);
printf( 合计:%8.2f\n ,Tel.total);
printf( 年月:%d\n ,Tel.yearmon);
}
break;
}
else
if(i=='0') break;
else
{printf( \n选择错误,请重新输入!\n scanf( \n%s , }
}
}
//-----------------------------------结束-----------------------------------------
else
if (i=='0') break;
else
printf( \n 选择错误,请重新输入\n
}
printf( \n程序正常结束!
return 0;
}
return 0;
}
//--------------------------读取数据--------------------------------------------
int readData()//函数定义
{//若出错,则返回1;否则返回0
FILE *pf; int i=0; char cc[110];
if ((pf=fopen( Bank.txt , r ))==NULL)//打开代收费数据文件
{printf( \n Open DataFile Error! return 1;}
//printf( \n 姓名 电话号码 合计 年月 状态 收费日期 收费人
while(!feof(pf) (i NN)) //判断文件是否结束或已读的记录数是否达到所定义的空间
{ fgets(cc,110,pf); //一次读入整行的内容
//以下处理所读入的行,转换成结构数组中的内容
memcpy(Tel.name,cc,16); memcpy(Tel.telNo, cc[16],12);
Tel.city=(float) atof( cc[28]); Tel.longf =(float) atof( cc[35]);
Tel.message =(float) atof( cc[42]); Tel.ADSL =(float) atof( cc[47]);
Tel.total =(float) atof( cc[54]);
Tel.status=cc[70]; cc[70]=' '; //需先处理,否则年月会变成7位数字
Tel.yearmon =(int)atof( cc[64]);
memcpy(Tel.BankNo, cc[79],20); cc[79]=' ';
Tel.RecvDate=(long)atof( cc[71]);
memcpy(Tel.RecvNM, cc[99],8);
i++;
}
Records=i;
fclose(pf);//(char *)Tel[i++],sizeof(struct Telphone )
return 0;
}
//---------------DelSpCpy函数的功能相当于memcpy--------------------
/*void DelSpCpy(char *Pdes, char *PSource,int llen)
{
while (*PSource==' ') //去掉前面的空格
{PSource++; llen--;}
while ((*PSource ' ') (llen 0))//取非空格字符送Pdes
{ *Pdes++ = *PSource++; llen--; }
*Pdes=0;
}
*/
//-------------------------报表---------------------------------
int DayStat() //按天统计收费
{return 0;
}
//------------------------------------------------------------
int MonthStat() //按月统计收费
{return 0;
}
//---------------------------------------------------------
void report() //备注
{
int i,Recv=0,NoRV=0; float Recvjj=0,NoRVjj=0;
//printf( \n Run report!
for(i=0; i Records ;i++)
{ if (Tel.status=='0')
{ NoRV++; NoRVjj+=Tel.total;//累计未收费
}
else
{ Recv++; Recvjj+=Tel.total;//累计已收费
}
}
printf( \n 类型 户数 金额 占比%
printf( \n 已收费 %4d %7.2f %5.2f ,Recv,Recvjj,Recvjj/(Recvjj+NoRVjj)*100);
printf( \n 未收费 %4d %7.2f %5.2f\n ,NoRV,NoRVjj,NoRVjj/(Recvjj+NoRVjj)*100);
/*-----------------------------未收费备注---------------------------------*/
printf( \n ★未收费备注★:\n
for(i=0;i Records;i++)
if(Tel.status=='0')
{printf( \n 姓名:%s\n 电话号码:%s\n ,Tel.name,Tel.telNo);
printf( 市话费:%7.2f\n ,Tel.city);
printf( 长途费:%7.2f\n ,Tel.longf);
printf( 信息费:%7.2f\n ,Tel.message);
printf( ADSL: %7.2f\n ,Tel.ADSL);
printf( 合计:%8.2f\n ,Tel.total);
printf( 年月:%d\n ,Tel.yearmon);
}
/*-----------------------------已收费备注-----------------------------------*/
printf( \n
printf( \n ★已收费备注★:\n
for(i=0;i Records;i++)
if(Tel.status=='1')
{
printf( \n 姓名:%s\n 电话号码:%s\n ,Tel.name,Tel.telNo);
printf( 市话费:%7.2f\n ,Tel.city);
printf( 长途费:%7.2f\n ,Tel.longf);
printf( 信息费:%7.2f\n ,Tel.message);
printf( ADSL: %7.2f\n ,Tel.ADSL);
printf( 合计:%8.2f\n ,Tel.total);
printf( 年月:%d\n ,Tel.yearmon);
}
}
//-----------------------按电话号码排序(折半排序)--------------------------
int OrderTel()
{ int i,k,Low,Last;
Ord[0].telNo[0]='0';
strcpy(Ord[1].telNo, Tel[0].telNo);
Ord[1].RecordNo =0;
for (i=1; i Records ;i++)
{
Low=0; Last=i; //寻找插入位置
while (Low =Last)
{
k =(Low+ Last) /2;//计算中间位置
if (strcmp(Ord[k].telNo, Tel.telNo ) 0)//把Ord[k]的值与Tel比较
Low =k+1;
else
if (strcmp(Ord[k].telNo,Tel.telNo) 0)
Last =k-1;
else
{printf( \n 存在重复的电话号码 return 1;}
}
if (strcmp(Ord[k].telNo,Tel.telNo) 0)
//移动
{for(Low=i; Low Low--)
Ord[Low+1]=Ord[Low];
k++;
}
else
for(Low=i; Low Low--)
Ord[Low+1]=Ord[Low];
// k=i+1;
//插入Tel
strcpy(Ord[k].telNo, Tel.telNo);
Ord[k].RecordNo = i;
}
/*printf( \n 排序结果如下:\n
for (i=1; i = Records;i++)
printf( %s ,Ord.telNo);*/
return 0;
}
//-----------------------按姓名排序--------------------------------
int OrderName()
{int i,j,k;
for(i=0;i Records;i++)
{strcpy(Ordn.name,Tel.name);Ordn.RecordNo=i;}
for(i=0;i Records-1;i++) //在Ordn,Ordn[i+1],Ordn[Records-1]中选键值最小的Ordn[k]
{
for(k=i,j=i+1;j Records;j++)//如果存在有同名字的怎么办???
if(strcmp(Ordn[k].name,Ordn[j].name) 0) k=j;
if(k!=i) {tttn=Ordn[k]; Ordn[k]=Ordn; Ordn=tttn;}//交换
}
/*printf( \n排序结果如下:\n
for(i=0;i Records;i++)
printf( %s ,Ordn.name);*/
return 0;
}
//----------------------按姓名收费------------------------------------
void RecvName()
{int i;
if((i= InquirName()) -1) //查找姓名
{//Tel.total=Tel.city+Tel.longf+Tel.message+Tel.ADSL;//合计
if(Tel.status=='0')
{
printf( \n收费信息如下: \n
printf( \n 姓名:%s\n 电话号码:%s\n ,Tel.name,Tel.telNo);
printf( 市话费:%7.2f\n ,Tel.city);
printf( 长途费:%7.2f\n ,Tel.longf);
printf( 信息费:%7.2f\n ,Tel.message);
printf( ADSL: %7.2f\n ,Tel.ADSL);
printf( 合计:%8.2f\n ,Tel.total);
printf( 年月:%d\n ,Tel.yearmon);
}
else
if(Tel.status=='1')
{
printf( \n 退费信息如下: \n
printf( \n 姓名:%s\n 电话号码:%s\n ,Tel.name,Tel.telNo);
printf( 市话费:%7.2f\n ,Tel.city);
printf( 长途费:%7.2f\n ,Tel.longf);
printf( 信息费:%7.2f\n ,Tel.message);
printf( ADSL: %7.2f\n ,Tel.ADSL);
printf( 合计:%8.2f\n ,Tel.total);
printf( 年月:%d\n ,Tel.yearmon);
}
else return;
}
}
//--------------------按电话号码收费----------------------------------
void RecvTel()
{int i;//t;
//FILE *fp;
if((i= InquirdTel()) -1) //查找电话号码
{//Tel.total=Tel.city+Tel.longf+Tel.message+Tel.ADSL;//合计
if(Tel.status=='1')
{
printf( 该用户已收费,退费信息如下: \n //加上单引号有影响吗????
printf( \n 姓名:%s\n 电话号码:%s\n ,Tel.name,Tel.telNo);
printf( 市话费:%7.2f\n ,Tel.city);
printf( 长途费:%7.2f\n ,Tel.longf);
printf( 信息费:%7.2f\n ,Tel.message);
printf( ADSL: %7.2f\n ,Tel.ADSL);
printf( 合计:%8.2f\n ,Tel.total);
printf( 年月:%d\n ,Tel.yearmon);
}
else
if(Tel.status=='0')
{
printf( 收费信息如下: \n
printf( \n 姓名:%s\n 电话号码:%s\n ,Tel.name,Tel.telNo);
printf( 市话费:%7.2f\n ,Tel.city);
printf( 长途费:%7.2f\n ,Tel.longf);
printf( 信息费:%7.2f\n ,Tel.message);
printf( ADSL: %7.2f\n ,Tel.ADSL);
printf( 合计:%8.2f\n ,Tel.total);
printf( 年月:%d\n ,Tel.yearmon);
}
else return;
/*if(Tel.status=='0')
{printf( 要对该用户收费吗(y/n)? scanf( %s ,
if(t='y')
{
if((fp=fopen( bank.txt , w+ ))==NULL)
{
printf( 不能够打开这个文件\n
return;
}
Tel.status='1';printf( \n成功收费\n
}
}
*/
}
}
//----------------------按姓名查找------------------------------------
/*--------------------无序线性表的顺序查找----------------------------*/
int InquirName()
{int i,NameLen; char Name[17];
printf( \n Name= scanf( %s ,Name);NameLen=strlen(Name);
for(i=0;i Records;i++)
//return memcmp(Name, Ordn.name,NameLen)==0?Ordn.RecordNo:-1; // i NN?i:-1;
if((NameLen 17) memcmp(Name, Ordn.name,NameLen)==0)
return Ordn.RecordNo; //i
printf( \n 没有找到此用户!
return -1;
}
/*---------------------------有序存储线性表的查找--------------------------
int InquirName()
{int i,NameLen;char Name[17];
printf( \n Name= scanf( %s ,Name);NameLen=strlen(Name);
for(i=0;;i++)
if(i Records (memcmp(Name, Ordn.name,NameLen)==0)) return Ordn.RecordNo;
printf( \n 没有找到此号码!
return -1;
}*/
//--------------------按电话号码查找(折半查找)------------------------
int InquirdTel()
{ int Mid ,Low, Last,TelLen; char Telphone[13];
printf( \n Tel= scanf( %s ,Telphone);
Low=1; Last=Records; TelLen=strlen(Telphone);
while (Low = Last)
{ Mid= (Low +Last) /2;
//printf( \n Mid=%d , TelNo=%s ,Mid,Ord[Mid].telNo);
if (memcmp(Telphone, Ord[Mid].telNo,TelLen)==0)//加上单引号有何不同?//strcmp?
return Ord[Mid].RecordNo;//Mid;
else
if(memcmp(Telphone, Ord[Mid].telNo,TelLen) 0)
Low= Mid+1;
else
Last= Mid-1;
}
printf( \n 没有找到此号码!
return -1;
} [/B]

 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|