-程序设计报告(2012/2013学年第二学期)题目:电信计费模拟实现专业通信工程学生姓名班级学号指导教师郭剑指导单位计算机软件教学中心日期2013年6月27日-电信计费模拟实现一、课题内容和要求电信计费系统主要负责对电信各类客户每月帐单统计、查询、备份等管理工作。本课题以该系统要求编写一个程序,实现对电信计费的模拟。通过此可以,熟练掌握文件读写、函数调用等知识,以及查找、典型算法的设计与应用。二、需求分析功能框架图:(见图1)图1(1)提供可操作的主菜单:输出个菜单,用于显示以从文件中加载的总客户信息和若干个可选的功能选项。根据客户输入的选项来运行不同的功能,运行不同的函数。(2)进行文本信息的载入:从指定的文件中以链表形式加载所需的客户信息。这里的文件是在编译时就已经指定好的、存在的文本,需设计者预先自己建立好。(3)查找客户功能:以客户输入的电话号码进行查找对应的客户信息并将它们输出。(4)对现有信息的保存:保存内存中的最新的记录输出到磁盘文件中。这里默认的是保存到原读取文件中并覆盖原来的信息。电信计费模拟系统通话记录显示备份通话记录检测通话时长异常保存话费详细话费统计-(5)将信息备份到另外的一个文本中:通过文件格式读写函数,将源文件信息写到客户提供的目标文件中。(6)分类合计功能:客户话费小计、长话费小计、通话费合计、客户帐单数量。三、概要设计1主要结构体:structconsumer//用户信息定义{charname1[10];//客户姓氏charname2[10];//客户名charphone[9];//电话号码charYN[2];//来电显示是否}yhzl[100];structfeelist//话单信息定义{charnumber1[9];//主叫号码charnumber2[13];//被叫号码charqishi[15];//通话起始时间charzhongzhi[15];//通话终止时间}hd[300];structhuafei{charhaoma[9];//本人号码charxingming1[10];//姓charxingming2[10];//名inty;//月租费intg;//功能费doubleshinei;//市内话费doublechangtu;//长途话费-doublezonghe;//总和}hfd[100];2主要函数流程图:(1)装载函数:用于实现用户与系统的交互,显示用户菜单、操作提示等,流程图如图2所示:图2图3(2)查找函数:利用用户输入的号码进行顺序查找并将找到的客户的所有通话记录并输出。见图3开始调用函数打开文件成功读入数据是号码比对相同输出数据文件是否结束是不同否结束开始读入号码加载菜单读入选项选项符合条件调用函数是否继续是是否否结束-(3)查看账单:利用计算函数和输入的用户号码,,进行顺序查找出用户的通话账单并显示在屏幕上。见图4图4图5(4)检查错误话单:检查号码通话时长是否大于三天,并显示和保存异常话单,如图5(5)保存文件函数:将用户所有通话记录保存到本文件中。是开始打开文件成功读入数据文件是否结束号码是否相同输出话费信息结束否是是否开始打开文件成功读入数据文件是否结束计算时间判断时间输出话单结束-四、源程序代码#includestdio.h#includestdlib.h#includestring.hstructconsumer//用户信息定义{charname1[10];//姓charname2[10];//名charphone[9];//电话号码charYN[2];//来电显示是否}yhzl[100];structfeelist//话单信息定义{charnumber1[9];//主叫号码charnumber2[13];//被叫号码charqishi[15];//通话起始时间charzhongzhi[15];//通话终止时间}hd[300];structhuafei{charhaoma[9];//本人号码charxingming1[10];//姓charxingming2[10];//名inty;//月租费intg;//功能费doubleshinei;//市内话费doublechangtu;//长途话费doublezonghe;//总和}hfd[100];constinta=25,b=6;//a为月租费,b为来电显示费constdoublec=0.1,d=0.7;//c为市内电话单价,d为长途电话单价voidjisuan();//计算所有话费信息voidmenu();//显示菜单doubleshijian(char[],char[]);//计算单次通话时长voidjilu(char[]);//显示个人所有通话记录voidxiangxi(char[]);//显示个人话费账单voidsavefile(char[]);//保存个人所有通话记录-voidcheck(char[]);//检查号码通话时长是否大于三天,并显示和保存异常话单intmain(){inte;//e为所选操作项目序号charf;//f为记录是否继续操作(Y或N)charp1[9];//电话号码字符串jisuan();printf(欢迎进入电信计费模拟系统\n);printf(*****************************************************************************\n);printf(请输入您的号码:\n);gets(p1);menu();do{printf(请选择您要进行的操作:\n);scanf(%d,&e);switch(e){case1:jilu(p1);break;case2:xiangxi(p1);break;case3:savefile(p1);break;case4:check(p1);break;case0:exit(0);default:printf(\n%d不可用,e);}printf(\n是否继续(Y/N)?\n);getchar();f=getchar();}while(f=='Y'||f=='y');return0;}voidjisuan()//打开文件,并生成“费用详单”文件{inti=0,j=0;intnum1;//num1为来电显示费用-doublet,changtuhf=0.0,shineihf=0.0,sum=0.0;//changtuhf长途话费累加变量,shineihf市内话费累加变量,sum话费总和FILE*fp1,*fp2,*fp3;fp1=fopen(D:\\话单记录.txt,r);fp2=fopen(D:\\用户资料.txt,r);fp3=fopen(D:\\费用详单.txt,w);if(!fp1){printf(filecannotbeopened);exit(0);}if(!fp2){printf(filecannotbeopened);exit(0);}if(!fp3){printf(filecannotbeopened);exit(0);}for(i=0;!feof(fp2);i++){fscanf(fp2,%s%s%s%s,&yhzl[i].name1,&yhzl[i].name2,&yhzl[i].phone,&yhzl[i].YN);for(j=0;!feof(fp1);j++){fscanf(fp1,%s%s%s%s,&hd[j].number1,&hd[j].number2,&hd[j].qishi,&hd[j].zhongzhi);if(strcmp(yhzl[i].phone,hd[j].number1)==0)//找出所选号码对应的通话记录{if(strcmp(yhzl[i].YN,Y)==0)//判断是否开通来电显示功能num1=b;elsenum1=0;t=shijian(hd[j].qishi,hd[j].zhongzhi);if((t-(int)t)0)t=(int)t+1;elset=(int)t;if(hd[j].number2[0]=='0')changtuhf+=d*t;elseshineihf+=c*t;}}sum=a+num1+shineihf+changtuhf;fprintf(fp3,%-10s%-6s%-10s%-10d%-10d%-15lf%-15lf%-15lf\n,yhzl[i].phone,yhzl[i].name1,yhzl[i].name2,-a,num1,shineihf,changtuhf,sum);rewind(fp1);changtuhf=0.0,shineihf=0.0,sum=0.0;}fclose(fp1);fclose(fp2);fclose(fp3);}voidmenu(){printf(*****************************************************************************\n);printf(请选择需要的服务:\n);printf(*****************************************************************************\n);printf(1-通话记录显示\n);printf(2-详细话费\n);printf(3-保存话费\n);printf(4-检测通话时长异常\n);printf(0-退出\n);printf(*****************************************************************************\n);}voidjilu(charphone1[])//利用用户输入的号码进行顺序查找并将找到的客户信息输出{inti=0;FILE*tt;tt=fopen(D:\\话单记录.txt,r);if(!tt){printf(filecannotbeopened);exit(0);}-fscanf(tt,%s%s%s%s,&hd[i].number1,&hd[i].number2,&hd[i].qishi,&hd[i].zhongzhi);while(!feof(tt)){if(strcmp(hd[i].number1,phone1)==0)fprintf(stdout,%-10s%-10s%-20s%-20s\n,hd[i].number1,hd[i].number2,hd[i].qishi,hd[i].zhongzhi);i++;fscanf(tt,%s%s%s%s,&hd[i].number1,&hd[i].number2,&hd[i].qishi,&hd[i].zhongzhi);}fclose(tt);}voidxiangxi(charphone1[])//将用户月租费、功能费、市话费、长途费和合计显示在屏幕上{inti=0;FILE*ss;ss=fopen(D:\\费用详单.txt,r);if(!ss){printf(filecannotbeopened);exit(0);}fscanf(ss,%s%s%s%d%d%lf%lf%lf,&hfd[i].haoma,&hfd[i].xingming1,&hfd[i].xingming2,&hfd[i].y,&hfd[i].g,&hfd[i].shinei,&hfd[i].changtu,&hfd[i].zonghe);while(!feof(ss)){if(strcmp(hfd[i].haoma,phone1)==0){printf(用户号码用户姓名月租费功能费市话费长途费合计\n);printf(%-10s%-6s%-10s%-10d%-10d%-10.3lf%-10.3lf%-10.3lf\n,hfd[i].haoma,hfd[i].xingming1,hfd[i].xingming2,hfd[i].y,hfd[i].g,hfd[i].