虽然之前我们已经写过几个版本的学生信息管理系统,但是那些学生信息都没有保存到数据库中,读写很不方便,这次我们继续升级一下,后面会陆续更新更多功能的版本
创建数据库,创建表,添加数据
#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;
}