【C语言+sqlite3 API接口】实现水果超市

实验内容:

假如我家开了个水果超市,有以下水果,想实现自动化管理,扫描二维码就能知道当前的水果状态,进货几天了,
好久需要再次进货,那些水果畅销,那些水果不畅销,那些水果春夏秋冬的价格波动,好,那么现在我想将这些信息保存在数据库中,那么我应该怎么做?

超市每天水果都有进货和卖出嘛,水果的价格随着季节和天气也会有波动,顾客也会看一下每天水果的价格的嘛, 所以要求,利用数据库完成水果店各种水果的增(进货)删(卖出)改(波动)查(看价格)功能。
并将进出货的时间和顾客光顾的时间记录到数据库中保存。

相关API

可以看看3)sqlite3 数据库 C语言
API

实现流程:

首先创建一张数据表fruit,除了需要指定每条记录的唯一标识id外,还要有水果品类(name)、存量(weight)、价格(price)、最近交易时间(time)等字段。
每一次操作,都会改变表中的数据内容,这些我们通过API来实现:各种水果的增(进货)删(卖出)改(波动)查(看价格)功能。并将进出货的时间和顾客光顾的时间记录到数据库中保存。

实现代码:

fruit.h

#ifndef _FRUIT_H_
#define _FRUIT_H_

#include <stdio.h>
#include <sqlite3.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

#define N 128
#define DATABASE "fruitery.db"
#define TABLE "fruit"

int do_insert(sqlite3 *db, char *buf);
int do_query(sqlite3 *db);
int do_update_weight(sqlite3 *db, char * buf);
int do_update_price(sqlite3 *db, char * buf);
int do_delete(sqlite3 *db, char *buf);
int do_delete_sort(sqlite3 *db, char * buf, int id);

#endif

fruit.c

#include "fruit.h"

int do_insert(sqlite3 *db, char *buf) {
	char *errmsg;
	char sql[N] = {};
	char name[N] = {};
	float weight;
	float price;

	printf("Input fruit name:");
	scanf("%s", name);
	getchar();

	printf("Input weight:");
	scanf("%f", &weight);
		
	printf("Input price:");
	scanf("%f", &price);

	sprintf(sql, "insert into '%s' (name, weight, price, time) values('%s', '%.3f', '%.3f', '%s')", TABLE, name, weight, price, buf);
	if ( sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK) {
		printf("Error: %s\n", errmsg);
	} else {
		printf("insert done.\n");
	}

	return 0;
}

int callback (void* arg,int f_num ,char** f_value,char** f_name) {
	int i;

	for(i = 0; i < f_num; i++) {
		printf("%-8s", f_value[i]);
	}
	return 0;
}

int do_query(sqlite3 *db) {
	char *errmsg;
	char sql[N] = {};

	sprintf(sql, "select * from '%s'", TABLE);
	if ( sqlite3_exec(db, sql, callback, NULL, &errmsg) != SQLITE_OK) {
		printf("Error: %s\n", errmsg);
	} else {
		printf("query done.\n");
	}
	return 0;
}

int do_update_weight(sqlite3 *db, char * buf)
{
	char *errmsg;
	char sql[N] = {};
	float weight;
	int id;

	printf("Input id:");
	scanf("%d", &id);

	printf("Input weight:");
	scanf("%f", &weight);

	sprintf(sql, "update '%s' set weight = '%.3f', time = '%s' where id = %d", TABLE, weight, buf, id);
	if ( sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK) {
		printf("Error: %s\n", errmsg);
	} else {
		printf("update weight done.\n");
	}
	return 0;
}

int do_update_price(sqlite3 *db, char * buf)
{
	char *errmsg;
	char sql[N] = {};
	float price;
	int id;

	printf("Input id:");
	scanf("%d", &id);

	printf("Input price:");
	scanf("%f", &price);

	sprintf(sql, "update '%s' set price = '%.3f', time = '%s' where id = %d", TABLE, price, buf, id);
	if ( sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK) {
		printf("Error: %s\n", errmsg);
	} else {
		printf("update price done.\n");
	}
	return 0;
}

int do_delete(sqlite3 *db, char * buf) 
{
	char *errmsg;
	char sql[N] = {};
	int id;

	printf("Input id:");
	scanf("%d", &id);

	do_delete_sort(db, buf, id );
	sprintf(sql, "delete from '%s' where id = %d", TABLE, id);
	if ( sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK) {
		printf("Error: %s\n", errmsg);
	} else {
		printf("delete done.\n");
	}
	return 0;
	
}

