【C】二分查找与函数1
二分查找
练习:
给定一个整型的有序数组,在数组中找到指定的一个值,如:
1,2,3,4,5,6,7,8,9,10
找出7.如果找到了,打印这个值的下标
如果没找到,就打印找不到
1. 遍历
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int k = 0;scanf("%d", &k);//输入要查找的数//遍历这个数组int i = 0;int flag = 0;//假设没找到int sz = sizeof(arr) / sizeof(arr[0]);for (i = 0;i < sz;i++) {if (arr[i] == k) {printf("找到了,下标是%d", i);flag = 1;break;}}if (flag == 0) {printf("找不到");}/*if (i == sz) {printf("找不到");}*/return 0;
}
2. 二分查找
前提:有序的数组
思路:
- 找出被查找到中间元素,使用下标来计算
- 使用中间元素与k比较,去掉一半数据
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main() {int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int k = 0;scanf("%d", &k);//输入要查找的数int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);int left = 0;int right = sz - 1;int flag = 0;//初始状态没找到while (left<=right) {int mid = (left + right) / 2;if (arr[mid] < k) {left = mid + 1;}else if (arr[mid] > k) {right = mid - 1;}else {printf("找到了,下标是%d", mid);flag = 1;break;}}if (flag == 0){printf("找不到");}return 0;
}
注:
int mid = (left + right) / 2;
这种方法求中间值大部分情况下都没问题
但是当left和right非常大的时候(left+right>整形的最大值)就可能会出现问题
另一种求两个数平均值的方式:
int mid = left + (right - left) / 2;//与left right之间的大小无关
函数
函数的概念
函数 (function)(子程序)是一个完成某项特定的任务的一小段代码
C语言的程序是由无数个小的函数组合而成的,一个大的计算任务可以分解成若干个较小的函数(对应较小的任务)完成
一个函数如果能完成某项特定任务的话,复用这个函数可以提升了开发软件的效率
在C语言中一般会见到两类函数:库函数,自定义函数
库函数
标准库和头文件
C语言标准中规定了C语言的各种语法规则,C语言并不提供库函数
C语言的国际标准ANSIC规定了一些常用的函数的标准,被称为标准库
不同的编译器厂商根据ANSI提供的C语言标准就给出了一系列函数的实现,这些函数就被称为库函数
各种编译器的标准库中提供了一系列的库函数,这些库函数根据功能的划分,都在不同的头文件中进行了声明
库函数相关头文件:https://zh.cppreference.com/w/c/header
库函数的使用方法
库函数的学习和查看工具很多,比如:
C/C++官方的链接: https://zh.cppreference.com/w/c/header
cplusplus.com: https://legacy.cplusplus.com/reference/clibrary/
库函数文档的一般格式
1.函数原型
2.函数功能介绍
3.参数和返回类型说明
4.代码举例
5.代码输出
6.相关知识链接
例:
自定义函数
语法
ret_type fun_name(形式参数)
{}
函数构成:
- ret_type: 返回值类型(void表示没有返回值)
- fun_name: 函数名
- { }内:函数体
- ()内:形式参数(void表示没有参数,参数可有一个或多个)
例:完成两个整数的加和
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//函数的定义
int Add(int x, int y) {int z = x + y;return z;//返回计算的和 return x+y;
}
int main() {int a = 0;int b = 0;scanf("%d%d", &a, &b);int c = Add(a, b);//函数调用printf("%d", c);return 0;
}
VS上调试时:
F10–可以一步步的执行代码
F11–进入函数
形参与实参
以上面代码举例:
int c = Add(a, b);//a,b实际参数,简称实参
int Add(int x, int y)//x,y形式参数。简称形参
注: 当函数调用的时候,实参传递给形参到时候,形参会创建自己的空间来存放是实参的值,形参和实参不是同一块空间,对形参的修改不会影响实参,可以理解为:形参是实参的一份临时拷贝
return
return语句使用的注意事项:
- return后边可以是一个数值,也可以是一个表达式,如果是表达式则先执行表达式,再返回表达式的结果
- 函数返回类型是void时,直接写return
- return语句执行后,函数就彻底返回,后边的代码不再执行
- return返回的值和函数返回类型不一致,系统会自动将返回的值隐式转换为函数的返回类型
例:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int test() {int a = 0;scanf("%d", &a);if (a == 1)return 3.14;elsereturn -3.14;
}
int main() {int r = test();printf("%d\n", r);return 0;
}
若输入6,则输出为:
若将代码改为如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int test() {int a = 0;scanf("%d", &a);if (a == 1) return 5;
}
int main() {int r = test();printf("%d\n", r);return 0;
}
就会出现警告:
故要保证每种情况下都有返回值
- 如果函数中存在if等分支的语句,则要保证每种情况下都有return返回,否则会出现编译错误
- .函数的返回类型如果不写,编译器会默认函数的返回类型是int
- 函数写了返回类型,但是函数中没有使用return返回值,那么函数的返回值是未知的
设计函数返回值的时候:
1.如果函数执行的结果,需要返回给主调函数,函数就要设计返回值
2.根据需要返回的值,来设计返回的返回值
3.如果函数不需要返回追,那么写void
数组作为函数参数
例:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//实参和形参的名字可以相同
void set_arr(int arr[10],int sz) {int i = 0;for (i = 0;i < sz;i++) {arr[i] = -1;}
}
void print_arr(int arr[10], int sz) {int i = 0;for (i = 0;i < sz;i++) {printf("%d ", arr[i]);}printf("\n");
}
int main() {int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int sz = sizeof(arr) / sizeof(arr[0]);print_arr(arr, sz);//写一个函数,将数组arr的内容全部置为-1set_arr(arr,sz);//写一个函数,打印数组的内容print_arr(arr,sz);return 0;
}
输出为:
形参的数组和实参的数组是同一个数组,数组在传参过程中不会创建一个新的数组,单独开设空间,而是传的是数组起始位置的地址,所以对形参的修改会影响实参,形参中的数组也可以不设置数组的大小
即,可以改为:
void set_arr(int arr[],int sz)
数组传参的注意事项:
- 函数的形式参数要和函数的实参个数匹配
- 函数的实参是数组,形参也是可以写成数组形式的
- 形参如果是一维数组,数组大小可以省略不写
- 形参如果是二维数组,行可以省略,但是列不能省略
- 数组传参,形参是不会创建新的数组的
- 形参操作的数组和实参的数组是同一个数组
函数的嵌套调用
嵌套调用就是函数之间的互相调用
例:
假设我们计算某年某月有多少天
可以设计2个函数:
- is_leap_year():根据年份确定是否是闰年
- get_days_of_month():调用is_leap_year确定是否是闰年后,再根据月计算这个月的天数
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int is_leap_year(int y) {if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0)return 1;else return 0;}
int get_days_of_month(int y, int m) {int days[13] = { 0,31,28,31,30.31,30,31,31,30,31,30,31 };int d = days[m];//判断是否为闰年if (is_leap_year(y) && m== 2)d += 1;return d;
}
int main() {int year = 0;//年int month = 0;//月scanf("%d %d", &year, &month);//计算year年month月的天数int d = get_days_of_month(year,month);printf("%d", d);return 0;
}
函数都是对等的,函数不可以定义到另一个函数里面,但是可以嵌套调用
END…
最后:
我不去想是否能够成功,既然选择了远方,便只顾风雨兼程;
我不去想身后会不会袭来寒风冷雨,既然选择目标是地平线,留给世界的只能是背景。
相关文章:

