每日学习总结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或者0
    int 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 函数或者发生错误导致程序崩溃),则缓冲区通常不会被刷新,部分输出内容可能会丢失。因此,在重要的输出操作后,最好及时刷新缓冲区以确保输出内容被正确显示。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

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

目录&#xff1a; 第一题 Spring框架的设计目标&#xff0c;设计理念&#xff0c;和核心是什么&#xff1f;第二题. Spring由哪些模块组成&#xff1f;第三题. 详细讲解一下核心容器&#xff08;spring context应用上下文) 模块第四题.Spring框架中有哪些不同类型的事件第五题.…

【C++】类与对象—— 初始化列表 、static 静态成员、

类与对象 1 再谈构造函数1.1 构造函数体赋值1.2 初始化列表语法&#xff1a;建议&#xff1a;初始化顺序&#xff1a;注意&#xff1a; 1.3 explicit关键字 2 static 静态成员2.1 概念2.2 声明成员变量2.3 使用类的静态成员2.4 定义静态成员总结 Thanks♪(&#xff65;ω&#…

Linux:gcc的基本知识

gcc 是一个将C语言文件变成可执行文件的工具。 在Linux中&#xff0c;如果需要将一个C语言文件变得可以执行&#xff0c;那么除了这个文件本身的内容是C语言编写的内容外&#xff0c;还需要gcc这个编译工具进行编译才行。 gcc 使用的格式方法:gcc 要编译的文件 //在该代码下…

【数据结构与算法初学者指南】【冲击蓝桥篇】String与StringBuilder的区别和用法

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《数据结构与算法&#xff1a;初学者入门指南》&#x1f4d8;&am…

Llama2模型的优化版本:Llama-2-Onnx

Llama2模型的优化版本&#xff1a;Llama-2-Onnx。 Llama-2-Onnx是Llama2模型的优化版本。Llama2模型由一堆解码器层组成。每个解码器层&#xff08;或变换器块&#xff09;由一个自注意层和一个前馈多层感知器构成。与经典的变换器相比&#xff0c;Llama模型在前馈层中使用了不…

Redis进阶篇

Redis线程模型 redis是基于内存运行的高性能k-v数据库&#xff0c;6.x之前是单线程, 对外提供的键值存储服务的主要流程 是单线程&#xff0c;也就是网络 IO 和数据读写是由单个线程来完成&#xff0c;6.x之后引入多线程而键值对读写命 令仍然是单线程处理的&#xff0c;所以 …

[SpringDataMongodb开发游戏服务器实战]

背景&#xff1a; xdb其实足够完美了&#xff0c;现在回想一下&#xff0c;觉得有点复杂&#xff0c;我们不应该绑定语言&#xff0c;最好有自己的架构思路。 七号堡垒作为成功的商业项目&#xff0c;告诉我&#xff1a;其实数据是多读少写的&#xff0c;有修改的时候直接改库也…

离散数学 第八单元 布尔代数

目录 1. 布尔函数 2. duality 二元性 3. 表示布尔函数的布尔表达式 sum-of-products expansions 4. Functional Completeness 5. Logic Gates 逻辑门​​​​​​​ 4. 最小化 K-map卡诺图 Quine-McCluskey法 1. 布尔函数 嗯也就是我要知道布尔代数是啥形式&#xff…

[面试] 什么是死锁? 如何解决死锁?

什么是死锁 死锁&#xff0c;简单来说就是两个或者多个的线程在执行的过程中&#xff0c;争夺同一个共享资源造成的相互等待的现象。如果没有外部干预线程会一直阻塞下去. 导致死锁的原因 互斥条件&#xff0c;共享资源 X 和 Y 只能被一个线程占用; 请求和保持条件&#xf…

VMware虚拟机从一台电脑复制到另一台电脑

1 概述 在一台电脑上利用虚拟机安装了OS系统&#xff0c;特别是如果虚拟机中的系统进行了各种繁琐的配置&#xff0c;因为换电脑或者需要在其他电脑上配置&#xff0c;这个时候就可以将虚拟机中的系统复制拷贝一份到新电脑上&#xff0c;省时省力。 2 操作步骤 2.1 vmx文件 …

数字化转型导师坚鹏:政府数字化运营三步曲之认知、行动、结果

