当前位置:   article > 正文

基于开发板linux系统的利用文件IO 与 数据结构 制作一个 超市购物系统项目_linux系统实现商品管理系统搭建

linux系统实现商品管理系统搭建

设计目标

利用文件IO 与 数据结构 制作一个 超市购物系统

功能描述:

1.程序运行检索目录下图片信息 利用文件IO写入读取商品信息保存到链表中

2.点击饮料/零食位置 显示饮料/零食界面 根据用户选择商品 自动跳到商品详细界面,能够实现上一张下一张播放商品信息,能够加入购物车并自动添加到购物车链表中,支持直接购买商品。

3.点击购物车位置,自动遍历购物车的商品,能够实现商品数量的增加和删除,删除直到数量为0时,自动把该商品剔除。购物车同时能够分页显示。

4.结算功能:点击结算功能自动结算购物车里所有的商品价格,并且屏幕刷一张图显示出来。

代码编写过程:

设计方案:

通过文件IO 读取文件信息存储到链表中,实现链表的增删改查数据功能,通过触摸屏和jpg显示,字库操作 来设计完善项目。

系统框架:

实现过程:

1.把商品的 价格 数量 名称 图片路径 存放到一个文件中

2.程序启动 加载 商品文件 中的信息 到 数据结构中。

3.遍历数据结构,把图标 和商品其他信息 利用字库显示到

LCD 设备中。

4.根据用户点击的位置,确定选择了哪项功能,点击 饮料

或 零食。重新遍历数据结构显示。 根据用户点击的商品位置添加到 购物车链表中。

5.点击购物车,遍历购物车链表 显示购物车中的所有内容

主函数:

主函数主要初始化头结点 读取文件的链表信息存入

  1. int main(int argc, char const *argv[])
  2. {
  3. //初始化设备
  4. init_all();
  5. //1.清屏 设置为黑色
  6. set_black();
  7. read_JPEG_file("./img/state_drink.jpg",0,435);
  8. //新建饮料头结点
  9. struct D_node *head = Create_Node(0,"","");
  10. //新建零食头结点
  11. struct D_node *snack_head = Create_Node(0,"","");
  12. //创建购物车链表头结点
  13. struct D_node *shop_head = Create_Node(0,"","");
  14. read_node(head,"shop_drink.txt");
  15. read_node(snack_head,"shop_snack.txt");
  16. // find_image(argv[1],head);
  17. // find_image(argv[1],shop_head);
  18. //printf("检索完毕!\n");
  19. //write_node(head,"shop_drink.txt");
  20. // write_node(shop_head,"shop_snack.txt");
  21. // Traver_Nodes(snack_head);
  22. Traver_Nodes(head);
  23. //主界面运行函数
  24. screen_control(head,snack_head,shop_head);
  25. return 0;
  26. }

界面设计:

 

先说饮料界面和零食界面吧:

 先刷一张饮料界面的图,

  1. //1.清屏 设置为黑色
  2. set_black();
  3. read_JPEG_file("./img/state_drink.jpg",0,435);

通过文件IO遍历文本存储的链表节点数据到链表中,

  1. //读取文件中的链表数据 需要第一个节点的地址
  2. void read_node(struct D_node *head,char *pathname)
  3. {
  4. FILE * fp = fopen(pathname, "r");
  5. if(fp == NULL)
  6. {
  7. printf("打开文件失败\n");
  8. return ;
  9. }else
  10. {
  11. printf("打开文件成功\n");
  12. }
  13. //这里是读取第一个节点为头结点 并初始化
  14. int size = fread(head,sizeof(struct D_node),1,fp);
  15. head->prev = head;
  16. head->next = head;
  17. while (1)
  18. {
  19. struct D_node read_node ;
  20. size = fread(&read_node,sizeof(struct D_node),1,fp);
  21. printf("size:%d\n",size);
  22. //判断读取数据为空 跳出循环
  23. if(size == 0)
  24. break;
  25. printf("商品: %s 价格:%.2f 路径:%s\n",read_node.name,read_node.money,read_node.pathname);
  26. //尾插入数据
  27. Insert_Node(head,read_node.money,read_node.name,read_node.pathname);
  28. }
  29. printf("链表结点读取保存成功========================\n");
  30. fclose(fp);
  31. }

