嵌入式学习

笔记

作业 

        学生管理系统部分功能。

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <pthread.h>
#include <semaphore.h>
#include <wait.h>
#include <signal.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <semaphore.h>
#include <sys/msg.h>
#include <sys/shm.h>
#include <sys/un.h>
#include <poll.h>
#include <errno.h>
#include <sqlite3.h>

typedef struct Stu {
	int sid;
	char name[20];
	int age;
	char sex[2];
	double score;
}Stu;

//添加学生信息
int do_add(sqlite3 *ppDb);
//删除学生信息
int do_del(sqlite3 *ppDb);
//修改学生信息
int do_update(sqlite3 *ppDb);
//定义回调函数用于处理查找后的结果集,do_search中需要用到回调函数
int callback(void *arg, int cols, char **col_text, char **clo_name);
//查找学生信息,法1
int do_search(sqlite3 *ppDb);
//查看学生信息,法2
int do_search02(sqlite3 *ppDb);

int main(int argc, const char *argv[])
{

	//创建或打开一个数据库
	sqlite3 *ppDb=NULL;
	if(sqlite3_open("my01.db",&ppDb) != SQLITE_OK)
	{
		printf("database open error:%d, %s\n",sqlite3_errcode(ppDb),sqlite3_errmsg(ppDb));
		return -1;
	}
	printf("数据库打开成功\n");

	//对数据库相关操作
	//创建数据表
	//准备sql语句
	char sql[128]="create table if not exists Stu(sid int primary key not null,name text, age int, sex text, score real)";
	char *errmsg=NULL;//对于用于接收错误信息
	//执行sql语句
	if(sqlite3_exec(ppDb, sql, NULL, NULL, &errmsg) != SQLITE_OK)
	{
		printf("Stu table create error:%s\n",errmsg);
		//释放errmsg空间
		return -1;
	}
	printf("Stu table create success\n");

	//制作菜单
	int menu=0;
	while(1)
	{
		system("clear");//清屏
		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_del(ppDb);
				break;
			case 3:
				//修改学生信息
				do_update(ppDb);
				break;
			case 4:
				//查找学生信息
				do_search(ppDb);
				//do_search02(ppDb);
				break;
			case 0:
				//退出
				goto END;
			default:
				printf("您输入的功能有误,请重新输入\n");
				break;
		}
		printf("请输入任意键按回车清屏\n");
		while(getchar() != '\n');
	}

END:

	//关闭数据库
	sqlite3_close(ppDb);

	return 0;
}

//添加学生信息
int do_add(sqlite3 *ppDb)
{
	Stu stu;//声明学生结构体变量
	printf("请输入要添加的学生id:");
	scanf("%d",&stu.sid);
	printf("请输入要添加的学生姓名:");
	scanf("%s",stu.name);
	printf("请输入要添加的学生年龄:");
	scanf("%d",&stu.age);
	printf("请输入要添加的学生性别:");
	scanf("%s",stu.sex);
	printf("请输入要添加的学生的分数:");
	scanf("%lf",&stu.score);
	getchar();

	//准备sql语句
	char sql[128]="";
	snprintf(sql,sizeof(sql),"insert into Stu values(%d, \"%s\", %d, \"%s\", %.2lf);",stu.sid, stu.name, stu.age, stu.sex, stu.score);

	//执行sql语句
	char *errmsg=NULL;//用于接收错误信息
	if(sqlite3_exec(ppDb, sql, NULL, NULL,&errmsg) != SQLITE_OK)
	{
		printf("Stu create error:%s\n",errmsg);
		//释放errmsg空间
		sqlite3_free(errmsg);
		return -1;
	}
	printf("插入成功\n");
	return 0;
}

//删除学生信息
int do_del(sqlite3 *ppDb)
{
	Stu stu;
	
	printf("请输入要删除学生的id:");
	scanf("%d",&stu.sid);
	getchar();

	//准备sql语句
	char sql[128]="";
	snprintf(sql, sizeof(sql), "delete from Stu where sid=%d;",stu.sid);

	//执行sql语句
	char *errmsg=NULL;//用于接收错误信息
	if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg) != SQLITE_OK)
	{
		printf("Stu delete error:%s\n",errmsg);
		//释放errmsg的空间
		sqlite3_free(errmsg);
		return -1;
	}
	printf("删除成功\n");
	return 0;
}

