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;
}

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

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

相关文章

SAP 物料读取基本数据文本与检验文本READ_TEXT

1. 读取基本数据文本 使用函数 READ_TEXT 2. 读取检验文本

聚道云软件连接器助力某软件科技有限公司实现人力资源信息自动化

客户介绍&#xff1a; 某软件科技有限公司是一家集软件研发、销售、服务于一体的综合性软件企业。公司业务遍布全球多个国家和地区&#xff0c;拥有众多员工。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 客户痛点&#xff1a; 部门及人员信息分散…

PyTorch|保存与加载自己的模型

训练好一个模型之后&#xff0c;我们往往要对其进行保存&#xff0c;除非下次用时想再次训练一遍。 下面以一个简单的回归任务来详细讲解模型的保存和加载。 来看这样一组数据&#xff1a; xtorch.linspace(-1,1,50)xx.view(50,1)yx.pow(2)0.3*torch.rand(50).view(50,1) 画…

【HarmonyOS】深入了解 ArkUI 的动画交互以提高用户体验

从今天开始&#xff0c;博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”&#xff0c;对于刚接触这项技术的小伙伴在学习鸿蒙开发之前&#xff0c;有必要先了解一下鸿蒙&#xff0c;从你的角度来讲&#xff0c;你认为什么是鸿蒙呢&#xff1f;它出现的意义又是…

解压方法之一 zip

文章目录 解压方法之一 zip语法参数参考实例仅保存文件名更多信息 解压方法之一 zip … _linux-beginner-zip: Linux zip命令的功能是用于压缩文件&#xff0c;解压命令为unzip。 通过zip命令可以将很多文件打包成.zip格式的压缩包&#xff0c;里面会包含文件的名称、路径、…

性能分析与调优: Linux 实现 CPU剖析与火焰图

目录 一、实验 1.环境 2.CPU 剖析 3.CPU火焰图 一、实验 1.环境 &#xff08;1&#xff09;主机 表1-1 主机 主机架构组件IP备注prometheus 监测 系统 prometheus、node_exporter 192.168.204.18grafana监测GUIgrafana192.168.204.19agent 监测 主机 node_exporter192…

【AI视野·今日CV 计算机视觉论文速览 第284期】Fri, 5 Jan 2024

AI视野今日CS.CV 计算机视觉论文速览 Fri, 5 Jan 2024 Totally 62 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computer Vision Papers Learning to Prompt with Text Only Supervision for Vision-Language Models Authors Muhammad Uzair Khattak, Muhammad F…

jenkins忘记admin密码

jenkins忘记admin密码&#xff0c;重置密码&#xff1a; 1.找打jenkins目录下面的config.xml [rootVM-0-15-centos .jenkins]# find ./* -name config.xml ./config.xml [rootVM-0-15-centos .jenkins]# pwd /root/.jenkins删除下面的这部分内容&#xff1a; [rootVM-0-15-c…

网站被篡改怎么办,如何进行有效的防护

随着互联网的飞速发展&#xff0c;信息传播的速度和范围得到了极大的提升。然而&#xff0c;这也为网页篡改行为提供了可乘之机。网页被篡改不仅会损害网站的形象&#xff0c;还可能对用户造成误导&#xff0c;甚至导致安全漏洞。因此&#xff0c;网页防篡改技术成为了网络安全…

如何翻译整本书并制作为双语对照?

随着人工智能技术的快速发展&#xff0c;机器翻译已经不再是遥不可及的梦想。众多大互联网公司如谷歌、百度等都相继推出了免费的翻译工具&#xff0c;使得跨语言沟通变得触手可及。今年&#xff0c;数百家公司更是开发出大型AI语言模型&#xff0c;其中以ChatGPT 4引人瞩目&am…

外延炉及其相关的小知识

