C语言算法(二分查找、文件读写)
二分查找
前提条件:数据有序,随机访问
#include <stdio.h>int binary_search(int arr[],int n,int key);int main(void) {}int search(int arr[],int left,int right,int key) {//边界条件if(left > right) return -1;//int mid = (left + right) / 2;//防止溢出int mid = left + ((right - left) >> 1);if(key < arr[mid]) {return search(arr,left,mid - 1,key);}else fi(key > arr[mid]) {return search(arr,mid + 1,right,key);}else {return mid;}
}
//递归
int binary_search(int arr[],int n,int key) {return search(arr,0,n-1,key);
}
//循环
int binary_search(int arr[]],int n,int key) {if(n == 0) return -1;int left = 0,right = n-1;while(left <= right) {int mid = left + ((right - left) >> 1);if(key < arr[mid]) {right = mid - 1;}else if(key > arr[mid]) {left = mid + 1 ;}else {return mid;}}return -1;
}
二分查找的局限性
(1)二分查找依赖顺序表的结构,需要你有序性
(2)二分查找针对的是有序数据
(3)数据量太小没必要进行二分查找;
a)二分查可以减少比较操作;
b)比较操作很耗时
(4)数据量太大也不适合二分查找
(5)动态数据也不适合二分查找
(6)动态数据查找:平衡二叉树,哈希表二分查找变种
(1)查找第一个与key值相同的元素
(2)查找最后一个与key值相同的元素
(3)查找最后一个小于等于key值的元素
(4)查找第一个大于等于key值的元素
//查找第一个与key值相同的元素
int binary_search1(int arr[],int n,int key) {int left = 0,right = n - 1;while(left <= right) {int mid = left + ((right-left) >> 1);if(key < arr[mid]) {right = mid - 1;}else if(key > arr[mid]) {left = mid + 1;}else {if(mid == left || arr[mid - 1] < key) {return mid;}right = mid - 1;}}return -1;
}
//查找最后一个与key值先沟通呢房的人元素
//查找最后一个小于等于key值的元素
int binary_search2(int arr[],int n,int key) {int left = 0,right = n - 1;while(left <= right) {int mid = left + ((right-left) >> 1);if(arr[mid] > key) {right = mid - 1;}else {if(mid == right || arr[mid + 1] > key) {return mid;}left = mid +1;}}return -1;
}
文件
流:表示任意输入的源或输出的目的地
文件缓冲
缓冲区的分类:
满缓冲区:当缓冲区空的时候才会向缓冲区中写入数据,当缓冲区满的时候才会从缓冲区中读取数据
行缓冲区:每次从输入流中读取一行数据,每次也只会从缓冲区中被输出流读取一行数据
无缓冲区:不会进行缓冲,数据直接写到我们的目标文件内之中
刷新缓冲区
ffluh
:刷新输出流中的数据到实际中的文件中去
标准流
在c语言中流对应的数据类型是—>FILE结构体
使用FILE*表示一个流
其中回从出流的起始位置,目前流读取到的位置
这三个标准流可以直接使用,使用完毕之后也不需要关闭
stdin
:标准输入流,一般将其和键盘关联起来
stdout
:标准输出流,一般将其和显示器关联起来
stderr
:标准错误流,一般将其哦和显示器关联起来
文本文件和二进制文件
打开之后可以看得懂的就是文本文件,存储的是字符数据
打开之后看不懂的就是二进制文件,存储的是二进制形式数据
文本文件有两个特殊的性质:
(1)文本文件有行的概念,二进制文件没有行的概念【Linux中换行\n
,windows中换行\r
/\n
】
(2)文本文件可能包含一个特殊的文件末尾:EOF
【windows中表示文件末尾\x1a
(使用快捷键ctrl + z
可以向输入流中输入一个结尾字符)】
文本文件存储数据:优点:方便人类阅读和编辑;缺点:占用空间大
二进制文件存储数据:缺点:人类看不懂,不方便编辑;优点:占用空间小
打开文件和关闭文件
fopen
打开文件
filename
:文件路径
mode
:打开文件的方式
文件路径分为绝对路径(从根目录,盘符开始,一致到文件所在的位置)和相对路径(从当前工作目录开始,一致到文件所在的位置)
打开方式:
r
(rt
)—>read
只读,要求文件事先存在;
w
(wt
)—>write
只写模式,不要求文件存在,如果文件存在,写之前会清空原文件内容;
a
(at
)—>append
追加不要求文件存在,如果文件存在,不会清空源文件的内容
r+
(rb+
)—>可读可写,要求文件存在,如果写数据会清空数据
w+
(wb+
)—>可读可写,不要求文件存在
a+
(ab+
)—>可读可写,不要求文件存在,不会清空原有数据
以上方法用于读写文本文件,读写二进制文件为rb
,wb
,ab
,rb+
,wb+
,ab+
fclose
:关闭文件
如果成功关闭返回0;否则返回EOF
文件的读写
文本文件的读写
fgetc
:一次读一个字符, 可以从任意输入流中读数据
fputc
:一次写一个字符,可以将数据写到任意的输出流中
fgets
:一次读取一行,读到换行符为止,可以从任意的流中读取字符串
fputs
:把一个字符串写入到一个输出流中
fscanf
:用格式化的方式将数据从标准输入流stdin中读入
fprintf
:用格式化的方式将数据写到stdout标准输出流中
从stream流中读取最多count个数据到str中,遇到换行符就停止读入,会将存储数据的st指针返回回来,如果失败会返回空指针
将str字符串写出到输出流stream中
#define _CRT_SECURE_NO_WARINGS
#include <stdio.h>
#include <stdlib.h>
#define N 100
int main(int argc,char *argv[]) {if(argc != 3) {fprintf(stderr,"Invalid arguments.\n");//向stderr错误输出流中输入错误信息exit(1);}FILE* src = fopen(argv[1],"r");//打开文件if(src == NULL) {printf("Error:open %s failed.\n",argv[1]);exit(1);}FILE* dest = fopen(argv[2],"w");if(dest == NULL) {printf("Error:open %s failed.\n",argv[2]);fclose(src);exit(1);}//读写数据//每次读取字符//int ch;//while((ch = fgetc(src) != EOF)) {// fputc(ch,dest);//将字符写入dest流中//}//读写一行数据char buf[N];while(fgets(buf,N,src) != NULL) {fputs(buf,dest);}//关闭流fclose(src);fclose(dest);return 0;
}
#include <stdio.h>typedef struct student_s{int number;char name[25];int chinese;int math;int english;
}Student;int main(void) {//序列化:把内存中的对象持久化(格式:文本格式)xml,json存在磁盘中Student s = {1,"xixi",100,100,100};FILE* fp = fopen("student.dat","w");if(fp == NULL) {fprintf(stderr,"Error:open student.dat failed.\n");exit(1);}fprintf(fp,"%d %s %d %d %d\n",s.number,s.name,s.chinese,s.math,s.english);fclose(fp);//反序列化:把持久化的数据加载到内存,斌生产对应的对象FILE* fp = fopen("student.dat","r");if(fp == NULL) {fprintf(stderr,"Error:open student.dat failed.\n");exit(1);}Student s;fscanf(fp,"%d%s%d%d%D",&s.number,&s.name,&s.chinese,&s.math,&s.english);fclose(fp);return 0;
}
二进制文件的读写
buffer
:把文件中的数据读到buffer中
size
:每个元素的大小
count
:表示又多少个元素
stream
:需要从那个数据流中读取数据
返回值是成功读入数据的个数
buffer
:内存中的对象,我们要将内存buffer中的数据写入到文件中
size
:每个对象的大小
count
:要写的对象的数量
stream
:要写到的目标输出流
返回值是成功写出对象的个数, 一般情况下返回值和count值是相同的
#define _CRT_SECURE_NO_WARINGS
#include <stdio.h>
#include <stdlib.h>
#define N 4096
int main(int argc,char *argv[]) {if(argc != 3) {fprintf(stderr,"Invalid arguments.\n");//向stderr错误输出流中输入错误信息exit(1);}FILE* src = fopen(argv[1],"rb");//打开文件if(src == NULL) {printf("Error:open %s failed.\n",argv[1]);exit(1);}FILE* dest = fopen(argv[2],"wb");if(dest == NULL) {printf("Error:open %s failed.\n",argv[2]);fclose(src);exit(1);}//读写数据char buf[4096]; int n;//读入数据的个数while((n = fread(buf, 1, N, src)) != 0) {//从src中的数据读入到buf中fwrite(buf, 1, n, dest);//将src中的数据写入到dest中去}//关闭流fclose(src);fclose(dest);return 0;
}
//二进制形式序列化
#include <stdio.h>typedef struct student_s{int number;char name[25];int chinese;int math;int english;
}Student;int main(void) {//序列化:把内存中的对象持久化(格式:文本格式)xml,json存在磁盘中Student s = {1,"xixi",100,100,100};FILE* fp = fopen("student.dat","wb");if(fp == NULL) {fprintf(stderr,"Error:open student.dat failed.\n");exit(1);}fwrite(&s,sizeof(s),1,fp);fclose(fp);//反序列化:把持久化的数据加载到内存,斌生产对应的对象FILE* fp = fopen("student.dat","rb");if(fp == NULL) {fprintf(stderr,"Error:open student.dat failed.\n");exit(1);}Student s;fread(&s,sizeof(s),1,fp);fclose(fp);return 0;
}
文件定位
查找文件中对应的位置,可以改变读写指针位置
int fseek(FILE* stream,long int offset,int whence)
offset
:以字节为单位计算偏移量
whence
:参照点【whence
取值:(1)SEEK_SET
:文件的起始位置;(2)SEEK_CUR
:文件的当前位置;(3)SEEK_END
:文件的末尾位置】
移动到文件的开始:fseek(stream,0L,SEEK_SET);
<==>rewind(stream);
往回移动10个字节:fseek(stream,-10L,SEEK_CUR);
移动到文件的末尾:fseek(stream,0L,SEEK_END);
打印当前文件的位置(相对于SEEK_SET而言)
long ftell(FILE* stream)
可以将处于任意读写位置的指针指向开始位置
void rewind(FILE* stream)
#include <stdio.h>typedef struct student_s{int number;char name[25];int chinese;int math;int english;
}Student;int main(void) {//序列化:把内存中的对象持久化(格式:文本格式)xml,json存在磁盘中Student s = {1,"xixi",100,100,100};FILE* fp = fopen("student.dat","wb+");if(fp == NULL) {fprintf(stderr,"Error:open student.dat failed.\n");exit(1);}fwrite(&s,sizeof(s),1,fp);//反序列化:把持久化的数据加载到内存,斌生产对应的对象Student s1;rewind(fp);//重定向文件位置 <==>fseek(fp,0L,SEEK_SET)fread(&s1,sizeof(s1),1,fp);fclose(fp);return 0;
}
错误处理
如果数值计算、文件读写发生错误,系统调用(sysytem call)会把errno设置为对应的值
#include <stdio.h>
#include <errno.h>
#inlcude <math.h>int main(void) {printf("%d\n",errno);//0printf("%s\n",strerror(errno));//No errorperror("Error");// Error:No errorlog(0,0);printf("%d\n",errno);//34printf("%s\n",strerror(errno));// Result too largeperror("Error");//Error: Result too large//虽然errnno可以告诉我们发生错误的系统的调用返回的值,但是我们很难去确定齐放回的数值表示什么含义我们可以使用strerror(errno)打印其字符串表达return 0;
}
相关文章:

