【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;
}

实现结果:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

selenium查找svg元素

目录 如何为SVG元素编写XPath 使用local-name&#xff08;&#xff09;的语法 需要记住的一点 将“and”与SVG元素一起使用 如何定位嵌套的SVG元素&#xff1f; XPath是一种用于定位XML文档中的web元素的语言&#xff0c;包括构成网页的HTML文档。在Selenium中&#xff0…

【计算机视觉】DINOv2(视觉大模型)代码四个不同模型的对比,以 28 * 28 的图像为例(完整的源代码)

文章目录 一、ViT-S/14二、ViT-B/14三、ViT-L/14四、ViT-g/14 一、ViT-S/14 import torch import torchvision.transforms as T import matplotlib.pyplot as plt import numpy as np import matplotlib.image as mpimg from PIL import Image from sklearn.decomposition im…

ES系列--es进阶

一、系统架构 一个运行中的 Elasticsearch 实例称为一个节点&#xff0c;而集群是由一个或者多个拥有相同 cluster.name 配置的节点组成&#xff0c; 它们共同承担数据和负载的压力。当有节点加入集群中或者 从集群中移除节点时&#xff0c;集群将会重新平均分布所有的数据。 …

准备WebUI自动化测试面试?这30个问题你必须掌握(一)

本文共有8600字&#xff0c;包含了前十五个问题&#xff0c;如需要后十五个问题&#xff0c;可查看文末链接~ 1. 什么是WebUI自动化测试&#xff1f; WebUI自动化测试是指使用自动化测试工具和技术来模拟用户在Web用户界面&#xff08;UI&#xff09;上执行操作&#xff0c;并…

动态内存管理(C语言)

动态内存管理 1. 为什么存在动态内存管理2. 动态内存函数的介绍2.1 malloc函数和free函数2.2 calloc函数2.3 realloc函数 3. 常见的动态内存错误3.1 对NULL指针的解引用操作3.2 对动态开辟空间的越界访问3.3 对非动态开辟内存使用free函数3.4 使用free释放动态开辟内存的一部分…

Python爬虫——urllib_ajax的get请求爬取豆瓣电影前十页

ajax&#xff1a; 就是一段js代码&#xff0c;通过这段代码&#xff0c;可以让页面发送异步的请求&#xff0c;或者向服务器发送一个东西&#xff0c;即和服务器进行交互 对于ajax&#xff1a; 一定会有 url&#xff0c;请求方法(get, post)&#xff0c;可能有数据一般使用 j…

京东自动化功能之商品信息监控是否有库存

这里有两个参数,分别是area和skuids area是地区编码,我这里统计了全国各个区县的area编码,用户可以根据实际地址进行构造skuids是商品的信息ID填写好这两个商品之后,会显示两种状态,判断有货或者无货状态,详情如下图所示 简单编写下python代码,比如我们的地址是北京市…

291. 单词规律 II(plus题)

给你一种规律 pattern 和一个字符串 s&#xff0c;请你判断 s 是否和 pattern 的规律相匹配。 如果存在单个字符到 非空 字符串的 双射映射 &#xff0c;那么字符串 s 匹配 pattern &#xff0c;即&#xff1a;如果 pattern 中的每个字符都被它映射到的字符串替换&#xff0c;那…

猿辅导推出颠覆性产品小猿学练机,加速个性化学习时代到来

近期&#xff0c;沉默近两年的猿辅导在智能硬件领域释放动作&#xff0c;发布旗下首款智能硬件产品——小猿学练机。这一动作代表着&#xff0c;猿辅导正式入局1000亿智能硬件市场。据了解&#xff0c;小猿学练机面向全国中小学生&#xff0c;主打学练一体、以练促学&#xff0…

Maven 项目构建生命周期

Maven 项目构建生命周期 一句话: Maven 构建生命周期描述的是一次构建过程经历了多少个事件 生命周期的3 大阶段 clean 清理工作 default 核心工作&#xff0c;例如编译&#xff0c;测试&#xff0c;打包&#xff0c;部署等 site 产生报告&#xff0c;发布站点等 生命周期…

