每日学习总结20240222

每日总结

一旦停下来太久,就很难继续了 ——《一个人的朝圣》

20240222

1. 自定义逻辑

请设计一个函数single_track_logic,传入三个参数,第一个参数是int数组,第二个参数是一个int变量,第三个参数是一个以int为返回值,无输入参数的函数指针,该函数实现以下功能:

1.首先对第一个参数的数组进行排序

2.当第二个参数在第一个参数数组的两个数之间时,返回数组下标

3.循环执行该函数时 当上一次的下标大于此次获取的下标时需要满足第三个参数的函数返回1时才能更新此次获取的数组下标,否则返回上一次的数组下标

#include <stdio.h>
#include <stdlib.h>int compare_up(const void *a, const void *b) {return (*(int*)a - *(int*)b);
}
int compare_down(const void *a, const void *b) {return (*(int*)b - *(int*)a);
}typedef int (*pfunc_condition)(void);
typedef enum sort_dir{enum_dir_up = 0,enum_dir_down,enum_dir_none,
}enum_sort_dir;
/*!* @brief:    单向逻辑* @funcname: single_track_logic  * @param:    arr  阶梯数组*            dir  对数组进行排序的方向  从小到大  或者 从大到小  或者 不排序(默认从小到大)*            size 阶梯数组的个数*            value 要判断的值*            pfunc 满足条件时可以重新更新下标* @return:   值所在下标区域* @note:     该函数实现以下功能:* 1.首先对第一个参数的数组进行排序 * 2.当第二个参数在第一个参数数组的两个数之间时,返回数组下标* 3.循环执行该函数时  当上一次的下标大于此次获取的下标时需要满足第三个参数的函数返回1时才能更新此次获取的数组下标,否则返回上一次的数组下标* @date:     20230830*/
int single_track_logic(int arr[], enum_sort_dir dir, int size, int value, pfunc_condition pfunc) 
{static int prevIndex = -1; // 上一次获取的数组下标int index;// 对数组进行排序if (dir == enum_dir_up){qsort(arr, size, sizeof(int), compare_up);}else if (dir == enum_dir_down){qsort(arr, size, sizeof(int), compare_down);}else{printf("无需排序\n");}printf("排序结果:");for (size_t i = 0; i < size; i++){printf("%d ",arr[i]);}for (index = 0; index < size; index++) {if ((dir == enum_dir_none) || (dir == enum_dir_up)){if (arr[index] <= value)continue;else break;}else{if (arr[index] >= value)continue;else break;}}if (index >= prevIndex){prevIndex = index;}else{if (pfunc() == 1)	//恢复条件成立{index = index;prevIndex = index;}else{index = prevIndex;}}return index-1;
}int custom_function(void) {// 在这里定义你的自定义函数// 返回1或者0int flag = rand() % 2 ? 1 : 0;printf("flag=%d\t", flag);return flag; // 这里只是个示例,根据实际情况修改
}int main() {int arr[] = {5, 3, 8, 1, 7, 4, 10, 0, -1};int num = 0;int size = sizeof(arr) / sizeof(arr[0]);int result = 0;printf("从小到大:\r\n");for (size_t i = 0; i < 10; i++){num = rand() % 10;result = single_track_logic(arr, enum_dir_up, size, num, custom_function);printf("num=%d result=%d\n",num, result);}printf("从大到小:\r\n");for (size_t i = 0; i < 10; i++){num = rand() % 10;result = single_track_logic(arr, enum_dir_down, size, num, custom_function);printf("num=%d result=%d\n",num, result);}return 0;
}

测试情况:

从小到大:
排序结果:-1 0 1 3 4 5 7 8 10 num=3 result=3
排序结果:-1 0 1 3 4 5 7 8 10 num=6 result=5
排序结果:-1 0 1 3 4 5 7 8 10 num=7 result=6
排序结果:-1 0 1 3 4 5 7 8 10 flag=1     num=5 result=5
排序结果:-1 0 1 3 4 5 7 8 10 num=5 result=5
排序结果:-1 0 1 3 4 5 7 8 10 num=6 result=5
排序结果:-1 0 1 3 4 5 7 8 10 flag=1     num=2 result=2
排序结果:-1 0 1 3 4 5 7 8 10 num=1 result=2
排序结果:-1 0 1 3 4 5 7 8 10 num=2 result=2
排序结果:-1 0 1 3 4 5 7 8 10 num=7 result=6
从大到小:
排序结果:10 8 7 5 4 3 1 0 -1 num=0 result=7
排序结果:10 8 7 5 4 3 1 0 -1 flag=1     num=9 result=0
排序结果:10 8 7 5 4 3 1 0 -1 num=6 result=2
排序结果:10 8 7 5 4 3 1 0 -1 num=0 result=7
排序结果:10 8 7 5 4 3 1 0 -1 flag=0     num=6 result=7
排序结果:10 8 7 5 4 3 1 0 -1 flag=1     num=6 result=2
排序结果:10 8 7 5 4 3 1 0 -1 flag=1     num=8 result=1
排序结果:10 8 7 5 4 3 1 0 -1 flag=0     num=9 result=1
排序结果:10 8 7 5 4 3 1 0 -1 num=0 result=7
排序结果:10 8 7 5 4 3 1 0 -1 flag=1     num=2 result=5

2. qsort

qsort 是 C 语言标准库中的一个函数,用于对数组进行快速排序。它的原型定义在 <stdlib.h> 头文件中,函数签名如下:

void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *));
  • base:指向要排序的数组的起始地址的指针。
  • nmemb:数组中元素的个数。
  • size:每个元素的大小,以字节为单位。
  • compar:比较函数的指针,用来确定元素之间的顺序关系。这个函数接受两个参数,即指向要比较的两个元素的指针,返回值小于、等于或大于 0 分别表示第一个参数小于、等于或大于第二个参数。

qsort 函数使用快速排序算法对数组进行排序,其时间复杂度为 O(n log n),是一种高效的排序算法。在调用 qsort 函数时,需要提供数组的起始地址、元素个数、元素大小以及比较函数,比较函数决定了排序的规则。

以下是一个简单的示例,演示如何使用 qsort 对整数数组进行升序排序:

#include <stdio.h>
#include <stdlib.h>int compare(const void *a, const void *b) {return (*(int*)a - *(int*)b);
}int main() {int arr[] = {5, 3, 8, 1, 10};int size = sizeof(arr) / sizeof(arr[0]);qsort(arr, size, sizeof(int), compare);for (int i = 0; i < size; i++) {printf("%d ", arr[i]);}return 0;
}

在这个示例中,我们定义了一个比较函数 compare,用于告诉 qsort 函数如何比较两个元素。然后调用 qsort 函数对整数数组 arr 进行排序,最后输出排序后的数组结果。

3. printf输出

3.1 使用C语言模拟输出进度条
#include <stdio.h>
#include <unistd.h> // 用于sleep函数void printProgressBar(int progress, int total) {int barWidth = 50;float progressRatio = (float)progress / total;int progressBar = progressRatio * barWidth;printf("[");for (int i = 0; i < barWidth; i++) {if (i < progressBar) {printf(">"); // 黑方格} else {printf("-"); // 空白}}printf("] %d%%\r", (int)(progressRatio * 100));fflush(stdout); // 刷新输出缓冲区// 可以加上一些延迟效果usleep(100000); // 100毫秒
}int main() {int total = 100;for (int i = 0; i <= total; i++) {printProgressBar(i, total);}printf("\n");return 0;
}
实现原理

当在控制台中使用printf函数输出信息时,输出的内容通常会先被存储在缓冲区中,并不会立即显示在屏幕上。这样做是为了提高效率,在一次性输出大量内容时减少频繁的屏幕刷新操作。但是对于进度条等需要实时更新的情况,我们希望能够立即将信息显示出来,而不是等到缓冲区满或遇到换行符才刷新。

  • fflush(stdout);函数用于强制将缓冲区中的内容立即输出到屏幕上。在进度条的实现中,每次调用printProgressBar函数后,使用fflush(stdout);可以确保立即将更新后的进度条显示出来。
  • printf("\r");中的\r是回车符(Carriage Return),它的作用是将光标移动到当前行的起始位置,这样在输出文本时就可以覆盖之前的内容。这就是为什么在进度条更新时,我们使用\r来让光标回到行首,然后再输出新的进度条,达到动态更新的效果。

综合使用fflush(stdout);\r,我们可以在控制台中实现动态更新的进度条效果。

printf默认在什么情况下刷新?

