使用数据库完成学生信息管理系统

前言:

虽然之前我们已经写过几个版本的学生信息管理系统,但是那些学生信息都没有保存到数据库中,读写很不方便,这次我们继续升级一下,后面会陆续更新更多功能的版本

1. 普通版

创建数据库,创建表,添加数据

使用数据库完成学生信息管理系统_第1张图片

manager_student.c

#include 
#include
#include
#include

//使用数据库完成学生信息管理系统

//查找操作
void select_info(sqlite3* mydb){

    //操作数据库,执行特定的sql语句
    //定义sql语句,查询
    char sql[128] = "select * from student;";
    //操作数据库
    char** resultp; //resultp里面存储了数据表中的所有数据
    int row; 
    int column;
    int n=0;
    sqlite3_get_table(mydb,sql,&resultp,&row,&column,NULL);
    //输出打印方法1
    for(int i=0;i<(row+1)*column;i++)//(row+1)这里加1,是因为没有把头算进去,我们要想输出头,就需要+1
	{
		
		printf("%-12s",resultp[i]);

		if((i+1)%column == 0)//这里是换行,每当下标i取模列为0的时候换行
		{
			printf("\n");
		}
	}
}

//增加操作
void add(sqlite3* mydb){
    char id[12];
    printf("请输入学生学号:");
    scanf("%s",id);

    char name[12];
    printf("请输入学生姓名:");
    scanf("%s",name);
    
    char sex[12];
    printf("请输入学生性别:");
    scanf("%s",sex);

    char score[12];
    printf("请输入学生成绩:");
    scanf("%s",score);

    //定义sql语句
    char sql[256];
    //拼接sql语句
    snprintf(sql,sizeof(sql),"insert into student(id,name,sex,score)values('%s','%s','%s','%s');",id,name,sex,score);

    char** resultp; //resultp里面存储了数据表中的所有数据
    int row; 
    int column;
    sqlite3_get_table(mydb,sql,&resultp,&row,&column,NULL);

}

//删除操作
void delete_info(sqlite3* mydb){
    char name[12];
    printf("请输入你要删除的学生姓名:");
    scanf("%s",name);

    //判断名字是否合法
    char** resultp; //resultp里面存储了数据表中的所有数据
    int row; 
    int column;
    char sql1[256] = "select name from student;";
    sqlite3_get_table(mydb,sql1,&resultp,&row,&column,NULL);
    for(int i=1;i<(row+1)*column;i++){

        if(strcmp(name,resultp[i])==0){

            //到这里名字合法,可以执行删除操作
            //拼接sql语句
            char sql2[256];
            snprintf(sql2,sizeof(sql2),"delete from student where name = '%s';",name);

            sqlite3_get_table(mydb,sql2,&resultp,&row,&column,NULL);
            printf("删除成功\n");
            return;

        }
    }
    printf("\n你要删除的学生不存在\n");

}

//修改操作
void update(sqlite3* mydb){
    char name[12];
    printf("请输入你要修改的学生姓名:");
    scanf("%s",name);

    //判断名字是否合法
    char** resultp; //resultp里面存储了数据表中的所有数据
    int row; 
    int column;
    char sql1[256] = "select name from student;";
    sqlite3_get_table(mydb,sql1,&resultp,&row,&column,NULL);
    //遍历判断名字是否合法
    for(int i=1;i<(row+1)*column;i++){

        if(strcmp(name,resultp[i])==0){
            //到这里名字合法,可以执行删除操作
            char id[12];
            printf("请 重新 输入学生学号:");
            scanf("%s",id);

            char name2[12];
            printf("请 重新 输入学生姓名:");
            scanf("%s",name2);
            
            char sex[12];
            printf("请 重新 输入学生性别:");
            scanf("%s",sex);

            char score[12];
            printf("请 重新 输入学生成绩:");
            scanf("%s",score);

            //定义sql语句
            char sql2[256];
            //拼接sql语句
            snprintf(sql2,sizeof(sql2),"update student set id='%s',name='%s',sex='%s',score='%s' where name = '%s';",id,name2,sex,score,name);

            sqlite3_get_table(mydb,sql2,&resultp,&row,&column,NULL);

            printf("\n修改成功\n");
            return;

        }
    }
    printf("\n你要修改的学生不存在\n");
    
}
//计算平均分
void avg(sqlite3* mydb){
    char** resultp; //resultp里面存储了数据表中的所有数据
    int row; 
    int column;
    //拼接字符串
    char sql1[256]= "select score from student;";
    sqlite3_get_table(mydb,sql1,&resultp,&row,&column,NULL);
    int sum = 0;
    int num = 0;
    for(int i=1;i<(row+1)*column;i++){
        sum += atoi(resultp[i]);
        num++;
    }
    float avg_sum = sum/(float)num;
    printf("平均分为:%.2f\n",avg_sum);//保留两位小数
}

