自学内容网 自学内容网

c语言学生管理系统(内置数据库版本)

c语言学生管理系统

工具:clion,sqlite

1. 下载sqlite以及与clion连接

官网:https://www.sqlite.org/index.html

下载c语言的sqlite头文件

在这里插入图片描述
主要文件:
在这里插入图片描述
将上面两个文件放在工程目录中:

在这里插入图片描述

修改CMakeLists.txt

在里面添加 add_compile_options(-l sqlite3) add_executable(db/sqlite3.c)这两个,db是我自己的目录,需要改成你自己的路径。
在这里插入图片描述

在clion中使用sqlite的图像界面,代码修改后的数据库内容在图形界面能够直观的看到。
选择新建数据库中的SQLite
在这里插入图片描述
添加数据库后要修改数据库地址成你的项目地址

在这里插入图片描述配置sqlite的jdbc驱动
在这里插入图片描述
这里我已经下载好了,如果下载的很慢的话可以手动安装sqlite.JDBC。你可以从https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc这个网站里面自己找需要的驱动放在C:\CLion\bin\ProtableData\config\jdbc-drivers这个clion的默认目录中。
在这里插入图片描述
然后进行连接测试
在这里插入图片描述
成功后自己建表
在这里插入图片描述

2. 管理系统代码

#include <stdio.h>
#include "../db/sqlite3.h"   //这里是要改自己的sqlite3.h位置
#include <stdlib.h>
#include <string.h>

int tip;

// 回调函数
int callback(void *NotUsed, int argc, char **argv, char **azColName) {
    static int first_row = 1;  // 用于判断是否是第一行(列名)
    if (first_row) {
        // 打印列名
        for (int i = 0; i < argc; i++) {
            printf("%-15s", azColName[i]);
        }
        printf("\n");
        first_row = 0;  // 后续行不再打印列名
    }
    // 打印每行数据
    for (int i = 0; i < argc; i++) {
        printf("%-15s", argv[i] ? argv[i] : "NULL");
    }
    printf("\n");
    return 0;
}