在C语言中,printf 函数通常会将输出内容缓存到内存中,并不会立即刷新到输出设备(如终端或文件)上。刷新缓冲区意味着将缓存中的数据写入到输出设备中,使得数据立即可见。

printf 函数默认情况下会在以下几种情况下刷新缓冲区:

  1. 当缓冲区已满时:当缓冲区达到一定大小或者输出内容包含换行符 \n 时,缓冲区会被自动刷新。
  2. 当遇到换行符 \n:如果 printf 输出的内容中包含换行符 \n,缓冲区会被刷新,输出内容被立即显示。
  3. 在程序正常结束时:当程序执行完毕时,缓冲区会被自动刷新,确保所有输出内容被显示出来。

除了以上默认情况外,我们也可以使用 fflush 函数手动刷新输出缓冲区。例如,调用 fflush(stdout) 可以强制刷新标准输出流缓冲区。

需要注意的是,如果程序异常终止(比如使用 exit 函数或者发生错误导致程序崩溃),则缓冲区通常不会被刷新,部分输出内容可能会丢失。因此,在重要的输出操作后,最好及时刷新缓冲区以确保输出内容被正确显示。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dell r740服务器黄灯闪烁维修现场解决

1&#xff1a;首先看一下这款DELL非常主力的PowerEdge R740服务器长啥样&#xff0c;不得不说就外观来说自从IBM抛弃System X系列服务器后&#xff0c;也就戴尔这个外观看的比较顺眼。 图一&#xff1a;是DELL R740前视图&#xff08;这款是8盘机型&#xff09; 图二&#xff…

SICTF Round#3 wp web

web hacker sql无列名注入&#xff1b; 提示查询username参数&#xff0c;flag在flag表中&#xff1b; 传参测试发现&#xff0c;union select 可用&#xff0c;空格被过滤可以使用/**/代替 &#xff0c;or也被过滤了且无法大小写、双写等绕过&#xff0c;导致无法查询flag表…

Python实战:读取MATLAB文件数据(.mat文件)

Python实战&#xff1a;读取MATLAB文件数据(.mat文件) &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 &#x1f448; 希望得到您的订阅…

Leetcoder Day18| 二叉树 part07

语言&#xff1a;Java/Go 今天做了一个小决定&#xff0c;如果时间不够的话&#xff0c;可以先看go去找实习&#xff0c;所以现在加上用go去刷题 530.二叉搜索树的最小绝对差 给你一棵所有节点为非负值的二叉搜索树&#xff0c;请你计算树中任意两节点的差的绝对值的最小值。…

常见锁策略,CAS,synchrodized原理讲解

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 常见锁策略 乐观锁和悲观锁 轻量级锁和重量级锁 自旋锁和挂起等待锁 读写锁 公平锁和非公平锁…

10大互联网技术受益于这个行业,它甚至推动互联网诞生

hello&#xff0c;我是贝格前端工场&#xff0c;今天分享某个行业存进了互联网技术发展&#xff0c;最早的互联网也是从该行业诞生的&#xff0c;希望老铁们喜欢&#xff0c;别忘了关注、点赞、评论、转发。 ARPANET 互联网的前身ARPANET最初是由美国国防部高级研究计划局&…

【云动世纪:Apache Doris 技术之光】

本文节选自《基础软件之路&#xff1a;企业级实践及开源之路》一书&#xff0c;该书集结了中国几乎所有主流基础软件企业的实践案例&#xff0c;由 28 位知名专家共同编写&#xff0c;系统剖析了基础软件发展趋势、四大基础软件&#xff08;数据库、操作系统、编程语言与中间件…

[力扣 Hot100]Day33 排序链表

