2024.3.21作业

#include<myhead.h>

//封装添加学生信息函数
int do_add(sqlite3 *ppDb)
{
    //准备sql语句
    int add_numb = 0;
    char add_name[20] = "";
    double add_score = 0;

    //提示并输入数据
    printf("请输入学号:");
    scanf("%d", &add_numb);
    printf("请输入姓名:");
    scanf("%s", add_name);
    printf("请输入成绩:");
    scanf("%lf", &add_score);
    getchar();

    char sql[128] = "";
    sprintf(sql,"insert into Stu values(%d, \"%s\", %lf);", add_numb,add_name,add_score);
    //printf("sql = %s\n", sql);
    
    //定义接收错误信息的变量
    char *errmsg = NULL;
    
    //执行sql语句
    if(sqlite3_exec(ppDb, sql, NULL, NULL, &errmsg) != SQLITE_OK)
    {
        printf("exec error:%s\n", errmsg);

        sqlite3_free(errmsg);       //释放错误信息的空间
        return -1;
    }

    printf("插入成功\n");

    return 0;

}

int do_delete(sqlite3 *ppDb)
{
	char name[20]="";
	printf("请输入你需要删除的数据姓名(张三 or 李四 or 王五....):");
	scanf("%s",name);
	getchar();
	char sql[128]="";
	sprintf(sql,"delete from Stu where name==\"%s\";",name);
	//定义接收错误信息的变量
    char *errmsg = NULL;
    
    //执行sql语句
    if(sqlite3_exec(ppDb, sql, NULL, NULL, &errmsg) != SQLITE_OK)
    {
        printf("exec error:%s\n", errmsg);

        sqlite3_free(errmsg);       //释放错误信息的空间
        return -1;
    }

    printf("删除数据成功\n");

    return 0;

}

int do_update(sqlite3 *ppDb)
{
	//通过学号修改成绩
	int numb = 0;
	double score = 0;
	printf("请输入需要修改分数的学生学号:");
	scanf("%d",&numb);
	printf("请输入修改的分数:");
	scanf("%lf",&score);
	getchar();
	char sql[128]="";
	sprintf(sql,"update Stu set score==%lf where numb==%d;",score,numb);
	//定义接收错误信息的变量
    char *errmsg = NULL;
    
    //执行sql语句
    if(sqlite3_exec(ppDb, sql, NULL, NULL, &errmsg) != SQLITE_OK)
    {
        printf("exec error:%s\n", errmsg);

        sqlite3_free(errmsg);       //释放错误信息的空间
        return -1;
    }

    printf("更新数据成功\n");

    return 0;



}





//定义回调函数处理查询后的结果集
int callback(void *arg, int cols, char **msgText, char **msgHeader)
{
    

    //输出所有数据
    //输出表头
    if( *((int *)arg) == 0)
    {
        for(int i=0; i<cols; i++)
        {
            printf("%s\t", *(msgHeader+i));
        }
        printf("\n");
        (*((int *)arg)) ++;
    }

    //输出当前记录的内容
    for(int i=0; i<cols; i++)
    {
        printf("%s\t", *(msgText+i));
    }
    printf("\n");

    return 0;
}


//定义查找函数
int do_search(sqlite3 *ppDb)
{
    //准备sql语句
    char sql[128] = "select * from Stu;";
    //定义错误信息容器
    char *errmsg = NULL;

    int flag = 0;        //定义标识位

    //执行sql语句
    if(sqlite3_exec(ppDb, sql, callback, &flag, &errmsg) != SQLITE_OK)
    {
        printf("exec error:%s\n", errmsg);

        sqlite3_free(errmsg);       //释放错误信息的空间
        return -1;
    }


    return 0;
}





