Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7565104
  • 博文数量: 961
  • 博客积分: 15795
  • 博客等级: 上将
  • 技术积分: 16612
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-07 14:23
文章分类

全部博文(961)

文章存档

2016年(1)

2015年(61)

2014年(41)

2013年(51)

2012年(235)

2011年(391)

2010年(181)

分类: C/C++

2011-05-31 11:19:26

 

  1. /*
  2.  *    主程序
  3.  *    Lzy        2011-5-31
  4.  */

  5. #include <stdio.h>
  6. #include <string.h>
  7. #include "Menu.h"
  8. #include "goods.h"
  9. #include "root.h"

  10. int main(void)
  11. {
  12.     int chose;

  13.     chose = Main_Memu();                    /*得到功能选项值*/
  14.     switch(chose)
  15.     {
  16.     case 1:
  17.         if(Root_login() == 0)                /*判断登陆是否成功*/        
  18.             Root_function();                /*进入root功能模式*/        
  19.         break;    

  20.     case 0:
  21.         break;
  22.     }

  23.     return 0;
  24. }
  1. /*
  2.  *    管理员实现函数
  3.  *    Lzy        2011-5-31
  4.  */
  5. #include <stdio.h>
  6. #include "root.h"

  7. root Root = {"root","123456"};            /*初始化超级用户姓名和密码*/

  8. /*****************************************************
  9. 函数名称:Root_function
  10. 功能说明:管理员功能主函数
  11. 入口参数:无
  12. 出口参数:
  13. ******************************************************/
  14. int Root_function(void)                    /*root功能模式*/
  15. {
  16.     while(1)
  17.     {
  18.         switch(Menu_Root())
  19.         {
  20.         case 1:
  21.             Goods_fun();                        /*商品管理*/
  22.             break;

  23.         case 2:
  24.             if(0 == Root_RePasswad())            /*修改登陆密码*/            
  25.                 Root_RePasswad_Save();            /*保存修改后root用户信息*/            
  26.             break;        

  27.         case 0:
  28.             return 0;                /*退出登陆*/
  29.         }
  30.     }
  31. }

  32. /*****************************************************
  33. 函数名称:Root_infor
  34. 功能说明:从文件读取root用户信息
  35. 入口参数:无
  36. 出口参数:0表示保存成功,-1表示失败
  37. ******************************************************/
  38. int Root_infor(void)
  39. {
  40.     FILE *fp;                            /*定义文件指针*/
  41.     
  42.     if((fp = fopen("RootInfor.txt", "rb+")) == NULL)        /*以二进制方式打开文件*/
  43.     {
  44.         printf("文件打开失败!\n");
  45.         return -1;
  46.     }
  47.     fread(&Root,sizeof(Root),1,fp);            /*以数据块方式读入root用户信息*/    
  48.     fclose(fp);
  49.     return 0;
  50. }

  51. /*****************************************************
  52. 函数名称:Root_RePasswad_Save
  53. 功能说明:保存root用户信息至文件
  54. 入口参数:无
  55. 出口参数:0表示保存成功,-1表示失败
  56. ******************************************************/
  57. int Root_RePasswad_Save(void)
  58. {    
  59.     FILE *fp;                            /*定义文件指针*/
  60.     
  61.     if((fp = fopen("RootInfor.txt", "wb+")) == NULL)        /*以二进制方式打开文件*/
  62.     {
  63.         printf("文件打开失败!\n");
  64.         return -1;
  65.     }

  66.     if(fwrite(&Root,sizeof(Root),1,fp) == NULL)        /*以数据块方式写入root用户信息*/
  67.     {
  68.         printf("密码保存失败!\n");
  69.         fclose(fp);
  70.         return -1;
  71.     }
  72.     else
  73.     {
  74.         printf("密码保存成功!\n");
  75.         fclose(fp);
  76.     }
  77.     return 0;                            /*成功*/
  78. }

  79. /*****************************************************
  80. 函数名称:Root_RePasswad
  81. 功能说明:修改密码
  82. 入口参数:无
  83. 出口参数:0表示修改成功,-1表示修改失败
  84. ******************************************************/
  85. int Root_RePasswad(void)
  86. {
  87.     char str[3],passwad[10];

  88.     printf("输入旧密码:");
  89.     scanf("%s",passwad);

  90.     if(strcmp(passwad, Root.passwad) == 0)            /*是否与旧密码匹配*/
  91.     {
  92.         printf("输入新密码:");
  93.         scanf("%s",passwad);

  94.         printf("是否修改密码(y\\n):");
  95.         scanf("%s",str);

  96.         if(strcmp(str,"y") == 0)                                /*确认修改*/
  97.         {
  98.             strcpy(Root.passwad, passwad);                    /*更改密码*/
  99.             return 0;
  100.         }
  101.         else
  102.         {                                            /*放弃修改*/
  103.             printf("放弃修改密码!\n");
  104.             return -1;
  105.         }
  106.     }
  107.     else
  108.     {
  109.         printf("密码输入有误!\n");
  110.         return -1;
  111.     }
  112. }

  113. /*****************************************************
  114. 函数名称:Root_login
  115. 功能说明:root登陆
  116. 入口参数:无
  117. 出口参数:0表示登陆成功,-1表示登陆失败
  118. ******************************************************/
  119. int Root_login(void)
  120. {
  121.     char name[10],passwad[10];                    /*临时字符数组*/
  122.     int flag = 1;

  123.     Root_infor();                                /*从文件读取root用户信息*/

  124.     while(flag < 4)                                /*连续三次登陆不成功就不充许登陆*/
  125.     {
  126.         printf("\n 用户名: ");
  127.         scanf("%s",name);
  128.         printf(" 密 码: ");
  129.         scanf("%s",passwad);

  130.         if((strcmp(name, Root.name) == 0) && (strcmp(passwad,Root.passwad) == 0))
  131.         {
  132.             return 0;                        /*登陆成功*/
  133.         }
  134.         else
  135.         {
  136.             printf("\n 输入用户名或密码有误! \n");
  137.             flag++;                            /*计错误次数*/
  138.         }
  139.     }
  140.     printf("登陆失败!\n");
  141.     return -1;                                /*登陆失败*/
  142. }
  1. /*
  2.  *    管理员声明函数
  3.  *    Lzy        2011-5-31
  4.  */

  5. #ifndef ROOT_H
  6. #define ROOT_H

  7. typedef struct ROOT                /*超级管理员信息*/
  8. {
  9.     char name[10];            /*超级管理员姓名*/
  10.     char passwad[10];        /*超级管理员密码*/
  11. }root;


  12. int Root_login(void);                /*root登陆*/

  13. int Root_function(void);                /*root功能模式*/

  14. int Root_RePasswad(void);            /*修改密码*/

  15. int Root_RePasswad_Save(void);        /*保存root用户信息至文件*/

  16. int Root_infor(void);                /*从文件读取root用户信息*/

  17. #endif
  1. #include "goods.h"
  2. #include <stdio.h>

  3. /*****************************************************
  4. 函数名称:Goods_fun
  5. 功能说明:商品信息管理主函数
  6. 入口参数:无
  7. 出口参数:0
  8. ******************************************************/
  9. int Goods_fun(void)
  10. {
  11.     Goods *head , *p, *q;
  12.     int num;                                /*临时变量*/
  13.     char str[3];

  14.     GoodsInit(&head);                        /*初始化链表头*/
  15.     if(GoodsFileRead(head) == -1)            /*导入已有的商品信息*/
  16.     {
  17.         printf("暂时没有任何商品信息\n");
  18.     }    

  19.     while(1)
  20.     {
  21.         switch(Goods_fun_menu())            /*功能选择*/
  22.         {
  23.         case 1:
  24.             GoodsPlayAll(head);                /*显示所有商品*/
  25.             break;

  26.         case 2:            
  27.             AddGoods(head);                    /*新增商品信息*/
  28.             break;

  29.         case 3:    
  30.             printf("\n输入要删除的商品编号:");
  31.             scanf("%d",&num);
  32.             if(DelGoods(head, num) == 0)            /*按商品名称删除商品信息*/
  33.             {
  34.                 printf("\n修改是否保存至文档(y\\n):");
  35.                 scanf("%s",str);

  36.                 if(strcmp(str,"y") == 0)        
  37.                     GoodsFileSave(head);            /*商品信息保存*/
  38.             }                
  39.             break;
  40.     
  41.         case 4:
  42.             GoodsFileSave(head);            /*保存商品信息*/
  43.             break;

  44.         case 5:
  45.             printf("\n商品种类总数:%d",LenGoods(head));
  46.             getchar();
  47.             break;
  48.             
  49.         case 6:
  50.             printf("输入要查找的商品编号:");
  51.             scanf("%d",&num);

  52.             if((p = Goods_ById(head,num,&q)) != NULL)            /*查找编号为num的商品,并打印至屏幕*/
  53.             {
  54.                 printf("\n%2d\t%s\t%4.1f\t %d\t %s",p->id,p->name,p->price,p->count,p->belong_to);            
  55.                 printf("\n\n输入'1'进行商品信息修改(0返回):");
  56.                 scanf("%d",&num);
  57.                 if(1 == num)                    /*商品信息修改*/
  58.                 {
  59.                     DelGoods(head, num);        /*先删除编号为num的商品信息*/
  60.                     AddGoods(head);                /*再新增一个商品信息*/
  61.                 }
  62.             }
  63.             else
  64.                 printf("\n没有此商品信息");            
  65.             getchar();
  66.             break;

  67.         case 7:
  68.             BuSort(head);                    /*用冒泡法进行排序*/
  69.             GoodsPlayAll(head);                /*显示所有商品*/
  70.             break;

  71.         case 0:
  72.             return 0;                        /*返回上一层*/
  73.         }    
  74.     }    
  75. }

  76. /*****************************************************
  77. 函数名称:BuSort
  78. 功能说明:使用冒泡法,按编号大小给节点进行升序排序
  79. 入口参数:头节点地址
  80. 出口参数:0表示成功
  81. ******************************************************/
  82. int BuSort(LinkGoods head)
  83. {
  84.     Goods *front,                        /*要交换的第一个节点的前一个节点*/
  85.          *p1,                            /*要交换的第一个节点*/
  86.          *p2,                            /*要交换的第二个节点*/        
  87.          *rear = NULL;                    /*纪录上次一趟排序最后交换一个节点的位置*/
  88.     
  89.     int len = LenGoods(head);            /*链表的长度*/

  90.     for(; len > 1; len--)
  91.     {
  92.         front = head;            /*指向头节点*/
  93.         p1 = front->next;        /*指向第一个节点*/
  94.         p2 = p1->next;            /*指向第二个节点*/

  95.         while((p2 != rear) && (p2 != NULL))        /*拿来比较的第二个节点不为空,且不是上趟交换最后一个节点的位置*/
  96.         {
  97.             if(p1->id > p2->id)            /*交换节点*/
  98.             {                            
  99.                 front->next = p2;
  100.                 p1->next = p2->next;
  101.                 p2->next = p1;
  102.             }

  103.             front = front->next;    /*往后面移支一个节点*/
  104.             p1 = front->next;        /*为下次循环作准备*/
  105.             p2 = p1->next;            
  106.         }
  107.         rear = p2;                    /*纪录这趟交换最后一个节点的位置*/
  108.     }
  109.     return 0;
  110. }

  111. /*****************************************************
  112. 函数名称:Goods_ById
  113. 功能说明:删除编号为num的商品信息
  114. 入口参数:头节点地址,商品编号
  115. 出口参数:0表示删除成功
  116. ******************************************************/
  117. int DelGoods(Goods *head, int num)
  118. {
  119.     Goods *p,            /*临时保存查找到编号为num的节点*/
  120.          *q;            /*临时保存查找到编号为num的前一个节点*/    

  121.     p = Goods_ById(head, num, &q);
  122.     q ->next = p->next;                /*删除编号为num的节点*/

  123.     free(p);
  124.     return 0;
  125. }

  126. /*****************************************************
  127. 函数名称:Goods_ById
  128. 功能说明:查找编号为num的商品
  129. 入口参数:头节点地址,商品编号,商品前一个节点
  130. 出口参数:查找到的节点地址,没找到为NULL
  131. ******************************************************/
  132. Goods *Goods_ById(LinkGoods head, int num, LinkGoods *front)
  133. {
  134.     Goods *p = head;                /*p指向第一个节点*/

  135.     while(p->next)                            /*p不为空时*/
  136.     {
  137.         if(p->id == num)                /*找到编号为num的节点*/
  138.             break;
  139.         else
  140.         {
  141.             (*front) = p;                /*保存当前查找的纪录*/
  142.             p = p->next;
  143.         }
  144.     }
  145.     return p;
  146. }

  147. /*****************************************************
  148. 函数名称:GoodsPlayAll
  149. 功能说明:打印所有商品信息
  150. 入口参数:头节点地址
  151. 出口参数:无
  152. ******************************************************/
  153. void GoodsPlayAll(LinkGoods head)
  154. {
  155.     Goods *p = head->next;

  156.     system("cls");                    /*清屏*/
  157.     printf("\t\t所有商品信息\n");
  158.     printf(" ID\t名称\t单价\t存储量\t管理员\n");

  159.     while(p)
  160.     {
  161.         printf("%2d\t%s\t%4.1f\t %d\t %s\n",p->id,p->name,p->price,p->count,p->belong_to);
  162.         p = p->next;
  163.     }

  164.     printf("\n按任意键返回!");
  165.     getchar();
  166. }

  167. /*****************************************************
  168. 函数名称:GoodsFileRead
  169. 功能说明:导出文件所有商品信息保存至链表
  170. 入口参数:头节点地址
  171. 出口参数:-1失败 0成功
  172. ******************************************************/
  173. int GoodsFileRead(LinkGoods head)
  174. {
  175.     Goods *p;
  176.     FILE *fp;
  177.     int length;                    /*用来标记有多少个商品*/    

  178.     if((fp = fopen("Goos.txt","rb+")) == NULL)    /*以读的方式打开文件*/
  179.     {
  180.         printf("文件打开失败!\n");
  181.         return -1;
  182.     }

  183.     fscanf(fp,"%d:",&length);        /*在文件中读出商品总数*/

  184.     while(length > 0)                            /*所有商品写入文件*/
  185.     {
  186.         p = (Goods *)malloc(sizeof(Goods));        /*分配新空间*/
  187.         fread(p,sizeof(Goods),1,fp);            /*数据从文件读出至结构体Goods中*/
  188.         InsertGoods(head,p);                    /*节点插入链表中*/
  189.         length--;
  190.     }

  191.     fclose(fp);
  192.     return 0;
  193. }

  194. /*****************************************************
  195. 函数名称:GoodsFileSave
  196. 功能说明:所有商品信息保存至文件
  197. 入口参数:头节点地址
  198. 出口参数:-1失败 0成功
  199. ******************************************************/
  200. int GoodsFileSave(LinkGoods head)
  201. {
  202.     Goods *p = head->next;
  203.     FILE *fp;
  204.     int length;                    /*用来标记有多少个商品*/
  205.                     
  206.     length = LenGoods(head);    

  207.     if((fp = fopen("Goos.txt","wb+")) == NULL)
  208.     {
  209.         printf("文件打开失败!\n");
  210.         return -1;
  211.     }

  212.     fprintf(fp,"%d:",length);    /*文件中第一个数保存商品总数*/

  213.     while(p)                                /*所有商品写入文件*/
  214.     {
  215.         fwrite(p,sizeof(Goods),1,fp);            /*数据写入*/
  216.         p = p->next;        
  217.     }

  218.     fclose(fp);
  219.     return 0;
  220. }

  221. /*****************************************************
  222. 函数名称:AddGoods
  223. 功能说明:在第一个位置连续加入新商品信息
  224. 入口参数:头节点地址
  225. 出口参数:无
  226. ******************************************************/
  227. void AddGoods(Goods *head)
  228. {
  229.     char str[3];
  230.     Goods *p;

  231.     while(1)
  232.     {
  233.         p = NesGoods();
  234.         if(p != NULL)                    /*判断商品保存才加入链表中*/
  235.             InsertGoods(head,p);        /*加入商品信息*/

  236.         printf("\n是否继续录入(y\\n):");
  237.         scanf("%s",str);

  238.         if(strcmp(str,"n") == 0)        
  239.             break ;
  240.     }

  241.     printf("\n是否保存至文档(y\\n):");
  242.     scanf("%s",str);

  243.     if(strcmp(str,"y") == 0)        
  244.         GoodsFileSave(head);            /*商品信息保存*/

  245.     return ;
  246. }

  247. /*****************************************************
  248. 函数名称:InsertGoods
  249. 功能说明:在第一个位置加入新商品信息
  250. 入口参数:头节点、新节点地址
  251. 出口参数:无
  252. ******************************************************/
  253. void InsertGoods(LinkGoods head, LinkGoods X)
  254. {
  255.     X->next = head->next;
  256.     head->next = X;                        /*节点插入*/
  257. }

  258. /*****************************************************
  259. 函数名称:LenGoods
  260. 功能说明:链表的长度
  261. 入口参数:头节点
  262. 出口参数:商品总数
  263. ******************************************************/
  264. int LenGoods(LinkGoods head)        /*链表的长度*/
  265. {
  266.     int num = 0;
  267.     Goods *p = head->next;            /*p指向第一个节点*/

  268.     while(p != NULL)                
  269.     {
  270.         num++;
  271.         p = p->next;                /*指针向后移动*/
  272.     }
  273.     return num;                        
  274. }

  275. /*****************************************************
  276. 函数名称:NesGoods
  277. 功能说明:手动录入商品信息
  278. 入口参数:无
  279. 出口参数:新分配结构体Goods指针地址
  280. ******************************************************/
  281. Goods *NesGoods(void)                        /*手动录入商品信息*/
  282. {
  283.     Goods *p;
  284.     char str[3];

  285.     p = (Goods *)malloc(sizeof(Goods));            /*分配存储空间*/

  286.     printf("\n输入商品编号:");                    /*开始录入信息*/
  287.     scanf("%d",&p->id);

  288.     printf("输入商品名称:");
  289.     scanf("%s",p->name);

  290.     printf("输入商品价格:");
  291.     scanf("%f",&p->price);

  292.     printf("输入商品数量:");
  293.     scanf("%d",&p->count);
  294.     
  295.     printf(" 商品管理员:");
  296.     scanf("%s",p->belong_to);

  297.     printf("\n是否保存(y\\n):");
  298.     scanf("%s",str);

  299.     if(strcmp(str,"y") == 0)            /*信息保存*/
  300.         return p;
  301.     else
  302.     {
  303.         free(p);                /*放弃输入,释放空间*/
  304.         return NULL;
  305.     }
  306. }

  307. /*****************************************************
  308. 函数名称:GoodsInit
  309. 功能说明:创建链表头
  310. 入口参数:结构体Goods指针地址
  311. 出口参数:无
  312. ******************************************************/
  313. void GoodsInit(LinkGoods *p)            /*创建头节点*/
  314. {
  315.     (*p) = (Goods *)malloc(sizeof(Goods));        
  316.     (*p)->next = NULL;    
  317. }
  1. #ifndef GOODS_H
  2. #define GOODS_H

  3. typedef struct goods            /*定义商品信息*/
  4. {
  5.     int id;                    /*商品编号*/
  6.     char name[10];                /*商品名称*/
  7.     float price;                    /*商品单价*/
  8.     int count;                    /*商品存储量*/
  9.     char belong_to[10];            /*商品管理员*/
  10.     struct goods *next;
  11. }Goods, *LinkGoods;


  12. void GoodsInit(LinkGoods *p);            /*创建头节点*/

  13. Goods *NesGoods(void);                    /*手动录入商品信息*/

  14. int LenGoods(LinkGoods head);            /*链表的长度*/

  15. void InsertGoods(LinkGoods head, LinkGoods X);    /*在第一个位置加入新商品信息*/

  16. void AddGoods(Goods *head);                /*在第一个位置连续加入新商品信息*/

  17. int GoodsFileSave(LinkGoods head);        /*所有商品信息保存至文件*/

  18. int GoodsFileRead(LinkGoods head);        /*导出文件所有商品信息保存至链表*/

  19. void GoodsPlayAll(LinkGoods head);            /*打印所有商品信息*/

  20. Goods *Goods_ById(LinkGoods head, int num, LinkGoods *front);    /*查找编号为num的商品*/

  21. int DelGoods(Goods *head, int num);            /*删除编号为num的商品信息*/

  22. int BuSort(LinkGoods head);                    /*使用冒泡法,按编号大小给节点进行升序排序*/

  23. int Goods_fun(void);                        /*商品信息管理主函数*/

  24. #endif
  1. #include "Menu.h"


  2. /*****************************************************
  3. 函数名称:Goods_fun_menu
  4. 功能说明:商品功能菜单
  5. 入口参数:无
  6. 出口参数:返回功能选项相应的值
  7. ******************************************************/
  8. int Goods_fun_menu(void)
  9. {
  10.     int chose;

  11.     while(1)
  12.     {
  13.         system("cls");                    /*清屏*/
  14.         printf("\n ____超级管理员____\n\n");
  15.         printf(" 1 > 查看所有商品信息\n");        
  16.         printf(" 2 > 新增商品信息\n\n");
  17.         printf(" 3 > 删除商品信息\n");
  18.         printf(" 4 > 保存商品信息至文档\n\n");
  19.         printf(" 5 > 商品种类总数\n");
  20.         printf(" 6 > 按商品编号查找商品信息\n\n");
  21.         printf(" 7 > 按商品编号排序\n");
  22.         printf(" 0 > 返回\n");
  23.         printf("\n 功能选择:");

  24.         chose = chose_judge(0,7);        /*输入数据并判断输入是否合法*/
  25.         if(chose != -1)        
  26.             return chose;                /*返回功能选项相应的值*/
  27.     }
  28. }

  29. /*****************************************************
  30. 函数名称: Menu_Root
  31. 功能说明:root功能菜单
  32. 入口参数:无
  33. 出口参数:返回功能选项相应的值
  34. ******************************************************/
  35. int Menu_Root(void)                        /*root功能菜单*/
  36. {
  37.     int chose;

  38.     while(1)
  39.     {
  40.         system("cls");                    /*清屏*/
  41.         printf("\n ____超级管理员____\n\n");            
  42.         printf(" 1 > 商品信息管理\n");
  43.         printf(" 2 > 登陆密码修改\n\n");        
  44.         printf(" 0 > 返回\n");
  45.         printf("\n 功能选择:");

  46.         chose = chose_judge(0,2);        /*输入数据并判断输入是否合法*/
  47.         if(chose != -1)        
  48.             return chose;                /*返回功能选项相应的值*/
  49.     }
  50. }

  51. /*****************************************************
  52. 函数名称:Main_Memu()
  53. 功能说明:主菜单
  54. 入口参数:无
  55. 出口参数:功能选项相应的数字值
  56. ******************************************************/
  57. int Main_Memu(void)                        /*主菜单*/
  58. {    
  59.     int chose;

  60.     while(1)
  61.     {
  62.         system("cls");                    /*清屏*/
  63.         printf("\n _____超市管理系统____\n\n");
  64.         printf(" 1 > 超级管理员登陆\n");            
  65.         printf(" 0 > 退出系统\n");
  66.         printf("\n 选择: ");

  67.         chose = chose_judge(0,1);        /*输入数据并判断输入是否合法*/
  68.         if(chose != -1)        
  69.             return chose;                /*返回功能选项相应的值*/
  70.     }
  71. }

  72. /*****************************************************
  73. 函数名称:chose_judge
  74. 功能说明:从键盘读入数据并判断
  75. 入口参数:值范围
  76. 出口参数:-1失败
  77. ******************************************************/
  78. int chose_judge( int low, int high)                /*从键盘读入数据并判断*/
  79. {
  80.     int chose;
  81.     scanf("%d",&chose);
  82.     getchar();                                    /*清空缓冲区 防止输入的不是数字而造成无限循环*/

  83.     if(low <= chose && chose <= high)            /*判断输入是否在规定的范围内*/
  84.     {
  85.         return chose;
  86.     }
  87.     else
  88.     {
  89.         printf("输入有误!\n");
  90.         return -1;                                /*输入有误返回-1*/
  91.     }
  92. }
  1. #ifndef MENU_H
  2. #define MENU_H

  3. int Main_Memu(void);                        /*主菜单*/

  4. int Menu_Root(void);                        /*root功能菜单*/

  5. int chose_judge( int low, int high);        /*从键盘读入数据并判断*/

  6. #endif
 main.rar  ( 源程序)
阅读(3593) | 评论(0) | 转发(3) |
0

上一篇:文件应用编程

下一篇:静态库与动态库

给主人留下些什么吧!~~