3/21作业

#include <myhead.h>

int do_add(sqlite3 *ppDb)
{
    int add_numb = 0;
    char add_name[20] = {0};
    double add_score = 0;
    printf("请输入学号:");
    scanf("%d",&add_numb);
    printf("请输入姓名:");
    scanf("%s",add_name);
    printf("请输入成绩:");
    scanf("%lf",&add_score);
    getchar();

    char sql[128] = {0};
    sprintf(sql,"insert into Stu values(%d,\"%s\",%lf);",add_numb,add_name,add_score);
    char *errmsg =NULL;

    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_del(sqlite3 *ppDb)
{
    int del_numb = 0;
    char del_name[20] = {0};
    double del_score = 0;
    int choose = -1;
    printf("请输入你想删除的字段:\n1.学号\n2.姓名\n3.成绩\n");
    scanf("%d",&choose);
    getchar();
    char sql[128] = {0};

    switch(choose)
    {
    case 1:
        {
            printf("请输入您的学号:");
            scanf("%d",&del_numb);
            getchar();    
            sprintf(sql,"delete from Stu where del_numb == %d;",del_numb);
            break;
        }
    case 2:
        {
            printf("请输入您的姓名:");
            scanf("%s",del_name);
            getchar();        
            sprintf(sql,"delete from Stu where del_name == \"%s\";",del_name);
            break;
        }
    case 3:
        {
            printf("请输入您的成绩:");
            scanf("%lf",&del_score);
            getchar();    
            sprintf(sql,"delete from Stu where del_score == %lf;",del_score);
            break;
        }
    default:
        {
            printf("输入错误,请重新输入\n");
        }
    }
    char *errmsg =NULL;

    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 update_numb = 0;
    char update_name[20] = {0};
    double update_score = 0;
    int choose = -1;
    int choose1 = -1;
    printf("请输入您想要修改的信息:\n1.学号\n2.姓名\n3.成绩\n");
    scanf("%d",&choose);
    getchar();
    char sql[128] = {0};
    switch(choose)
    {
    case 1:
        {
            printf("请输入您的学号:");
            scanf("%d",&update_numb);
            getchar();        

            printf("请输入您想要限制的条件:\n1.姓名\n2.成绩\n");
            scanf("%d",&choose1);
            getchar();
            switch(choose1)
            {
            case 1:
                {
                    printf("请输入您的姓名:");
                    scanf("%s",update_name);
                    getchar();
                    sprintf(sql,"update Stu set update_numb = %d where update_name == \"%s\";",update_numb,update_name);
                    break;
                }
            case 2:
                {
                    printf("请输入您的成绩:");
                    scanf("%lf",&update_score);
                    getchar();
                    sprintf(sql,"update Stu set update_numb = %d where update_score == %lf;",update_numb,update_score);
                    break;
                }
            default:
                {
                    printf("输入错误,请重新输入\n");
                }
            }
        }
    case 2:
        {
            printf("请输入您的姓名:");
            scanf("%s",update_name);
            getchar();        

            printf("请输入您想要限制的条件:\n1.学号\n2.成绩\n");
            scanf("%d",&choose1);
            getchar();
            switch(choose1)
            {
            case 1:
                {
                    printf("请输入您的学号:");
                    scanf("%d",&update_numb);
                    getchar();
                    sprintf(sql,"update Stu set update_name = \"%s\" where update_numb == %d;",update_name,update_numb);
                    break;
                }
            case 2:
                {
                    printf("请输入您的成绩:");
                    scanf("%lf",&update_score);
                    getchar();
                    sprintf(sql,"update Stu set update_name = \"%s\" where update_score == %lf;",update_name,update_score);
                    break;
                }
            default:
                {
                    printf("输入错误,请重新输入\n");
                }
            }
        }
    case 3:
        {
            printf("请输入您的成绩:");
            scanf("%lf",&update_score);
            getchar();

            printf("请输入您想要限制的条件:\n1.学号\n2.姓名\n");
            scanf("%d",&choose1);
            getchar();
            switch(choose1)
            {
            case 1:
                {
                    printf("请输入您的学号:");
                    scanf("%d",&update_numb);
                    getchar();
                    sprintf(sql,"update Stu set update_score = %lf where update_numb == %d;",update_score,update_numb);
                    break;
                }
            case 2:
                {
                    printf("请输入您的姓名:");
                    scanf("%s",update_name);
                    getchar();
                    sprintf(sql,"update Stu set update_score = %lf where update_name == \"%s\";",update_score,update_name);
                    break;
                }
            default:
                {
                    printf("输入错误,请重新输入\n");
                }
            }
        }
    }
    char *errmsg =NULL;

    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)) = 1;
    }

    for(int i = 0;i<cols;i++)
    {
        printf("%s\t",*(msgText+i));
    }
    printf("\n");
    return 0;

}


