基于GEC6818的个人超市购物系统

本文介绍了一个基于GEC6818的个人超市购物系统,利用C语言、ARM和Linux技术实现。系统将商品信息存储在文件中,通过哈希表和链表管理商店和购物车数据。用户可以通过触摸屏操作,浏览商品,自动加入购物车,查看购物车详情并结账。在实现过程中,涉及了解码JPEG图片、LCD显示、字库设计和文件操作等功能。
摘要由CSDN通过智能技术生成

设计目标

1、把商品信息存放到文件中

2、程序启动时加载文件信息到数据结构中

3、根据用户选择的功能显示商店或购物车信息

4、根据用户点击的商品添加、删除商店或购物车内容

功能描述

1、侧边功能栏可以浏览商品以及购物车

2、浏览商品时选中商品自动加入购物车,若数量为0则不加入,在购物车点击商品就减少该商品的数量,减至0则移除购物车

3、购物车中显示商品信息,带有翻页功能以及统计总价

4、结账功能会在屏幕显示购物信息,并且保存到文本文件,商店信息也重写到文本,最后退出程序。

浏览商品以及购物车;选中商品自动加入购物车,在购物车点击商品就减少该商品的数量,减至0则移除购物车;购物车中显示商品信息,带有翻页功能以及统计总价;结账功能会在屏幕显示购物信息,并且保存到文本文件,商店信息也重写到文本,最后退出程序。

设计方案

设计一个哈希表存储商店信息,一条链表存储购物车信息。

链表节点结构体包括数据域与指针域,数据域结构体有商品类型、商品名、数量、价格、图片路径。指针域使用内核链表。

设计一个函数解码jpg图片并且映射到lcd

设计字库,在商品图片下面显示商品信息,在左下角提示用户的操作

循环读取用户点击位置以触发相应功能

实现过程

首先读取商店信息的文件到哈希表中,fsanf格式化输入一行一行读取文件到结构体,根据数据结构体中的类别插入到哈希表。初始化LCD,把硬件设备层/dev/fb0映射到用户层,然后显示背景。这里用的图片都是jpg格式,要先对jpg进行解码,然后把24位的jpg图片转为32位才可以在屏幕中显示,最后把转化完的argb信息映射到lcd屏幕。

打开触摸屏/dev/input/event0,循环读取用户点击的位置,如果用户点击的是商店类型,show_list遍历该种类型的哈希表,读取结构体中的商品信息,解码映射jpg图片,并在图片下方使用字库显示商品信息,在进入一个循环读入用户是否要购物,点击右侧功能栏会退出这个循环,在这个循环中,如果用户点击了商品,就会加入购物车,商品数量-1,重新显示商品信息,商品数量为0则提示添加失败。如果用户点击购物车,就会遍历购物车链表,解码映射图片,字库显示信息。点击的位置是图片就购物车数量-1,并且商店的数量会+1,如果数量为0就不会显示在购物车。在此界面设计有翻页,商品的种类超过一页,就可以翻页,第二页内容全部删除则会跳转到前一页。

最后用户点击结账就退出读取用户点击的位置的循环,利用字库显示购物信息,并且保存到文本中,关闭打开的字库、触摸屏结束进程。

实现效果:

主函数

#include "head.h"
float TOTAL_COST = 0;
int GOODS_NUM = 0;
//int (*lcd)[800]=NULL;

int main()
{
    //write_shop.c写商店信息
    //1 加载商店信息到链表
    //初始化哈希表 
    struct node *hash[3]; //0.饮料, 1.水果  2.零食
    init_hash(hash);
    //初始化购物车
    struct list_head *cart=malloc(sizeof(struct list_head));
    INIT_LIST_HEAD(cart);
    //加载文件中的数据到哈希表中  
    load_shop(hash);  
    //show_hash(hash);//显示哈希表

    //初始化LCD
    init_lcd();
    //显示背景
    read_JPEG_file("picture/1-background.jpg",0,0);
    //加载字库
    font *f = fontLoad("/usr/share/fonts/DroidSansFallback.ttf");
    if(f == NULL)puts("加载字库失败");
    //提示框
    msg_tips(f,"欢迎使用XX商店系统");

    //打开触摸屏,在read_screen中打开
    // int fd = open("/dev/input/event0",O_RDWR);
    // if(fd<0){puts("Failed to open screen");return -1;}
    //读输入设备的值**************************************************
    read_screen(f,hash,cart);
    //关闭触摸屏在read_screen中操作
    //close(fd);

    //开发板显示购物车进行结账
    puts("\n购物信息:");
    show_cart(cart);
    printf("商品数量 %d ,共消费 %.2f 元\n",GOODS_NUM,TOTAL_COST);
    
    //显示屏幕信息
    display_from_cart_to_screen(cart,f);
    //保存小票
    save_ticket(cart);

    //关闭字库
    fontUnload(f); 
    //回写商店
    save_shop(hash);   
}


//arm-linux-gcc main.c 1-数据结构.c 2-LCD.c 3-map_jpeg.c -o main -L/home/gec/jpeglib/lib -ljpeg -L./ -lm -lfont

 1-数据结构.c

#include "head.h"
//#include "list.h"

int GOODS_TYPE_NUM = 0;
//初始化哈希表 
void init_hash(struct node *hash[3])
{
    for(int i=0;i<3;i++)
    {
        hash[i] =  malloc(sizeof(struct node));   
        INIT_LIST_HEAD(&hash[i]->list);     
    }
}

//加载文件
void load_shop(struct node *hash[3])
{
    //打开文件
    FILE *fp = fopen("shop.txt","r");  
         if(fp == NULL){puts("open shop.txt fail");return;}

    //不断读取文本信息 
    while (1)
    {
        //数据结构体
        struct shop data;  
        int ret = fscanf(fp,"%d %s %d %f %s\n",&data.type,data.name,&data.num,&data.price,data.pic_path);
        if(ret <= 0){printf("读取完毕\n");return;}

        //输出商品信息 
        //printf("%d %s %d %.2f %s\n",data.type,data.name,data.num,data.price,data.pic_path);

        //根据类别插入哈希表 
        struct node  *xnew = malloc(sizeof(struct node));
        xnew->data = data;

        //插入
        list_add_tail(&xnew->list,&hash[data.typ
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值