项目要求:
假如我家开了个水果超市,有以下水果,想实现自动化管理,扫描二维码就能知道当前的水果状态,进货几天了,
好久需要再次进货,那些水果畅销,那些水果不畅销,那些水果春夏秋冬的价格波动,好,那么现在我想将
这些信息保存在数据库中,那么我应该怎么做;
提示: 建立一张fruit表,
假如水果有: 苹果,香蕉,梨,橘子,葡萄....(可以自己查一下英文保存到数据库)
水果价格: 苹果 5元/斤 香蕉 3元/斤 梨 3.5元/斤 橘子2.5元/斤 葡萄 8元/斤....
当前存货: 苹果 80斤 香蕉 200斤 梨 50斤 橘子300斤 葡萄 100斤....
超市每天水果都有进货和卖出嘛,水果的价格随着季节和天气也会有波动,顾客也会看一下每天水果的价格的嘛,
所以要求,根据上述提示,利用数据库完成水果店各种水果的增(进货)删(卖出)改(波动)查(看价格)功能。
并将进出货的时间和顾客光顾的时间记录到数据库中保存。
1.项目演示
1
2.项目代码
#include<stdio.h>
#include<sqlite3.h>
#include<stdlib.h>
#include<time.h>
#define DATABASE "fruit.db"
/*
功能:按水果名字查询水果数量
参数:db:数据库句柄 name:水果名字
返回值:成功:水果数量 失败: -1
*/
int queryfruitamount(sqlite3 *db,char name[10])
{
char *errmsg;
char ** resultp;
int nrow;
int ncolumn;
char sql[128] = {};
int fruitamount;
sprintf(sql, "select amount from fruit where fruitname='%s';", name);
if(sqlite3_get_table(db, sql,&resultp, &nrow, &ncolumn, &errmsg) != 0)
{
printf("%s\n", errmsg);
return -1;
}
fruitamount=atoi(resultp[ncolumn]);
sqlite3_free_table(resultp);
return fruitamount;
}
/*
功能:改变水果数量
参数:db:数据库句柄 name:水果名字 num:数量
返回值:成功:0 失败: -1
*/
int updatefruitamount(sqlite3 *db,char name[10],int num)
{
char sql[128] = {};
char *errmsg;
sprintf(sql, "update fruit set amount=%d where fruitname='%s';", num,name);
if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("%s\n", errmsg);
return -1;
}
return 0;
}
/*
功能:记录时间
参数:db:数据库句柄 name:水果名字
operate:1:进货时间 2:出货时间 3:顾客查看价格时间
返回值:成功:0 失败: -1
*/
int updatetime(sqlite3 *db,char name[10],int operate)
{
char sql[128] = {};
char str[20]={};
char timestr[15]={};
char *errmsg;
time_t tem=time(NULL);
struct tm*tmer=localtime(&tem);
switch(operate)
{
case 1:
sprintf(str, "purchasetime");
break;
case 2:
sprintf(str, "shiptime");
break;
case 3:
sprintf(str, "watchtime");
break;
default:
return -1;
}
sprintf(timestr, "%02d:%02d:%02d",tmer->tm_hour,tmer->tm_min,tmer->tm_sec);
sprintf(sql, "update fruit set %s='%s' where fruitname='%s';", str,timestr,name);
if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("%s\n", errmsg);
return -1;
}
return 0;
}
/*
功能:改变水果价格
参数:db:数据库句柄 name:水果名字 price:水果价格
返回值:成功:0 失败: -1
*/
int updatefruitprice(sqlite3 *db,char name[10],float price)
{
char sql[128] = {};
char *errmsg;
sprintf(sql, "update fruit set price=%0.3f where fruitname='%s';", price,name);
if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("%s\n", errmsg);
return -1;
}
return 0;
}
/*
功能:水果进货
参数:db:数据库句柄
返回值:成功 :0 失败:-1
*/
int fruit_buy(sqlite3 *db)
{
char name[10];
int amount;
int num;
printf("请输入水果的名称:");
scanf("%s", name);
while(getchar()!='\n');
amount=queryfruitamount(db,name);
if(amount==-1)
{
return -1;
}
printf("请输入进货数量:");
scanf("%d", &num);
while(getchar()!='\n');
amount+=num;
if(updatefruitamount(db,name,amount)==-1)
{
return -1;
}
if(updatetime(db,name,1)==-1)
{
return -1;
}
return 0;
}
/*
功能:水果卖出
参数:db:数据库句柄
返回值:成功 :0 失败:-1
*/
int fruit_sell(sqlite3 *db)
{
char name[10];
int amount;
int num;
printf("请输入水果的名称:");
scanf("%s", name);
while(getchar()!='\n');
amount=queryfruitamount(db,name);
if(amount==-1)
{
return -1;
}
printf("请输入卖出的数量:");
scanf("%d", &num);
while(getchar()!='\n');
amount-=num;
if(amount<0)
{
printf("数量不够卖不了\n");
return -1;
}
if(updatefruitamount(db,name,amount)==-1)
{
return -1;
}
if(updatetime(db,name,2)==-1)
{
return -1;
}
return 0;
}
/*
功能:水果价格的更新
参数:db:数据库句柄
返回值:成功 :0
*/
int fruit_update(sqlite3 *db)
{
char name[10];
float price;
printf("请输入水果的名称:");
scanf("%s", name);
while(getchar()!='\n');
printf("请输入现在的价格:");
scanf("%f", &price);
while(getchar()!='\n');
if(updatefruitprice(db,name,price)==-1)
{
return -1;
}
return 0;
}
/*
功能:查看水果的价格
参数:db:数据库句柄
返回值:成功 :0 失败:-1
*/
int callback(void *arg, int f_num, char ** f_value, char ** f_name)
{
int i = 0;
for(i = 0; i < f_num; i++)
{
printf("%-16s元/斤\n", f_value[i]);
}
return 0;
}
int fruit_watch(sqlite3 *db)
{
char *errmsg;
char sql[128] = "select fruitname,price from fruit;";
char name[10];
printf("请输入水果的名称:");
scanf("%s", name);
while(getchar()!='\n');
sprintf(sql, "select price from fruit where fruitname='%s';",name);
if(sqlite3_exec(db, sql, callback,NULL , &errmsg) != 0)
{
printf("%s", errmsg);
return -1;
}
if(updatetime(db,name,3)==-1)
{
return -1;
}
return 0;
}
/*
功能:查看全部信息
参数:db:数据库句柄
返回值:成功 :0 失败:-1
*/
int fruit_all(sqlite3 *db)
{
char *errmsg;
char ** resultp;
int nrow;
int ncolumn;
if(sqlite3_get_table(db, "select * from fruit", &resultp, &nrow, &ncolumn, &errmsg) != SQLITE_OK)
{
printf("%s\n", errmsg);
return -1;
}
int i = 0;
int j = 0;
int index = ncolumn;
for(j = 0; j < ncolumn; j++)
{
printf("%-10s ", resultp[j]);
}
putchar(10);
for(i = 0; i < nrow; i++)
{
for(j = 0; j < ncolumn; j++)
{
printf("%-10s ", resultp[index++]);
}
putchar(10);
}
sqlite3_free_table(resultp);
return 0;
}
/*
功能:数据表赋值初始信息
参数:db:数据库句柄
返回值:成功 :0 失败:-1
*/
int fruit_create(sqlite3 *db)
{
char *errmsg;
char sql1[128] = {"insert into fruit(fruitname,price,amount) values('apple',5,80);"};
char sql2[128] = {"insert into fruit(fruitname,price,amount) values('banana',3,200);"};
char sql3[128] = {"insert into fruit(fruitname,price,amount) values('pear',3.5,50);"};
char sql4[128] = {"insert into fruit(fruitname,price,amount) values('orange',2.5,300);"};
char sql5[128] = {"insert into fruit(fruitname,price,amount) values('grape',8,100);"};
if(sqlite3_exec(db, sql1, NULL, NULL, &errmsg) != 0)
{
printf("%s\n", errmsg);
return -1;
}
if(sqlite3_exec(db, sql2, NULL, NULL, &errmsg) != 0)
{
printf("%s\n", errmsg);
return -1;
}
if(sqlite3_exec(db, sql3, NULL, NULL, &errmsg) != 0)
{
printf("%s\n", errmsg);
return -1;
}
if(sqlite3_exec(db, sql4, NULL, NULL, &errmsg) != 0)
{
printf("%s\n", errmsg);
return -1;
}
if(sqlite3_exec(db, sql5, NULL, NULL, &errmsg) != 0)
{
printf("%s\n", errmsg);
return -1;
}
return 0;
}
int main(int argc,char*argv[])
{
sqlite3*db;
if(sqlite3_open(DATABASE,&db)!=0)
{
printf("%s\n",sqlite3_errmsg(db));
return -1;
}
char*errmsg;
char sql[256]={"create table fruit(fruitname text,price float,amount int,purchasetime text,shiptime text,watchtime text);"};
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)==0)
{
fruit_create(db);//数据表创建成功赋初值
}
printf("open or create success\n");
int cmd=0;
while(1)
{
printf("**********************************\n");
printf("1.进货 2.卖出 3.价格波动 4.查看价格 5.显示所有 6.退出\n");
printf("**********************************\n");
printf("请选择:");
scanf("%d",&cmd);
while(getchar()!='\n');
switch(cmd)
{
case 1:
fruit_buy(db);
break;
case 2:
fruit_sell(db);
break;
case 3:
fruit_update(db);
break;
case 4:
fruit_watch(db);
break;
case 5:
fruit_all(db);
break;
case 6:
sqlite3_close(db);
exit(0);
break;
default:
printf("选择无效请重新选择\n");
}
}
return 0;
}