找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6708|回复: 0
打印 上一主题 下一主题
收起左侧

C语言超市会员信息管理系统源程序

[复制链接]
跳转到指定楼层
楼主
ID:359135 发表于 2018-6-26 10:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
超市会员信息管理系统
  1. #include <stdio.h>                  //编译预处理指令,引入头文件
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <conio.h>
  5. #define MAX 10                      //自定义符号常量
  6. #define MENU_MAIN_COUNT 7                     //主菜单的选项个数
  7. typedef struct member               //定义结构体类型member,采用链式存储结构
  8. {              
  9.         char name[MAX];                         //姓名
  10.         char id[MAX];                    //卡号
  11.         char sex[2];                             //性别
  12.         int age;                                     //年龄
  13.         float money;                             //余额
  14.         char tel[12];                         //电话
  15.         struct member *next;             //定义一个指针指向下一个会员信息
  16.         float cost;                                    //消费金额
  17. }mem;                                //定义结构体变量mem
  18.                                         /*声明函数*/
  19. void menu();                          /*声明函数,声明菜单函数*/               
  20. void save(mem *p);                     //声明保存函数

  21. mem *head=NULL;                                 //头指针为NULL
  22. mem* get_last(mem *p)                   //取得链表最后一个元素的节点指针并返回该指针
  23. {                                             
  24.                 if(p->next == NULL)
  25.                 {
  26.                         return p;
  27.                 }
  28.                 else
  29.                 {
  30.                         get_last(p->next);
  31.                 }
  32.         }



  33. void creat_member(mem *pNew)                                      //输入信息操作,会员登记函数
  34. {                                                                          //创建一个新的会员
  35.         char s;
  36.     printf("卡号:");                                        scanf("%s",pNew->id);     //运用指针输入卡号
  37.     printf("请输入姓名: ");                                scanf("%s",pNew->name);   //运用指针输入姓名
  38.     a:
  39.     printf("请输入性别(f--女m--男): ");        getchar();                //输入男女
  40.         s = getchar();
  41.         if(s=='f'||s=='m')                                            //判断是 男 是 女
  42.         {
  43.                 if (s == 'f' || s == 'F') strcpy(pNew->sex,"女");        
  44.                 if (s == 'M' || s == 'm') strcpy(pNew->sex,"男");      
  45.         }
  46.         else                                                           //如果输入错误
  47.         {
  48.                 printf("输入错误,请重新输入...\n");
  49.                 goto a;                                                    //跳转至a,重新输入
  50.         }
  51.     printf("请输入年龄: ");                                scanf("%d",&(pNew->age));   //运用指针输入年龄
  52.     printf("请输入缴费金额: ");                        scanf("%f",&(pNew->money));  //运用指针输入余额
  53.     printf("请输入电话: ");                                scanf("%s",pNew->tel);       //运用指针输入电话
  54.         pNew->cost=0;                                                    //运用指针初始化消费额为0
  55.     printf("\n创建完毕!\n");
  56. }


  57. void newMember()                                                    //会员登记函数
  58. {                                                                               //添加会员信息
  59.         char con='N';
  60.         mem *pLast= NULL;
  61.         mem *pNew=(mem *)malloc(sizeof(mem));                           //按 mem 动态分配内存
  62.         pNew->next=NULL;
  63.         creat_member(pNew);                                             //调用会员登记函数
  64.         if(head == NULL)
  65.         {
  66.                 head = pNew;
  67.         }
  68.         else
  69.         {
  70.                 pLast = get_last(head);
  71.                 pLast->next = pNew;
  72.         }
  73.         printf("继续输入会员信息?(Y 继续, N 返回菜单)");              //判断是否继续登记
  74.         getchar();
  75.         con = getchar();
  76.         if (con == 'n' || con == 'N')
  77.         {
  78.                 save(pNew);
  79.                 menu();
  80.         }
  81.         else{
  82.                 save(pNew);
  83.                 newMember();
  84.         }
  85. }                                                                 


  86.                                                                      //显示信息操作

  87. void table_head()                                             
  88. {                                                                             //定义表头
  89.         printf("+----------+------+------+------+--------+--------+-----------+\n");
  90.         printf("|   卡号   | 姓名 | 性别 | 年龄 |  余额  |累计消费|   电话    |\n");
  91.         printf("+----------+------+------+------+--------+--------+-----------+\n");       
  92. }
  93. void table_buttom()
  94. {                                                                       //定义底线
  95.         printf("+----------+------+------+------+--------+--------+-----------+\n");
  96. }  
  97. void table_row(mem *p)
  98. {                                                                        // 定义中间部分
  99.         printf("|%10s|%6s|%6s|%6d|%8.2f|%8.2f|%11s|\n",
  100.                         p->id,p->name,p->sex,p->age,p->money,p->cost,p->tel);
  101. }




  102. void display(mem *p)
  103. {                                                //显示所有信息
  104.         p = head;
  105.         table_head();                            //调用表头
  106.         while(p != NULL)
  107.         {
  108.                 table_row(p);                       //调用中间部分
  109.                 p = p->next;
  110.         }
  111.         table_buttom();                          //调用底线
  112. }


  113. void display_one(mem *p)
  114. {                                                //只显示一条信息
  115.         table_head();
  116.         table_row(p);
  117.         table_buttom();
  118. }


  119. void table_sum()
  120. {                                //定义总计
  121.         printf("+----------+------+------+------+--------+--------+-----------+\n");
  122.         printf("|          |      |      |      |  总计  |  总计  |           |\n");
  123.         printf("+----------+------+------+------+--------+--------+-----------+\n");       
  124. }
  125. void table_r(float money,float cost)
  126. {                              //定义总计2
  127.         printf("|          |      |      |      |%8.2f|%8.2f|           |\n",money,cost);
  128. }




  129. void display_statistics(mem *p,float money,float cost)
  130. {                                                                  //显示统计信息函数
  131.     p = head;
  132.         table_head();                                                 //调用表头
  133.         while(p != NULL)
  134.         {
  135.                 table_row(p);                                             //定义中间部分
  136.                 p = p->next;
  137.         }
  138.         p=head;
  139.         table_sum();                                                  //定义总计
  140.         table_r(money,cost);                                          //定义总计2
  141.         table_buttom();                                               //定义表尾
  142. }                                                                 //文件相关操作



  143. void save(mem *p)
  144. {                                                                             //保存函数
  145.         FILE *fp;                                                        //定义一个指向文件的指针变量
  146.     fp=fopen("member.dat", "a");                                     //将fopen函数的返回值赋给指针变量fp
  147.         while(p != NULL)
  148.         {
  149.                 fprintf(fp, "%s %s %s %d %f %s %d\n",p->id, p->name, p->sex, p->age, p->money, p->tel,p->cost);
  150.                 p = p->next;
  151.         }
  152.         fclose(fp);                                                       //关闭指针
  153.         getchar();                                                   
  154. }



  155. void modify_file(mem *p)
  156. {                                                                        //保存修改会员信息函数
  157.         FILE *fp;
  158.         p= head;
  159.         if((fp=fopen("member.dat", "w"))==NULL)
  160.         {                                                               //检查打开文件的操作是否有错
  161.                 printf("文件不存在");
  162.                 getchar();
  163.                 menu();                                                     //调用菜单函数
  164.         }
  165.         while(p != NULL)
  166.         {                                          
  167.                 fprintf(fp, "%s %s %s %d %f %s %f\n",p->id, p->name, p->sex, p->age, p->money, p->tel,p->cost);
  168.                 p = p->next;
  169.         }
  170.         fclose(fp);
  171.         getchar();
  172. }



  173. void load(mem *p)
  174. {                                                                  //从文件加载信息
  175.         FILE *fp;
  176.         mem *pLast = NULL;
  177.         head=NULL;
  178.         if((fp=fopen("member.dat","r"))==NULL)
  179.         {                                                         //检查打开文件的操作是否有错
  180.                 printf("没有会员信息,请录入!");
  181.                 getch();
  182.                 menu();                                               //调用菜单函数
  183.         }
  184.         while(!feof(fp))
  185.         {                                                         //文件指针是否到达末尾
  186.                 mem *pNew = (mem *)malloc(sizeof(mem));               //按 mem 动态分配内存
  187.                 pNew->next = NULL;
  188.                 fscanf(fp, "%s %s %s %d %f %s %f\n",
  189.                                         pNew->id, pNew->name, pNew->sex, &(pNew->age), &(pNew->money), pNew->tel,&(pNew->cost));
  190.                 if(head == NULL)
  191.                 {
  192.                         head = pNew;
  193.                 }  
  194.                 else
  195.                 {
  196.                         pLast = get_last(head);
  197.                         pLast->next = pNew;
  198.                 }               
  199.         }
  200.         p = head;
  201.         fclose(fp);
  202. }
  203.                                                           //通过卡号搜索信息函数


  204. mem* search_id(mem *p)
  205. {                                                               //通过卡号搜索信息
  206.         char id[MAX];
  207.         int i=0;
  208.         p = head;
  209.         scanf("%s",id);
  210.         while(p&&(strcmp(id,"n")!=0))
  211.         {                                                       //判断id是否不为n
  212.                 if(strcmp(p->id,id)==0)
  213.                 {                                                   //找到
  214.                         i=1;
  215.                         break;
  216.                 }
  217.                 else
  218.                         p=p->next;
  219.         }
  220.         if(strcmp(id,"n")==0)                                        //输入n时返回菜单
  221.                 menu();
  222.         if(p==NULL)
  223.         {                                                                   //重新搜索卡号
  224.                 printf("您查找的卡号不存在,请重新输入:\n");
  225.                 p=search_id(p);                                    //调用寻找函数
  226.         }
  227.         else
  228.                 return p;                                          //返回p
  229. }
  230.                                                            /*修改会员信息操作*/



  231. void modify_m()
  232. {                                                               //修改会员的信息

  233.         char s,fun='y';
  234.         char pro[] =                                 
  235.         "|\n"
  236.         "| 1 姓名\n"
  237.         "| 2 性别\n"
  238.         "| 3 年龄\n"
  239.         "| 4 电话\n"
  240.         "| 5 返回\n"
  241.         "|\n";
  242.         mem *p;
  243.         load(p);
  244.         display(p);                                    //调用显示函数
  245.         printf("请输入需要修改信息的会员卡号(n返回菜单):");
  246.         p=search_id(p);                                //调用按号寻找函数
  247.         while(fun=='y'||fun=='Y')
  248.         {                                              //当继续寻找时
  249.                 system("cls");                            //清屏
  250.                 display_one(p);                            //调用显示一条函数
  251.                 printf("请选择修改的项目:\n");            
  252.                 printf(pro);                               //输出pro
  253.                 getchar();
  254.                 scanf("%c",&fun);
  255.                 switch(fun)
  256.                 {                                           //用switch语句选择修改内容
  257.                             case '1':        printf("请输入姓名: ");                                scanf("%s",p->name);break;
  258.                             case '2':        a:
  259.                                                     printf("请输入性别(f--女m--男): ");        getchar();
  260.                                                         s = getchar();
  261.                                                         if(s=='f'||s=='m')
  262.                                                         {
  263.                                                                 if (s == 'f' || s == 'F') strcpy(p->sex,"女");
  264.                                                                 if (s == 'M' || s == 'm') strcpy(p->sex,"男");
  265.                                                         }
  266.                                                         else
  267.                                                         {
  268.                                                                 printf(">输入错误,请重新输入...\n");
  269.                                                                 goto a;
  270.                                                         }
  271.                                                         break;
  272.                             case '3':        printf("请输入年龄: ");                                scanf("%d",&(p->age));break;
  273.                             case '4':         printf("请输入电话: ");                                scanf("%s",p->tel);        break;
  274.                                 default :        break;
  275.                 }
  276.                 printf("是否继续修改Y/N?");                     //判断是否继续寻找
  277.                 getchar();  
  278.                 fun=getchar();
  279.         }
  280.         modify_file(p);                                    //调用保存修改会员信息函数                                      
  281.         system("cls");                                     //清屏
  282.         display_one(p);                                    //调用显示一条函数
  283.         printf("\n修改成功,按任意键继续!");
  284.         getchar();
  285.         menu();                                            //调用菜单函数
  286. }
  287.                                                        //会员续费函数


  288. void add()
  289. {                                                                   //会员续费
  290.         float money;
  291.         mem *p;
  292.         load(p);
  293.         display(p);                                        //调用浏览函数
  294.         printf("\n");
  295.         printf("请输入需要续费的会员卡号(n返回菜单):");
  296.         p=search_id(p);                                      //调用按号寻找函数
  297.         system("cls");                                       //清屏
  298.         display_one(p);                                      //调用显示一条函数
  299.         printf("请输入续费金额:");
  300.         scanf("%f",&money);
  301.         p->money+=money;                                      //续费
  302.         modify_file(p);                                        //调用保存修改会员信息函数
  303.         system("cls");                                         //清屏
  304.         display_one(p);                                        //调用显示一条函数
  305.         printf("续费成功,任意键继续!");
  306.         getchar();
  307.         menu();                                                  //调用菜单函数
  308. }
  309.                                                            //会员结算函数



  310. void consume()
  311. {                                                                     //会员结算
  312.         mem *p;
  313. float cost;
  314.         load(p);
  315.         display(p);                                                /* 调用浏览函数*/
  316.         printf("\n");
  317.         printf("请输入需要结算的会员卡号(n返回菜单):");
  318.         p=search_id(p);                                          //调用按号寻找函数   
  319.         system("cls");                                           //清屏
  320.         display_one(p);                                          //调用显示一条函数
  321.         printf("请输入花费金额:");
  322.         scanf("%f",&cost);
  323.         if(p->cost>=1000)
  324.         {                                                         //判断是否升级为vip
  325.                 printf("恭喜您已经升级为VIP,本次消费9折优惠。\n");
  326.                 printf("本次实际消费%.2f元!",cost*0.9);              //升级为vip,消费打9折
  327.                 cost*=0.9;
  328.                 if((p->money-cost)<0)
  329.                 {                                                     //判断余额是否充足
  330.                         printf("对不起,余额不足,请及时充值!");
  331.                         getchar();
  332.                         menu();            
  333.                 }
  334.                 p->cost+=cost;                                         
  335.                 p->money-=cost;                                       //消费
  336.                 getchar();
  337.         }
  338.         else
  339.         {
  340.                 if((p->money-cost)<0)
  341.                 {                                 //同上
  342.                         printf("对不起,余额不足,请及时充值!");
  343.                         getchar();
  344.                         menu();
  345.                 }
  346.                 p->cost+=cost;
  347.                 p->money-=cost;  
  348.         }
  349.         modify_file(p);                                       //调用保存修改会员信息函数
  350.         system("cls");                                         //清屏
  351.         display_one(p);                                       //调用显示一条函数
  352.         printf("结算成功,任意键继续!");
  353.         getch();
  354.         menu();                                               //调用菜单函数
  355. }
  356.                                                           /*会员退出函数*/



  357. void delete_m()
  358. {                                                              //删除会员信息
  359.         mem *p,*q=head,*thelast;
  360.         float money;
  361.         load(p);
  362.         display(p);                                           /* 调用浏览函数*/
  363.         printf("\n");
  364.         printf("请输入需要删除的会员卡号(n返回菜单):");
  365.         p=search_id(p);                                        //调用按号寻找函数
  366.         thelast=head;
  367.         if(p==head)
  368.         {                                                     //判断指针
  369.                 head=p->next;
  370.                 money=p->money;
  371.                 free(p) ;
  372.         }
  373.         else
  374.         {
  375.                 while(thelast)
  376.                 {
  377.                         if(thelast->next==p)
  378.                                 break;
  379.                         else
  380.                                 thelast=thelast->next;
  381.                 }
  382.                 thelast->next=p->next;
  383.                 money=p->money;
  384.                 free(p);
  385.         }
  386.         modify_file(q);                                           //调用保存函数
  387.         printf("退回余额%.2f元!\n",money);
  388.         printf("删除成功,按任意键继续!");                         //显示退回的余额
  389.         getch();
  390.         menu();                                                    //调用菜单函数
  391. }                                                                /*统计函数*/


  392. mem *sort_m()
  393. {                                                             //按缴费总额排序
  394.         mem *q,*tail,*p=(mem*)malloc(sizeof(mem));   
  395.         p->next=head;   
  396.         head=p;   
  397.         tail=NULL;                                                  //定义 tail
  398.         while(tail!=head->next)   
  399.         {
  400.                 p=head;   
  401.                 q=p->next;      
  402.                 while(q->next!=tail)  
  403.                 {                                                        //判断 q是否为空
  404.                         if(p->next->money>q->next->money)  
  405.                         {
  406.                                 p->next=q->next;                                 //比较大小,排序
  407.                                 q->next=q->next->next;   
  408.                                 p->next->next=q;   
  409.                         }   
  410.                         p=p->next;   
  411.                         q=p->next;   
  412.                 }   
  413.                 tail=q;   
  414.         }   
  415.         head=head->next;   
  416.         free(p);
  417.         return head;                                                  //返回值
  418. }


  419. mem* sort_c()
  420. {                                                                //按消费金额排序
  421.         mem *q,*tail,*p=(mem*)malloc(sizeof(mem));   
  422.         p->next=head;   
  423.         head=p;   
  424.         tail=NULL;                                                     //定义 tail                             
  425.         while(tail!=head->next)   
  426.         {
  427.                 p=head;   
  428.                 q=p->next;   
  429.                 while(q->next!=tail)   
  430.                 {
  431.                         if(p->next->cost>q->next->cost)  
  432.                         {                                                    //比较大小,排序
  433.                                 p->next=q->next;   
  434.                                 q->next=q->next->next;   
  435.                                 p->next->next=q;   
  436.                         }   
  437.                         p=p->next;   
  438.                         q=p->next;   
  439.                 }   
  440.                 tail=q;   
  441.         }   
  442.         head=head->next;   
  443.         free(p);
  444.         return head;                                        //返回值
  445. }


  446. float summ(mem *p)
  447. {                                           //计算缴费总额
  448.         float summ=0;
  449.         p=head;
  450.         while(p)
  451.         {                                         //循环,实现求总额
  452.                 summ+=p->money;
  453.                 p=p->next;
  454.         }
  455.         return summ;                                      //返回总额
  456. }



  457. float sumc(mem *p)
  458. {                                      //计算消费总额
  459.         float sumc=0;
  460.         p=head;
  461.         while(p)
  462.         {                                          //循环,实现求总额
  463.                 sumc+=p->cost;                              
  464.                 p=p->next;
  465.         }
  466.         return sumc;                                       //返回总额
  467. }


  468. void statistics()
  469. {                                          //统计会员信息函数
  470.         int f=0;
  471.         mem *p;
  472.         load(p);
  473.        
  474.         system("cls");
  475.         printf("\t\t=======================================\n"
  476.         "\t\t|\n"
  477.         "\t\t|1 按缴费总额排序\n"
  478.         "\t\t|2 按消费总额排序\n"
  479.         "\t\t|3 返回菜单\n"
  480.         "\t\t|\n"
  481.         "\t\t=======================================\n"
  482.                 ) ;
  483.         printf("请选择功能:");
  484.         scanf("%d",&f);
  485.         switch(f)
  486.         {                                          //用switch语句选择功能
  487.                 case 1:        p=sort_m();                              //调用按缴费总额排序
  488.                                 display_statistics(p,summ(p),sumc(p));    //调用函数
  489.                                 getch();
  490.                                 menu();
  491.                                 break;
  492.                 case 2: p=sort_c();                             //调用按消费总额排序
  493.                                 display_statistics(p,summ(p),sumc(p));   //调用函数
  494.                                 getch();
  495.                                 menu();break;
  496.                 default : menu();break;
  497.         }
  498. }
  499.                                                /*退出系统操作*/



  500. void clear(mem *p)
  501. {                                                     //释放链表空间
  502.         if(p==NULL)
  503.         {
  504.                 return;
  505.         }       
  506.         if(p->next ==NULL)
  507.         {
  508.                 free(p);
  509.         }
  510.         else
  511.         {
  512.                 clear(p->next);
  513.                 free(p);
  514.                 p = NULL;
  515.         }
  516. }



  517. void quit()
  518. {                                               //退出函数
  519.         clear(head);
  520.         exit(0);
  521. }
  522.                                                 /*菜单信息*/


  523. void menu_tile(char *title)
  524. {                                              //菜单表头  
  525.         printf("\t\t=======================================\n");
  526.         printf("\t\t| %s\n", title);
  527.         printf("\t\t---------------------------------------\n");
  528. }


  529. void (* menu_main_func[])()=                                    /*函数指针数组 menu_main_func[] 存储的是主菜单项中7个功能函数的地址,
  530.                                                                     分别对应1-7菜单项。例如用户选择1时,调用数组的第0个元素,即调用
  531.                                                                 newMember()函数,以此类推。*/
  532. {                 
  533.         newMember,
  534.         modify_m,
  535.         add,
  536.         consume,
  537.         delete_m,
  538.         statistics,
  539.         quit,
  540. };       
  541. char menu_main[] =                                              //菜单主函数
  542. "\t\t\n"
  543. "\t\t| 1 新会员登记\n"
  544. "\t\t| 2 会员信息修改\n"
  545. "\t\t| 3 会员续费\n"
  546. "\t\t| 4 会员消费结算\n"
  547. "\t\t| 5 会员退卡\n"
  548. "\t\t| 6 统计功能\n"
  549. "\t\t| 7 退出系统\n"
  550. "\t\t|\n";
  551. void menu()
  552. {                                                               //菜单函数
  553.         int selected = 0;                                           //初始化变量
  554.         system("cls");                                              //清屏
  555.        
  556.     printf("                 会员卡计费系统");
  557.         printf(menu_main);                                          //输出菜单主函数
  558.         printf("\t\t=======================================\n");
  559.        
  560.         while(!(selected >= 1 && selected <= MENU_MAIN_COUNT))
  561.         {                                                          //判断初始值
  562.                 printf("请选择:");
  563.                 scanf("%d",&selected);
  564.                 if(selected >= 1 && selected <= MENU_MAIN_COUNT)
  565.                 {    //判断输入值是否有效
  566.                         break;
  567.                 }
  568.                 printf("\n>输入错误!(注:请选择 1 - %d)\n", MENU_MAIN_COUNT);
  569.         }
  570.         menu_main_func[selected-1]();                             //调用相应的函数指针数组中的函数,执行操作
  571.                                                     
  572. }                                             
  573.   int main()                                                  /*主函数*/
  574. {
  575.         menu();                                                   //调用菜单函数
  576.         return 0;                                                //返回值
  577. }
复制代码


超市会员卡信息管理系统.docx

25.24 KB, 下载次数: 10, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表