【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.hqwc.cn/news/29214.html

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

相关文章

Linux之设备树解耦架构解读-V1.0

术语和缩略语 本文档使用了以下术语和缩略语 Dts&#xff1a;DTS即Device Tree Source&#xff0c;是一个文本形式的文件&#xff0c;用于描述硬件信息。一般都是固定信息&#xff0c;无法变更&#xff0c;无法overlay。 Dtsi&#xff1a;可以理解为dts的公共部分&#xff0…

初识Redis——Redis概述、安装、基本操作

目录 一、NoSQL介绍 1.1什么是NoSQL 1.2为什么会出现NoSQL技术 1.3NoSQL的类别 1.4传统的ACID是什么 1.5 CAP 1.5.1 经典CAP图 1.5.4 什么是BASE 二、Redis概述 2.1 什么是Redis 2.2 Redis能干什么 2.3 Redis的特点 2.4 Redis与memcached对比 2.5 Redis的安装 2.6 Docker安装 三…

机器学习(14)--XGBoost

目录 一、概述 二、CART、GB、GBDT 1、CART 2、BT&#xff08;Boosting Tree提升树&#xff09; 3、GBDT&#xff08;梯度提升树&#xff09; 4、GBDT在sklearn中的损失函数 三、Sklearn中的GBDT 1、加载模块 2、划分数据集 3、建模 4、与随机森林和线性回归对比 5…

教你快速安装Bootstrap

目录 Bootstrap简介Bootstrap的下载Bootstrap的使用 Bootstrap简介 Bootstrap是美国Twitter公司的设计师Mark Otto和Jacob Thornton合作&#xff0c;基于HTML、CSS、JavaScript开发的简洁、直观、强悍的前端开发框架&#xff0c;它会使Web开发更加快捷Bootstrap框架的优点 开发…

GRE实验

题目参考&#xff1a; 实验步骤&#xff1a; 第一步&#xff1a;地址规划拓扑设计&#xff0c;配置IP地址 R1配置&#xff1a; <Huawei>system-view [Huawei]sy R1 [R1]int g 0/0/1 [R1-GigabitEthernet0/0/1]ip address 192.168.1.1 24 [R1-GigabitEthernet0/0/1]in…

异步fifo(1)

什么时异步fifo FIFO&#xff0c;即First In First Out &#xff0c;是一种先进先出的数据缓存器&#xff0c;异步FIFO 是指读写时钟不一致&#xff0c;读写时钟是互相独立的。数据从一个时钟域写入FIFO缓冲区&#xff0c;并从另一个时钟域的同一FIFO缓冲区中读取数据&#xf…

博弈论--sg函数

sg函数------ 定义终止状态的SG函数值为0。如果游戏已经结束&#xff0c;即达到了终止状态&#xff0c;那么对应的SG函数值就是0。即先手的sg值为0&#xff0c;则先手必败&#xff0c;否则先手必胜。 如何求sg函数值--------对于每个可能的移动&#xff0c;将后续状态的SG函数…

Centos 7 使用国内镜像源更新内核

内核选择参考 此博文 &#xff1a;https://blog.csdn.net/alwaysbefine/article/details/108931626 elrepo官网介绍的内核升级方式为&#xff1a; 一、按文档执行引入 elrepo库&#xff1b; # 1、引入公钥 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org# 2、安…

JVM学习之内存与垃圾回收篇1

文章目录 1 JVM与Java体系结构1.0 Java发展重大事件1.1 虚拟机和Java虚拟机1.3 JVM整体结构1.4 Java代码执行流程1.5 JVM架构模型1.6 JVM的生命周期1.7 JVM发展历程 2 类加载子系统2.1 ClassLoader2.2 用户自定义类加载器2.2.1 为什么需要自定义类加载器2.2.2 自定义类加载器的…

go初识iris框架(二) - get,post请求和数据格式

继初步了解iris后 文章目录 获取url路径获取数据get请求post请求获取JSON数据格式JSON返回值获取XML数据格式XML返回值 获取url路径 package mainimport "github.com/kataras/iris/v12"func main(){app : iris.New()app.Get("/hello",func(ctx iris.Conte…

blender 建模马拉松

效果展示 蘑菇模型创建&#xff1a; 创建蘑菇头 shift A &#xff0c;创建立方体&#xff1b; 右下工具栏添加细分修改器&#xff08;视图层级&#xff1a;2&#xff0c;渲染&#xff1a;2&#xff09;&#xff1b;tab键进入编辑模式&#xff0c;alt z 进入透显模式&…

Java:输入与输出

目录 输入输出args 输入Scanner 输入格式化输出文件输入与输出 输入输出 args 输入 利用main函数中的参数args&#xff0c;当然也可以起别的名字。其他语言也是一样的。输入时空格分隔。 args的作用&#xff1a;在程序启动时可以用来指定外部参数 Scanner 输入 需要import j…