int do_search(sqlite3 *ppDb)
{
    char sql[128] = "select * from Stu;";

    char *errmsg = NULL;
    int flag = 0;

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

        sqlite3_free(errmsg);
        return -1;
    }
    return 0;
}


int do_search_1(sqlite3 *ppDb)
{
    char sql[128] = "select * from Stu;";
    char *errmsg = NULL;
    char **res = NULL;
    int rows = 0;
    int cols = 0;
    if(sqlite3_get_table(ppDb,sql,&res,&rows,&cols,&errmsg) != SQLITE_OK)
    {
        printf("get table error:%s\n",errmsg);
        sqlite3_free(errmsg);
        return -1;
    }

    for(int i = 0;i<rows;i++)
    {
        for(int j = 0;j<cols;j++)
        {
            printf("%s\t",*(res+(i*cols)+j));
        }
        printf("\n");
    }
    sqlite3_free_table(res);
    return 0;


}

int main(int argc, const char *argv[])
{
    sqlite3 *ppDb = NULL;

    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");

    char sql[128] = "create table if not exists Stu(numb int,name char,score double);";
    char *errmsg = NULL;

    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");

    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_del(ppDb);
            }
            break;

        case 3:
            {
                do_update(ppDb);
            }
            break;

        case 4:
            {
                do_search(ppDb);
                //do_search_1(ppDb);
            }
            break;
        case 0:goto END;
        default:printf("您输入的功能有误,请重新输入\n");
        }
        printf("请输入任意键回车后清屏\n");
        while(getchar()!='\n');
    }
END:
    sqlite3_close(ppDb);

    return 0;
}
 

1.IO多路复用的原理

IO多路复用的原理是利用操作系统提供的机制,通过一个线程或进程同时监听多个IO事件,实现对这些事件的管理和处理。常见的IO多路复用技术包括select、poll、epoll等。它们的基本原理是通过一个系统调用来监听多个文件描述符,一旦有IO事件发生,就通知应用程序进行相应的处理,从而提高IO效率和系统性能

2.实现IO多路复用的方式

1. 使用select函数:在C语言中,可以使用select函数实现IO多路复用,通过监视多个文件描述符的状态变化来进行IO操作。

2. 使用poll函数:类似于select,poll函数也可以用于实现IO多路复用,但在某些情况下性能更好。

select在文件描述符较多时性能会下降,因为每次调用select都需要线性扫描所有文件描述符;而poll使用链表结构存储文件描述符,性能相对较好。

select有一个固定的文件描述符数量限制,通常为1024,而poll没有这个限制。

3.数据库操作对应的函数有哪些

sqlite3_open:打开一个数据库,如果数据库不存在,则创建一个数据库

sqlite3_close:关闭数据库,断开句柄所拥有的资源

sqlite3_exec:调用该函数,执行sql语句,即该函数的第二个参数

4.什么是僵尸进程

僵尸进程是指已经完成执行任务但其父进程尚未调用wait()或waitpid()来获取其退出状态的进程。这些进程会占用系统资源,但不再执行任何操作。僵尸进程的存在通常是由于父进程没有正确处理子进程的退出状态引起的。

5.什么是孤儿进程

孤儿进程是指其父进程已经终止或不存在,而导致操作系统接管并管理该进程的状态和资源。

6.什么是I0

I0通常指的是输入和输出,用于描述计算机系统中与外部设备进行数据交换的过程。