政府数字化运营三步曲之认知、行动、结果 课程背景&#xff1a; 很多政府都在开展数字化运营工作&#xff0c;目前存在以下问题急需解决&#xff1a; 不清楚政府数字化运营包括哪些关键工作&#xff1f; 不清楚政府数字化运营工作的核心方法论&#xff1f; 不清楚政府数…

单词倒排——c语言解法

以下是题目&#xff1a; 这个题中有三个点&#xff0c; 一个是将非字母的字符转换为空格&#xff0c; 第二是如果有两个连续的空格&#xff0c; 那么就可以将这两个连续的空格变成一个空格。 第三个点就是让单词倒排。 那么我们就可以将这三个点分别封装成三个函数。 还有就是…

电脑闹钟软件哪个好用?

电脑闹钟软件哪个好用&#xff1f;一款带有闹钟定时提醒的备忘录软件是比较实用的&#xff0c;很多上班族每天都要处理堆积如山的工作&#xff0c;总是会忙于一件事的时候忘记另外一件事&#xff0c;导致效率极低。如当一项重要会议需要提前准备资料时&#xff0c;我们却忙于其…

复旦大学MBA聚劲联合会:洞见智慧,拓宽思维格局及国际化视野

12月2日&#xff0c;“焕拥时代 俱创未来”聚劲联合会俱创会年度盛典暨俱乐部募新仪式圆满收官。16家复旦MBA俱乐部、200余名同学、校友、各界同仁齐聚复旦管院&#xff0c;一起在精彩纷呈的圆桌论坛里激荡思想&#xff0c;在活力四射的俱乐部风采展示中凝聚力量。      以…

《Docker 简易速速上手小册》第1章 Docker 基础入门(2024 最新版)

文章目录 1.1 Docker 简介与历史1.1.1 Docker 基础知识1.1.2 重点案例&#xff1a;Python Web 应用的 Docker 化1.1.3 拓展案例 1&#xff1a;使用 Docker 进行 Python 数据分析1.1.4 拓展案例 2&#xff1a;Docker 中的 Python 机器学习环境 1.2 安装与配置 Docker1.2.1 重点基…

《隐私计算简易速速上手小册》第9章:实现隐私计算的步骤(2024 最新版)

文章目录 9.1 规划与设计:描绘你的隐私保护蓝图9.1.1 基础知识9.1.2 主要案例:设计一个隐私保护的数据分享平台9.1.3 拓展案例 1:创建一个隐私保护的健康数据分析系统9.1.4 拓展案例 2:开发一个加密的即时通讯应用9.2 实施与部署:从蓝图到现实9.2.1 基础知识9.2.2 主要案例…

BentoML:如何使用 JuiceFS 加速大模型加载?

BentoML 是一个开源的大语言模型&#xff08;LLM&#xff09; AI 应用的开发框架和部署工具&#xff0c;致力于为开发者提供最简单的构建大语言模型 AI 应用的能力&#xff0c;其开源产品已经支持全球数千家企业和组织的核心 AI 应用。 当 BentoML 在 Serverless 环境中部署模型…

牛客网 HJ10 字符个数统计

思路&#xff1a; 我们创建两个数组&#xff0c;一个数组接受输入的字符&#xff0c;另一个数组用来统计字符种数 同时将该字符作为下标传给另一个数组&#xff0c;如果另一个数组的这个下标对应的值为0&#xff0c;说明该字符没有被统计过&#xff0c;计数器加1&#xff0c;…

在当前源文件的目录或生成系统路径中未找到文件

vsqt中增加&#xff0c;减少文件&#xff0c;都必须要动一下cmakelist.txt,点一下换行或者保存 因为vsqt反应不过来 1。都必须要动一下cmakelist.txt,点一下换行或者保存 2.然后全部重新生成&#xff0c;或者重新扫描解决方案&#xff08;多扫几次&#xff09;

现货黄金中短线投资该怎么做?

要明确什么是现货黄金的中短线投资&#xff0c;中短线投资是指在短期内&#xff08;一般为几天至几周&#xff09;对现货黄金进行买卖操作&#xff0c;以期获得收益的投资方式。相较于长线投资&#xff0c;中短线投资的风险相对较大&#xff0c;但同时收益也更为可观。那么&…