Linux 基于sqlite3数据库的学生管理系统

一、数据库

        sqlite官网:www.sqlite.org

1.1 数据库的安装

        离线安装:

        sudo dpkg -i sqlite3_3.22.0-1ubuntu0.4_amd64.deb //数据库软件

        sudo dpkg -i libsqlite3-dev_3.22.0-1ubuntu0.4_amd64.deb //数据库的库函数

        在线安装:

        sudo apt-get install sqlite3 libsqlite3-dev

        如何确定自己是否已经安装成功了?

        在终端输入 sqlite3 如果能进入到下面的界面说明安装成功了

代码实现:

01test.c

gcc 01test.c -lsqlite3

编译时,需要链接sqlite3的库 -lsqlite3

#include <stdio.h>
#include <sqlite3.h>
#include <unistd.h>
#include <stdlib.h>
sqlite3 *pro_init()
{sqlite3 *my_db = NULL;int ret = 0;char *errmsg = NULL;if (SQLITE_OK != (ret = sqlite3_open("test.db", &my_db))){printf("sqlite3_open error:errno = [%d],errstr = [%s]\n", ret, sqlite3_errmsg(my_db));exit(-1);}printf("打开数据库成功...\n");// 建表// IF NO EXISTS表示如果不存在就新建  如果存在 就直接使用char sqlbuff[256] = "CREATE TABLE IF NOT EXISTS student(id INT PRIMARY KEY,name TEXT,score INT)"; // 程序中使用sql语句结尾不必加分号printf("%s\n", sqlbuff);if (SQLITE_OK != (ret = sqlite3_exec(my_db, sqlbuff, NULL, NULL, &errmsg))){printf("sqlite3_exec error:errno = %d,errstr = %s\n", ret, errmsg);exit(-1);}printf("建表成功..\n");sqlite3_free(errmsg); // 如果使用了第5个参数需要手动释放空间return my_db;
}
void print_menu()
{printf("--------------------------------------------\n");printf("| 1.添加   2.查找   3.修改   4.删除   5.退出 |\n");printf("--------------------------------------------\n");printf("请输入您的选择:");
}
// 添加学员信息
void insert_student(sqlite3 *my_db)
{int input_id = 0;int input_score = 0;char input_name[32] = {0};int ret = 0;printf("请输入学员信息(id(int) name(char) score(int)):");scanf("%d%s%d", &input_id, input_name, &input_score);// 组装sql语句char sqlbuff[256] = {0};sprintf(sqlbuff, "INSERT INTO student VALUES(%d,'%s',%d)", input_id, input_name, input_score);printf("sqlbuff : [%s]\n", sqlbuff);// 执行sql语句if (SQLITE_OK != (ret = sqlite3_exec(my_db, sqlbuff, NULL, NULL, NULL))){printf("sqlite3_exec error:errno = %d,errstr = %s\n", ret, sqlite3_errmsg(my_db));exit(-1);}printf("学员信息添加成功...\n");return;
}
// 查找学员信息 使用sqlite3_get_table实现
void search_student(sqlite3 *my_db)
{int ret = 0;char **result = NULL;int row = 0;int column = 0;// 组装sql语句char sqlbuff[256] = "SELECT *FROM student";// 执行sql语句if (SQLITE_OK != (ret = sqlite3_get_table(my_db, sqlbuff, &result, &row, &column, NULL))){printf("sqlite3_get_table error: errno = [%d],errstr = [%s]\n", ret, sqlite3_errmsg(my_db));exit(-1);}// 先打印字段名int i = 0;int j = 0;for (int i = 0; i < column; i++){printf("%16s", result[i]);}printf("\n");int index = i;// 再打印字段值for (i = 0; i < row; i++){for (j = 0; j < column; j++){printf("%16s", result[(i + 1) * 3 + j]);}printf("\n");}printf("学员信息查询成功...\n");return;
}
void modify_student(sqlite3 *my_db)
{printf("请输入要修改的学员id:");int input_id = 0;scanf("%d", &input_id);char input_name[32] = {0};int input_score = 0;printf("请输入新学员的信息(name(char) score(int)):");scanf("%s%d", input_name, &input_score);int ret = 0;char sqlbuff[256] = {0};sprintf(sqlbuff, "UPDATE student SET name='%s',score=%d WHERE id=%d", input_name, input_score, input_id);// 执行sql语句if (SQLITE_OK != (ret = sqlite3_exec(my_db, sqlbuff, NULL, NULL, NULL))){printf("sqlite3_exec error:errno = %d,errmsg = %s\n", ret, sqlite3_errmsg(my_db));exit(-1);}printf("修改学员信息成功...\n");return;
}void del_student(sqlite3 *my_db)
{printf("请输入要删除的学员id:");int input_id = 0;scanf("%d", &input_id);// 组装sql语句char sqlbuff[256] = {0};int ret = 0;sprintf(sqlbuff, "DELETE FROM student where id=%d", input_id);// 执行sql语句if (SQLITE_OK != (ret = sqlite3_exec(my_db, sqlbuff, NULL, NULL, NULL))){printf("sqlite3_exec error:errno = %d,errmsg = %s\n", ret, sqlite3_errmsg(my_db));exit(-1);}printf("学员信息删除成功...\n");return;
}
int main(int argc, char const *argv[])
{printf("欢迎使用..\n");sqlite3 *my_db = NULL;my_db = pro_init();int choose = 0;while (1){print_menu();scanf("%d", &choose);switch (choose){case 1:insert_student(my_db);break;case 2:search_student(my_db);break;case 3:modify_student(my_db);break;case 4:del_student(my_db);break;}if (5 == choose){printf("退出成功..\n");break;}}sqlite3_close(my_db);printf("欢迎下次使用...\n");return 0;
}

 效果图:

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

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

