2024/03/21(网络编程·day7)

news2024/9/22 19:30:16

一、思维导图

二、

//定义删除函数

int do_delete(sqlite3 *ppDb)
{
	int del_numb=0;

	printf("请输入要删除的学生的学号:");
	scanf("%d",&del_numb);
	getchar();

	//准备sql语句
	char sql[128]="select *from Stu";
	sprintf(sql,"delete from Stu where numb =%d;",del_numb);
	//定义接收错误信息的变量
	char *errmsg=NULL;
	//执行sql语句
	if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
	{
		printf("exec:%s\n",errmsg);
		sqlite3_free(errmsg);
		return -1;
	}
	printf("删除成功\n");
	return 0;
}

//定义修改函数

int do_update(sqlite3 *ppDb)
{
	int upd_numb=0;
	double new_score=0;

	printf("请输入要修改的学生的学号:");
	scanf("%d",&upd_numb);
	printf("请输入学生的新成绩:");
	scanf("%lf",&new_score);
	getchar();

	//准备sql语句
	char sql[128]="select *from Stu";
	sprintf(sql,"update Stu set score =%lf where numb =%d;",new_score,upd_numb);
	//定义接收错误信息的变量
	char *errmsg=NULL;
	//执行sql语句
	if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
	{
		printf("exec:%s\n",errmsg);
		sqlite3_free(errmsg);
		return -1;
	}
	printf("修改成功\n");
	return 0;
}

完整代码

#include<myhead.h>

//封装添加学生信息函数
int do_add(sqlite3 *ppDb)
{
    //准备sql语句
    int add_numb = 0;
    char add_name[20] = "";
    double add_score = 0;

    //提示并输入数据
    printf("请输入学号:");
    scanf("%d", &add_numb);
    printf("请输入姓名:");
    scanf("%s", add_name);
    printf("请输入成绩:");
    scanf("%lf", &add_score);
    getchar();

    char sql[128] = "";
    sprintf(sql,"insert into Stu values(%d, \"%s\", %lf);", add_numb,add_name,add_score);
    //printf("sql = %s\n", sql);
    
    //定义接收错误信息的变量
    char *errmsg = NULL;
    
    //执行sql语句
    if(sqlite3_exec(ppDb, sql, NULL, NULL, &errmsg) != SQLITE_OK)
    {
        printf("exec error:%s\n", errmsg);

        sqlite3_free(errmsg);       //释放错误信息的空间
        return -1;
    }

    printf("插入成功\n");

    return 0;

}

//定义删除函数
int do_delete(sqlite3 *ppDb)
{
	int del_numb=0;

	printf("请输入要删除的学生的学号:");
	scanf("%d",&del_numb);
	getchar();

	//准备sql语句
	char sql[128]="select *from Stu";
	sprintf(sql,"delete from Stu where numb =%d;",del_numb);
	//定义接收错误信息的变量
	char *errmsg=NULL;
	//执行sql语句
	if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
	{
		printf("exec:%s\n",errmsg);
		sqlite3_free(errmsg);
		return -1;
	}
	printf("删除成功\n");
	return 0;
}


//定义修改函数
int do_update(sqlite3 *ppDb)
{
	int upd_numb=0;
	double new_score=0;

	printf("请输入要修改的学生的学号:");
	scanf("%d",&upd_numb);
	printf("请输入学生的新成绩:");
	scanf("%lf",&new_score);
	getchar();

	//准备sql语句
	char sql[128]="select *from Stu";
	sprintf(sql,"update Stu set score =%lf where numb =%d;",new_score,upd_numb);
	//定义接收错误信息的变量
	char *errmsg=NULL;
	//执行sql语句
	if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
	{
		printf("exec:%s\n",errmsg);
		sqlite3_free(errmsg);
		return -1;
	}
	printf("修改成功\n");
	return 0;
}