C语言算法(二分查找、文件读写)
二分查找 前提条件:数据有序,随机访问 #include <stdio.h>int binary_search(int arr[],int n,int key);int main(void) {}int search(int arr[],int left,int right,int key) {//边界条件if(left > right) return -1;//int mid (left righ…...

流媒体学习之路(WebRTC)——Pacer与GCC(5)
流媒体学习之路(WebRTC)——Pacer与GCC(5) —— 我正在的github给大家开发一个用于做实验的项目 —— github.com/qw225967/Bifrost目标:可以让大家熟悉各类Qos能力、带宽估计能力,提供每个环节关键参数调节接口并实现一个json全…...

2023版本QT学习记录 -11- 多线程的使用(QT的方式)
———————多线程的使用(QT方式)——————— 🎄效果演示 两个线程都输出一些调试信息 🎄创建多线程的流程 🎄头文件 #include "qthread.h"🎄利用多态重写任务函数 class rlthread1 : public QThread {Q_OBJE…...

iOS苹果和Android安卓测试APP应用程序的差异
Hello大家好呀,我是咕噜铁蛋!我们经常需要关注移动应用程序的测试和优化,以提供更好的用户体验。在移动应用开发领域,iOS和Android是两个主要的操作系统平台。本文铁蛋讲给各位小伙伴们详细介绍在App测试中iOS和Android的差异&…...