外延炉是一种用于生产半导体材料的设备&#xff0c;其工作原理是在高温高压环境下将半导体材料沉积在衬底上。 硅外延生长&#xff0c;是在具有一定晶向的硅单晶衬底上&#xff0c;生长一层具有和衬底相同晶向的电阻率且厚度不同的晶格结构完整性好的晶体。 外延生长的特点&am…

Redis分布式锁(二)基于Redis的分布式锁

一、redis锁 1、思路 利用set nx ex获取锁&#xff0c;并设置过期时间&#xff0c;保存线程标识释放锁时先判断线程标识是否与自己一致&#xff0c;一致则删除 2、特性 利用set nx满足互斥性利用set ex保证故障时锁依然能释放&#xff0c;避免死锁&#xff0c;提高安全性利…

如何进行深入的竞品分析:掌握这些技巧让你更加了解市场

随着互联网行业的快速发展&#xff0c;产品经理需要对竞品进行深入分析&#xff0c;才能更好地把握市场需求和趋势&#xff0c;为公司带来更好的商业价值。那么&#xff0c;如何做好竞品分析呢&#xff1f;以下是我对于这个问题的思考和建议。 一、确定分析的目的和范围 在开…

vs 修改系统环境变量putenv、_putenv

事情起因是某一天需要在vs2010的工程中去动态配置adb环境变量&#xff0c;win10环境 一开始&#xff0c;使用了putenv&#xff0c;很快进入代码调试&#xff0c;死活无法达成目的&#xff08;奇怪的是另外一个工程就能修改成功&#xff09; 一番面向运气编程&#xff0c;最后…

3D Gaussian Splatting 应用场景及最新进展【附10篇前沿论文和代码】

CV玩家们&#xff0c;知道3D高斯吗&#xff1f;对&#xff0c;就是计算机视觉最近的新宠&#xff0c;在几个月内席卷三维视觉和SLAM领域的3D高斯。不太了解也没关系&#xff0c;我今天就来和同学们一起聊聊这个话题。 3D Gaussian Splatting&#xff08;3DGS&#xff09;是用于…

ShardingSphere-JDBC学习笔记

引言 开源产品的小故事 Sharding-JDBC是2015年开源的&#xff0c;早期的定位就是一个分布式数据库的中间件&#xff0c;而在它之前有一个MyCat的产品。MyCat也是从阿里开源出来的&#xff0c;作为分库分表的代名词火了很长一段时间&#xff0c;而MyCat早年的目标就是想进入ap…

一致性 Hash

一致性 Hash 一致性哈希算法(Consistent Hashing Algorithm)是一种分布式算法&#xff0c;常用于负载均衡。Memcached client 也选择这种算法&#xff0c;解决将 key-value 均匀分配到众多 Memcached server 上的问题。它可以取代传统的取模操作&#xff0c;解决了取模操作无法…

关于网盘下载速度提升的一些技巧!!

这里写自定义目录标题 前言&#xff1a;步骤&#xff1a;一、下载IDM二、安装油猴三、添加到Google拓展程序上PS&#xff1a;四、添加脚本五、IDM配置六、打开网页版网盘 前言&#xff1a; 18G的网盘资源下载时间仅仅3-5分钟 步骤&#xff1a; 一、下载IDM 这里我以IDM举例…

kettle分页抽取数据

背景 kettle抽取数据大家还是比较熟悉的&#xff0c;kettle在抽取数据的时候会开启很多通道&#xff0c;同时抽取&#xff0c;但是我现在遇到一个场景&#xff1a; 从一个mysql数据库里获取“已办”状态的数据id&#xff0c;然后拿这些id去一个oracle数据库里查询&#xff0c…

【MATLAB】ICEEMDAN_LSTM神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 ICEEMDAN-LSTM神经网络时序预测算法是一种结合了改进的完全扩展经验模态分解&#xff08;ICEEMDAN&#xff09;和长短期记忆神经网络&#xff08;LSTM&#xff09;的时间序列预测方法。 …