2025.01.02(数据库)

作业:实现以下功能:

1> 创建一个工人信息库,包含工号(主键)、姓名、年龄、薪资。

2> 添加三条工人信息(可以完整信息,也可以非完整信息)

3> 修改某一个工人的薪资(确定的一个)

4> 展示出工资在10000到20000之间的所有工人信息

5> 删除掉指定姓名工人的信息

6> 工厂倒闭,删除整个工人信息库

#include <myhead.h>
#include <sqlite3.h>typedef struct 
{int num ;char name[20];int age;int salary; }Worker;// 回调函数
#if 0
int callback(void *NotUsed,int argc,char **argv,char **azColName)
{for(int i=0;i<argc;i++){printf("%s = %s  \t",azColName[i],argv[i]?argv[i]:"NULL");}printf("\n");return 0;
}
#endif
int callback(void *aaa,int n,char **m,char **xin)
{int i,j;static int flag = 0;if(flag == 0){for(i=0;i<n;i++){printf("%s\t",*(xin+i));}printf("\n");}flag += 1;for(int j=0;j<n;j++){printf("%s\t",*(m+j));}printf("\n");return 0;
}
sqlite3 * creat_squlte() //创建数据库并返回数据库句柄
{const char *p = "./my.db";sqlite3 *ppDb;if(sqlite3_open(p,&ppDb)!=SQLITE_OK)//调用数据库第三方库函数{printf("打开数据库失败\n");printf("%s\n",sqlite3_errmsg(ppDb));printf("%d\n",sqlite3_errcode(ppDb));perror("sqlite3_open");}return ppDb;//返回数据库句柄
}void insert_worker(sqlite3 *ppDb)//插入员工信息
{char sql[1024];Worker work;char *errmsg ;sprintf(sql,"%s","create table if not exists works(num int primary key,name char,age int,salary int);");if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=SQLITE_OK){printf("%s\n",sqlite3_errmsg(ppDb)); 		//错误信息printf("%d\n",sqlite3_errcode(ppDb)); 		//错误码printf("错误行:%d\n",__LINE__); 		printf("出错信息:%s\n",errmsg); 		//错误信息}while(1){printf("请输入员工相关信息:\n");printf("请输入员工工号,输入“000”结束\n");int a1 = 000;scanf("%d",&work.num);while(getchar()!='\n');if(work.num == a1){printf("录入完毕\n");break;}printf("请输入员工姓名\n");scanf("%s",work.name);while(getchar()!='\n');printf("请输入员工年龄\n");scanf("%d",&work.age);while(getchar()!='\n');printf("请输入员工工资\n");scanf("%d",&work.salary);while(getchar()!='\n');sprintf(sql,"insert into works values(%d,\"%s\",%d,%d);",work.num,work.name,work.age,work.salary);if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=SQLITE_OK){printf("%s\n",sqlite3_errmsg(ppDb));printf("%d\n",sqlite3_errcode(ppDb));printf("错误行:%d\n",__LINE__);return ;}}}void Revise_worker(sqlite3 *ppDb) 		//修改工人信息
{char sql[1024];Worker work;char *errmsg;printf("请输入要修改的员工工号\n");scanf("%d", &work.num);while (getchar() != '\n');printf("请输入新的员工姓名\n");scanf("%s", work.name);while (getchar() != '\n');printf("请输入新的员工年龄\n");scanf("%d", &work.age);while (getchar() != '\n');printf("请输入新的员工工资\n");scanf("%d", &work.salary);while (getchar() != '\n');sprintf(sql, "UPDATE works SET name = '%s', age = %d, salary = %d WHERE num = %d;",work.name, work.age, work.salary, work.num);if (sqlite3_exec(ppDb, sql, NULL, NULL, NULL) != SQLITE_OK) {printf("%s\n",sqlite3_errmsg(ppDb));printf("%d\n",sqlite3_errcode(ppDb));printf("错误行:%d\n",__LINE__);return ;}else{printf("修改成功\n");}
}//方法1
//外部传参记录次数//方法2
#if 0
void show_worker(sqlite3 *ppDb) 			//展示所有信息
{char sql[1024];Worker work;char *errmsg;sprintf(sql,"%s","select * from works");if (sqlite3_exec(ppDb, sql,callback, NULL, NULL) != SQLITE_OK) {printf("%s\n",sqlite3_errmsg(ppDb));printf("%d\n",sqlite3_errcode(ppDb));printf("错误行:%d\n",__LINE__);return ;}
}#endif
//方法三
//使用新的函数获取信息
#if 1
void show_worker(sqlite3 *ppDb)
{char sql[1024];char *errmsg; 		//存储错误信息的指针char **p;int hang;int lie;sprintf(sql,"%s","select * from works;");if(sqlite3_get_table(ppDb,sql,&p,&hang,&lie,&errmsg)!=SQLITE_OK){printf("%s\n",sqlite3_errmsg(ppDb));printf("%d\n",sqlite3_errcode(ppDb));printf("错误行:%d\n",__LINE__);return ;}int i,j;for(i=0;i<hang;i++){for(j=0;j<lie;j++){printf("%s\t",*(p+(lie*i)+j));}printf("\n");}
}
#endif
void delete_worker(sqlite3 *ppDb) 		//删除指定工人信息
{char sql[1024];Worker work;char *errmsg;char bbb[20];printf("输入要删除员工的编号\n");scanf("%s",bbb);sprintf(sql,"delete from works where num = %s",bbb);if (sqlite3_exec(ppDb, sql, NULL, NULL, NULL) != SQLITE_OK) {printf("%s\n",sqlite3_errmsg(ppDb));printf("%d\n",sqlite3_errcode(ppDb));printf("错误行:%d\n",__LINE__);return ;}else{printf("删除成功\n");}}
void delete_all_worker(sqlite3 *ppDb) 	//删除整表
{char sql[1024];char *errmsg;sprintf(sql,"delete from works");if (sqlite3_exec(ppDb, sql, NULL, NULL, NULL) != SQLITE_OK) {printf("%s\n",sqlite3_errmsg(ppDb));printf("%d\n",sqlite3_errcode(ppDb));printf("错误行:%d\n",__LINE__);return ;}else{printf("删除整表成功\n");}}void menu()
{int ch;sqlite3 *ppDb;//数据库句柄while(1){printf("\t\t\t1.创建数据库\n");printf("\t\t\t2.添加工人信息\n");printf("\t\t\t3.修改工人信息\n");printf("\t\t\t4.展示所有信息\n");printf("\t\t\t5.删除指定工人信息\n");printf("\t\t\t6.删除整表\n");printf("\t请输入你的选择\n");scanf("%d",&ch);while(getchar()!='\n');switch(ch){case 1:ppDb = creat_squlte(); 		//创建数据库函数break;case 2:insert_worker(ppDb); 		//添加工人信息break;case 3:Revise_worker(ppDb); 		//修改工人信息break;case 4:show_worker(ppDb); 			//展示所有信息break;case 5:delete_worker(ppDb); 		//删除制定工人信息break;case 6:delete_all_worker(ppDb); 	//删除整表break;case 0:exit(0); 				//退出break;default :printf("输入的功能有误,请从新输入\n");}}
}
int main(int argc, const char *argv[])
{menu();return 0;
}

思维导图

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

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

相关文章

df.groupby()方法使用表达式分组

# 索引值是否为偶数&#xff0c;分成两组 df.groupby(lambda x:x%20).sum() df.groupby(df.index%20).sum() # 同上这两个写法看似相似&#xff0c;确实都基于索引值来进行分组&#xff0c;但在实现方式上有细微的区别&#xff1a; df.groupby(lambda x: x % 2 0) 这种方式通过…

景区自助售卡机与定点酒店的合作双赢之策-景区酒店方案

一、景区与酒店合作资源优势 1. 提升游客体验&#xff1a;游客在规划旅行时&#xff0c;可以一次性解决住宿和景区游览的安排&#xff0c;减少预订环节的繁琐&#xff0c;提供更便捷、顺畅的旅行体验。 2. 增加游客停留时间&#xff1a;通过联合推广&#xff0c;吸引游客在景区…

RK3588+FPGA全国产异步LED显示屏控制卡/屏幕拼接解决方案

RK3588FPGA核心板采用Rockchip RK3588新一代旗舰 级八核64位处理器&#xff0c;支持8K视频编解码&#xff0c;多屏4K输出&#xff0c;可实现12屏联屏拼接、同显、异显&#xff0c;适配多种操作系统&#xff0c;广泛适用于展览展示、广告内容投放、新零售、商超等领域实现各种媒…

双指针算法详解

目录 一、双指针 二、双指针题目 1.移动零 解法&#xff1a; 代码&#xff1a; 2.复写零 ​编辑 解法&#xff1a; 代码&#xff1a; 边界情况处理: 3.快乐数 ​编辑 解法:快慢指针 代码&#xff1a; 4.盛水最多的容器 解法&#xff1a;&#xff08;对撞指针&#xff09;…

【文献精读笔记】Explainability for Large Language Models: A Survey (大语言模型的可解释性综述)(三)

****非斜体正文为原文献内容&#xff08;也包含笔者的补充&#xff09;&#xff0c;灰色块中是对文章细节的进一步详细解释&#xff01; 3.2 全局解释&#xff08;Global Explanation&#xff09; 与旨在解释模型个体预测的局部解释不同&#xff0c;全局解释提供了对语言模型…

STM32G431收发CAN

1.硬件连接 PB8作为CAN_RX&#xff0c;PB9作为CAN_TX&#xff0c;连接一个CAN收发器TJA1051T/3 2. CubeMX里配置CAN 设置连接FDCAN1的参数&#xff0c;使用1个标准过滤器&#xff0c;波特率位500K 使能FDCAN1的中断 3 自动生成代码 3.1 初始化 static void MX_FDCAN1_In…

设计心得——流程图和数据流图绘制

一、流程图和数据流图 在软件开发中&#xff0c;画流程图和数据流图可以说是几乎每个人都会遇到。 1、数据流&#xff08;程&#xff09;图 Data Flow Diagram&#xff0c;DFG。它可以称为数据流图或数据流程图。其主要用来描述系统中数据流程的一种图形工具&#xff0c;可以将…

普及组集训数据结构--并查集

P1551 亲戚 - 洛谷 | 计算机科学教育新生态 并查集就是把所有相关联的量串成一串珠子&#xff0c;抽象来说就是&#xff1a; 把此类相关联的量当作节点&#xff0c;两个节点之间连接一条无向边&#xff0c;所形成的图 例题算法流程&#xff1a; 在此定义“族长”就是一个树的…

路由基本配置实验

路由器用于实现不同类型网络之间的互联。 路由器转发ip分组的基础是路由表。 路由表中的路由项分为直连路由项、静态路由项和动态路由项。 通过配置路由器接口的ip地址和子网掩码自动生成直连路由项。 通过手工配置创建静态路由项。 热备份路由器协议允许将由多个路由器组…

17爬虫:关于DrissionPage相关内容的学习01

概述 前面我们已经大致了解了selenium的用法&#xff0c;DerssionPage同selenium一样&#xff0c;也是一个基于Python的网页自动化工具。 DrissionPage既可以实现网页的自动化操作&#xff0c;也能够实现收发数据包&#xff0c;也可以把两者的功能合二为一。 DressionPage的…

计算机网络•自顶向下方法:网络层介绍、路由器的组成

网络层介绍 网络层服务&#xff1a;网络层为传输层提供主机到主机的通信服务 每一台主机和路由器都运行网络层协议 发送终端&#xff1a;将传输层报文段封装到网络层分组中&#xff0c;发送给边缘路由器路由器&#xff1a;将分组从输入链路转发到输出链路接收终端&#xff1…

下载linux aarch64版本的htop

htop代码网站似乎没有编译好的各平台的包&#xff0c;而自己编译需要下载一些工具&#xff0c;比较麻烦。这里找到了快速下载和使用的方法&#xff0c;记录一下。 先在linux电脑上执行&#xff1a; mkdir htop_exe cd htop_exe apt download htop:arm64 # 会直接下载到当前目…

呼叫中心中间件实现IVR进入排队,判断排队超时播放提示音

文章目录 [TOC](文章目录) 前言需求排队结束原因 联系我们实现步骤1. 调用http接口返回动作2. 启用拨号方案 前言 需求 呼叫中心需要实现调用IVR接口进入排队&#xff0c;如果是因为等待超时导致退出排队的&#xff0c;那就播放一段提示音再挂断通话&#xff1b;其他的情况就…

如何二次封装组件(vue3版本)

在开发 Vue 项目中我们一般使用第三方组件库进行开发&#xff0c;如 Element-Plus, 但是这些组件库提供的组件并不一定满足我们的需求&#xff0c;这时我们可以通过对组件库的组件进行二次封装&#xff0c;来满足我们特殊的需求。 对于封装组件有一个大原则就是我们应该尽量保…

【74HC192减法24/20/72进制】2022-5-17

缘由用74ls192设计一个72进制的减法计数器&#xff0c;需要有逻辑电路图-硬件开发-CSDN问答

Fastapi项目通过Jenkins2.4.91自动化构建部署到Nginx1.20进行访问详细方法(完全自动化部署亲测可用)

这篇技术文章需要结合我写的前两篇文章来一起看Gitlab17.7Jenkins2.4.91实现Fastapi/Django项目持续发布版本详细操作(亲测可用) 和 Pycharm2024.3Gitlab.17.7本地化部署和自动提交代码使用方法&#xff08;亲测可用&#xff09;&#xff0c;总体来说是三部曲。这篇文章详细解读…

iOS 11 中的 HEIF 图像格式 - 您需要了解的内容

HEIF&#xff0c;也称为高效图像格式&#xff0c;是iOS 11 之后发布的新图像格式&#xff0c;以能够在不压缩图像质量的情况下以较小尺寸保存照片而闻名。换句话说&#xff0c;HEIF 图像格式可以具有相同或更好的照片质量&#xff0c;同时比 JPEG、PNG、GIF、TIFF 占用更少的设…

DATACOM-DHCP-复习-实验

DHCP 概述工作原理DHCP分配机制 配置配置基于全局地址池的DHCP服务器配置DHCP Relay中继验证 实验配置DHCP中继 参考 概述 动态主机配置协议DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;是一种网络管理协议&#xff0c;用于集中对用户IP地址进行动态管理和…

深入浅出 Beam Search:自然语言处理中的高效搜索利器

Beam Search 技术详解 搜索系列相关文章&#xff08;置顶&#xff09; 1.原始信息再加工&#xff1a;一文读懂倒排索引 2.慧眼识词&#xff1a;解析TF-IDF工作原理 3.超越TF-IDF&#xff1a;信息检索之BM25 4.深入浅出 Beam Search&#xff1a;自然语言处理中的高效搜索利器 1…

二、CSS基础

一、选择器(1) 大白话&#xff1a;我们人为认为的解析方式是&#xff0c;从左往右查找&#xff0c;对于浏览器来说&#xff0c;是从右往左查找&#xff0c;解析速度更高。 注&#xff1a; 伪类选择器 - 作用于实际存在的元素&#xff0c;用于描述元素的某种特定状态或关系&…