主利用双向循环链表来遍历数据中的图片 计算相互之间的间隔 通过jpg格式刷新出来

  1. void Traver_Nodes(struct D_node *head)
  2. {
  3. struct D_node *pos = head->next;
  4. int i = 0 , j = 0;
  5. while (1)
  6. {
  7. printf("商品名:%s 价格:%.2f图片路径:%s\n",pos->name, pos->money,pos->pathname);
  8. //显示文字
  9. //4.将字体写到点阵图上
  10. char buf[512] = {0};
  11. sprintf(buf,"%s 价格:%.2f元",pos->name,pos->money);
  12. bitmap *bm = createBitmapWithInit(120,30,4,getColor(0,192,128,0));
  13. fontPrint(f,bm,2,2,buf,getColor(0,0,0,0),0);
  14. //5.把字体框输出到LCD屏幕上
  15. if(i <= 5)
  16. {
  17. show_font_to_lcd((int *)lcd,130*i,180,bm);
  18. read_JPEG_file(pos->pathname,130*i,0);//4*130 520 5*130 650 6*130 780
  19. i++;
  20. }else if(j <= 5)//换行遍历
  21. {
  22. show_font_to_lcd((int *)lcd,130*j,400,bm);
  23. read_JPEG_file(pos->pathname,130*j,220);//4*130 520 5*130 650 6*130 780
  24. j++;
  25. }
  26. pos=pos->next;
  27. if(pos == head)
  28. break;
  29. }
  30. printf("========================\n");
  31. }

商品详细查看:

 主函数设置4个标志 分别为饮料界面标志 零食界面标志 购物车界面标志 商品详细界面标志 1 2 3 4

使用触摸屏判断xy点击的是第几个节点的商品

  1. int x = 0,y = 0, location = 0;
  2. int buy_flag = -1;
  3. get_xy(ts_fd,&x,&y);
  4. location = return_position(x,y);
  5. printf("location:%d\n", location);
  6. if(location != 0)
  7. {
  8. flag = 4;
  9. information_pag_display(head,shop_head,location);
  10. }

  传入显示界面 通过节点的pos=pos->next 和pos = pos->prev 实现图片上一张下一张播放。加入购物车 购买商品

  1. //商品详细界面 获取商品信息,左右查看商品,购买或者返回菜单
  2. int information_pag_display(struct D_node *head,struct D_node *shop_head ,int n)
  3. {
  4. read_JPEG_file("./img/information_page.jpg",0,0);
  5. struct D_node *tmp = Find_Node(head,n,shop_head);
  6. read_JPEG_file(tmp->pathname,330,126);
  7. show_shop_price_name(tmp);
  8. while(1)
  9. {
  10. int x = 0,y = 0;
  11. get_xy(ts_fd,&x,&y);
  12. printf("x=%d y=%d\n",x,y);
  13. if(y>394 &&y<480 && x>0 &&x<166)//退出返回主菜单
  14. {
  15. //1.清屏 设置为黑色
  16. set_black();
  17. read_JPEG_file("./img/state_drink.jpg",0,433);
  18. Traver_Nodes(head);
  19. flag = 1;
  20. break;
  21. }
  22. if(y>396 &&y<480 && x>298 &&x<503)//购买商品后3秒自动返回
  23. {
  24. read_JPEG_file("./img/buysuccess.jpg",0,0);
  25. show_shop_price_name(tmp);
  26. sleep(2);
  27. set_black();
  28. read_JPEG_file("./img/state_drink.jpg",0,435);
  29. Traver_Nodes(head);
  30. flag = 1;
  31. break;
  32. }
  33. if( y>137 &&y<227 && x>565 &&x<800)//显示下个商品以及数量
  34. {
  35. if(tmp->next==head)
  36. {
  37. tmp=tmp->next;
  38. }
  39. tmp=tmp->next;
  40. read_JPEG_file(tmp->pathname,330,126);
  41. show_shop_price_name(tmp);
  42. }
  43. if( y>120 &&y<220 && x>0 &&x<230)//显示上个商品以及数量
  44. {
  45. if(tmp->prev==head)
  46. {
  47. tmp=tmp->prev;
  48. }
  49. tmp=tmp->prev;
  50. read_JPEG_file(tmp->pathname,330,126);
  51. show_shop_price_name(tmp);
  52. }
  53. if(y>400 &&y<480 &&x>620 &&x<800)//购物车
  54. {
  55. printf("加入购物车\n");
  56. struct D_node *pos = judge_node_repeat(shop_head,tmp);
  57. //判断是否重复
  58. if(pos!=NULL)
  59. {
  60. pos->sum++;
  61. }
  62. else
  63. {
  64. Insert_Shop_Node(shop_head,tmp->money,tmp->name,tmp->pathname,1);
  65. }
  66. read_JPEG_file("./img/add_shopsucess.jpg",0,0);//显示加入购物车成功图片
  67. read_JPEG_file(tmp->pathname,330,126); //显示商品图片
  68. sleep(1);
  69. read_JPEG_file("./img/information_page.jpg",0,0);//显示主界面图片
  70. read_JPEG_file(tmp->pathname,330,126);
  71. show_shop_price_name(tmp);
  72. }
  73. }
  74. return 1;
  75. }

 购物车功能:

 