/**************************主程序********************/
int main(int argc, const char *argv[])
{
    //1、定义数据库句柄指针
    sqlite3 *ppDb = NULL;

    //2、打开(创建)数据库
    if(sqlite3_open("./my.db", &ppDb) != SQLITE_OK)
    {
        fprintf(stderr, "sqlite3_open error:errmsg = %s, errcode = %d\n",\
                sqlite3_errmsg(ppDb), sqlite3_errcode(ppDb));
        return -1;
    }
    printf("sqlite3_open success\n");

    //3、创建数据库表
    //3.1 准备sql语句
    char sql[128] = "create table if not exists Stu(numb int, name char, score double);";
    //char *sql =  "create table if not exists Stu(numb int, name char, score double);";
    char *errmsg = NULL;      //用于接收出错时的错误信息

    //3.2 执行sql语句
    if(sqlite3_exec(ppDb, sql, NULL, NULL, &errmsg) != SQLITE_OK)
    {
        printf("exec error:%s\n", errmsg);
        sqlite3_free(errmsg);       //释放错误信息的空间

        return -1;
    }
    printf("create table Stu success\n");

    //4、对数据表进行操作
    int menu = -1;
    while(1)
    {
        system("clear");
        printf("\t\t============XXX 学生管理系统=============\n");
        printf("\t\t============1、添加学生信息=============\n");
        printf("\t\t============2、删除学生信息=============\n");
        printf("\t\t============3、修改学生信息=============\n");
        printf("\t\t============4、查找学生信息=============\n");
        printf("\t\t============0、退出系统=============\n");
        printf("请输入功能:");
        scanf("%d", &menu);
        getchar();

        //对功能多分支选择
        switch(menu)
        {
        case 1:
            {
                do_add(ppDb);
            }
            break;
        case 2:
            {
                do_delete(ppDb);
            }
            break;

        case 3:
            {
                do_update(ppDb);
            }
            break;
        case 4:
            {
                do_search(ppDb);
            }
            break;
        case 0:goto END;
        default:printf("您输入的功能有误,请重新输入!!!!\n");
        }

        printf("请输入任意键,按回车清屏\n");
        while(getchar() != '\n');
    }



END:


    //关闭数据库
    sqlite3_close(ppDb);

    return 0;
}

 

 

 

 

 IO多路复用的原理:将多个阻塞任务的文件描述符统一放到一个检测容器中,然后用一个阻塞函数进行管理,如果检测容器中有一个或者多个文件描述符对应的事件产生,就会解除阻塞,进而去执行相应的函数。

实现IO多路复用的方式:select,poll,二者的区别是:

select 和 poll 都是 POSIX 标准提供的 I/O 多路复用机制,它们都可以被用于实现非阻塞式 IO。下面列出了 select 和 poll 的基本异同点:

参数形式不同: select 函数使用 fd_set 类型的描述符集合来传递需要监视的文件描述符列表,而 poll 函数使用 struct pollfd 数组类型来指定需要监听的文件描述符及其感兴趣的事件。

描述符数量限制不同: select 函数所支持的最大描述符数量由内核设定,一般情况下默认值为 1024;而 poll 函数能够处理的描述符数量没有固定上限,但也会受到系统资源限制。

提供的事件标志位不同:select 函数仅支持三种事件标志:可读、可写和异常;而 poll 函数支持更多的事件标志:可读、可写、异常、连接断开、优先级带数据和错误事件等。

实现方式不同: select 函数和 poll 函数之间在实现机制上有很大区别,主要表现在对文件描述符集合的维护上。select 函数每次调用时都需要将待检测的文件描述符集合拷贝到内核中去,而 poll 函数则是通过参数传递文件描述符集合,不需要对文件描述符集合进行操作。

兼容性不同: select 函数是传统的多路复用机制,可以在大多数 UNIX 系统上使用;而 poll 函数是 POSIX 标准中才定义的 I/O 多路复用机制,不是所有平台都支持。另外,在一些平台上,select 函数会有一些问题,例如无法正确处理大于 1024 的文件描述符数量等,但是这些问题并不影响 poll 函数的使用。

数据库操作对应的函数有哪些:sqlite3_exec函数执行sql语句,执行完sql语句会有一个结果,这个结果集里面会有多个结果,对于每一个结果都会去执行你给定的回调函数来处理这个结果,执行单个结果过后的内容的。

什么是IO:程序与外部设备进行信息交互的过程

IO的分类:文件IO和标准IO

文件IO是依赖linux内核提供的函数,而标准IO依赖的是C语言库提供的函数

消息队列和共享内存的区别:消息队列如果放入的消息一直没有读出来,那么就会一直保存在消息队列里,可以保证数据的不丢失性,共享内存下一次写入的数据会覆盖上一次的数据,具有时效性和实时性。