7.IO的分类

文件IO和标准IO

8.文件IO依赖的函数谁提供,标准IO依赖的函数谁提供

文件IO由LINUX内核提供,标准IO由c语言库提供

9.消息队列和共享内存的区别

消息队列是一种通信机制,用于在不同进程之间传递消息,消息存储在队列中,进程可以异步地发送和接收消息。

共享内存是一种进程间通信的方式,允许多个进程访问同一块内存区域,进程可以直接读写这块内存,实现数据共享

10.什么是野指针,以及野指针的产生情况

野指针是指指向未知内存地址的指针,通常是指针未被正确初始化或者指向已释放的内存。

野指针的产生情况包括:指针未初始化、指针指向已释放的内存、指针超出作用域后未置空等。

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

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

相关文章

Python机器学习019:sklearn中如何找到测试集中预测错误的样本在原数据中所在的索引位置

原理 要查看预测错误的 X_test 在原始数据集中的索引,你可以首先找到预测错误的样本索引,然后将这些索引映射回原始数据集的索引。 案例 from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metric…

鸿蒙ArkTS实战开发-Native XComponent组件的使用

介绍 本篇Codelab主要介绍如何使用XComponent组件调用NAPI来创建EGL/GLES环境&#xff0c;实现在主页面绘制一个正方形&#xff0c;并可以改变正方形的颜色。本篇CodeLab使用Native C模板创建。 如图所示&#xff0c;点击绘制矩形按钮&#xff0c;XComponent组件绘制区域中渲…

Sketch软件:重塑UI/UX设计流程的革命性工具

Sketch是一款在Mac操作系统上运行的矢量图形设计软件&#xff0c;其功能特色丰富多样&#xff0c;深受设计师们的喜爱。以下是Sketch软件的主要功能特色介绍&#xff1a; 专业矢量图形设计&#xff1a;Sketch为UI设计、移动应用设计和Web设计等领域提供了强大的支持。它支持线条…

了解OGC

什么是OGC OGC&#xff08;Open Geospatial Consortium&#xff09;是一个国际性的组织&#xff0c;专注于制定和发布开放的地理信息标准&#xff0c;以促进地理空间数据和服务的互操作性和共享。其目标是在全球范围内推动地理信息系统&#xff08;GIS&#xff09;和地理空间技…

串口控制LED灯

uart.c #include "uart4.h"void uart4_init() {//使能GPIOB GPIOG UART4外设时钟RCC->MP_AHB4ENSETR | (0x1<<1);//GPIOBRCC->MP_AHB4ENSETR | (0x1<<6);//GPIOGRCC->MP_APB1ENSETR | (0X1<<16);//UART4//设置PB2和PG11管脚复用//PB2GPI…

即时编译器在JVM调优战场的决胜策略

目录 一、方法内联 二、循环展开 三、分支预测 四、逃逸分析 4.1 栈上分配 4.2 标量替换 4.3 同步消除 五、冗余消除 JVM中的即时编译器&#xff08;如HotSpot的C1、C2编译器&#xff09;会对代码进行即时编译优化&#xff0c;即时编译优化&#xff08;Just-In-Time Compi…

【JavaScript 中的数据类型】

JavaScript 中的基本数据类型 基本数据类型 数字&#xff08;Number&#xff09;&#xff1a;用于表示数字&#xff0c;包括整数和浮点数。字符串&#xff08;String&#xff09;&#xff1a;用于表示文本数据。布尔值&#xff08;Boolean&#xff09;&#xff1a;用于表示逻…

数据结构奇妙旅程之线性表

线性表&#xff08;Linear List&#xff09;是数据结构中的一种基本类型&#xff0c;它代表了具有相同类型数据元素的一个有限序列。线性表中的数据元素之间是一对一的关系&#xff0c;即除了第一个元素外&#xff0c;每个元素有且仅有一个前驱元素&#xff1b;除了最后一个元素…

Hive常用函数 之 数值处理

