每日学习总结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.mzph.cn/news/698096.shtml

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

相关文章

【前端素材】推荐优质后台管理系统GramOs平台模板(附源码)

一、需求分析 后台管理系统是一种用于管理网站、应用程序或系统的工具&#xff0c;它通常作为一个独立的后台界面存在&#xff0c;供管理员或特定用户使用。下面详细分析后台管理系统的定义和功能&#xff1a; 1. 定义 后台管理系统是一个用于管理和控制网站、应用程序或系统…

Redis 工具类 与 Redis 布隆过滤器

Redis 工具类 1. 核心依赖 <!--redis--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency><groupId>com.google.guava…

ubuntu解决“E: Unable to locate package lrzsz“

今天在ubuntu上安装rzsz包时报错&#xff0c;提示无法定位包&#xff0c;提示如下 出现这个问题是因为apt的源没有更新&#xff0c;我们直接说解决办法 把下面的命令执行一遍即可 sudo add-apt-repository main sudo add-apt-repository universe sudo add-apt-repository re…

fly-barrage 前端弹幕库(1):项目介绍

fly-barrage 是我写的一个前端弹幕库&#xff0c;由于经常在 Bilibili 上看视频&#xff0c;所以对网页的弹幕功能一直蛮感兴趣的&#xff0c;所以做了这个库&#xff0c;可以帮助前端快速的实现弹幕功能。 项目官网地址&#xff1a;https://fly-barrage.netlify.app/&#xff…

Redis信创平替之TongRDS(东方通),麒麟系统安装步骤

我的系统: 银河麒麟桌面系统V10(SP1)兆芯版 1.先进入东方通申请使用 2.客服会发送一个TongRDS包与center.lic给你(我这里只拿到.tar.gz文件,没有网上的什么安装版) 3.上传全部文件到目录中 4.服务节点安装,并启动 tar -zxvf TongRDS-2.2.1.2_P3.Node.tar.gz cd pmemdb/bin/…

QT入门看这一篇就够了——超详细讲解(40000多字详细讲解,涵盖qt大量知识)

目录 一、Qt概述 1.1 什么是Qt 1.2 Qt的发展史 1.3 Qt的优势 1.4 Qt版本 1.5 成功案例 二、创建Qt项目 2.1 使用向导创建 2.2 一个最简单的Qt应用程序 2.2.1 main函数中 2.2.2 类头文件 2.3 .pro文件 2.4 命名规范 2.5 QtCreator常用快捷键 三、Qt按钮小程序 …

MySQL5.7.24解压版安装教程

一、MySQL5.7.24解压版安装步骤 1.在指定目录下解压压缩包。比如在D:\Program Files\mysql下解压 2.在D:\Program Files\mysql\mysql-5.7.24-winx64目录下新建data文件夹&#xff0c;如果此目录下没有my.ini也需要手动创建 3.my.ini 文件配置内容如下 [mysqld] # 设置3306端口…

Nginx 配置前端工程项目二级目录

前提&#xff1a; 前端工程技术框架: vue 后端工程技术工程&#xff1a;spring boot 需求&#xff1a;需要通过二级目录访问前端工程&#xff1a; 如之前&#xff1a;http://127.0.0.1:80/ 改成 http://127.0.0.1/secondDirectory:80/ 一.前端工程支持二级目录 1.编译文…

三、矩阵基本知识

目录 1. 理解 2、矩阵的直观感受 3、矩阵与向量 1. 理解 ①矩阵是一个向量组&#xff0c;由许多 行向量 和 纵向量 组成。 ②矩阵方程求解 用增广矩阵初等变换化为 E 。齐次/非齐次方程组 的解用 初等变化 化为 行最简阶梯型。 ③初步认为由多元一次方程组的系数组成&…

petalinux_zynq7 驱动DAC以及ADC模块之六:qt显示adc波形

前文&#xff1a; petalinux_zynq7 C语言驱动DAC以及ADC模块之一&#xff1a;建立IPhttps://blog.csdn.net/qq_27158179/article/details/136234296petalinux_zynq7 C语言驱动DAC以及ADC模块之二&#xff1a;petalinuxhttps://blog.csdn.net/qq_27158179/article/details/1362…

