选题:设计一个模拟电信计费程序
1.假设电信计费标准:固定电话长途话费0.02元 / 秒,固定电话本地话费0.06元 / 分,
无线电话长途话费1.00元 / 分,无线电话本地话费0.60元 / 分 ,无线电话接听话费0.50元 / 分。
2.源数据文件中存放:电话号码,电信服务类别,通话时间(秒)。
3.生成固定长途电话文件:长途电话号码和通话时间。
4.生成固定本地电话文件:本地电话号码和通话时间。
5.生成无线长途电话文件:长途电话号码和通话时间。
6.生成无线本地电话文件:本地电话号码和通话时间。
7.生成无线接听电话文件:接听电话号码和通话时间。
8.生成统计电信费用文件:电话号码、累计电信费用。
技术路线: } 2.功能篇 } void log(char ss[]) } int queryBill(const char *logUser) } } 源代码:
主要运用了C语言和C++的一些知识,侧重使用C语言
#define User_NUM 6
#define FDT 1 // 固定长途
#define FLT 2 // 固定本地
#define WDT 4 // 无线长途
#define WLT 8 // 无限本地
#define WAP 16 // 无线接听
首先先用define定义一些变量,方便读者读懂程序
char *userTel[User_NUM] ={“15271766778”,“13429806441”,“18062612126”};
char *codeStr[User_NUM] ={“yv332a”,“rrh44c”,“0dh52m”};
并且使用char类型指针变量存放电话号码和密码
1)格式设计篇
ui界面的设计以及load大标志的转场
1.Ui界面的设计:使用const函数,与char类型的指针来判定账号的状态
onst是一个C语言的关键字,它限定一个变量不允许被改变。使用const在一定程度上可以提高程序的健壮性,另外,在观看别人代码的时候,清晰理解const所起的作用,对理解对方的程序也有一些帮助。
void welcome_ui(const char *logUser)//ui登录界面的设计,char *logUser是声明了一个指向char类型的指针变量,来判断账号是否登录
{
cout<<" “<
if(NULL == logUser)//如果logUser为空则,代表没有登录,所以账号显示为待登录
{
printf("\t\t\t= = = 状态:[ 待登录 ] = = = \n");
}
else
{
printf("\t\t= = = 手机号码: %s = = =\n",logUser);
}
printf(" ====================================================\n");
printf("\t\t 1. 登陆 \n");
printf("\t\t 2. 查询电话账单 \n");
printf("\t\t 0. 退出系统 \n");
cout<<"\t\t 使 用 事 项 “<
功能1:登录功能
主要有输入相应的电话号码和其相应的密码后才能查看话费
同样是以const函数保证代码的健壮性,并且把电话号码作为char类型的指针变量,方便做比较以验证密码与账号是否匹配
int matchUserAndCode(const char *tel,const char *code)//匹配账号与密码
{
int ret = -1,i =0,id =-1;
if(NULL == tel || NULL == code ) //如果账号与密码为空则返回-1
return -1;
for(i =0 ;i < User_NUM;i++) //这里的User_NUM前面已定义为6
{
if( 0 ==strncmp(tel,userTel[i],11) )//如果输入的号码匹配和是11位,
则返回0值,
{
id = i ;
ret =0 ;
break;
}}
if(-1 == ret)
{
ret = 1;
return ret ;
}
if( 0 != strncmp(code,codeStr[id],6) )//判断密码是否与上面的账号相匹配
{
ret = 2 ;
}
return ret ;
{
char user[12] ="\0",code[7] ="\0";//电话号码是11位数,密码是6位数
int matchState =0,count =1;//count的作用是计算输入错误的次数,以判断其是否会过试用次数
while(count <= 3)//有三次输入的机会
{
if(count >1)
printf("\n\t\t 输入有错误,请重新输入 \n");
printf(“请输入的手机号:\n”);
printf(“手机号:”);
scanf("%s",user);
printf(“密码:”); scanf("%s",code);
if(11 == strlen(user) && 6 == strlen(code))//如果符合格式就跳出循环
break;
else
{
count++;//每错误一次count都会+1
}
}
if(count >=4) //错误超过3次直接强制退出
{
clear_screen();
printf("========== 错误次数过多 ========== \n\n");
welcome_ui(NULL);
}
else
{
matchState = matchUserAndCode(user,code);
switch(matchState)
{
case 0:
clear_screen();
load();
clear_screen();
printf("\n=== 已 登 陆 ===\n\n");
strncpy(ss,user,11);
ss[11] ='\0';
login_flag =1 ;
welcome_ui(user);
break;
case 1:
clear_screen();
printf(" \n查询失败\n\n");
welcome_ui(NULL);
break;
case 2:
clear_screen();
printf(" \n密码错误\n\n");
welcome_ui(NULL);
break;
default:
break;
}
}
功能2:话费时间生成以及记录
利用二维数组配合文件生成话费的时间,在配合for循环算出话费,其中要判断文件是否可以打开等等操作,用 if (NULL == fpRead)判断。
再用二维数组给时间赋值,最后得出话费
{
int i = 0,j =0,id =-1;
int k[6][2] = {0};
int tel_time[6][5] = {0};
char *ss[] ={“C:/Users/DELL/Desktop/ccc/FDT.txt”,“C:/Users/DELL/Desktop/ccc/FLT.txt”,“C:/Users/DELL/Desktop/ccc/WDT.txt”,“C:/Users/DELL/Desktop/ccc/WLT.txt”,“C:/Users/DELL/Desktop/ccc/WAP.txt”};for(i =0 ;i < User_NUM;i++)
{
if( 0 == strncmp(logUser,userTel[i],6) )
{
id = i ;
break;
}
}
if(id <0 || id >5)
return -2;
for(i =0;i < 5; i++)
{
FILE *fpRead = fopen(ss[i], "r");
if (NULL == fpRead)
{
return -1;
}
j =0 ;
while ( fscanf(fpRead, "%d|%d",\
&k[j][0], &k[j][1]) !=EOF )
{
if(j >5)
break;
else
j++;
}
fclose(fpRead);
for(j =0 ;j < 6;j++)
{
if(k[j][0] >=1 && k[j][0] <=6)
{
tel_time[k[j][0]-1][i] = k[j][1];
j++;
}
else
{
printf(" 信息被修改\n");
welcome_ui(logUser);
break;
}
}
}
printf("\n 您的本月话费账单如下:\n");
printf(" 手机号码:%s\n",userTel[id]);
printf("|||---- 固定长途:%d分钟,产生费用%.2f元\n",tel_time[id][0],0.02*tel_time[id][0]);
printf("|||---- 固定本地:%d分钟,产生费用%.2f元\n",tel_time[id][1],0.06*tel_time[id][1]);
printf("|||---- 无线长途:%d分钟,产生费用%.2f元\n",tel_time[id][2],1.00*tel_time[id][2]);
printf("|||---- 无线本地:%d分钟,产生费用%.2f元\n",tel_time[id][3],0.60*tel_time[id][3]);
printf("|||---- 无线接听:%d分钟,产生费用%.2f元\n",tel_time[id][4],0.50*tel_time[id][4]);
printf("|||---- 总计费用%.2f元\n\n",0.02*tel_time[id][0]\
+0.06*tel_time[id][1]+1.00*tel_time[id][2]\
+0.60*tel_time[id][3]+0.50*tel_time[id][4]);
功能3:退出程序
根据user的指令来操作是否退出系统
void logOut(char *user)
{
if(NULL == user)
return;login_flag =0 ;
clear_screen();
welcome_ui(NULL);
#include