//定义回调函数处理查询后的结果集
int callback(void *arg,int cols,char **msgText,char **msgHeader)
{
	//输出所有数据
	//输出表头
	if(*(int *)arg == 0)
	{
		for(int i=0;i<cols;i++)
		{
			printf("%s\t",*(msgHeader+i));
		}
		printf("\n");
		(*((int *)arg)) ++;
	}

	//输出当前记录的内容
	for(int i=0;i<cols;i++)
	{
		printf("%s\t",*(msgText+i));
	}
	printf("\n");

	return 0;
}

//定义查询函数
int do_search(sqlite3 *ppDb)
{
    //准备sql语句
    char sql[128] = "select * from Stu;";
    //定义错误信息容器
    char *errmsg = NULL;

    int flag = 0;        //定义标识位

    //执行sql语句
    if(sqlite3_exec(ppDb, sql, callback, &flag, &errmsg) != SQLITE_OK)
    {
        printf("exec error:%s\n", errmsg);

        sqlite3_free(errmsg);       //释放错误信息的空间
        return -1;
    }


    return 0;
}
//定义查询函数1 
int do_search_1(sqlite3 *ppDb)
{
	//准备sql语句
	char sql[128] = "select *from Stu;";
	//定义错误信息容器
	char *errmsg = NULL;
	//准备接收结果集的相关变量
	char **retPtr = NULL;  //记录结果集的起始地址
	int rows = 0; 		//记录结果集的行数
	int cols = 0;  		//记录结果集的列数

	//执行sql语句
	if(sqlite3_get_table(ppDb,sql,&retPtr,&rows,&cols,&errmsg)!=SQLITE_OK)
	{
		printf("get table error:%s\n",errmsg);
		sqlite3_free(errmsg);
		return -1;
	}

	//此时查询的结果集合已经放入了retPtr作为起始地址的二维容器里面
	for(int i=0;i<rows+1;i++)
	{
		for(int j=0;j<cols;j++)
		{
			printf("%s\t",*(retPtr + (i*cols)+j)); 	//输出任意一个元素
		}
		printf("\n");
	}

	//释放结果集
	sqlite3_free_table(retPtr);

	return 0;
}

/***************************主程序***********************************/
int main(int argc, const char *argv[])
{
	//1、定义数据库句柄指针
	sqlite3 *ppDb = NULL;

	//2、打开(创建)数据库
	if(sqlite3_open("./my.db",&ppDb) != SQLITE_OK)
	{
		fprintf(stderr,"sqlite_open error:errmsg = %s,errcode = %d\n",sqlite3_errmsg(ppDb),sqlite3_errcode(ppDb));
		return -1;
	}
	printf("sqlite3_open success\n");

	//3、创建数据库表
	//3.1、准备sql语句
	char sql[128] = "create table if not exists Stu(numb int,name char,score double);";
	char *errmsg =NULL; 		//用于接收出错时的错误消息

	//3.2执行sql语句
	if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg) != SQLITE_OK)
	{
		printf("exec error:%s\n,errmsg");
		sqlite3_free(errmsg);  //释放错误信息空间

		return -1;
	}
	printf("create table Stu success\n");

	//4、对数据表进行操作
	int menu = -1;
	while(1)
	{
		system("clear");
		printf("\t\t============XXX 学生管理系统=============\n");
        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_delete(ppDb);
			}
			break;
		case 3:
			{
				do_update(ppDb);
			}
			break;
		case 4:
			{
				do_search_1(ppDb);
			}
			break;
		case 0:goto END;
		default:printf("您输入的功能有误,请重新输入!\n");
		}

		printf("请输入任意键,按回车清屏\n");
		while(getchar() !='\n');
	}

END:

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

	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1534866.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RocketMQ 流存储解析:面向流场景的关键特性与典型案例