【C++】——模板初阶 | STL简介

前言: 模板初阶 | STL简介 文章目录 一、模板初阶1.1 函数模板1.2 类模板 二、STL简介 &#xff08;了解&#xff09; 一、模板初阶 泛式编程&#xff08;Generic Programming&#xff09;指的是一种编程范式&#xff0c;其核心思想是编写可以在不同数据类型上通用的代码&#…

智能科技助力服装业:商品计划管理系统的革命性变革

随着智能科技的飞速发展&#xff0c;服装行业正在经历前所未有的变革。在这股浪潮中&#xff0c;商品计划管理系统的智能化转型成为了行业的核心驱动力。这种变革不仅极大地提高了服装企业的运营效率和市场竞争力&#xff0c;更为整个行业的可持续发展注入了新的活力。 智能商…

你听说过柔性数组吗?

目录 1. 柔性数组的概念 2. 柔性数组的特点 3. 柔性数组的使用 4. 柔性数组的优势 5.完结散花 悟已往之不谏&#xff0c;知来者犹可追 创作不易&#xff0c;宝子们&#xff01;如果这篇文章对你们有帮助的话&#…

怎么理解ping?这是我听过最好的回答

晚上好&#xff0c;我是老杨。 Ping这几个字母&#xff0c;已经深入网工人的骨髓了吧&#xff1f; 把Ping用到工作里&#xff0c;肯定不少人在用&#xff0c;但对Ping的了解和理解是不是足够深&#xff0c;取决了你能在工作里用到什么程度&#xff0c;能让它帮你到什么地步。…

美格智能联合罗德与施瓦茨完成5G RedCap模组SRM813Q验证,推动5G轻量化全面商用

全球5G发展进入下半场&#xff0c;5G RedCap以其低成本、低功耗的特性成为行业焦点。近日&#xff0c;中国移动携手合作伙伴率先完成全球最大规模、最全场景、最全产业的RedCap现网规模试验&#xff0c;推动首批芯片、终端具备商用条件&#xff0c;RedCap端到端产业已全面达到商…

10.CSS3的calc函数

CSS3 的 calc 函数 经典真题 CSS 的计算属性知道吗&#xff1f; CSS3 中的 calc 函数 calc 是英文单词 calculate&#xff08;计算&#xff09;的缩写&#xff0c;是 CSS3 的一个新增的功能。 MDN 的解释为可以用在任何长度、数值、时间、角度、频率等处&#xff0c;语法如…

Spring6学习技术|Junit

学习材料 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09; Junit 背景 背景就是每次Test都要重复创建容器&#xff0c;获取对象。就是ApplicationContext和getBean两个语句。通过Spring整合Junit&#xff0c;可以…

sentinel的资源数据指标是如何采集

资源数据采集 之前的NodeSelectorSlot和ClusterBuilderSlot已经完成了对资源调用树的构建, 现在则是要对资源进行收集, 核心点就是这些资源数据是如何统计 LogSlot 作用: 记录异常请求日志, 用于故障排查 public class LogSlot extends AbstractLinkedProcessorSlot<Def…

统计图雷达图绘制方法

统计图雷达图绘制方法 常用的统计图有条形图、柱形图、折线图、曲线图、饼图、环形图、扇形图。 前几类图比较容易绘制&#xff0c;饼图环形图绘制较难。 还有一种雷达图的绘制也较难&#xff0c;今提供雷达图的绘制方法供参考。 本方法采用C语言的最基本功能&#xff1a; &am…

跟着野火学FreeRTOS:第二段(事件组)

在小节里面介绍了二进制信号量&#xff0c;计数信号量&#xff0c;互斥量和递归互斥量等功能&#xff0c;其中二进制信号量和计数信号量&#xff08;也包括队列&#xff09;常用于任务和任务之间以及任务和中断之间的同步&#xff0c;她们具有以下属性&#xff1a; 当等待的事…