//查找一个学生信息
void select_one(sqlite3* mydb){
    char name[12];
    printf("请输入你要查找的学生姓名:");
    scanf("%s",name);

    //操作数据库,执行特定的sql语句
    //定义sql语句,查询
    char sql[128];
    //操作数据库
    char** resultp; //resultp里面存储了数据表中的所有数据
    int row; 
    int column;
    snprintf(sql,sizeof(sql),"select * from student where name = '%s';",name);
    sqlite3_get_table(mydb,sql,&resultp,&row,&column,NULL);
    //输出打印方法1
    for(int i=0;i<(row+1)*column;i++)//(row+1)这里加1,是因为没有把头算进去,我们要想输出头,就需要+1
	{
		
		printf("%-12s",resultp[i]);

		if((i+1)%column == 0)//这里是换行,每当下标i取模列为0的时候换行
		{
			printf("\n");
		}
	}
}

//查询学生老师信息
void sel_teacher(sqlite3* mydb){
    char name[12];
    printf("请输入你要查询的学生姓名:");
    scanf("%s",name);

    //判断名字是否合法
    char** resultp; //resultp里面存储了数据表中的所有数据
    int row; 
    int column;
    char sql1[256] = "select name from student;";
    sqlite3_get_table(mydb,sql1,&resultp,&row,&column,NULL);
    for(int i=1;i<(row+1)*column;i++){

        if(strcmp(name,resultp[i])==0){

            //到这里名字合法,可以执行删除操作
            //拼接sql语句
            char sql2[256];
            snprintf(sql2,sizeof(sql2),"select student.*,teacher.name from student,teacher where teacher.teacher_stu = student.name and student.name = '%s';",name);

            sqlite3_get_table(mydb,sql2,&resultp,&row,&column,NULL);
            for(int i=0;i<(row+1)*column;i++){
                printf("%-12s",resultp[i]);
                if((i+1)%column == 0)//这里是换行,每当下标i取模列为0的时候换行
                {
                    printf("\n");
                }
            }
            return;

        }
    }
    printf("\n你要查询的学生不存在\n");

}

void menu(){
    printf("**********************************\n");
    printf("****1. add           2. delete****\n");
    printf("****3. update        4. select****\n");
    printf("*5. avg             6. select_one*\n");
    printf("***7.sel_teacher        0. exit***\n");
    printf("**********************************\n");
}

int main()
{

    //打开数据库
    sqlite3* mydb = NULL; 
    int ret = sqlite3_open("./stu.db",&mydb);
    if(ret==-1){
        perror("open failed");
        return -1;
    }

    int input;
    while(input){
        printf("\n");
        menu();
        printf("请输入你的操作:");
        scanf("%d",&input);
        printf("\n");

        switch (input)
        {
        case 1:
            add(mydb);
            break;
        case 2:
            delete_info(mydb);
            break;
        case 3:
            update(mydb);
            break;
        case 4:
            select_info(mydb);
            break;
        case 5:
            avg(mydb);
            break;
        case 6:
            select_one(mydb);
            break;
        case 7:
            sel_teacher(mydb);
            break;
        case 0:
            
            break;
        
        default:
            printf("输入错误,请重新输入\n");
            break;
        }
    }
    return 0;
}

你可能感兴趣的:(Sqlite,数据库,linux,c语言,sqlite)