作者&#xff1a;林清山&#xff08;隆基&#xff09; 前言&#xff1a; 从初代开源消息队列崛起&#xff0c;到 PC 互联网、移动互联网爆发式发展&#xff0c;再到如今 IoT、云计算、云原生引领了新的技术趋势&#xff0c;消息中间件的发展已经走过了 30 多个年头。 目前&…

蓝桥杯-模拟-纸张尺寸

题目 思路 代码 qlist(str(input())) numint(q[1]) x,y1189,841 while num:num-1x//2if x<y:x,yy,x print(x) print(y)

关于安卓调用文件浏览器(一)打开并复制

背景 最近在做一个硬件产品&#xff0c;安卓应用开发。PM抽风&#xff0c;要求从app打开文件浏览器&#xff0c;跳转到指定目录&#xff0c;然后可以实现文件复制粘贴操作。 思考 从应用开发的角度看&#xff0c;从app打开系统文件浏览器并且选择文件&#xff0c;这是很常见…

牛客小白月赛86(D剪纸游戏)

题目链接:D-剪纸游戏_牛客小白月赛86 (nowcoder.com) 题目描述: 输入描述: 输入第一行包含两个空格分隔的整数分别代表 n 和 m。 接下来输入 n行&#xff0c;每行包含 m 个字符&#xff0c;代表残缺纸张。 保证&#xff1a; 1≤n,m≤10001 字符仅有 . 和 * 两种字符&#xf…

代码随想录算法训练营 DAY 16 | 104.二叉树最大深度 111.二叉树最小深度 222.完全二叉树的节点个数

104.二叉树最大深度 深度和高度 二叉树节点的深度&#xff1a;指从根节点到该节点的最长简单路径边的条数或者节点数&#xff08;取决于深度从0开始还是从1开始&#xff09;二叉树节点的高度&#xff1a;指从该节点到叶子节点的最长简单路径边的条数或者节点数&#xff08;取…

按键模拟精灵

按键模拟精灵功能简单&#xff1a; 1.添加模拟按键 2.删除模拟按键 3.开始模拟 4.停止模拟 适合简单的按键操作&#xff0c;有需要的可以点赞收藏关注我&#xff01;

315晚会:虚假的水军是怎样形成的?又要如何破解?

随着互联网的普及和发展&#xff0c;网络信息的传播已经成为了现代社会中不可或缺的一部分。然而&#xff0c;随之而来的是网络舆论的泛滥和虚假信息的肆意传播&#xff0c;这使得网络治理变得尤为重要。 2024年的315晚会&#xff0c;央视曝光了一种新型的水军制造手段&#x…

DXF™ 格式对象和图元——cad vba

在 DXF™ 格式中&#xff0c;对象的定义与图元的定义不同&#xff1a;对象没有图形表示&#xff0c;而图元则有图形表示。例如&#xff0c;词典是对象而不是图元。图元也称为图形对象&#xff0c;而对象称为非图形对象。 第七段中humbnail image&#xff0c;即&#xff1a;缩略…

