本次项目是基于Linux环境的交叉编译arm-linux-gcc,在GEC6818arm开发板上运行,运用C语言的相关知识利用链表存储商品信息和购物车功能,用户通过触摸屏点击事件选择和购买商品。
开发环境:
Linux
开发工具:
arm-linux-gcc、Notepad++
其他工具:
font库
编程实现:
通过开源代码编译器notepad++编写代码,利用arm-linux-gcc交叉编译,再通过LINUX平台的SSH服务器将编译生成的程序文件传输到开发板中,最后执行。
实现思路:
创建链表存取所有商品信息(商品名称,数量,价格),利用触摸屏事件,先确定商品页,再判断每件商品所在坐标。当用户点击商品坐标时,判断出该坐标为第几页第几个商品再切换界面显示商品信息。或者点击购物车,进入购物车界面。
实体效果:
具体部分代码:
while(1)
{
//显示主界面一
printf("\n");
show_pohoto("yinliao.bmp");
tmp_x=0;
tmp_y=0;
page=yinliao_list(fd,head,head2);//判断用户点击的是第几页的第几个商品,返回页数。(全局变量X,Y保存用户点击的坐标)
printf("页数=%d\n",page);
while(1)
{
tmp_x=x,tmp_y=y;
printf("x=%d y=%d\n",tmp_x,tmp_y);//打印x,y的坐标
if(page==1)//显示点击的商品
{
if(tmp_y>60 &&tmp_y<200 &&tmp_x>80 &&tmp_x<170)//显示第一页第一商品
{
tmp=seek_pos(head,1);//获取节点
sprintf(buff,"//shangping/%s",tmp->pic_name);//拼接路径
show_pohoto(buff);//显示第一个商品
show_num(tmp->num);//字库显示该商品数量
add_shoppingcar(head,head2,tmp,tmp_x,tmp_y,fd,xy);//加入购物车链表
break;
}
else if(tmp_y>60 &&tmp_y<200 && tmp_x>300 &&tmp_x<390)//显示第一页第二个商品
{
//重复上述....
}
//以此类推,显示该页其他所有商品
}
if(page==2)//显示点击的商品
{
if(tmp_y>60 &&tmp_y<200 && tmp_x>80 &&tmp_x<170)//显示第二页第一商品
{
tmp=seek_pos(head,7);//获取节点
sprintf(buff,"//shangping/%s",tmp->pic_name);
show_pohoto(buff);//显示第七个商品
show_num(tmp->num);//显示商品数量
add_shoppingcar(head,head2,tmp,tmp_x,tmp_y,fd,xy);//加入购物车链表
break;
}
if(tmp_y>60 &&tmp_y<200 && tmp_x>300 &&tmp_x<390)//显示第二页第二个商品
{
//重复上述....
}
//以此类推,显示该页其他所有商品
}
if(page==3)//购物车清单界面
{
break;
}
}
if(page!=3)//单商品信息列表
{
return_menu(head,head2,tmp,tmp_x,tmp_y,fd,xy);
}
}
实现思路:
当用户点击某件商品图标时,通过指针跳转到该商品节点,显示商品图片,名称,价格,数量。再根据触摸屏事件判断坐标,实现上下商品切换(链表节点跳转),购买商品,加入购物车的功能。
实体效果:
商品上下切换:
商品购买,库存更改:
判断节点中商品数量,若为0,则无法购买。库存不足:
加入购物车:
具体部分代码:
int return_menu(struct double_list *head,struct double_list *head2,struct double_list *tmp,int tmp_x,int tmp_y,int fd,struct input_event xy)//获取商品信息,左右查看商品,购买或者返回菜单
{
char buff[66]={0}; //接取拼接后的节点信息
while(1)
{
read(fd,&xy,sizeof(xy));
if(xy.type == EV_ABS && xy.code == ABS_X )
{
tmp_x=xy.value;
}
if(xy.type == EV_ABS && xy.code == ABS_Y)
{
tmp_y=xy.value;
}
if(xy.type == EV_KEY && xy.code == BTN_TOUCH && xy.value == 0)
{
printf("x=%d y=%d\n",tmp_x,tmp_y);
if(tmp_y>400 &&tmp_y<480 && tmp_x>0 &&tmp_x<130)//退出返回主菜单
{
printf("\n");
show_pohoto("yinliao.bmp");
break;
}
if(tmp_y>400 &&tmp_y<480 && tmp_x>270 &&tmp_x<530)//购买商品后3秒自动返回
{
if(tmp->num==0)
{
printf("\n");
show_pohoto("kucunbuzu.bmp");
sleep(2);
return 1;
}
printf("\n");
show_pohoto("goumai1.bmp");
show_word(tmp->price);
gouwu_name(tmp->pic_name);
tmp->num=(tmp->num)-1;
sleep(1);
printf("\n");
show_pohoto("goumai2.bmp");
show_word(tmp->price);
gouwu_name(tmp->pic_name);
sleep(1);
printf("\n");
show_pohoto("goumai3.bmp");
show_word(tmp->price);
gouwu_name(tmp->pic_name);
sleep(1);
break;
}
if( tmp_y>170 &&tmp_y<310 && tmp_x>610 &&tmp_x<800)//显示下个商品以及数量
{
if(tmp->next==head)
{
tmp=tmp->next;
}
tmp=tmp->next;
bzero(buff,sizeof(buff));
sprintf(buff,"//shangping/%s",tmp->pic_name);
printf("\n");
show_pohoto(buff);
show_num(tmp->num);//显示商品数量
}
if( tmp_y>170 &&tmp_y<310 && tmp_x>0 &&tmp_x<190)//显示上个商品以及数量
{
if(tmp->prev==head)
{
tmp=tmp->prev;
}
tmp=tmp->prev;
bzero(buff,sizeof(buff));
sprintf(buff,"//shangping/%s",tmp->pic_name);
printf("\n");
show_pohoto(buff);
show_num(tmp->num);//显示商品数量
}
if(tmp_y>400 &&tmp_y<480 &&tmp_x>620 &&tmp_x<800)//购物车
{
if(tmp->tmp_num>=tmp->num)
{
printf("\n");
show_pohoto("kucunbuzu.bmp");
sleep(1);
break;
}
printf("\n");
show_pohoto("jiarugouwuche.bmp");
sleep(1);
bzero(buff,sizeof(buff));
sprintf(buff,"//shangping/%s",tmp->pic_name);
printf("\n");
tmp->tmp_num+=1;
show_pohoto(buff);
show_num(tmp->num);
printf("加入购物车\n");
inser_gouwulist(head2,tmp);
head2->price=tmp->price;
head2->num=1;
}
}
}
return 1;
}
实现思路:
当用户点击了商品信息页中加入购物车图标时,若库存充足则将该商品名和价格保存到另一条链表之中,当用户进入购物车界面时,遍历购物车链表通过字库显示出所有需要购买商品的信息,再通过清空购物车图标或结账,选择清空链表或者计算所有商品价格,显示结账信息,最后清空链表。
实体效果:
结账
清空购物车
具体部分代码:
if(y>380 &&y<480 && x>650 && x<800)//进入购物车页面
{
show_pohoto("gouwuche.bmp");
page=3;//确定饮料页数
int jiedian;//查看购物车有多少个商品
jiedian=show_list(head2);//查看购物车信息
printf("购物车的节点有%d个\n",jiedian);
switch(jiedian)
{
//.....显示购物车中的商品信息
case 4:
show_gouwu(head2->next->next->next->next->pic_name,10,240);
show_gouwu_pirce(head2->next->next->next->next->price,240,240);
case 3:
show_gouwu(head2->next->next->next->pic_name,10,200);
show_gouwu_pirce(head2->next->next->next->price,240,200);
case 2:
show_gouwu(head2->next->next->pic_name,10,160);
show_gouwu_pirce(head2->next->next->price,240,160);
case 1:
show_gouwu(head2->next->pic_name,10,120);
show_gouwu_pirce(head2->next->price,240,120);
}
while(1)
{
read(fd,&xy,sizeof(xy));
if(xy.type == EV_ABS && xy.code == ABS_X )
{
x=xy.value;
}
if(xy.type == EV_ABS && xy.code == ABS_Y)
{
y=xy.value;
}
if(xy.type == EV_KEY && xy.code == BTN_TOUCH && xy.value == 0)
{
if(y>400 &&y<480 &&x>0 &&x<130)//返回菜单
{
show_pohoto("yinliao.bmp");
return page;
}
if(y>410 &&y<480 &&x>670 &&x<800)//支付成功
{
show_pohoto("gouwuchezhifu.bmp");
//计算购物车总价格
struct double_list *q = head2;
float gw_price=0;
while(q->next !=head2)
{
gw_price+=q->next->price;
q=q->next;
}
show_gw_price(gw_price);
sleep(2);
delete_list(head2);
jian_num(head);//减去链表1中购物车的库存;
delete_tmp_num(head);
return page;
}
if(y>410 &&y<480 &&x>310 &&x<440)//清空购物车
{
show_pohoto("qingkong.bmp");
sleep(2);
delete_tmp_num(head);
delete_list(head2);
return page;
}
}
}
}
此次项目主要运用了双向链表的增删查改,对数据的判断和修改,字库的使用,触摸屏坐标的判断。通过不断重复去调试、解决出现的BUG。完善好链表之间的数据交互…从而实现项目的所有功能。