每日算法打卡:数的三次方根 day 7
文章目录 原题链接题目描述输入格式输出格式数据范围输入样例:输出样例: 题目分析示例代码 原题链接 790. 数的三次方根 题目难度:简单 题目描述 给定一个浮点数 n,求它的三次方根。 输入格式 共一行,包含一个浮…...

人机交互主板定制_基于MT8735安卓核心板的自助查询机方案
人机交互主板是一种商显智能终端主板,广泛应用于广告机、工控一体机、教学一体机、智能自助终端、考勤机、智能零售终端、O2O智能设备、取号机、计算机视觉、医疗健康设备、机器人设备等领域。 人机交互主板采用联发科MTK8735芯片平台,四核Cortex-A53架构…...
全志F1C100s Linux 系统编译出错:不能连接 github
环境 Ubuntu 20.04 LTS 64 位虚拟机 开发板:Lichee Pi Nano 源代码:GitHub - florpor/licheepi-nano 问题描述 该源码库使用了 git 子模块的概念,一个库中包含了 u-boot、Linux等代码库。不需要分别编译,一个 make 全搞定 编译时提示错误: >>> linux-hea…...
如何保障 MySQL 和 Redis 的数据一致性?
数据一致性问题是如何产生的? 数据一致性问题通常产生于数据在不同的时间点、地点或系统中存在多个副本的情况, 系统只存在一个副本的情况下也完全可能会产生。 设想一下,你在一家连锁咖啡店有一张会员卡这张会员卡可以绑定两个账号&#x…...
Leetcode 2999. Count the Number of Powerful Integers
Leetcode 2999. Count the Number of Powerful Integers 1. 解题思路2. 代码实现 题目链接:10034. Count the Number of Powerful Integers 1. 解题思路 这一题的话其实还是一个典型的求不大于 N N N的特殊数字个数的问题。 这道题本质上进行一下替换还是要求如…...