Elasticsearch 介绍及java集成

一、Elasticsearch 基础介绍 ElasticSearch 是分布式实时搜索、实时分析、实时存储引擎&#xff0c;简称&#xff08;ES)&#xff0c; 成立于2012年&#xff0c;是一家来自荷兰的、开源的大数据搜索、分析服务提供商&#xff0c;为企业提供实时搜索、数据分析服务&#xff0c;…

“layui助力博客管理升级!用增删改查功能打造优质博客体验“

目录 引文1.前置条件2.数据接口2.1 UserDao(CRUD)2.2 R工具类 3.HTML 结构3.1 主界面的HTML3.2 用户的查询所有界面的HTML3.3 新增修改通用的的HTML 4.JavaScript 代码4.1 用户的CRUD javaScript 代码(userManage)4.2 新增修改的javaScript代码(userEdit) 5. 运行截图总结 引文…

【Spring 】执行流程解析:了解Bean的作用域及生命周期

哈喽&#xff0c;哈喽&#xff0c;大家好~ 我是你们的老朋友&#xff1a;保护小周ღ 今天给大家带来的是 Spring 项目的执行流程解析 和 Bean 对象的6 种作用域以及生命周期&#xff0c;本文将为大家讲解&#xff0c;一起来看看叭~ 本期收录于博主的专栏&#xff1a;JavaEE_保…

latex3【排版】

多行公式排版&#xff1a;&#xff08;gather、align、split、cases&#xff09; \section{多行公式}%gather环境\begin{gather} abba \\ abcbaccbacab\end{gather}\begin{gather*} abba \\ abcbaccbacab\end{gather*}​\begin{gather} abba \\ 123 \notag …

【NLP】多头注意力概念(02)

接上文: 【NLP】多头注意力概念(01) 五、计算注意力 将 Q、K 和 V 拆分为它们的头部后,现在可以计算 Q 和 K 的缩放点积。上面的等式表明,第一步是执行张量乘法。但是,必须先转置 K。 展望未来,每个张量的seq_length形状将通过其各自的张量来识别,以确保清晰…

学习记录——SpectFormer、DilateFormer、ShadowFormer、MISSFormer

SpectFormer: Frequency and Attention is what you need in a Vision Transformer, arXiv2023 频域混合注意力SpectFormer 2023 论文&#xff1a;https://arxiv.org/abs/2304.06446 代码&#xff1a;https://badripatro.github.io/SpectFormers/ 摘要视觉变压器已经成功地应用…

网络套接字编程(三)(HTTP)

gitee仓库&#xff1a;https://gitee.com/WangZihao64/linux/tree/master/CalTcp 一、重谈协议 协议是一种“约定”&#xff0c;这种约定是双方都知道的。有了一致的约定&#xff0c;双方才能够正常地进行通信。协议在网络的第一篇博客中也提到过&#xff0c;协议是双方进行通…

python opencv 级联Haar多目标检测

一、基于OpenCV的haar分类器实现笑脸检测 1、Haar分类器介绍 &#x1f680;Haar分类器是一种基于机器学习的目标检测算法&#xff0c;它使用Haar特征描述图像中的目标。Haar特征是基于图像亮度的局部差异计算得出的&#xff0c;可以用来描述目标的边缘、角落和线条等特征。 使用…

基于PyQt5的UI界面开发——信号与槽

信号与槽的机制 PyQt5采用了一种被称为“信号与槽”机制的编程模式&#xff0c;用于处理对象间的通信和事件处理。在PyQt5中&#xff0c;信号&#xff08;signal&#xff09;是对象发出的特定事件&#xff0c;例如按钮被点击、文本被修改等。而槽&#xff08;slot&#xff09;…

用Maven的exec插件执行Java程序

Maven的exec插件介绍 利用maven的exec插件可以执行系统和Java程序。 官网资源 exec插件官网&#xff1a;https://www.mojohaus.org/exec-maven-plugin/java-mojo.html Goals exec:exec表示在一个单独的进程内执行系统和Java程序。 exec:java表示在当前的Java虚拟机内执行J…