网络编程:学生管理系统

news2024/12/29 10:55:09

一、实现功能

1.添加学生信息

2.删除学生信息

3.修改学生信息

4.查找学生信息

二、添加

int do_add(sqlite3 *ppDb)
{
    // 准备sql语句
    int add_num = 0;
    char add_name[20] = "";
    double add_score = 0;

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

    char sql[128] = "";
    sprintf(sql, "insert into Stu values(%d,\"%s\",%lf);", add_num, add_name, add_score);

    // 定义接受错误信息的变量
    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)
{
    // 准备sql语句
    char sql[128] = "";
    char name[10] = "";
    printf("请输入要删除学生的姓名\n");
    scanf("%s", name);
    getchar();
    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)
{
    char name[10] = "";
    int score;
    printf("输入要修改的学生的姓名\n");
    scanf("%s", name);
    getchar();
    printf("修改的成绩为\n");
    scanf("%d", &score);
    getchar();

    char sql[128] = "";
    sprintf(sql, "update Stu set score=%d where name=\"%s\";", score, 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");
}

 

五、查看

法一:exec

// 定义回调函数处理查询后的结果集
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; // 定义标识符
    if (sqlite3_exec(ppDb, sql, callback, &flag, &errmsg) != SQLITE_OK)
    {
        printf("exec error:%s\n", errmsg);
        sqlite3_free(errmsg); // 释放错误信息的空间
        return -1;
    }
    return 0;
}

法二:get——table

// 定义查询函数1
int do_search_1(sqlite3 *ppDb)
{
    // 准备sql语句
    char sql[128] = "select *from Stu;";
    // 定义错误信息容器
    char *errmsg = NULL;
    // 准备接受结果集的相关变量
    char **retPtr = NULL; // 记录结果集的其实地址
    int rows = 0;         // 记录结果集的行数
    int cols = 0;         // 记录结果集的列数

    // 执行sql语句
    if (sqlite3_get_table(ppDb, sql, &retPtr, &rows, &cols, &errmsg) != SQLITE_OK)
    {
        printf("get table error:%s\n", errmsg);
        sqlite3_free(errmsg);
        return -1;
    }
    // 此时查询的结果集已经放入了retPtr作为起始地址的二维容器中
    for (int i = 0; i < rows + 1; i++)
    { // 外行
        for (int j = 0; j < cols; j++)
        {                                               // 内列
            printf("%s\t", *(retPtr + (i * cols) + j)); // 输出任意一个元素
        }
        printf("\n");
    }
    // 释放结果集
    sqlite3_free_table(retPtr);
    return 0;
}

 

六、主函数

/*****主程序*****/

int main(int argc, char const *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(num 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==========学生管理系统==========\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);
            do_search_1(ppDb);
        }
        break;
        case 0:
            goto END;
        default:
            printf("您输入的功能有误,请重新输入!!!\n");
        }
        printf("请按任意键清屏\n");
        while (getchar() != '\n')
            ;
    }
END:
    // 关闭数据库
    sqlite3_close(ppDb);

    return 0;
}

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

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

相关文章

芯片公司SAP管理架构:科技与管理的完美融合

在当今日新月异的科技时代&#xff0c;芯片公司作为信息技术领域的核心力量&#xff0c;其运营管理的复杂性日益凸显。SAP管理架构作为一种高效的企业资源规划系统&#xff0c;为芯片公司提供了强大的管理支持。本文将为您科普芯片公司SAP管理架构的相关知识。 SAP管理架构是一…

使用倒模耳机壳UV树脂胶液制作舞台监听耳返入耳式耳机壳有哪些优点?

使用倒模耳机壳UV树脂胶液制作舞台监听耳返入耳式耳机壳有很多优点&#xff0c;具体如下&#xff1a; 高音质表现&#xff1a;通过倒模工艺制作的耳机壳能够更好地贴合耳朵&#xff0c;减少声音散射和反射&#xff0c;提高声音的清晰度和质感。这对于舞台监听来说非常重要&…

USB调试工具大全-USB中文网

USB中文网在此之前开发了很多的应用层USB设备调试工具&#xff0c;再加上收集的一些其它相关工具&#xff0c;并将这些调试工具分享给各位USB开发者爱好者&#xff0c;帮助大家更快的学习和了解USB相关的知识。 不过酒香也怕巷子深&#xff0c;今天我们就将这些调试工具的导航…

带你学会深度学习之卷积神经网络[CNN] - 5

前言 本文不讲述如泛化&#xff0c;前向后向传播&#xff0c;过拟合等基础概念。 本文图片来源于网络&#xff0c;图片所有者可以随时联系笔者删除。 本文提供代码不代表该神经网络的全部实现&#xff0c;只是为了方便展示此模型的关键结构。 CNN&#xff0c;常用于计算机视…

Leetcode 200. 岛屿数量

心路历程&#xff1a; 在没有看图论这一章之前看这道题没什么直接的思路&#xff0c;在看完图论之后&#xff0c;学着使用DFS和BFS去套用解决。第一次自己做的时候还是遇到了很多小问题。整体思路很流畅&#xff0c;但是需要处理的细节第一次没怎么处理好&#xff0c;花了很多…

如何使用Android平板公网访问本地Linux code-server

文章目录 1.ubuntu本地安装code-server2. 安装cpolar内网穿透3. 创建隧道映射本地端口4. 安卓平板测试访问5.固定域名公网地址6.结语 1.ubuntu本地安装code-server 准备一台虚拟机,Ubuntu或者centos都可以&#xff0c;这里以VMwhere ubuntu系统为例 下载code server服务,浏览器…

