C语言/C++程序设计大作业之模拟电信计费系统

C语言/C++程序设计大作业之模拟电信计费系统

项目GitHub:https://github.com/zjm-cityboy/telBill-GitHub.git

选题:设计一个模拟电信计费程序
1.假设电信计费标准:固定电话长途话费0.02元 / 秒,固定电话本地话费0.06元 / 分,
无线电话长途话费1.00元 / 分,无线电话本地话费0.60元 / 分 ,无线电话接听话费0.50元 / 分。
2.源数据文件中存放:电话号码,电信服务类别,通话时间(秒)。
3.生成固定长途电话文件:长途电话号码和通话时间。
4.生成固定本地电话文件:本地电话号码和通话时间。
5.生成无线长途电话文件:长途电话号码和通话时间。
6.生成无线本地电话文件:本地电话号码和通话时间。
7.生成无线接听电话文件:接听电话号码和通话时间。
8.生成统计电信费用文件:电话号码、累计电信费用。

技术路线:
主要运用了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<<" “<<endl;
printf(” \t\t\t= = = |电信查询系统| = = = \n");
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 使 用 事 项 “<<endl;
cout<<”\t\t ①按1,然后输入您的手机号和密码 “<<endl;
cout<<”\t\t ②登录后按2,查询您本月电话账单 "<<endl;

}

2.功能篇
功能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 ;

}

void log(char ss[])
{
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 queryBill(const char *logUser)
{
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 <stdio.h>
#include <string.h>
#include <stdlib.h>
#include<iostream>
#include<string>
#include<time.h>
using namespace std;

#define User_NUM  4
#define FDT   1    // 固定长途
#define FLT   2    // 固定本地
#define WDT   4    // 无线长途
#define WLT   8    // 无限本地
#define WAP   16   // 无线接听

char *userTel[User_NUM] ={"15271766778","13429806441","18062612126"};
char *codeStr[User_NUM] ={"yv332a","rrh44c","0dh52m"};
static int login_flag =0 ;

void clear_screen()
{
    system("cls");
}  

void welcome_ui(const char *logUser)//ui登录界面的设计,char *logUser是声明了一个指向char类型的指针变量,来判断账号是否登录
{
       cout<<" "<<endl;
    printf(" \t\t\t= = =      |电信查询系统|  = = =  \n");
    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                  *使 用 事 项*                  "<<endl;
    cout<<"\t\t                  ①按1,然后输入您的手机号和密码                  "<<endl;
    cout<<"\t\t                  ②登录后按2,查询您本月电话账单                   "<<endl;
    
  
}

void load()                    
{
	int i, count = 0;
	char str[50], str1[50];
	time_t t1, *t = &t1;
	/*t1=time(NULL)或t1=time(0)
	将空指针传递给time()函数
	并将time()返回值赋给变量t1*/
	printf("\n\n\n\n\n\n");
	printf("\t*                                                *\n");
	printf("\t*                                                *\n");
	printf("\t*                                                *\n");
	printf("\t*                                                *\n");
	printf("\t*           * * * * *     * * * * *              *\n");
	printf("\t*           *       *     *       *              *\n");
	printf("\t*           *       *     *       *        * * * *\n");
	printf("\t*           *       *     *       *        *     *\n");
	printf("\t*           *       *     *       *        *     *\n");
	printf("\t*           *       *     *      * *       *     *\n");
	printf("\t* * * * *   * * * * *     * * *  * * *     * * * *\n");
	i = 6;
	do {
		t1 = time(NULL);   /*t是空指针(NULL),直接返回当前时间。*/
		strcpy(str, ctime(t));
		if (count == 6) break;
		while (strcmp(str, str1) != 0)
			/*strcmp函数是string compare(字符串比较)的缩写
			当s1<s2时,返回为负数;
			当s1=s2时,返回值 = 0;
			当s1>s2时,返回正数。*/
		{
			strcpy(str1, str);//这里的目的是一秒输出一个>然后转换页面
			printf(" >");
			count++;
			break;
		}
	} while (1);
	system("cls");//清屏操作
    
}

int matchUserAndCode(const char *tel,const char *code)//判断是否匹配机制
{
    int ret = -1,i =0,id =-1;
    if(NULL == tel || NULL == code )
        return -1;
    for(i =0 ;i < User_NUM;i++)
    {
        if( 0 ==strncmp(tel,userTel[i],11) )
        {
            id = i ;
            ret =0 ;
            break;
        }

    }
    if(-1 == ret)
    {
         ret = 1;
         return ret ;
    }

    if( 0 != strncmp(code,codeStr[id],6) )
    {
        ret = 2 ;
    }
    return ret ;
}


void log(char ss[])
{
    char user[12] ="\0",code[7] ="\0";
    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++;//每输入错误一次,都会增加计数
        }
    }
    if(count >=4)
    {
        clear_screen();
        printf("==========  错误次数过多  ========== \n\n");
        welcome_ui(NULL);
    }
    else
    {
        matchState = matchUserAndCode(user,code);//按照return的数字配合if来完成相应的功能
        switch(matchState)
        {
            case 0://返回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://返回1,查询失败
                clear_screen();
                printf("      \n查询失败\n\n");
                welcome_ui(NULL);
                break;

            case 2:
                clear_screen();//返回2,说明输入的密码错误,返回最开始的登录ui
                printf("      \n密码错误\n\n");
                welcome_ui(NULL);
                break;

            default:
                break;

        }
    }
}

int queryBill(const char *logUser)
{
    int i = 0,j =0,id =-1;
    int k[6][2] = {0};
    int tel_time[6][5] = {0};
   char *ss[] ={"C:/Users/pc/Desktop/ccc/FDT.txt","C:/Users/pc/Desktop/ccc/FLT.txt","C:/Users/pc/Desktop/ccc/WDT.txt","C:/Users/pc/Desktop/ccc/WLT.txt","C:/Users/pc/Desktop/ccc/WAP.txt"};

    for(i =0 ;i < User_NUM;i++)
    {
        if( 0 == strncmp(logUser,userTel[i],11) )
        {
            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)//打开失败,返回-1
        {
            return -1;
        }
        j =0 ;
        while ( fscanf(fpRead, "%d|%d",\
                              &k[j][0], &k[j][1]) !=EOF ) // fscanf为文件标准输入,EOF是文件结束的标志,它等于NULL,也就是0.
        {
           
            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]);

}

void logOut(char *user)
{
    if(NULL == user)
        return;
    
    login_flag =0 ;
    clear_screen();
    welcome_ui(NULL);
}

int main(void)
{
    char activeUser[12] = {"\0"};
    int user_choice =-1 ,flag =1;

    welcome_ui(NULL);
    while(flag)
    {
        printf("\t\t            请输入需要的服务:    ");
        scanf("%d",&user_choice);
        if( 1 == user_choice )
        {
            log(activeUser);
        }
        else if(2 == user_choice)
        {
            if( 0 == login_flag)
            {
                printf("\n\t\t===========   系统需先登录   ===========\n\n");
                welcome_ui(NULL);
            }
            else
            {
                queryBill(activeUser);
            }
        }
        
        else if( 0 == user_choice)
        {
            printf("\n\t\t===========  服务已结束 ===========\n");
            flag =0 ;
        }

    }
    system("pause");
    return 0;
}

在这里插入图片描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述

  • 11
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值