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

程序设计题九:电信优惠套餐推荐系统的设计与实现
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;//初始化为-1 switch(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)++;//数组长度+1 system("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)--;//数组长度-1 for(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; } 

原文链接:https://blog.csdn.net/u011256974/article/details/89207404?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522165277499316782390570638%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=165277499316782390570638&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~times_rank-9-89207404-null-null.nonecase&utm_term=%E4%BC%98%E6%83%A0

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
文明发言,共建和谐米科社区
提交
头像

昵称

取消
昵称表情图片