野指针:指向非法内存的指针,例如定义没有初始化的指针,指向已经释放空间的内存指针,即悬空指针;数组下标越界,非法访问数组内核。

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

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

相关文章

spring-boot如何启动WEB项目之二

文章目录 概要spring-boot项目结构踩坑1踩坑2踩坑3总结 概要 最近在做信创的项目&#xff0c;需要将原来在tomcat启动的项目&#xff0c;转移为微服务的项目&#xff0c;然后由于对spring-boot项目了解不足&#xff0c;导致耗费了一些时间来启动项目。 spring-boot项目结构 每…

YoloV8改进策略:Block改进|PKINet

摘要 PKINet是面向遥感旋转框的主干&#xff0c;网络包含了CAA、PKI等模块&#xff0c;给我们改进卷积结构的模型带来了很多启发。 论文&#xff1a;《Poly Kernel Inception Network在遥感检测中的应用》 https://export.arxiv.org/pdf/2403.06258 遥感图像&#xff08;RSI…

应用APM-如何配置Prometheus + Grafana监控springboot应用

文章目录 概述在Spring Boot应用中集成Micrometerspringboot配置修改 Docker安装Prometheus和Grafanaprometheus配置grafana配置启动Prometheus和Grafana在Grafana中配置数据源创建Grafana仪表盘配置Grafana告警&#xff08;可选&#xff09;监控和分析 概述 配置Prometheus和…

内网如何访问其他电脑?

在现代信息技术时代&#xff0c;人们对于与其他电脑进行内网访问的需求日益增长。不同地区的电脑与设备之间的信息远程通信问题成为了一个亟待解决的难题。幸运的是我们有一些解决方案&#xff0c;其中包括【天联】组网技术。 【天联】组网技术 【天联】组网技术是一种解决不同…

解决GNURadio自定义C++ OOT块-导入块时报错问题

文章目录 前言一、问题描述二、解决方法1、安装依赖2、配置环境变量3、重新编译及安装三、结果1、添加结果2、运行结果前言 本文记录在 GNURadio 自定义 C++ OOT 块后导入块时报错 AttributeError: module myModule has no attribute multDivSelect。 一、问题描述 参考官方教…

C#,图片分层(Layer Bitmap)绘制,反色、高斯模糊及凹凸贴图等处理的高速算法与源程序

1 图像反色Invert 对图像处理的过程中会遇到一些场景需要将图片反色,反色就是取像素的互补色,比如当前像素是0X00FFFF,对其取反色就是0XFFFFFF – 0X00FFFF = 0XFF0000,依次对图像中的每个像素这样做,最后得到的就是原始2 图像的反色。 2 高斯模糊(Gauss Blur)算法 …

ABAP笔记:定义指针,动态指针分配:ASSIGN COMPONENT <N> OF STRUCTURE <结构> TO <指针>.

参考大佬文章学习&#xff0c;总结了下没有提到的点&#xff1a;SAP ABAP指针的6种用法。_abap 指针-CSDN博客 定义指针&#xff1a;其实指针这玩意&#xff0c;就是类似你给个地方&#xff0c;把东西临时放进去&#xff0c;然后指针就是这个东西的替身了&#xff0c;写代码的…

异常机制二

目录 异常的处理方式之一&#xff1a;捕获异常 try-catch-finally 语句块的执行过程&#xff1a; 异常的处理方式之二&#xff1a;声明异常&#xff08;throws 子句&#xff09; 自定义异常 异常的处理方式之一&#xff1a;捕获异常 捕获异常是通过 3 个关键词来实现的&…

【UE5】动画蒙太奇简述

项目资源文末百度网盘自取 动画蒙太奇基本功能 动画蒙太奇&#xff08;Animation Montage&#xff09; 可以将多个 动画序列&#xff08;Animation Sequences&#xff09; 合并为单个资产并通过蓝图播放&#xff0c;还可以将一个蒙太奇动画切分为多个 蒙太奇分段&#xff08;M…

数据结构从入门到精通——二叉树的实现