【智能算法】海洋捕食者算法(MPA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2020年&#xff0c;Afshin Faramarzi 等人受到海洋生物适者生存启发&#xff0c;提出了海洋捕食者算法(Marine Predators Algorithm&#xff0c;MPA)。 2.算法原理 2.1算法思想 MPA根据模拟自然界…

图神经网络实战(2)——图论基础

图神经网络实战&#xff08;2&#xff09;——图论基础 0. 前言1. 图属性1.1 有向图和无向图1.2 加权图和非加权图1.3 连通图和非连通图1.4 其它图类型 2. 图概念2.1 基本对象2.2 图的度量指标2.2 邻接矩阵表示法 3. 图算法3.1 广度优先搜索3.2 深度优先搜索 小结系列链接 0. 前…

户外水质检测显示屏用于检测并显示各种水质数据

水质检测一直是环境保护和公共卫生领域的重要课题。随着科技的不断进步&#xff0c;水质检测设备也在不断更新换代。其中&#xff0c;水质检测显示屏作为一种新型的检测设备&#xff0c;为监测和显示各种水质数据提供了便利和高效的手段。 水质检测显示屏是一种集成了传感器、数…

tcp seq ack

seq&#xff08;Sequence Number&#xff09;&#xff1a;32bits&#xff0c;表示这个tcp包的序列号。tcp协议拼凑接收到的数据包时&#xff0c;根据seq来确定顺序&#xff0c;并且能够确定是否有数据包丢失。 ack&#xff08;Acknowledgment Number&#xff09;&#xff1a;3…

Python基础学习笔记(一)

Python简介 Python 语言是一种跨平台、开源、免费、解释型、面向对象、动态数据类型的高级程序设计语言。早期版本的 Python 被称作是 Python1&#xff1b;Python2 最后一个版本是 2.7&#xff1b;Python3 是目前最活跃的版 本&#xff0c;基本上新开发的 Python 代码都会支持…

Infoq:腾讯内容千亿级实时计算和规则引擎实践优化之路

1.系统背景 腾讯内容中台提供从内容生产、内容加工、内容分发、内容结算等全链路环节的一站式服务&#xff0c;在这个过程中&#xff0c;会产生大量的数据以及围绕这些数据衍生的实时流业务应用&#xff0c;如智能审核、运营决策、在线学习等&#xff0c;从底层去看这些内容生态…

SM4加密是什么?SM4算法在国密HTTPS协议中的作用

SM4加密算法是一种分组密码标准&#xff0c;由国家密码管理局于2012年3月21日发布&#xff0c;相关标准为“GM/T 0002-2012《SM4分组密码算法》&#xff0c;与国际上广泛使用的AES等算法类似&#xff0c;SM4同算法样用于保护数据的机密性&#xff0c;确保信息在传输过程中不被未…

MT1478 插入A(技巧)

从键盘上输入一个字符串&#xff08;长度小于10000&#xff0c;以回车作为结束&#xff0c;其余地方不出现回车&#xff09;&#xff0c;按后按照下面要求输出一个新字符串&#xff0c; 新的字符串是在原来字符串中&#xff0c; 每两个字符之间插入一个A&#xff0c; 输出新产生…

代码随想录|Day25|回溯05|491.非递减子序列、46.全排列、47.全排列II

491. 非递减子序列 本题并不能像 90.子集II 那样&#xff0c;使用排序进行树层去重。虽然题目没有明确不能排序&#xff0c;但如果排序了&#xff0c;集合本身就是递增子序列&#xff0c;这是LeetCode示例2中没有出现的。 所以本题的关键在于&#xff0c;如何在不排序的情况下对…

C语言数据结构基础——二叉树学习笔记(三)链式二叉树以及初步认识递归思想

1.链式二叉树概念及其逻辑 每个树都要看成&#xff1a;根&#xff0c;左子树&#xff0c;右子树 链表、顺序表中的遍历方式有正序遍历和逆序遍历&#xff0c;而我们在二叉树中&#xff0c;有前序遍历、中序遍历、后序遍历、层序等多种遍历方法。 所谓 二叉树遍历 (Traversal) …

linux网络固定ip的方式

1. 注意 默认情况下&#xff0c;我们linux操作系统 ip 获取的方式是自动获取的方式&#xff08;DHCP&#xff09;&#xff0c;自动获取在我们需要进行集群配置的时候&#xff0c;IP会经常变化&#xff0c;需要将IP固定下来。 2. 第一步 编辑我们 linux 的网卡文件 这个网卡文件…

Springmvc---解读<url-pattern/>

&#xff08;1&#xff09; *.do&#xff1a; 在没有特殊要求的情况下&#xff0c;SpringMVC 的中央调度器 DispatcherServlet 的<url-pattern/>常使用后辍匹配方式&#xff0c;如写为*.do 或者 *.action, *.mvc等。 &#xff08;2&#xff09; / &#xff1a; Tomcat本身…