Hive常用函数 之 数值处理 以下是Hive中常用的数值处理函数&#xff0c;可用于执行各种数学运算和数值转换操作。 1. ABS()&#xff1a;返回一个数的绝对值。 SELECT ABS(-10); -- 输出: 102. ROUND()&#xff1a;对一个数进行四舍五入。 SELECT ROUND(10.56); -- 输出: 113.…

探索ChatGPT时代下的下一代信息检索系统:机遇与挑战

1 Introduction 2022 年 11 月 30 日&#xff0c;OpenAI 推出了 ChatGPT&#xff0c;这是一款由先进的 GPT3.5 和更高版本的 GPT-4 生成语言模型提供支持的 AI 聊天机器人应用程序。该应用迅速吸引了全球超亿用户&#xff0c;创下了产品快速传播的新纪录。 它能够以对话的方式…

ElasticSearch 用法

首先讲下 ES的倒排序索引 创建倒排索引是对正向索引的一种特殊处理&#xff0c; 将每一个文档的数据利用算法分词&#xff0c;得到一个个词条 创建表&#xff0c;每行数据包括词条、词条所在文档id、位置等信息 因为词条唯一性&#xff0c;可以给词条创建索引&#xff0c;例如…

旅游小程序开发的费用及功能

随着科技的发展和智能手机的普及&#xff0c;越来越多的行业开始利用小程序来进行线上服务。旅游业作为一个重要的服务业&#xff0c;也纷纷推出了自己的旅游小程序&#xff0c;以方便游客在线预订、查询景点信息等。那么&#xff0c;旅游小程序开发的费用是多少&#xff1f;功…

Google研究者们提出了VLOGGER模型

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【探索Linux】—— 强大的命令行工具 P.29(网络编程套接字 —— 简单的TCP网络程序模拟实现)

阅读导航 引言一、TCP协议二、TCP网络程序模拟实现1. 预备代码⭕ThreadPool.hpp&#xff08;线程池&#xff09;⭕makefile文件⭕打印日志文件⭕将当前进程转变为守护进程 2. TCP 服务器端实现&#xff08;TcpServer.hpp&#xff09;3. TCP 客户端实现&#xff08;main函数&…

babyos 学习记录

宏定义头文件 将一个宏定义取不同的数据到不同的数组中&#xff1b; 侵入式链表 struct list_head { struct list_head *next, *prev; }; // 添加&#xff08;list_add_tail/list_add&#xff09;、删除、查找 xx.h // 定义一个用于链表管理的结构体 typedef sturct{ xxx …

探索数据库的世界:分类、作用与特点

数据库是现代信息时代的基础设施之一&#xff0c;它是一种组织、存储、管理和检索数据的系统。数据库在各个领域都有着广泛的应用&#xff0c;如企业、政府、医疗、金融等&#xff0c;它可以帮助企业和组织高效地管理和分析数据&#xff0c;从而做出更好的决策。本文将介绍数据…

matlab矩形薄板小挠度弯曲有限元编程 |【Matlab源码+理论文本】|板单元| Kirchoff薄板 | 板壳单元

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

分库分表场景下多维查询解决方案(用户+商户)

在采用分库分表设计时&#xff0c;通过一个PartitionKey根据散列策略将数据分散到不同的库表中&#xff0c;从而有效降低海量数据下C端访问数据库的压力。这种方式可以缓解单一数据库的压力&#xff0c;提升了吞吐量&#xff0c;但同时也带来了新的问题。对于B端商户而言&#…

项目技术问题记录-【前端】处理低版本JQuery系UI框架的toggle事件失效的问题

原创作者&#xff1a;田超凡&#xff08;程序员田宝宝&#xff09; 版权所有&#xff0c;引用请注明原作者&#xff0c;严禁复制转载 $.fn.toggle function( fn, fn2 ) { var args arguments,guid fn.guid || $.guid,i0, toggle function( event ) { …

Layui实现删除及修改后停留在当前页

1、功能概述&#xff1f; 我们在使用layui框架的table显示数据的时候&#xff0c;会经常的使用分页技术&#xff0c;这个我们期望能够期望修改数据能停留在当前页&#xff0c;或者删除数据的时候也能够停留在当前页&#xff0c;这样的用户体验会更好一些&#xff0c;但往往事与…