二叉树的实现 前言一、二叉树链式结构的实现1.1前置说明1.2二叉树的手动创建 二、二叉树的遍历2.1 前序、中序以及后序遍历二叉树前序遍历二叉树中序遍历二叉树后序遍历2.2 层序遍历练习 三、二叉树的具体代码实现二叉树的节点个数二叉树叶子节点个数二叉树第k层节点个数二叉树…

【数字图像处理系列】读取图像

【数字图像处理系列】读取图像 使用函数 imread 可以将图像读人 MATLAB 环境&#xff0c;imread 的语法为 imread(filename)其中&#xff0c;filename是一个含有图像文件全名的字符串(包括任何可用的扩展名)。例如&#xff0c;命令行 >>f imread(pout.tif)将tif图像po…

MATLAB环境下基于振动信号的轴承状态监测和故障诊断

故障预测与健康管理PHM分为故障预测和健康管理与维修两部分&#xff0c;PHM首先借助传感器采集关键零部件的运行状态数据&#xff0c;如振动信号、温度图像、电流电压信号、声音信号及油液分析等&#xff0c;提取设备的运行监测指标&#xff0c;进而实现对设备关键零部件运行状…

精确率(召回率)的权衡(Machine Learning研习十六)

精确率&#xff08;召回率&#xff09;的权衡 为了理解这种权衡&#xff0c;让我们看看 SGDClassifier如何做出分类决策。 对于每个实例&#xff0c;它根据决策函数计算分数。 如果该分数大于阈值&#xff0c;则将该实例分配给正类&#xff1b; 否则它会将其分配给负类。 图 3…

基于SpringBoot+Vue保密信息学科平台系统设计与实现(源码+部署说明+演示视频+源码介绍+lw)

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通…

filezilla客户端的应用以及ftplftpwget的用法

filezilla的应用 用户的配置查看上一篇文章FTP3种用户的配置 进入filezilla软件测试 用yy用户登录发现可以上传下载创建删除 再用cc用户登录发现不能上传不能删除不能创建只能下载 ftp&lftp&wget客户端的应用 以命令行的方式连接ftp&#xff0c;一般只会用到上…

【HTTP完全注解】范围请求

范围请求 范围请求是HTTP的一种内容协商机制&#xff0c;该机制允许客户端只请求资源的部分内容。范围请求在传送大的媒体文件&#xff0c;或者与文件下载的断点续传功能搭配使用时非常有用。 范围请求的工作流程 范围请求通过在HTTP请求标头Range中表明需要请求的部分资源的…

Windows东方通下载及使用

把安装包都拖到桌面来&#xff0c;可以拖一个解压包进去 下载东方通可以不用配环境变量 双击安装包 下一步 点击接受 选择版本&#xff0c;都可以 选择安装路径 下一步 点击安装 改端口号 移到桌面 把安装包里面的文件拖进去 过期了&#xff0c;记得改时间 点击时间面板&…

【回顾练习】静态路由配置综合实验报告

一、分析要求 为R6设备配置公有IP地址&#xff0c;并确保只能进行IP地址配置&#xff0c;无法进行其他配置。为R1-R5设备分配私有IP地址。为R1、R2、R4配置两个环回地址&#xff0c;为R5、R6配置一个环回地址。在R3上配置DHCP服务&#xff0c;以供两台PC自动获取IP地址。使用动…

Vuex状态、数据持久化(vue2、vue3状态数据持久化)

简介&#xff1a;Vuex是一个仓库&#xff0c;是vue的状态管理工具&#xff0c;存放公共数据&#xff0c;任何组件都可以使用vuex里的公共数据。Vuex提供了插件系统&#xff0c;允许我们使用 vuex-persistedstate插件&#xff0c;将Vuex的状态持久化到本地存储中&#xff0c;解决…

如何安装配置Goland并使用固定公网地址SSH远程连接本地服务器

文章目录 1. 安装配置GoLand2. 服务器开启SSH服务3. GoLand本地服务器远程连接测试4. 安装cpolar内网穿透远程访问服务器端4.1 服务器端安装cpolar4.2 创建远程连接公网地址 5. 使用固定TCP地址远程开发 本文主要介绍使用GoLand通过SSH远程连接服务器&#xff0c;并结合cpolar内…