【C】二分查找与函数1
二分查找 练习: 给定一个整型的有序数组,在数组中找到指定的一个值,如: 1,2,3,4,5,6,7,8,9,10 找出7.如果找到了&#x…...

光纤光学的基本方程
一、麦克斯韦方程与亥姆赫兹方程 1.1 麦克斯韦方程 光纤是一种介质光波导,具有以下特点: ① 无传导电流 ② 无自由电荷 ③ 线性各向同性 推导出来的即为波动方程。为材料在真空中的磁导率,为材料在真空中的介电常数,n为材料折…...
题解:CF584D Dima and Lisa
前置知识 哥德巴赫猜想,任一大于 2 2 2 的偶数都可写成两个素数之和。 思路 我们可以分类讨论一下。 n n n 一开始就是质数。直接输出即可 n n n 是偶数,那么一定可以写成两个质数之和。那么暴力枚举两个质数即可。 如果以上均不符合,计…...
【OD】【E卷】【真题】【100分】内存资源分配(PythonJavaJavaScriptC++C)
题目描述 有一个简易内存池,内存按照大小粒度分类,每个粒度有若干个可用内存资源,用户会进行一系列内存申请,需要按需分配内存池中的资源返回申请结果成功失败列表。 分配规则如下: 分配的内存要大于等于内存的申请…...

Linux基础项目开发day05:量产工具——页面系统
文章目录 一、数据结构抽象page_manager.h 二、页面管理器page_manager.c 三、单元测试1、main.page.c2、page_test.c3、Makefile修改3.1、unittest中的Makefile3.2、page中的Makefile 四、上机实验 前言 前面实现了显示、输入、文字、UI系统,现在我们就来实现页面的…...

保护企业终端安全,天锐DLP帮助企业智能管控终端资产
为有效预防员工非法调包公司的软硬件终端资产,企业管理员必须建立高效的企业终端安全管控机制,确保能够即时洞察并确认公司所有软硬件资产的状态变化。这要求企业要有一套能够全面管理终端资产的管理系统,确保任何未经授权的资产变动都能被迅…...

