电信优惠套餐推荐系统的设计与实现

2024-06-02 21:48

本文主要是介绍电信优惠套餐推荐系统的设计与实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

程序设计题九:电信优惠套餐推荐系统的设计与实现
1 问题描述
电信公司常常推出各种类型的优惠套餐,体现上上网流量、语音通话、资费上的各种优惠。要求设计一个优惠套餐推荐系统,将各种优惠套餐的情况存于文件中,系统提供办理业务的用户输入功能,主是提供自己希望得到的优惠,系统根据用户需求和已有套餐自动去匹配,挑选出最合适的套餐推荐给用户。
2 功能要求
系统中主要有管理员和普通用户两种身份的用户,二者各具有不同的功能:
管理员:
(1)以密码登录系统(密码用*显示,不得显示输入的字符)
(2)管理优惠套餐(同学自己参考电信移动公司的优惠政策)的具体信息,主要包括:优惠套餐编号(主关键字,唯一)月资费、通话时长、4G流量、宽带带宽等。管理员可以增加、删除、修改具体优惠套餐的信息
(3)可以管理并查询所有用户所享受的优惠套餐政策
普通用户:
(1) 逐条输入(或根据选项来选择)自己希望享受的各优惠条件,具体到每月通话时常、4G流量需求,是否需要宽带等;
(2)在系统给出推荐的优惠套餐之后,进行确认
(3)可以随时查询本人的优惠套餐具体信息,可根据需要提出变更需求,系统再为其重新计算和推荐。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>#define Max_Size 100/*定义数组长度*/typedef struct _USER_Info/*记录管理员及用户账户*/
{int flag;/*区分用户和管理员  1代表用户 0代表管理员*/int no;/*优惠套餐编号*/char user_count[20];/*账户(字符串)*/char user_code[20];/*密码*/
}USER,*PUSER;typedef struct _Combo/*记录套餐信息*/
{int no;/*套餐编号*/float no_price;/*月资费*/int second;/*通话时长*/float flux_4g;/*4g流量*/int band_with;/*宽带带宽*/
}Combo,*PCombo;/*
*函数功能:注册用户
*参数1:PUSER user 传递用户数组首地址
*参数2:int* n     传递数组长度变量地址
*/
void User_Regest(PUSER user,int* n)
{system("cls");//清屏user[*n].flag=1;//设置权限为用户user[*n].no=-1;//未选择套餐printf("请输入用户账号:");scanf("%s",user[*n].user_count);//直接加入到数组尾部  *n为数组最后一个元素printf("请输入用户密码:");scanf("%s",user[*n].user_code);printf("注册成功!\n");system("pause");//暂停(*n)++;//数组长度+1
}/*
*函数功能:注册管理员
*参数1:PUSER user 传递用户数组首地址
*参数2:int* n     传递数组长度变量地址
*/
void Admin_Red(PUSER user,int* n)
{system("cls");user[*n].flag=0;//设置权限为管理员 其它和注册用户相同printf("请输入管理员账号:");scanf("%s",user[*n].user_count);printf("请输入管理员密码:");scanf("%s",user[*n].user_code);printf("注册成功!\n");system("pause");(*n)++;
}/*
*函数功能:输入账号密码登录
*参数1:PUSER user 传递用户数组首地址
*参数2:int n      传递数组长度
*返回值:-3代表登录失败 
*返回值:[0,n-1]中的任意一个 代表登录成功的用户或管理员数组下标
*/
int Log_In(PUSER user,int n)
{int i;char name[20],code[20];//记录账号密码system("cls");printf("请输入账号:");scanf("%s",name);fflush(stdin);//情况输入流 避免读取回车printf("请输入密码:");i=0;while(code[i]=getch())//循环获取输入流数据赋值给code[i]{if(code[i] == '\r')//如果获取的字符为回车{code[i]='\0';//给字符串添加结尾printf("\n");//输出回车break;//跳出获取字符}printf("*");//如果输入的不是回车  在屏幕输出*代替按键i++;//下标+1}for(i=0;i<n;i++)//遍历用户结构体数组{if(!strcmp(name,user[i].user_count)&&!strcmp(code,user[i].user_code))//如果账号密码都正确{break;//跳出循环}}if(i==n)//如果一直没跳出循环 说明账号密码不对{printf("密码不正确!\n");system("pause");return -3;//返回-3代表账号密码不正确}printf("登录成功!\n");system("pause");return i;//返回i是查找到的用户或管理员在数组内的位置下标
}/*
*函数功能:提供用户主选择菜单
*参数1:PUSER user 传递用户数组首地址
*参数2:int* n     传递数组长度地址
*返回值:-2代表退出系统
*返回值:[0,n-1]中的任意一个 代表登录成功的用户或管理员数组下标
*/
int Main_Menu(PUSER user,int*n)/*主菜单*/
{int chioce,flag;/*记录选择与函数返回值*/do{system("cls");printf("1:登录\n");printf("2:用户注册\n");printf("3:管理员注册\n");printf("0:退出系统\n");printf("请输入选择:");//提供选择菜单scanf("%d",&chioce);//获取选择while (chioce<0||chioce>3)//判断选择是否正确 是否是0-3范围{printf("请重新输入:");//不正确重新获取scanf("%d",chioce);}flag=-1;//初始化为-1switch(chioce){case 1:flag=Log_In(user,*n);/*返回编号为用户下标 或者登陆失败-2*/break;case 2:User_Regest(user,n);/*注册用户*/break;case 3:Admin_Red(user,n);/*注册管理员*/break;case 0:flag = -2;//退出程序break;}if(flag==-2){return flag;/*退出程序*/}else if(flag==-3){;//登录失败 不操作}else if(flag==-1){;//选择了2或3号功能 不操作}else//返回说明登录成功{break;//跳出循环}}while(chioce!=0);return flag;//返回用户下标}/*
*函数功能:打印用户信息
*参数1:PUSER user 传递用户数组首地址
*参数2:int* n     传递数组长度地址
*参数3:PCombo com 传递套餐数组首地址
*参数4:int com_n  传递数组长度
*/
void Print_User_Info(PUSER user,int n,PCombo com,int com_n)
{int i,temp,j;system("cls");printf("%-10s%-10s%-10s%-10s%-10s%-10s\n","账号","套餐编号","月咨费","通话时长","4G流量","宽带带宽");//显示在第一行for(i=0;i<n;i++)//遍历数组{if(user[i].flag==1)//如果是用户{printf("%-10s",user[i].user_count);//输出用户账号temp=user[i].no;if(temp==-1)//如果套餐号为-1  说明没有选择{printf("未选择套餐!\n");continue;//跳过本次循环}printf("%-10d",temp);//输出套餐号for(j=0;j<com_n;j++)//遍历数组{if(temp==com[j].no)//查找到套餐{printf("%-10.2f",com[j].no_price);printf("%-10d",com[j].second);printf("%-10.2f",com[j].flux_4g);printf("%-10d\n",com[j].band_with);break;//输出套餐信息  并跳出查找套餐}}}}
}/*
*函数功能:打印套餐信息
*参数1:PCombo com 传递套餐数组首地址
*参数2:int com_n  传递数组长度
*/
void Print_Com_Info(PCombo com,int n)
{int i;system("cls");printf("%-10s%-10s%-10s%-10s%-10s\n","套餐编号","月咨费","通话时长","4G流量","宽带带宽");//显示在第一行for(i=0;i<n;i++)//遍历数组打印{printf("%-10d",com[i].no);printf("%-10.2f",com[i].no_price);printf("%-10d",com[i].second);printf("%-10.2f",com[i].flux_4g);printf("%-10d\n",com[i].band_with);}
}/*
*函数功能:用户选择套餐
*参数1:PCombo com 传递套餐数组首地址
*参数2:int who    传递当前用户下标
*参数3:PCombo com 传递套餐数组首地址
*参数4:int n      传递数组长度
*/
void Chioce_User_No(PUSER user,int who,PCombo com,int n)
{int temp,i;printf("请选择套餐编号:");scanf("%d",&temp);for(i=0;i<n;i++)//遍历数组{if(temp==com[i].no)//查找套餐{user[who].no=temp;//找到则添加printf("选择成功!\n");system("pause");return ;//添加后结束函数}}printf("无该套餐编号!\n");system("pause");
}/*
*函数功能:用户选择菜单
*参数1:PCombo com 传递套餐数组首地址
*参数2:int who    传递当前用户下标
*参数3:PCombo com 传递套餐数组首地址
*参数4:int n      传递数组长度
*/
void user_Menu(PUSER user,int who,PCombo com,int n)
{int chioce;/*记录选择与函数返回值*/do{system("cls");printf("1:查看本人套餐\n");printf("2:重新选择套餐\n");printf("0:返回\n");printf("请输入选择:");scanf("%d",&chioce);//显示用户选择 获取选择while (chioce<0||chioce>2)//判断选择范围是否正确{printf("请重新输入:");//不正确则重新获取scanf("%d",chioce);}switch(chioce)//根据选择 进行判断  进入具体函数{case 1:Print_User_Info(&user[who],1,com,n);//打印用户信息 1代表只输出1个system("pause");break;case 2:Print_Com_Info(com,n);//打印套餐信息Chioce_User_No(user,who,com,n);//进入选择套餐函数break;}}while(chioce!=0);//当选择为0时  退出
}/*
*函数功能:添加套餐
*参数1:PCombo com 传递套餐数组首地址
*参数2:int* n     传递数组长度地址
*/
void Add_Com(PCombo com,int* n)
{system("cls");printf("请输入套餐编号:");//根据提示 输入新套餐信息 加在数组末尾scanf("%d",&com[*n].no);printf("请输入套餐月资费:");scanf("%f",&com[*n].no_price);printf("请输入套餐通话时长:");scanf("%d",&com[*n].second);printf("请输入套餐4G流量:");scanf("%f",&com[*n].flux_4g);printf("请输入套餐宽带:");scanf("%d",&com[*n].band_with);printf("添加成功!\n");(*n)++;//数组长度+1system("pause");
}/*
*函数功能:删除套餐
*参数1:PCombo com 传递套餐数组首地址
*参数2:int user_n 传递数组长度
*参数3:PCombo com 传递套餐数组首地址
*参数4:int* com_n 传递数组长度地址
*/
void Del_Com(PUSER user,int user_n,PCombo com,int* com_n)
{int i,temp,j;system("cls");printf("请输入要删除的套餐编号:");scanf("%d",&temp);for(i=0;i<*com_n;i++)//遍历数组  查找{if(temp==com[i].no)//如果找到{break;//跳出循环}}if(i==*com_n)//如果没有找到{printf("无该套餐!删除失败!\n");system("pause");return ;//函数返回}for(j=i;j<*com_n;j++)//如果找到 将数组后面元素移动到前面 覆盖数据 达到删除效果{com[j]=com[j+1];//后一个元素覆盖前一个}(*com_n)--;//数组长度-1for(i=0;i<user_n;i++)//遍历用户数组{if(user[i].no == temp)//查找是否有被删除的套餐 如果有 将用户套餐设置为-1(未设置){user[i].no=-1;}}printf("删除成功!\n");system("pause");
}/*
*函数功能:修改套餐
*参数1:PCombo com 传递套餐数组首地址
*参数2:int* n     传递数组长度地址
*/
void MOD_Com(PCombo com,int* n)
{system("cls");int i,temp,j;system("cls");printf("请输入要修改的套餐编号:");scanf("%d",&temp);for(i=0;i<*n;i++)//遍历数组{if(temp==com[i].no)//查找编号{break;//找到则跳出}}if(i==*n)//如果没找到{printf("无该套餐!\n");system("pause");return ;//函数返回}Print_Com_Info(&com[i],1);//找到了则打印该套餐信息printf("请输入套餐月资费:");scanf("%f",&com[i].no_price);printf("请输入套餐通话时长:");scanf("%d",&com[i].second);printf("请输入套餐4G流量:");scanf("%f",&com[i].flux_4g);printf("请输入套餐宽带:");scanf("%d",&com[i].band_with);printf("修改成功!\n");//让管理员重新输入套餐信息system("pause");
}/*
*函数功能:管理员菜单
*参数1:PUSER user 传递套餐数组首地址
*参数2:int user_n 传递数组长度
*参数3:PCombo com 传递套餐数组首地址
*参数4:int* com_n 传递数组长度地址
*/
void Admin_Menu(PUSER user,int user_n,PCombo com,int* com_n)
{int chioce;/*记录选择与函数返回值*/do{system("cls");printf("1:添加套餐\n");printf("2:删除套餐\n");printf("3:显示套餐\n");printf("4:查看用户信息\n");printf("5:修改套餐\n");printf("0:返回\n");printf("请输入选择:");scanf("%d",&chioce);//提供选择 获取选择while (chioce<0||chioce>5)//判断范围是否正确{printf("请重新输入:");//不正确则重新获取scanf("%d",chioce);}switch(chioce)//根据选择进入相应功能{case 1:Add_Com(com,com_n);//添加套餐break;case 2:Del_Com(user,user_n,com,com_n);//删除套餐break;case 3:Print_Com_Info(com,*com_n);//打印套餐system("pause");break;case 4:Print_User_Info(user,user_n,com,*com_n);//打印用户信息system("pause");break;case 5:MOD_Com(com,com_n);//修改套餐break;}}while(chioce!=0);//选择为0  退出
}/*
*函数功能:保存用户与管理员信息
*参数1:PUSER user 传递套餐数组首地址
*参数2:int n      传递数组长度
*/
void Save_USER_File(PUSER user,int n)
{	int i;FILE* fp=fopen("user.txt","w+");//用写的方式打开文件if(fp==NULL)//打开失败则返回{		return ;	}	for(i=0;i<n;i++)	//循环写入文件{		fwrite(&user[i],sizeof(USER),1,fp);//每次写入一个结构体大小}	fclose(fp);//关闭文件
}/*
*函数功能:加载用户与管理员信息
*参数1:PUSER user 传递套餐数组首地址
*/
int Load_USER_File(PUSER user)
{	int i=0;FILE* fp=fopen("user.txt","r+");//用读的方式打开文件if(fp==NULL)//打开失败则返回	{		return 0;	}	while(fread(&user[i],sizeof(USER),1,fp))	//每次读取一个结构体大小{i++;//直到读取到文件结尾}fclose(fp);//关闭文件return i;//返回读取到的数据长度
}/*
*函数功能:保存套餐信息
*参数1:PCombo com 传递套餐数组首地址
*参数2:int n      传递数组长度
*/
void Save_com_File(PCombo com,int n)
{	int i;FILE* fp=fopen("com.txt","w+");//用写的方式打开文件if(fp==NULL)//打开失败则返回{		return ;	}	for(i=0;i<n;i++)//循环写入文件	{		fwrite(&com[i],sizeof(Combo),1,fp);//每次写入一个结构体大小}	fclose(fp);//关闭文件
}/*
*函数功能:加载套餐信息
*参数1:PCombo com 传递套餐数组首地址
*/
int Load_com_File(PCombo com)
{	int i=0;FILE* fp=fopen("com.txt","r+");//用读的方式打开文件if(fp==NULL)	//打开失败则返回{		return 0;	}	while(fread(&com[i],sizeof(Combo),1,fp))//每次读取一个结构体大小	{i++;//直到读取到文件结尾}	fclose(fp);//关闭文件return i;//返回读取到的数据长度
}/*
*主函数  程序入口点
*/int main(){int flag;USER user[Max_Size];/*记录用户数据*/int user_num=0;/*记录用户数量*/Combo com[Max_Size];/*记录套餐数据*/int com_num=0;/*记录套餐数*/user_num = Load_USER_File(user);//加载用户数据com_num = Load_com_File(com);/*读取文件*/do{flag = Main_Menu(user,&user_num);//运行主菜单if(flag == -2)//如果主菜单选择了0 返回-2 就是退出程序{Save_USER_File(user,user_num);//保存数据后 退出Save_com_File(com,com_num);exit(0);}switch(user[flag].flag)//根据用户的权限 判断是管理员还是用户{case 1:user_Menu(user,flag,com,com_num);/*进入用户菜单*/break;case 0:Admin_Menu(user,user_num,com,&com_num);/*进入管理员菜单*/break;}}while(1);return 0;}

这篇关于电信优惠套餐推荐系统的设计与实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1025175

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

基于人工智能的图像分类系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据预处理模型训练模型预测应用场景结论 1. 引言 图像分类是计算机视觉中的一个重要任务,目标是自动识别图像中的对象类别。通过卷积神经网络(CNN)等深度学习技术,我们可以构建高效的图像分类系统,广泛应用于自动驾驶、医疗影像诊断、监控分析等领域。本文将介绍如何构建一个基于人工智能的图像分类系统,包括环境

水位雨量在线监测系统概述及应用介绍

在当今社会,随着科技的飞速发展,各种智能监测系统已成为保障公共安全、促进资源管理和环境保护的重要工具。其中,水位雨量在线监测系统作为自然灾害预警、水资源管理及水利工程运行的关键技术,其重要性不言而喻。 一、水位雨量在线监测系统的基本原理 水位雨量在线监测系统主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构成,形成了一个完整的闭环系统。 数据采集单元:这是系统的“眼睛”,

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time