虚拟机基于gcc编译的学生管理
代码展示
#include <stdio.h>
#include <sqlite3.h>
#include <string.h>
sqlite3 *db = NULL;//数据库标识
char *errmsg = NULL;错误信息
char **resultp=NULL;存放执行sql语句后的结果
int nrow,ncolumn;//行和列
int lcj=0;//全局变量
int i;//全局变量
char sql[100];
void print_dl()//登录界面
{
char c=' ';
printf("\n%23c登录界面%23c",c,c);
printf("\n===============================================================");
printf("\n===============================================================");
printf(" %18c用户名:%15c\n",c,c);
printf(" %17c密码:%15c\n",c,c);
printf("\n===============================================================");
printf(" %15c0|登录 1|注册 2|退出%15c\n",c,c);
}
int login()//登录功能:用户输入账户密码,系统去访问用户密码数据库,搜索的到说明登录成功,反之相反,sqlite3_get_table,搜索成功行数为1,失败0
{
char name[100];
char password[100];
printf("用户名: ");
gets(name);
printf("\n");
printf("密码: ");
gets(password);
printf("\n");
sprintf(sql, "select *from password where name='%s' and password=%s;",name,password);
if(SQLITE_OK!=sqlite3_get_table(db,sql,&resultp,&nrow,&ncolumn,&errmsg)){
printf("login:%s",errmsg);
return -1;
}
if(nrow==1){
printf("登录成功");
lcj=1;
}
else if(nrow==0){
printf("登录失败");
}
return 0;
}
int enroll()//注册功能:用户输入账户密码,向用户密码数据库中添加数据
{
char name[100];
char password[100];
printf("请输入你要注册的用户名和密码:\n");
printf("用户名: ");
gets(name);
printf("\n");
printf("密码: ");
gets(password);
printf("\n");
sprintf(sql, "insert into password values('%s', %s);",name,password);
if (SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg)) {
printf("注册失败\n");
return -1;
}
printf("注册成功\n");
return 0;
}
int quit()//退出登录
{
printf("退出登录:\n");
return 0;
}
void print()//打印学生系统界面
{
char c=' ';
printf("\n%23c学生信息管理系统%23c",c,c);
printf("\n===============================================================");
printf("\n%25c系统功能菜单%25c",c,c);
printf("\n===============================================================");
printf("\n===============================================================");
printf(" %15c|0.系统说明 1.增加学生记录|%15c\n",c,c);
printf("-----------------------------------------------------------------");
printf("%15c|2.浏览学生记录 3.查询学生记录|%15c\n",c,c);
printf("-----------------------------------------------------------------");
printf("%15c|4.删除学生记录 5.修改学生记录|%15c\n",c,c);
printf("-----------------------------------------------------------------");
printf("%15c|6.统计学生记录 7.退出系统 |%15c\n",c,c);
printf("-----------------------------------------------------------------");
printf("%15c| |%15c\n",c,c);
printf("-----------------------------------------------------------------");
}
void help()//系统说明
{
printf("输入相关的编号,系统将弹到对应的操作处,在此你要根据相应的语句提示进行输入,随后系统将执行你的记录!\n");
}
int add()//添加记录:用户输入记录,向学生数据库添加整段记录
{
printf("请输入你要增加的记录(学号名字性别语文成绩数学成绩英语成绩,分隔 名字和性别用'')\n");
char c[100];
gets(c);
sprintf(sql,"insert into student values(%s);",c);
if (SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg)) {
printf("insert: %s\n", errmsg);
return -1;
}
printf("添加成功!\n");
return 0;
}
int display()//浏览,用户输入浏览方式,访问学生数据库并且打印需要的记录
{
printf("浏览学生记录(输入你要的浏览的方式学号或者名次)\n");
char c[100];
char xh[100];
char mc[100];
int i, j;
int count = 0;
gets(c);
if(0==strcmp(c,"学号")){
sprintf(xh,"select *from student order by id;");
if(SQLITE_OK!=sqlite3_get_table(db,xh,&resultp,&nrow,&ncolumn,&errmsg)){
printf("%s\n",errmsg);
return -1;
}
for (i = 0; i <= nrow; i++) {//行数
for(j=0;j<ncolumn;j++)//列数
printf("%-10s",resultp[count++]);//数据的位置
printf("\n");
}
}
else if(0==strcmp(c,"名次")){
sprintf(mc,"select *,chinese+math+english as 总分 from student order by 总分 desc;");
if(SQLITE_OK!=sqlite3_get_table(db,mc,&resultp,&nrow,&ncolumn,&errmsg)){
printf("%s\n",errmsg);
return -1;
}
for(i = 0; i <= nrow; i++) {//行数
for(j=0;j<ncolumn;j++)//列数
printf("%-10s",resultp[count++]);//数据的位置
printf("\n");
}
}
return 0;
}
int select()//用户输入查询方式,访问学生数据库并且打印需要的记录
{
char xh[100];
char mz[100];
int i, j;
int count = 0;
printf("搜寻学生记录(请输入你要搜寻学号还是名字)\n");
char c[100];
gets(c);
if(0==strcmp(c,"名字")){
printf("请输入你要搜寻的名字\n");
gets(mz);
sprintf(sql,"select *from student where name='%s'",mz);
if(SQLITE_OK!=sqlite3_get_table(db,sql,&resultp,&nrow,&ncolumn,&errmsg)){
printf("%s\n",errmsg);
return -1;
}
for (i = 0; i <= nrow; i++) {//行数
for(j=0;j<ncolumn;j++)//列数
printf("%-10s",resultp[count++]);//数据的位置
printf("\n");
}
}
else if(0==strcmp(c,"学号")){
printf("请输入你要搜寻的学号\n");
gets(xh);
sprintf(sql,"select *from student where id=%s;",xh);
if(SQLITE_OK!=sqlite3_get_table(db,sql,&resultp,&nrow,&ncolumn,&errmsg)){
printf("%s\n",errmsg);
return -1;
}
for(i = 0; i <= nrow; i++) {//行数
for(j=0;j<ncolumn;j++)//列数
printf("%-10s",resultp[count++]);//数据的位置
printf("\n");
}
}
return 0;
}
int delete()//删除学生记录:输入记录,访问数据库删除这条记录
{
int i, j;
int count = 0;
printf("请输入你要删除的学生记录(输入学生的学号))\n");
char xh[100];
gets(xh);
sprintf(sql,"delete from student where id=%s;",xh);
if(SQLITE_OK!=sqlite3_get_table(db,sql,&resultp,&nrow,&ncolumn,&errmsg)){
printf("%s\n",errmsg);
return -1;
}
printf("删除成功!");
return 0;
}
int alter()//修改学生记录:输入修改记录,访问数据库进行修改
{
printf("修改学生记录(请输入你要修改基本信息(学号、姓名、性别)还是成绩信息(语文、数学、英语))\n");
char jb[100];
char cj[100];
char a[100];
char b[100];
char c[100];
char e[100];
int i, j;
int count = 0;
char d[100];
gets(d);
if(0==strcmp(d,"基本信息")){
printf("请输入你要修改学生的学号");
gets(e);
printf("请输入学号\n");
gets(a);
printf("请输入姓名\n");
gets(b);
printf("请输入性别\n");
gets(c);
sprintf(sql,"update student set id=%s,name='%s',sex='%s' where id=%s;",a,b,c,e);
if(SQLITE_OK!=sqlite3_get_table(db,sql,&resultp,&nrow,&ncolumn,&errmsg)){
printf("%s\n",errmsg);
return -1;
}
}
else if(0==strcmp(d,"成绩信息")){
printf("请输入你要修改学生的学号");
gets(e);
printf("请输入语文成绩\n");
gets(a);
printf("请输入数学成绩\n");
gets(b);
printf("请输入英语成绩\n");
gets(c);
sprintf(sql,"update student set chinese=%s,math=%s,english=%s where id=%s;",a,b,c,e);
if(SQLITE_OK!=sqlite3_get_table(db,sql,&resultp,&nrow,&ncolumn,&errmsg)){
printf("%s\n",errmsg);
return -1;
}
}
printf("修改成功!");
return 0;
}
int avg()//统计记录,输入你要统计什么,访问学生数据库并且打印
{
char zf[100];
char avg[100];
char minandmax[100];
char math[100];
char english[100];
int i, j,z;
int count = 0;
printf("统计学生记录(请输入你要统计什么(总分,平均分,最大值和最小值,分段)\n");
char c[100];
gets(c);
if(0==strcmp(c,"总分")){
sprintf(zf,"select *,chinese+math+english as 总分 from student;");
if(SQLITE_OK!=sqlite3_get_table(db,zf,&resultp,&nrow,&ncolumn,&errmsg)){
printf("%s\n",errmsg);
return -1;
}
for (i = 0; i <= nrow; i++) {//行数
for(j=0;j<ncolumn;j++)//列数
printf("%-10s",resultp[count++]);//数据的位置
printf("\n");
}
}
else if(0==strcmp(c,"平均分")){
sprintf(avg,"select avg(chinese),avg(math),avg(english) from student;");
if(SQLITE_OK!=sqlite3_get_table(db,avg,&resultp,&nrow,&ncolumn,&errmsg)){
printf("%s\n",errmsg);
return -1;
}
for(i = 0; i <= nrow; i++) {//行数
for(j=0;j<ncolumn;j++)//列数
printf("%-10s",resultp[count++]);//数据的位置
printf("\n");
}
}
else if(0==strcmp(c,"最大值和最小值")){
sprintf(minandmax,"select min(chinese), max(chinese),min(math),max(math),min(english),max(english) from student;");
if(SQLITE_OK!=sqlite3_get_table(db,minandmax,&resultp,&nrow,&ncolumn,&errmsg)){
printf("%s\n",errmsg);
return -1;
}
for(i = 0; i <= nrow; i++) {//行数
for(j=0;j<ncolumn;j++)//列数
printf("%-10s",resultp[count++]);//数据的位置
printf("\n");
}
}
else if(0==strcmp(c,"分段")){
char a[100];
char b[100];
char km[100];
printf("输入分段前区间");
gets(a);
printf("输入分段后区间");
gets(b);
printf("请输入科目");
gets(km);
if(0==strcmp(km,"语文")){
sprintf(sql,"select count(chinese) as 语文人数 from student where chinese>=%s and chinese <=%s;",a,b);
if(SQLITE_OK!=sqlite3_get_table(db,sql,&resultp,&nrow,&ncolumn,&errmsg)){
printf("%s\n",errmsg);
return -1;
}
for(i = 0; i <= nrow; i++) {//行数
for(j=0;j<ncolumn;j++)//列数
printf("%-10s",resultp[count++]);//数据的位置
printf("\n");
}
}
else if(0==strcmp(km,"数学")){
sprintf(math,"select count(math) from student as 数学人数 where math>=%s and math<=%s;",a,b);
if(SQLITE_OK!=sqlite3_get_table(db,math,&resultp,&nrow,&ncolumn,&errmsg)){
printf("%s\n",errmsg);
return -1;
}
for(i = 0; i <= nrow; i++) {//行数
for(j=0;j<ncolumn;j++)//列数
printf("%-10s",resultp[count++]);//数据的位置
printf("\n");
}
}
else if(0==strcmp(km,"英语")){
sprintf(english,"select count(english) as 英语人数 from student where english>=%s and english<=%s;",a,b);
if(SQLITE_OK!=sqlite3_get_table(db,english,&resultp,&nrow,&ncolumn,&errmsg)){
printf("%s\n",errmsg);
return -1;
}
for(i = 0; i <= nrow; i++) {//行数
for(j=0;j<ncolumn;j++)//列数
printf("%-10s",resultp[count++]);//数据的位置
printf("\n");
}
}
}
return 0;
}
void out()
{
printf("系统退出\n");
}
int main()//主框架
{
if (SQLITE_OK != sqlite3_open("my.db", &db)) { //打开数据库
printf("Sqlite open failed!\n");
return -1;
}
printf("Sqlite open success!\n");
if(SQLITE_OK!=sqlite3_exec(db,"create table if not exists password(name text primary key,password integer);", NULL, NULL, &errmsg)){
printf("creat: %s\n", errmsg);
return -1;
}//创建用户密码数据库
if(SQLITE_OK!=sqlite3_exec(db,"create table if not exists student(id integer primary key,name text,sex text,chinese integer,math integer,english integer);", NULL, NULL, &errmsg)){
printf("creat: %s\n", errmsg);
return -1;
}//创建学生数据库(学号,名字,性别,语文成绩,数学成绩,英语成绩)
print_dl();//打印登录界面
while(1){
printf("请输入对应的编号:\n");
scanf("%d",&i);
getchar();
switch(i){
case 0:login();break;
case 1:enroll();break;
case 2:quit();break;
}
if(i==2)//登录退出
break;
if(lcj==1){//登录成功
print();//打印学生系统管理界面
while(1){
printf("请输入菜单编号:\n");
scanf("%d",&i);
getchar();
switch(i){
case 0:help();continue;
case 1:add();continue;
case 2:display();continue;
case 3:select();continue;
case 4:delete();continue;
case 5:alter();continue;
case 6:avg();continue;
case 7:out();break;
default:printf("请在0-7选择!\n");
}
if(i==7)
break;
}
break;
}
else//登录失败
continue;
}
sqlite3_close(db);
return 0;
}
主体框架
while(1){
printf("请输入对应的编号:\n");
scanf("%d",&i);
getchar();
switch(i){
case 0:login();break;
case 1:enroll();break;
case 2:quit();break;
}
if(i==2)//登录退出
break;
if(lcj==1){//登录成功
print();//打印学生系统管理界面
while(1){
printf("请输入菜单编号:\n");
scanf("%d",&i);
getchar();
switch(i){
case 0:help();continue;
case 1:add();continue;
case 2:display();continue;
case 3:select();continue;
case 4:delete();continue;
case 5:alter();continue;
case 6:avg();continue;
case 7:out();break;
default:printf("请在0-7选择!\n");
}
if(i==7)
break;
}
break;
}
else//登录失败
continue;
}
使用两个while循环,第一个while实现不断的登录,注册,满足条件跳出循环,登录失败退出整体循环,登录成功跳转到第二个while,第二个while实现不断执行学生管理系统的功能,满足条件退出。再在两个while里面使用switch case 语句,输入相关编号方便去调用相关函数
将c语言代码和数据库连接起来
在c编程中使用sqlite3语句访问数据库,用户输入相关指令,用字符串相关处理方法构建sql语句,使用sqlite3函数访问数据库,完成目的
字符串的相关处理方法
引用头部文件<string.h>,此次编程将使用到利用数组输入字符串,字符串比较strcmp,创建自定义字符串sprintf
利用数组输入字符串
char c[100];
gets(c)//输入字符串
字符串比较strcmp
strcmp(a,b)
a,b为字符串,结果将返回3个值
返 回 值 意 义
<0 第一个字符串小于第二个字符串
0 两个字符串相等 ·
>0 第一个字符串大于第二个字符串
strcmp(a,b)//a和b为两个字符串
创建自定义字符串sprintf
sprintf(str," ",x)
str:你要构建出来的字符串
" ":在这里自定义字符串可添加%s调用后面参数x
x:字符串
char english[100];
char a[100];
char b[100];
printf("输入分段前区间");
gets(a);
printf("输入分段后区间");
gets(b);
sprintf(english,"select count(english) as 英语人数 from student where english>=%s and english<=%s;",a,b);