#define NEW_TABLE "new_table"
int do_delete_sort(sqlite3 *db, char *buf, int id) 
{
	char *errmsg;
	char sql[N] = {};

	//创建一张临时的新表格
	sprintf(sql, "create table '%s'(id integer  primary key autoincrement, name char, weight float, price float, time char);", NEW_TABLE);
	sqlite3_exec(db, sql, NULL, NULL, &errmsg);
	memset(sql, 0, sizeof(sql));

	//
	sprintf(sql, "insert into '%s' select * from '%s' where id = %d;",NEW_TABLE, TABLE, id);
	sqlite3_exec(db, sql, NULL, NULL, &errmsg);
	memset(sql, 0, sizeof(sql));

	//删除原有的表
	sprintf(sql, "drop table '%s'", TABLE);
	sqlite3_exec(db, sql, NULL, NULL, &errmsg);
	memset(sql, 0, sizeof(sql));

	//将新表的名字改成原有的旧表的名字
	sprintf(sql, "alter table '%s' rename to '%s'", NEW_TABLE, TABLE);
	sqlite3_exec(db, sql, NULL, NULL, &errmsg);
	memset(sql, 0, sizeof(sql));
	return 0;
}

test.c

#include "fruit.h"

int main (int argc, char *argv[]) {
	sqlite3 *db;
	char *errmsg;
	char buf[N] = {};
	char sql[N] = {};
	int n;

	time_t t;
	struct tm *tp;

//打开数据库文件 
	if ( sqlite3_open(DATABASE, &db) != SQLITE_OK ) {
		printf("%s\n", errmsg);
		return -1;
	} else {
		printf("open DATABASE success.\n");
	}
//创建一张数据库表格
	sprintf(sql, "create table '%s'(id integer  primary key autoincrement, name char, weight float, price float, time char);", TABLE);
	if ( sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK) {
		printf("exec :%s\n", errmsg);
	} else {
		printf("create table success.\n");
	}

	//时间
	time(&t);
	tp = localtime(&t);
	sprintf(buf,"%d-%02d-%02d %02d:%02d:%02d\n",
			tp->tm_year+1900, tp->tm_mon+1,tp->tm_mday, tp->tm_hour, tp->tm_min, tp->tm_sec);
	printf("%s\n", buf);

	while (1) {
		printf("-------------------------------------------\n");
		printf("1: insert 2:query 3:trade 4:update 5:delete 6:quit\n");
		printf("-------------------------------------------\n");
		printf("Please select:");
		scanf("%d", &n);

		switch(n) 
		{
		case 1: 
			do_insert(db, buf);
			break;
		case 2:
			do_query(db);
			break;
		case 3:
			do_update_weight(db, buf);
			break;
		case 4:
			do_update_price(db, buf);
			break;
		case 5:
			do_delete(db, buf);
			break;
		case 6:
			printf("main exit.\n");
			sqlite3_close(db);
			exit(0);
			break;
		default :
			printf("Invalid data,\n");
		}
	}
	return 0;
}

实现结果:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/40736.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

第一次实操Python+robotframework接口自动化测试

目前我们需要考虑的是如何实现关键字驱动实现接口自动化输出&#xff0c;通过关键字的封装实现一定意义上的脚本与用例的脱离&#xff01; robot framework 的安装不过多说明&#xff0c;网上资料比较太多~ 实例&#xff1a;&#xff01;&#xff01;&#xff01;&#xff01…

开源的短视频生成和编辑工具 Open Chat Video Editor

GitHub - SCUTlihaoyu/open-chat-video-editor: Open source short video automatic generation tool

KUKA机械臂的导纳控制

KUKA机械臂的导纳控制 在近期的实验中&#xff0c;需要根据传感器的给出的实时位置信息进行导纳控制&#xff0c;并实时改变导纳控制的参数。由于KUKA自带的实时导纳控制模型无法实时修改参数&#xff0c;因此尝试了自己实现导纳控制。网上这方面的资料比较少&#xff0c;整理…

Vue自定义指令

需求1&#xff1a;定义一个v-big指令&#xff0c;和v-text功能类似&#xff0c;但会把绑定的数值放大10倍。 需求2&#xff1a;定义一个v-fbind指令&#xff0c;和v-bind功能类似&#xff0c;但可以让其所绑定的input元素默认获取焦点。 自定义指令函数式v-big&#xff1a; &l…

Flutter 小技巧之滑动控件即将“抛弃” shrinkWrap 属性

相信对于 Flutter 开发的大家来说&#xff0c; ListView 的 shrinkWrap 配置都不会陌生&#xff0c;如下图所示&#xff0c;每当遇到类似的 unbounded error 的时候&#xff0c;总会有第一反应就是给 ListView 加上 shrinkWrap: true 就可以解决问题&#xff0c;那为什么现在会…

2023云曦期末复现

目录 WEB sign SSTI serialize WEB sign 有10000个 进行bp爆破 能发现 410 和 414长度 还有 420 410 414存在16进制的字符 拼凑出来为 \x66\x6c\x61\x67\x7b\x61\x63\x63\x39\x39\x66\x39\x30\x34\x66\x30\x65\x61\x66\x61\x34\x31\x63\x30\x36\x34\x33\x36\x38\x31\x3…

手机外壳缺陷视觉检测软硬件方案

单独使用一种光源效果图 同轴光会出现亮度不够的情况&#xff1b;回形面光因为光源中间的圆孔会使图像有阴影&#xff0c;造成图像效果不均衡&#xff0c;所以不采用单独光源打光 使用同轴回形面光源效果图 回形光源照亮产品要寻找的边缘&#xff0c;同轴光源起到补光的作用&a…