【Reading Notes】(2)
文章目录 FreestyleHip-hop dance and MusicProgrammerMaster Freestyle 都说人的成长有三个阶段,第一个阶段认为自己独一无二,天之骄子;第二个阶段发现自己原来如此渺小,如此普通,沮丧失望;第三阶段&#…...
【设计模式之美】SOLID 原则之一:怎么才算是单一原则、如何取舍单一原则
文章目录 一. 如何判断类的职责是否足够单一?二. 类的职责是否设计得越单一越好? 开始学习一些经典的设计原则,其中包括,SOLID、KISS、YAGNI、DRY、LOD 等。 本文主要学习单一职责原则的相关内容。 单一职责原则的定义:…...
# [NOIP2015 普及组] 扫雷游戏#洛谷
题目背景 NOIP2015 普及组 T2 题目描述 扫雷游戏是一款十分经典的单机小游戏。在 n n n 行 m m m 列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时&#…...

Unity中Shader的_Time精度问题
文章目录 前言一、U方向上优化二、V方向上优化在这里插入图片描述 三、最终代码1、效果2、Shader 前言 在Unity的Shader中,使用了_Time来达到UV的流动效果,普遍会出现一个问题。我们的UV值会随着时间一直增加(uv值增加了,但是因为…...

听GPT 讲Rust源代码--compiler(15)
File: rust/compiler/rustc_arena/src/lib.rs 在Rust源代码中,rustc_arena/src/lib.rs文件定义了TypedArena,ArenaChunk,DroplessArena和Arena结构体,以及一些与内存分配和容器操作相关的函数。 cold_path<F: FnOnce,drop,new,…...
关键字联合体union的定义和使用
联合体的定义 联合体的定义和结构体相同。 联合体成员共用存储空间,联合体占用的空间最大长度的数据成员的长度。 union State {char sleep;char run;int suspend;double error; }state_u;以上例子,State表示联合体的名字,它相当于声明了一…...

基于GA-PSO遗传粒子群混合优化算法的VRPTW问题求解matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 遗传算法(GA)基本原理 4.2 粒子群优化(PSO)基本原理 4.3 算法优化策略 5.完整程序 1.程序功能描述 VRPTW是车辆路径问题(VR…...
【leetcode100-033】【链表】排序链表
【题干】 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 【思路】 递归版归并法链表版~没什么特别好说的(非递归版归并也是可以哒,但是马上要考试了今天懒得写了!打个flag在这里也许哪天想起来…...

[Kubernetes]5. k8s集群StatefulSet详解,以及数据持久化(SC PV PVC)
前面通过deployment结合service来部署无状态的应用,下面来讲解通过satefulSet结合service来部署有状态的应用 一.StatefulSet详解 1.有状态和无状态区别 无状态: 无状态(stateless)、牲畜(cattle)、无名(nameless)、可丢弃(disposable) 有状态: 有状态(stateful)、宠物(pet)…...

数据库系统-甘晴void学习笔记
数据库系统笔记 计科210X 甘晴void 202108010XXX 教材:《数据库系统概论》第6版 (图片来源于网络,侵删) 文章目录 数据库系统<br>笔记第一篇 基础篇1 绪论1.1数据库系统概述1.2数据模型1.3数据库系统的结构(三级模式结构…...

Azure Machine Learning - 人脸识别任务概述与技术实战
Azure AI 人脸服务提供了可检测、识别和分析图像中的人脸的 AI 算法。 人脸识别软件在许多不同情形中都十分重要,例如识别、无接触访问控制和实现隐私的人脸模糊。你可以通过客户端库 SDK,或者直接调用 REST API 使用人脸服务。 目录 一、人脸识别服务场…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

k8s业务程序联调工具-KtConnect
概述 原理 工具作用是建立了一个从本地到集群的单向VPN,根据VPN原理,打通两个内网必然需要借助一个公共中继节点,ktconnect工具巧妙的利用k8s原生的portforward能力,简化了建立连接的过程,apiserver间接起到了中继节…...