//修改学生信息
int do_update(sqlite3 *ppDb)
{
	Stu stu;

	printf("请输入要修改信息的学生的id:");
	scanf("%d",&stu.sid);
	getchar();
	printf("====1. 姓名====\n");
	printf("====2. 年龄====\n");
	printf("====3. 性别====\n");
	printf("====4. 分数====\n");
	printf("请选择要修改的内容:");
	int num_update=0;
	scanf("%d",&num_update);
	getchar();
	if(num_update>0 && num_update<5)
	{
		printf("请输入修改后的内容:\n");
	}
	char sql[128]={0};
	switch(num_update)
	{
		case 1:
			//修改姓名
			scanf("%s",stu.name);
			getchar();
			snprintf(sql,sizeof(sql),"update Stu set name=\"%s\" where sid=%d;",stu.name,stu.sid);
			break;
		case 2:
			//修改年龄
			scanf("%d",&stu.age);
			getchar();
			snprintf(sql,sizeof(sql),"update Stu set age=%d where sid=%d;",stu.age,stu.sid);
			break;
		case 3:
			//修改性别
			scanf("%s",stu.sex);
			getchar();
			snprintf(sql,sizeof(sql),"update Stu set sex=\"%s\" where sid=%d;",stu.sex,stu.sid);
			break;
		case 4:
			//修改分数
			scanf("%lf",&stu.score);
			getchar();
			snprintf(sql,sizeof(sql),"update Stu set score=%.2lf where sid=%d;",stu.score,stu.sid);
			break;
		default:
			printf("选项错误:\n");
			goto END02;
	}
	
	char *errmsg=NULL;//用于接收错误信息
	//执行sql语句
	if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg) != SQLITE_OK)
	{
		printf("Stu create error:%s\n",errmsg);
		//释放errmsg空间
		sqlite3_free(errmsg);
		return -1;
	}
	printf("修改成功\n");

END02:
	return 0;

}

//定义回调函数用于处理查找后的结果集
int callback(void *arg, int cols, char **col_text, char **col_name)
{
	if(*(int*)arg == 0)
	{
		//输出表头
		for(int i=0;i<cols;i++)
		{
			printf("%s\t",*(col_name+i));
		}
		printf("\n");
		*(int*)arg=1;
	}
	//输出当前记录
	for(int i=0;i<cols;i++)
	{
		printf("%s\t",col_text[i]);
	}
	printf("\n");
	return 0;
}

//查找学生信息,法1
int do_search(sqlite3 *ppDb)
{
	int flag=0;
	//准备sql语句
	char sql[128]="select * from Stu;";

	//执行sql语句
	char *errmsg=NULL;
	if(sqlite3_exec(ppDb, sql, callback, &flag, &errmsg) != SQLITE_OK)
	{
		printf("Stu vreate error:%s\n",errmsg);
		//释放errmsg空间
		sqlite3_free(errmsg);
		return -1;
	}
	printf("查找结束\n");
	return 0;
}
/*
//查看学生信息,法2
int do_search02(sqlite3 *ppDb)
{
	//准备sql语句
	char sql[128]="select * from Stu;";//sql语句结尾不要忘记";"
	//准备其他容器
	char **pazResult=NULL;//返回结果起始地址
	int rows=0;//行
	int cols=0;//列
	char *errmsg=NULL;//错误信息

	//调用函数执行sql语句,并得到结果
	if(sqlite3_get_table(ppDb, sql, &pazResult, &rows, &cols, &errmsg) != SQLITE_OK)
	{
		printf("sql 执行失败:%s\n",errmsg);
		sqlite3_free(errmsg);//不管执行是否成功,都需要将错误信息的空间释放
		return -1;
	}

	for(int i=0;i<rows+1;i++)
	{
		for(int j=0;j<cols;j++)
		{
			printf("%s\t",pazResult[i*cols+j]);
		}
		printf("\n");
	}
	//不用表时,需要将表释放
	sqlite3_free_table(pazResult);
	
	return 0;
}
*/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值