当前位置: 首页 > news >正文

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语言算法(二分查找、文件读写)

二分查找 前提条件&#xff1a;数据有序&#xff0c;随机访问 #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&#xff08;5&#xff09; —— 我正在的github给大家开发一个用于做实验的项目 —— github.com/qw225967/Bifrost目标&#xff1a;可以让大家熟悉各类Qos能力、带宽估计能力&#xff0c;提供每个环节关键参数调节接口并实现一个json全…...

2023版本QT学习记录 -11- 多线程的使用(QT的方式)

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

iOS苹果和Android安卓测试APP应用程序的差异

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

每日算法打卡:数的三次方根 day 7

文章目录 原题链接题目描述输入格式输出格式数据范围输入样例&#xff1a;输出样例&#xff1a; 题目分析示例代码 原题链接 790. 数的三次方根 题目难度&#xff1a;简单 题目描述 给定一个浮点数 n&#xff0c;求它的三次方根。 输入格式 共一行&#xff0c;包含一个浮…...

人机交互主板定制_基于MT8735安卓核心板的自助查询机方案

人机交互主板是一种商显智能终端主板&#xff0c;广泛应用于广告机、工控一体机、教学一体机、智能自助终端、考勤机、智能零售终端、O2O智能设备、取号机、计算机视觉、医疗健康设备、机器人设备等领域。 人机交互主板采用联发科MTK8735芯片平台&#xff0c;四核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 的数据一致性?

数据一致性问题是如何产生的&#xff1f; 数据一致性问题通常产生于数据在不同的时间点、地点或系统中存在多个副本的情况&#xff0c; 系统只存在一个副本的情况下也完全可能会产生。 设想一下&#xff0c;你在一家连锁咖啡店有一张会员卡这张会员卡可以绑定两个账号&#x…...

Leetcode 2999. Count the Number of Powerful Integers

Leetcode 2999. Count the Number of Powerful Integers 1. 解题思路2. 代码实现 题目链接&#xff1a;10034. Count the Number of Powerful Integers 1. 解题思路 这一题的话其实还是一个典型的求不大于 N N N的特殊数字个数的问题。 这道题本质上进行一下替换还是要求如…...

【Reading Notes】(2)

文章目录 FreestyleHip-hop dance and MusicProgrammerMaster Freestyle 都说人的成长有三个阶段&#xff0c;第一个阶段认为自己独一无二&#xff0c;天之骄子&#xff1b;第二个阶段发现自己原来如此渺小&#xff0c;如此普通&#xff0c;沮丧失望&#xff1b;第三阶段&#…...

【设计模式之美】SOLID 原则之一:怎么才算是单一原则、如何取舍单一原则

文章目录 一. 如何判断类的职责是否足够单一&#xff1f;二. 类的职责是否设计得越单一越好&#xff1f; 开始学习一些经典的设计原则&#xff0c;其中包括&#xff0c;SOLID、KISS、YAGNI、DRY、LOD 等。 本文主要学习单一职责原则的相关内容。 单一职责原则的定义&#xff1a…...

# [NOIP2015 普及组] 扫雷游戏#洛谷

题目背景 NOIP2015 普及组 T2 题目描述 扫雷游戏是一款十分经典的单机小游戏。在 n n n 行 m m m 列的雷区中有一些格子含有地雷&#xff08;称之为地雷格&#xff09;&#xff0c;其他格子不含地雷&#xff08;称之为非地雷格&#xff09;。玩家翻开一个非地雷格时&#…...

Unity中Shader的_Time精度问题

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

听GPT 讲Rust源代码--compiler(15)

File: rust/compiler/rustc_arena/src/lib.rs 在Rust源代码中&#xff0c;rustc_arena/src/lib.rs文件定义了TypedArena&#xff0c;ArenaChunk&#xff0c;DroplessArena和Arena结构体&#xff0c;以及一些与内存分配和容器操作相关的函数。 cold_path<F: FnOnce,drop,new,…...

关键字联合体union的定义和使用

联合体的定义 联合体的定义和结构体相同。 联合体成员共用存储空间&#xff0c;联合体占用的空间最大长度的数据成员的长度。 union State {char sleep;char run;int suspend;double error; }state_u;以上例子&#xff0c;State表示联合体的名字&#xff0c;它相当于声明了一…...

基于GA-PSO遗传粒子群混合优化算法的VRPTW问题求解matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 遗传算法&#xff08;GA&#xff09;基本原理 4.2 粒子群优化&#xff08;PSO&#xff09;基本原理 4.3 算法优化策略 5.完整程序 1.程序功能描述 VRPTW是车辆路径问题&#xff08;VR…...

【leetcode100-033】【链表】排序链表

【题干】 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 【思路】 递归版归并法链表版&#xff5e;没什么特别好说的&#xff08;非递归版归并也是可以哒&#xff0c;但是马上要考试了今天懒得写了&#xff01;打个flag在这里也许哪天想起来…...

[Kubernetes]5. k8s集群StatefulSet详解,以及数据持久化(SC PV PVC)

前面通过deployment结合service来部署无状态的应用,下面来讲解通过satefulSet结合service来部署有状态的应用 一.StatefulSet详解 1.有状态和无状态区别 无状态: 无状态(stateless)、牲畜(cattle)、无名(nameless)、可丢弃(disposable) 有状态: 有状态(stateful)、宠物(pet)…...

数据库系统-甘晴void学习笔记

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

Azure Machine Learning - 人脸识别任务概述与技术实战

Azure AI 人脸服务提供了可检测、识别和分析图像中的人脸的 AI 算法。 人脸识别软件在许多不同情形中都十分重要&#xff0c;例如识别、无接触访问控制和实现隐私的人脸模糊。你可以通过客户端库 SDK&#xff0c;或者直接调用 REST API 使用人脸服务。 目录 一、人脸识别服务场…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...