OR-806A固态继电器光耦

固态继电器 VL60V输出端击穿电压光耦 高隔离电压 60 至 600V 输出耐受电压 工业温度范围&#xff1a;-40 to 85℃ 高灵敏度和高速响应、 特征 输入和输出之间的高隔离电压 &#xff08;Viso&#xff1a;5000 V rms&#xff09;。 控制低电平模拟信号 高灵敏度和高速响应…

含“AI”量上涨,智能模组SC208系列助力智慧零售全场景高质发展

AI正重塑智慧零售产业&#xff0c;加速零售在采购、生产、供应链、销售、服务等方面改善运营效率和用户体验。零售行业经历了从线下到线上再到全渠道融合发展过程&#xff0c;“提质、降本、增效、高体验”是亘古不变的商业化与智能化方向。含“AI”量逐渐上涨的智慧零售正经历…

Linux:Gitlab:16.9.2 (rpm包) 部署及基础操作(1)

1.基础环境 我只准备了一台gitlab服务器&#xff0c;访问就用真机进行访问&#xff0c;接下来介绍一下详细配置 centos7 内网ip:192.168.6.7 外网ip:172.20.10.4 运行内存&#xff1a;4G CPU:4核 先去配置基础环境 关闭防火墙以及selinux 再去下载基础的运行…

差分逻辑电平 --- SSTL、HSTL、HSUL结构

SSTL/HSTL/HSUL 属于DDR存储器接口逻辑电平&#xff0c;虽然是单端&#xff0c;本质上是差分对&#xff0c;因实现机制是将信号与参考电平Vref组成差分对进行比较。 SSTL SSTL&#xff1a;Stub Series Termination Logic&#xff0c;短截线串联端接逻辑。 我们所熟知的DDR 采…

记录西门子200:PUT和GET通讯测试

GET/PUT&#xff1a;S7-200SMART之间专有通讯协议。 准备两台Smart-PLC&#xff0c;这里使用的ST60和CR40。外加一个交换机。 CR40的地址设置是&#xff1a;192.168.2.1 用来读 ST60的地址设置是&#xff1a;192.168.2.2 用来写 打开软件&#xff0c;选择CPU-CR4配…

LeetCode_Java_递归系列(题目+思路+代码)

206.反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]以此类推&#xff0c;直到反转结束返回头结点 class Solution {public ListNode rever…

统计-R(相关系数)与R^2(决定系数)

1.相关系数&#xff08;R&#xff09; 定义&#xff1a;考察两个事物&#xff08;在数据里我们称之为变量&#xff09;之间的相关程度。 假设有两个变量X&#xff0c;Y&#xff0c;那么两个变量间的皮尔逊相关系数可通过以下公式计算&#xff1a; 公式一&#xff1a; 其中…

创建一个electron-vite项目

前置条件&#xff1a;非常重要&#xff01;&#xff01;&#xff01; npm: npm create quick-start/electronlatest yarn: yarn create quick-start/electron 然后进入目录&#xff0c;下载包文件&#xff0c;运行项目 到以上步骤&#xff0c;你已经成功运行起来一个 electr…

【C++】vector容器初步模拟

送给大家一句话&#xff1a; 努力一点&#xff0c;漂亮—点&#xff0c;阳光一点。早晚有一天&#xff0c;你会惊艳了时光&#xff0c;既无人能替&#xff0c;又光芒万丈。 vector容器初步模拟 1 认识vector开始了解底层实现 2 开始实现成员变量构造函数 析构函数尾插迭代器插入…

新零售SaaS架构:线上商城系统架构设计

零售商家为什么要建设线上商城&#xff1f; 传统的实体门店服务范围有限&#xff0c;只能吸引周边500米以内的消费者。因此&#xff0c;如何拓展服务范围&#xff0c;吸引更多的消费者到店&#xff0c;成为了店家迫切需要解决的问题。 缺乏忠实顾客&#xff0c;客户基础不稳&…

分治法排序:原理与C语言实现

分治法排序&#xff1a;原理与C语言实现 一、分治法与归并排序概述二、归并排序的C语言实现三、归并排序的性能分析四、归并排序的优化 在计算机科学中&#xff0c;分治法是一种解决问题的策略&#xff0c;它将一个难以直接解决的大问题&#xff0c;分割成一些规模较小的相同问…

数据可视化实战(三)

图书销量情况对比 import pandas as pd import matplotlib.pyplot as plt # 读取Excel数据 dfpd.read_excel(mrbook.xlsx) df序号书号序号.1月份销量rate0B189.787569e1211月15060.31B199.787569e1222月1200-0.32B259.787569e1233月33050.63B219.787569e1244月66100.54NaNNaN5…

docker 进入容器内部命令

docker容器运行了&#xff0c;怎么进入容器内部查看内部的文件情况呢&#xff1f; 答&#xff1a;可以通过docker exec 的命令查看。 docker exec --help 可以查看命令介绍 &#xff1a; docker exec -it XXX /bin/bash XX为容器ID 进入容器内部 /bin/bash是需要添加的 不…

虚拟机扩展:虚拟机快照

虚拟机快照 在学习阶段我们无法避免的可能损坏Linux操作系统。如果损坏的话&#xff0c;重新安装一个Linux操作系统就会十分麻烦。 那我们就可以通过快照将当前虚拟机的状态保存下来&#xff0c;在以后系统损坏时通过快照恢复虚拟机到保存的状态。 制作并还原快照 在VMware …