相关文章

推荐系统三十六式学习笔记:原理篇.模型融合13|经典模型融合办法:线性模型和树模型的组合拳

目录 为什么要融合&#xff1f;“辑度组合”原理逻辑回归梯度提升决策树GBDT二者结合 总结 推荐系统在技术实现上一般划分为三个阶段&#xff1a;挖掘、召回、排序 。 为什么要融合&#xff1f; 挖掘的工作是对用户和物品做非常深入的结构化分析&#xff0c;各个角度各个层面…

MySQL之可扩展性(六)

可扩展性 向外扩展 12.重新均衡分片数据 如有必要&#xff0c;可以通过在分片间移动数据来达到负载均衡。举个例子&#xff0c;许多读者可能听一些大型图片分享网站或流行社区网站的开发者提到过用于分片间移动用户数据的工具。在分片间移动数据的好处很明显。例如&#xff…

鸿蒙开发设备管理:【@ohos.batteryInfo (电量信息)】

电量信息 该模块主要提供电池状态和充放电状态的查询接口。 说明&#xff1a; 本模块首批接口从API version 6开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import batteryInfo from ohos.batteryInfo;属性 描述电池信息。 系统能…

NLP经典论文研读--xlnet论文代码复现记录

xlnet源码解读(简易pytorch实现版本) xlnet这个模型还是相当复杂的&#xff0c;我看了很长一段时间也还是有很多地方没有搞明白&#xff0c;最后又在网上搜了很多大佬写的相关博客&#xff0c;才算是大致弄明白了&#xff0c;想了解xlnet的原理&#xff0c;请参考原论文&#…

(2024,RNN,梯度消失和爆炸,记忆诅咒,重参数化和动态学习率,权重矩阵对角化,复值 RNN)梯度消失和爆炸并不是故事的结局

Recurrent neural networks: vanishing and exploding gradients are not the end of the story 公和众与号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 1. 梯度消失和梯度爆炸 2. 记…

%运算符

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法介绍 在python中&#xff0c;可以使用%运算符进行灵活多样的格式化处理&#xff0c;通用的语法格式为&#xff1a; &#xff08;格式模板&…

面试突击:ArrayList源码详解

本文已收录于&#xff1a;https://github.com/danmuking/all-in-one&#xff08;持续更新&#xff09; 前言 哈喽&#xff0c;大家好&#xff0c;我是 DanMu。ArrayList 是我们日常开发中不可避免要使用到的一个类&#xff0c;并且在面试过程中也是一个非常高频的知识点&#…

机器人控制系列教程之URDF文件语法介绍

前两期推文&#xff1a;机器人控制系列教程之动力学建模(1)、机器人控制系列教程之动力学建模(2)&#xff0c;我们主要从数学的角度介绍了机器人的动力学建模的方式&#xff0c;随着机器人技术的不断发展&#xff0c;机器人建模成为了机器人系统设计中的一项关键任务。URDF&…

ZSWatch 开源项目介绍

前言 因为时不时逛 GitHub 会发现一些比较不错的开源项目&#xff0c;突发奇想想做一个专题&#xff0c;专门记录开源项目&#xff0c;内容不限于组件、框架以及 DIY 作品&#xff0c;希望能坚持下去&#xff0c;与此同时&#xff0c;也会选取其中的开源项目做专题分析。希望这…