【100天精通python】Day5:python 基本语句,流程控制语句

目录 1. 条件语句 1.1 if语句 1.2 if-else语句 1.3 if-elif-else语句 2 循环语句 2.1 for循环 2.2 while循环&#xff1a; 3 跳转语句 3.1 break语句 3.2 continue语句 3.3 pass语句 4 异常处理语句&#xff08;try-except语句&#xff09; 5 语句嵌套 5.1 条…

Spring框架概述及核心设计思想

文章目录 一. Spring框架概述1. 什么是Spring框架2. 为什么要学习框架&#xff1f;3. Spring框架学习的难点 二. Spring核心设计思想1. 容器是什么&#xff1f;2. IoC是什么&#xff1f;3. Spring是IoC容器4. DI&#xff08;依赖注入&#xff09;5. DL&#xff08;依赖查找&…

2023-7-13-第十八式观察者模式

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

2023年iOS App Store上架流程详解(上)

目录 1.注册开发者账号 2.登录并配置人员 3.申请证书和配置文件 一.证书管理​ 二.新建证书​ 三.使用appuploader服务同步证书​ 1&#xff09;申请证书 2&#xff09;添加Identifiers和配置App ID 3&#xff09;申请配置文件 1.在Xcode项目中配置签名 2.上传应用包…

谷歌和加州大学伯克利分校的“改革者”在单个GPU上运行64K序列

转换器模型是自然语言处理&#xff08;NLP&#xff09;研究领域越来越流行的神经网络架构&#xff0c;大型变压器可以在许多任务上实现最先进的性能。代价是转换器过多的计算消耗和成本&#xff0c;尤其是对于长序列上的训练模型。 谷歌和加州大学伯克利分校的研究人员最近发表…

设计模式——解释器模式

解释器模式 定义 解释器模式&#xff08;Interpreter Pattern&#xff09;是一种按照规定语法进行解析的模式&#xff0c;现实项目中用得较少。 给定一门语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;该解释器使用该表示来解释语言中的句…

Java 设计模式——观察者模式

目录 1.概述2.结构3.案例实现3.1.抽象观察者3.2.观察对象3.3.具体观察者3.4.具体观察对象3.5.测试 4.优缺点5.使用场景6.JDK 源码解析——Observable / Observer6.1.Observable 类6.2.Observer 接口6.3.案例 1.概述 观察者模式 (Observer Pattern) 是一种行为型设计模式&#…

HP惠普暗影精灵9笔记本原装出厂Win11系统预装专用OEM系统镜像

暗影9笔记本电脑原厂Windows11系统包 OMEN by HP 16.1英寸游戏本16-wf0000,16-wf0001,16-wf0003,16-wf0004,16-wf0006,16-wf0008,16-wf0009,16-wf0010,16-wf0011,16-wf0012,16-wf0028,16-wf0029,16-wf0007,16-wf0032,16-wf0036,16-wf0043 链接&#xff1a;https://pan.baidu.…

[SQL系列] 从头开始学PostgreSQL Union Null 别名 触发器

初级的操作就是CRUD&#xff0c;但是高级的操作也是CRUD&#xff0c;只是语句写的更加复杂&#xff0c;不再是select * from table&#xff1b;这样简单&#xff0c;这次咱们学一些稍微高级点的。下面是上一篇文章。 [SQL系列] 从头开始学PostgreSQL 约束连接_Edward.W的博客-…

划片机的作用将晶圆分割成独立的芯片

划片机是将晶圆分割成独立芯片的关键设备之一。在半导体制造过程中&#xff0c;晶圆划片机用于将整个晶圆切割成单个的芯片&#xff0c;这个过程被称为“晶圆分割”或“晶圆切割”。 晶圆划片机通常采用精密的机械传动系统、高精度的切割刀具和先进的控制系统&#xff0c;以确保…

【C++ 重要知识点总结】表达式

表达式 1 基础 组合运算 优先级结合律 类型转换 运算符重载 左值和右值 2 算数运算符 3 逻辑和关系运算法 短路求值 逻辑与&#xff0c;当第一个判定为否的时候&#xff0c;不再执行第二个判定&#xff0c;可以用来屏蔽第二步的计算&#xff0c;代替条件判断&#xff0…

rabbitmq延时队列自动解锁库存

一、库存服务自动解锁库存 使用了最终一致性来解决分布式事务 当order服务出现异常回滚&#xff0c;此时ware服务无法回滚&#xff0c;怎么办&#xff1f; 使用seata全局事务虽然能在order服务出现异常导致回滚时使其他服务的也能同时回滚&#xff0c;但在流量大的情况下是使用…

【SpringBoot】从零开始封装自己的starter并且引入到其他项目中使用

从零开始封装自己的starter并且引入到其他项目中使用 简介 本文将介绍如何从零开始封装自己的starter并且引入到其他项目中使用 为什么要自己封装starter&#xff1f; 这样可以对spring以及其他第三方提供的starter做二次封装或者封装一些自己需要的内容提供给其他项目使用&…