int main() {
    // 1. 打开数据库
    char *errMsg = 0;
    sqlite3 *db = NULL;
    sqlite3_open("../db/student.sqlite", &db);

    // 提供用户操作菜单
    while (1) {
        // 菜单
        printf("*********************************************\n");
        printf("*              学生管理系统                  *\n");
        printf("*********************************************\n");
        printf("1.连接数据库\n");
        printf("2.增加学生成绩\n");
        printf("3.修改学生成绩\n");
        printf("4.删除学生成绩\n");
        printf("5.列出学生成绩\n");
        printf("6.清屏\n");
        printf("7.退出系统\n");
        printf("*********************************************\n");
        printf("**注意!!由于sql语句不支持中文符号,请切换输入法**\n");
        printf("*********************************************\n");
        printf("请输入要执行的操作提示:\n");

        // 缓冲区
        scanf("%d", &tip);
        getchar();  // 消耗掉换行符

        // 输入sql相关变量
        char *sql = malloc(1024);
        char **result;
        int row, column;  // row 和 column 用于存储查询结果的行数和列数
        char *buf = malloc(100);
        char *buf1 = malloc(100);
        char *buf2 = malloc(100);
        char *buf3 = malloc(100);
        /***********连接数据库*********/
        if (tip == 1) {
            // 先检查数据库是否成功连接
            if (db != NULL) {
                printf("连接数据库成功!\n");
            } else {
                printf("连接数据库失败!\n");
            }
        }

            /***********增加数据************/
        else if (tip == 2) {
            printf("请输入要增加的学生成绩(格式:id, name, math, english, chinese):\n");

            // 读取用户输入
            fgets(buf, 100, stdin);
            buf[strcspn(buf, "\n")] = 0; // 移除换行符

            // 分析输入,将字符串字段( name)添加引号
            int id, math, english, chinese;
            char name[50];

            // 假设用户输入格式为:id,name,math,english,chinese
            sscanf(buf, "%d,%49[^,],%d,%d,%d", &id, name, &math, &english, &chinese);

            // 构造 SQL 语句,给 name 自动加引号
            snprintf(sql, 1024, "insert into student values(%d, '%s', %d, %d, %d);", id, name, math, english, chinese);

            printf("SQL: %s\n", sql);

            // 执行插入操作
            int rc = sqlite3_exec(db, sql, NULL, NULL, NULL);
            if (rc != SQLITE_OK) {
                printf("插入失败: %s\n", sqlite3_errmsg(db));
            } else {
                printf("插入成功!\n");
            }
        }

            /***********修改数据***********/
        else if (tip == 3) {
            // 询问并读取学生ID、姓名、数学成绩和英语成绩
            printf("请输入要修改的学生ID:\n");
            fgets(buf, 100, stdin);
            buf[strcspn(buf, "\n")] = 0;

            printf("请输入修改的学生姓名:\n");
            fgets(buf1, 100, stdin);
            buf1[strcspn(buf1, "\n")] = 0;

            printf("请输入修改的学生数学成绩:\n");
            fgets(buf2, 100, stdin);
            buf2[strcspn(buf2, "\n")] = 0;

            printf("请输入修改的学生英语成绩:\n");
            fgets(buf3, 100, stdin);
            buf3[strcspn(buf3, "\n")] = 0;
            // 构造正确的SQL更新语句
            snprintf(sql, 1024,
                     "UPDATE student SET name = '%s', math_score = '%s', english_score = '%s' WHERE id = '%s';",
                     buf1, buf2, buf3, buf);

            printf("sql=%s\n", sql);  // 打印构造的SQL语句(可以检查是否正确)

            // 执行更新操作
            int rc = sqlite3_exec(db, sql, NULL, NULL, NULL);

            // 检查更新是否成功
            if (rc != SQLITE_OK) {
                printf("更新失败:%s\n", sqlite3_errmsg(db));
            } else {
                printf("更新成功!\n");
            }
        }

            /***********删除数据************/
        else if (tip == 4) {
            sqlite3_exec(db, "select *from student;", &callback, NULL, NULL);

            printf("请输入要删除的学生成绩:(只输入ID就行!)\n");
            fgets(buf1, 100, stdin);
            buf1[strcspn(buf1, "\n")] = 0;

            snprintf(sql, 1024, "delete from student where id = %s;", buf1);
            printf("sql=%s\n", sql);
           int rc=sqlite3_exec(db, sql, NULL, NULL, NULL);
            if (rc != SQLITE_OK) {
                printf("删除失败:%s\n", sqlite3_errmsg(db));
            } else {
                printf("删除成功!\n");
            }
        }

            /***********列出学生成绩************/
        else if (tip == 5) {
            // 当用户选择5时,列出学生成绩
            printf("学生成绩信息如下:\n");

            // 查询学生成绩
            const char *sql = "SELECT * FROM student;";  // 查询所有学生成绩
            int rc = sqlite3_exec(db, sql, callback, 0, &errMsg);
            if (rc != SQLITE_OK) {
                fprintf(stderr, "SQL error: %s\n", errMsg);
                sqlite3_free(errMsg);
            }

        }
                /***********清屏操作************/
            else if (tip == 6) {
                system("cls");  // Unix系统清屏命令,Windows用 system("cls");
            printf("已经清屏!\n");
            }

                /***********退出系统************/
            else if (tip == 7) {
                printf("系统退出\n");
                break;  // 跳出循环,结束程序
            } else {
                printf("无效的输入,请重新选择。\n");
            }
        }

        sqlite3_close(db);  // 关闭数据库
        return 0;
    }

注意代码中需要改动的一些文件路径

…/ 表示源文件所在目录的上一级目录,

…/…/ 表示源文件所在目录的上上级目录

3.创建数据库

在这里插入图片描述
数据库代码:

-- auto-generated definition
create table student
(
    id      INTEGER
        primary key,
    name    TEXT,
    math    REAL,
    english REAL,
    chinese REAL
);


运行结果如下:
在这里插入图片描述
这里我只写了对数据库的curd所以比较简单。


原文地址:https://blog.csdn.net/qq_68890680/article/details/144319280

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!