2024市场营销第3次课
品牌管理 1.认识品牌 品牌定义:一个名称、术语、标志、符号或设计,或者是它们的组合,用来识别某个销售商或某一群销售商的产品或服务,并使其与竞争者的产品或服务区分开来。 品牌构成:成功品牌的构成都是由外及内的…...
Python基础之函数的定义与调用
一、函数的定义 在Python中,函数是一段可重复使用的代码块,用于完成特定的任务。可以使用def关键字来定义函数。 语法如下: def function_name(parameters): """docstring""" # function body return expres…...

GPU在AI绘画中的作用以及GPU的选择
大家好,我是Shelly,一个专注于输出AI工具和科技前沿内容的AI应用教练,体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具,拥抱AI时代的到来。 GPU在AI绘画中的作用: GPU在A…...

【火山引擎】 Chat实践 | 大模型调用实践 | python
目录 一 前期工作 二 Doubao-pro-4k_test实践 一 前期工作 1 已在火山方舟控制台在线推理页面创建了推理接入点 ,接入大语言模型并获取接入点 ID。 2 已参考安装与初始化中的步骤完成 SDK 安装和访问凭证配置...
mysql学习教程,从入门到精通,SQL 注入(42)
1、 SQL 注入 SQL 注入是一种严重的安全漏洞,它允许攻击者通过操纵 SQL 查询来访问、修改或删除数据库中的数据。由于 SQL 注入的潜在危害,我不能提供具体的恶意代码示例。然而,我可以向你展示如何防御 SQL 注入,并解释其工作原理…...

图论day60|108.冗余连接(卡码网) 、109.冗余连接II(卡码网)【并查集 摧毁信心的一题,胆小的走开!】
图论day60|108.冗余连接(卡码网)、109.冗余连接II(卡码网)【并查集 摧毁信心的一题,胆小的走开!】 108.冗余连接(卡码网)109.冗余连接II(卡码网)【并查集 摧毁…...

即使是编程新手,也能利用ChatGPT编写高质量的EA
在外汇交易领域,MetaTrader是一款备受欢迎的交易软件,包括MT5和MT4,提供了众多强大的分析工具和自动化交易功能。对于没有编程经验的新手而言,编写专家顾问(EA)可能显得既复杂又令人望而却步。幸运的是&…...

StarRocks大批量数据导入方案-使用 Routine Load 导入数据
本文详细介绍如何使用Routine Load 导入数据 一、准备工作 1.1 安装基础环境 主要是安装StarRocks和Kafka,本文直接跳过不做详细介绍~ 二、概念及原理 2.1 概念 导入作业(Load job) 导入作业会常驻运行,当导入作业的状态为 R…...

从零开始学PHP之输出语句变量常量
一、 输出方式 在 PHP 中输出方式: echo,print,print_r,var_dump 1、echo和print为php的输出语句 2、var_dump,print_r为php的输出函数 (这里不做介绍)echo 和 print 区别 1、echo - 可以输出…...
二叉树算法之字典树(Trie)详细解读
字典树(Trie,也称前缀树或单词查找树)是一种用于快速查找字符串的数据结构,主要应用于字符串集合的高效存储和查找。字典树特别适合处理具有相同前缀的大量字符串集合,比如单词自动补全、拼写检查等场景。 1. 字典树的…...

butterfly侧边栏音乐模块
方法1.美观但换页后没法播放 1.blog根目录/source文件夹下新建_data文件夹(如果没有_data文件夹) 2.在刚刚的_data文件夹里创建widget.yml文件 bottom:- class_name: user-musicid_name: user-musicname: 音乐icon: fas fa-heartbeatorder:html: <…...

【论文阅读】Detach and unite: A simple meta-transfer for few-shot learning
分离与联合:一种用于小样本学习的简单元迁移方法 引用:Zheng Y, Zhang X, Tian Z, et al. Detach and unite: A simple meta-transfer for few-shot learning[J]. Knowledge-Based Systems, 2023, 277: 110798. 论文地址:下载地址 论文代码&a…...
Java中的动态代理——介绍与使用示例
Java中的动态代理其实就是一种“代理”模式,在运行时帮我们创建一个“代理对象”,通过这个代理对象可以在不改变原本方法的情况下,做一些额外的事情,比如记录日志、检查权限等。这种代理机制非常灵活和实用,特别是在像…...

微信开发者工具:音乐小程序报错
报错信息 GET http://localhost:3000/1.mp3 net::ERR CONNECTION REFUSED (env: Windows,mp,1.06.2303220;lib:3.6.0) 原因:小程序没有直接获取本地文件,为了提高访问速度,而采用放到网络服务器中网络访问的方式获取文件内容 解决办法&#…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...