题目描述 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 出处 思路 归并排序即可。 代码 class Solution { public:ListNode* merge(ListNode *h1,ListNode *h2) {ListNode *head nullptr;if(h1->val<h2->val){head h1;h1h1-…

SQL面试题及答案

介绍 在快节奏的数据管理和信息技术世界中,导航和操作结构化数据的能力是一项非常重要的技能。SQL,即结构化查询语言,是关系数据库的基石,掌握这种语言的专业人员的需求量很大。SQL 面试在科技行业很常见,潜在的候选人会接受测试以展示他们的知识和解决问题的能力。为了帮…

远程连接 vscode 出错 “远程主机可能不符合 glibc 和 libstdc++ VS Code 服务器的先决条件”

原因&#xff1a; vscode 版本是 1.86&#xff0c;服务器上的 glibc 和 libstdc 版本不满足 要求(2.28 和 3.4.25)。 解决&#xff1a; 1、下载 1.85.2&#xff0c;解压直接运行 Code.exe。 2、回退 Remote-ssh 到 0.107.1。 参考&#xff1a; vscode 1.86版本远程ssh不兼容旧…

java八股 redis

缓存穿透&#xff1f;如何解决&#xff1f; 缓存穿透是指查询一个一定不存在的数据&#xff0c;如果从存储层查不到数据&#xff0c;则不写入缓存&#xff0c;这就导致这个不存在的数据每次都要去数据库中查询&#xff0c;可能导致数据库挂掉。 可以通过布隆过滤器来解决。布隆…

每日五道java面试题之spring篇(三)

目录&#xff1a; 第一题 ApplicationContext和BeanFactory有什么区别&#xff1f;第二题 Spring中的事务是如何实现的&#xff1f;第三题 Spring中什么时候Transactional会失效&#xff1f;第四题 Spring容器启动流程是怎样的&#xff1f;第五题 Spring Boot、Spring MVC 和 S…

C语言第二十九弹---浮点数在内存中的存储

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 目录 1、浮点数在内存中的存储 1.1、练习 1.2、浮点数怎么转化为二进制 1.3、浮点数的存储 1.3.1、浮点数存的过程 1.3.2、浮点数取的过程 1.3、题目解析…

【Python笔记-设计模式】原型模式

一、说明 原型模式是一种创建型设计模式&#xff0c; 用于创建重复的对象&#xff0c;同时又能保证性能。 使一个原型实例指定了要创建的对象的种类&#xff0c;并且通过拷贝这个原型来创建新的对象。 (一) 解决问题 主要解决了对象的创建与复制过程中的性能问题。主要针对…

【自然语言处理】:实验5,司法阅读理解

清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 代码和报告均为本人自己实现&#xff08;实验满分&#xff09;&#xff0c;只展示主要任务实验结果&#xff0c;如果需要详细的实验报告或者代码可以私聊博主 有任何疑问或者问题&#xff0c;也欢…

【鸿蒙 HarmonyOS 4.0】UIAbility、页面及组件的生命周期

一、背景 主要梳理下鸿蒙系统开发中常用的生命周期 二、UIAbility组件 UIAbility组件是一种包含UI界面的应用组件&#xff0c;主要用于和用户交互。 UIAbility组件是系统调度的基本单元&#xff0c;为应用提供绘制界面的窗口&#xff1b;一个UIAbility组件中可以通过多个页…

Hudi程序导致集群RPC偏高问题分析

1、背景 Hudi程序中upsert操作频繁&#xff0c;过多的删除和回滚操作,导致集群RPC持续偏高 2、描述 hudi采用的是mvcc设计&#xff0c;提供了清理工具cleaner来把旧版本的文件分片删除&#xff0c;默认开启了清理功能&#xff0c;可以防止文件系统的存储空间和文件数量的无限…

sentinel中监听器的运用--规则管理

sentinel中监听器的运用–规则管理 规则结构 类图关系 类关系图如下 Rule 将规则抽象成一个类, 规则与资源是紧密关联的, 也就是说规则作用于资源。因此, 我们需要将规则表示为一个类, 并包含一个获取资源的方法 这里采用接口的原因就是规则是一个抽象概念而非具体实现。…

UE5 C++ 创建可缩放的相机

一.要将相机设置在Pawn类里 1.在MyPawn头文件里&#xff0c;加上摇臂和相机组件 #include "GameFramework/SpringArmComponent.h" #include "Camera/CameraComponent.h" 2.在Pawm里声明SceneComponet&#xff0c;SpringArmComponent,CameraComponent组件…

OpenAI发布Sora模型,可根据文字生成逼真AI视频

早在2022年11月30日&#xff0c;OpenAI第一次发布人工智能聊天机器人ChatGPT&#xff0c;随后在全世界掀起了人工智能狂潮&#xff0c;颠覆了一个又一个行业。在过去的一年多的时间里&#xff0c;chatGPT的强大功能改变了越来越多人的工作和生活方式&#xff0c;成为了世界上用…