基于Java的汽车租赁系统【附源码】

论文题目 设计&#xff08;论文&#xff09;综述&#xff08;1000字&#xff09; 当今社会&#xff0c;汽车租赁已成为一种受欢迎的出行方式。本文旨在探讨汽车租赁行业的发展趋势、市场规模及其对环境的影响。目前&#xff0c;汽车租赁行业正在经历着快速的发展。随着经济的发…

【独家揭秘】SmartEDA电路仿真软件:电子电路基础学习的神器!

在电子科技日新月异的今天&#xff0c;电路基础学习的重要性愈发凸显。但你是否曾为复杂的电路图、难以理解的电路原理而感到困扰&#xff1f;今天&#xff0c;我要向大家推荐一款学习神器——SmartEDA电路仿真软件&#xff0c;让你轻松踏入电子电路基础学习的殿堂&#xff01;…

22 Shell编程之免交互

目录 22.1 Here Document免交互 22.1.1 Here Document概述 22.1.2 Here Document免交互 22.1.3 Here Document变量设定 22.1.4 Here Document格式控制 22.1.5 Here Document多行注释 22.2 expect免交互 22.2.1 expect概述 22.2.2 expect安装 22.2.3 基本命令介绍 22.2.4expec…

ARM裸机:地址映射

S5PV210的地址映射详解 什么是地址映射&#xff1f; S5PV210属于ARM Cortex-A8架构&#xff0c;32位CPU&#xff0c;CPU设计时就有32根地址线&32根数据线。 32根地址线决定了CPU的地址空间为4G&#xff0c;那么这4G空间如何分配使用&#xff1f;这个问题就是内存映射问题。…

NAND闪存巨头铠侠(Kioxia)计划最迟于10月下旬通过首次公开募股IPO

据路透社于6月26日引用消息来源的报道&#xff0c;在半导体市场条件反弹及财务业绩迅速改善的背景下&#xff0c;NAND闪存巨头铠侠&#xff08;Kioxia&#xff09;正准备尽快提交初步申请&#xff0c;并计划最迟于10月下旬通过首次公开募股&#xff08;IPO&#xff09;在东京证…

9.二维数组的遍历和存储

二维数组的遍历和存储 二维数组的遍历 二维数组a[3][4],可分解为三个一维数组,其数组名分别为: 这三个一维数组都有4个元素,例如:一维数组a[0]的 元素为a[0][0],a[0][1],a[0][2],a[0][3]。所以遍历二维数组无非就是先取出二维数组中得一维数组, 然后再从一维数组中取出每个元…

Eclipse代码编辑器自主配色

1. 打开 Eclipse 的设置 - Java - Editor - Syntax Coloring 2. 自定义各种类型的颜色&#xff0c;例如&#xff1a; 1. Interface 勾选&#xff0c;设置为紫色 2. Class 勾选&#xff0c;设置为淡蓝色 3. Abstract classes 勾选&#xff0c;有自己默认的颜色 …

俯视LLM的灵魂:一文搞懂稀疏自动编码器

实时了解业内动态&#xff0c;论文是最好的桥梁&#xff0c;专栏精选论文重点解读热点论文&#xff0c;围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;…

使用jupyter打开本地ipynb文件的方法

常用方法&#xff1a; 先启动jupyter&#xff0c;然后在打开的页面点击upload&#xff0c;选择想要打开的文件上传然后打开&#xff0c;但是这样其实是先复制了一份到jupyter中&#xff0c;然后打开运行。而我不想复制。 方法二 先打开项目文件所在文件夹&#xff0c;文件夹…

【Dison夏令营 Day 01】如何用Python写一个游戏“石头剪刀布”

欢迎你们踏入这个充满无限可能性的编程世界&#xff01;作为一名热爱Python的开发者&#xff0c;我深感编程的魅力&#xff0c;并希望与你们一同分享这份乐趣和激情。编程&#xff0c;不仅仅是一种技能&#xff0c;更是一种思维方式和解决问题的工具。在Python的世界里&#xf…

如何寻找强势货币和弱势货币?

外汇交易的独特之处在于&#xff0c;它融合了两种货币的价值&#xff0c;其中一种货币的价值通过另一种货币来体现。举例来说&#xff0c;USDJPY外汇反映了美元与日元之间的价值关系&#xff0c;而EURUSD则代表了欧元与美元的价值对比。 通过开仓操作&#xff0c;我们预测一种…