购买商品:

  1. if( x >700 && x< 800 && y>339 && y<439 )
  2. {
  3. //付款结算
  4. float price = goods_payment(shop_head);
  5. printf("需要付款的金额为:%.2f\n",price);
  6. //刷新界面
  7. read_JPEG_file("./img/payallsuccess.jpg",0,0);
  8. //将字体写到点阵图上
  9. char buf[512] = {0};
  10. font *f1 = fontLoad("/usr/share/fonts/DroidSansFallback.ttf");
  11. sprintf(buf,"金额:%.2f元",price);
  12. bitmap *bm = createBitmapWithInit(200,45,4,getColor(0,200,214,223));
  13. fontSetSize(f1,45);
  14. fontPrint(f1,bm,2,2,buf,getColor(0,0,0,0),0);
  15. //5.把字体框输出到LCD屏幕上
  16. show_font_to_lcd((int *)lcd,214,112,bm);
  17. sleep(1);
  18. //删除购物车所有节点
  19. delete_shopping_cart_all_nodes(shop_head);
  20. //返回主界面
  21. flag = 1;
  22. set_black();
  23. read_JPEG_file("./img/state_drink.jpg",0,433);
  24. Traver_Nodes(head);
  25. }

 购物车的上一页下一页:

  1. if(x >695 && x< 800 && y>190 && y<270)//下一页
  2. {
  3. //刷新界面
  4. read_JPEG_file("./img/shopping_cart1.jpg",0,0);
  5. //遍历显示
  6. Traver_Shoppag2_Nodes(shop_head);
  7. second_page_logo = 1;
  8. }
  9. if(x>0 && x<155 && y>0 && y<70)//点击返回第一页
  10. {
  11. //刷新界面
  12. read_JPEG_file("./img/shopping_cart.jpg",0,0);
  13. //遍历显示
  14. Traver_Shop_Nodes(shop_head);
  15. second_page_logo = 0;
  16. }

 因为这里涉及到数据的增加和删除 需要标志位来使第一页或者第二页的数据操作限制,

  1. location = return_shoplist_position(x,y);
  2. buy_flag = return_buy_flag(x,y);//这里标志0 1 表示是删除还是增加
  3. printf("x:%d y:% location:%d buy_flag:%d second_page_logo:%d\n",x,y,location,buy_flag,second_page_logo);
  4. if(buy_flag != -1)
  5. {
  6. if(second_page_logo)
  7. {
  8. Update_Shop_Node(shop_head,buy_flag,location+4);
  9. }else{
  10. Update_Shop_Node(shop_head,buy_flag,location);
  11. }
  12. }

数据更新函数:

  1. //查询购物车第几个节点的数据 并更新数据 需要传入第几个节点
  2. int Update_Shop_Node(struct D_node *shop_head,int set_flag, int n)
  3. {
  4. struct D_node *pos = shop_head->next;//定义pos指针遍历
  5. int i = 1;
  6. while (pos != shop_head)
  7. {
  8. if(i == n)
  9. {
  10. printf("找到啦!商品: %s 价格:%.2f数量:%d\n",pos->name,pos->money,pos->sum);
  11. //更新节点 判断是增还是减
  12. if(set_flag == 1)
  13. {
  14. //增加
  15. pos->sum++;
  16. }else{
  17. //减少
  18. pos->sum--;
  19. if(pos->sum == 0)
  20. {
  21. //删除节点
  22. Remove_Node(shop_head,pos->name);
  23. //Traver_Shoppag2_Nodes(shop_head);
  24. break;
  25. }
  26. }
  27. }
  28. pos=pos->next;
  29. i++;
  30. }
  31. if(second_page_logo==0)//购物车分页标志 第一页
  32. {
  33. set_black();
  34. read_JPEG_file("./img/shopping_cart.jpg",0,0);
  35. Traver_Shop_Nodes(shop_head);
  36. }else
  37. {
  38. set_black();
  39. read_JPEG_file("./img/shopping_cart1.jpg",0,0);
  40. Traver_Shoppag2_Nodes(shop_head);
  41. }
  42. return 0;
  43. }

 界面设计比较简陋勿喷哈哈~大体功能实现演示讲解到此!谢谢观看

心得体会:

此次项目主要花的时间在于判断x y坐标 判断图片显示的位置 这里比较繁琐 其他功能实现主要是数据结构的双链表知识,通过这次项目 ,更加深刻的吸收链表文件IO知识!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/48420
推荐阅读
相关标签
  

闽ICP备14008679号