【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) 原因:小程序没有直接获取本地文件,为了提高访问速度,而采用放到网络服务器中网络访问的方式获取文件内容 解决办法&#…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
在 Spring Boot 中使用 JSP
jsp? 好多年没用了。重新整一下 还费了点时间,记录一下。 项目结构: pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...
