1 条题解
-
0
说明
该程序模拟了冈瓦纳电信公司的通话计费系统,根据通话距离和时段的不同,按照不同的费率计算通话费用。程序读取输入的通话记录,计算各时段的通话分钟数及总费用,并格式化输出结果。
算法标签
- 模拟
- 时间处理
- 条件判断
解题思路
- 问题分析:根据通话的起始时间和结束时间,将通话时间划分为不同的时段(白天、晚间、夜间),并根据计费等级(A-E)计算各时段的费用。
- 输入处理:读取计费等级、被叫号码、通话起始时间和结束时间。
- 时间分段:将通话时间按不同费率时段分割,统计各时段的通话分钟数。
- 费用计算:根据各时段的通话分钟数和对应的费率,计算总费用。
- 输出结果:格式化输出被叫号码、各时段通话分钟数、计费等级和总费用。
分析
- 费率时段划分:
- 白天(8:00-18:00):费率A-E分别为0.10、0.25、0.53、0.87、1.44。
- 晚间(18:00-22:00):费率A-E分别为0.06、0.15、0.33、0.47、0.80。
- 夜间(22:00-8:00):费率A-E分别为0.02、0.05、0.13、0.17、0.30。
- 时间处理:将时间转换为分钟数,便于计算各时段的通话分钟数。
- 特殊情况处理:通话跨越午夜的情况需要分段计算。
实现步骤
- 初始化费率表:使用结构体数组存储不同计费等级的各时段费率。
- 读取输入:循环读取输入数据,直到遇到
#
结束。 - 时间转换:将起始时间和结束时间转换为分钟数。
- 时段统计:
- 如果起始时间小于结束时间,直接遍历统计各时段。
- 如果起始时间等于结束时间,视为24小时通话。
- 如果起始时间大于结束时间,通话跨越午夜,需分段统计。
- 费用计算:根据统计的各时段分钟数和对应费率,计算总费用。
- 输出结果:按格式输出结果。
代码解释
- 数据结构:
price
结构体:存储计费等级和各时段费率。s
数组:初始化五个计费等级的费率。
- 输入处理:
- 读取计费等级、被叫号码、起始时间和结束时间。
- 将时间转换为分钟数以便处理。
- 时段统计:
- 使用
getprice
函数判断当前分钟所属时段,并统计各时段分钟数。 - 处理通话跨越午夜的情况。
- 使用
- 费用计算:根据各时段分钟数和费率累加总费用。
- 输出:格式化输出被叫号码、各时段分钟数、计费等级和总费用。
该程序通过精确的时间分段和费率计算,高效地模拟了通话计费过程,并正确输出了各次通话的费用详情。
代码
#include<iostream> #include<stdio.h> typedef struct price{ char step; double a; double b; double c; }price; price s[5]={ {'A',0.10,0.06,0.02 }, {'B',0.25,0.15,0.05}, {'C',0.53,0.33,0.13}, {'D',0.87,0.47,0.17}, {'E',1.44,0.80,0.30}}; char phone_number[8]; char tt; int sh,sm,eh,em; int startindex; int endindex; int a,b,c; inline double getprice(int i,int index) { //printf(" %d\n",i); if(i<=480){c++;return s[index].c;} if(480<i&&i<=1080){a++;return s[index].a;} if(1080<i&&i<=1320){b++;return s[index].b;} if(i>1320){c++;return s[index].c;} } int main(int argc, char *argv[]) { //freopen("1.in","r",stdin); scanf("%c",&tt); while(tt!='#'){ char cc=tt; scanf("%s",phone_number); scanf("%d %d %d %d",&sh,&sm,&eh,&em); a=b=c=0; int index=0; for(;index<5;++index) { if(s[index].step==cc) break; } int E=eh*60+em; int S=sh*60+sm; double sum=0; if(S<E){ for(int i=S+1;i<=E;++i) { sum+=getprice(i,index); } } else if(S==E) { for(int i=S+1;i<=1440;++i) sum+=getprice(i,index); for(int i=1;i<=E;++i) sum+=getprice(i,index); } else { for(int i=S+1;i<=1440;++i) sum+=getprice(i,index); for(int i=1;i<=E;++i) sum+=getprice(i,index); } printf("%10s%6d%6d%6d%3c%8.2lf\n", phone_number, a, b,c, cc, sum); scanf("\n%c",&tt); } return 0; }
- 1
信息
- ID
- 216
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者