C++从头再来:知识点速通

news2025/8/3 23:30:23

1. 关于scanf

1.1 读入数字

scanf 的返回值表示成功输入的变量个数,当输入结束时,scanf将无法再次读取数据,返回0

# include <stdio.h>
# include <math.h>
# include <time.h>

# define M 1000000;
// compute the max, min, average value of a given list
int main(){
	int x, min = M, max = -M;
	int n = 0;
	int sum = 0;
	printf("%d", min); 
	// scanf 读取结束后,则完成最后一次while循环。
	// windows的退出方法:回车-ctrl+z-回车 
	while(scanf("%d", &x) == 1){
		sum += x;
		n += 1;
		if (min > x){
			min = x;
		}
		if (max < x){
			max = x;
		}
	}
	printf("the max number in the list : %d\n", max);
	printf("the min number in the list : %d\n", min);
	printf("the average number in the list : %f\n", sum*1.0/n);
	return 0;
} 

1.2 读入字符串

scanf(“%s”, s)

  • 不需要&
  • 读入的结果:一个不含空格、TAB、回车符的字符串,存入一个字符数组s

1.3 输出数字的小技巧:printf函数中,使用变量指定小数位数

printf("%.*f", str_len, number);// str_len表示小数位数,number为浮点数变量

printf函数中,输入确定位数的浮点数

printf("%5d", n);  // (不超过五位时,)按照五位来打印,不足五位则补空格
printf("%05d", n); // (不超过五位时,)按照五位来打印,不足五位则补零
printf("%11.3f", f);// 打印数字占11位,保留小数点后3位,不足则补空格
printf("%011.3f", f);// 打印数字占11位,保留小数点后3位,不足则补零

2. 琐碎规范

2.1 一个在分母位置上平方溢出的解决方法

待解决问题:输入多组n, m,求1/n2+1/(n+1)2+ … +1/m2的结果。当输入n,m为0时,程序终止
输入范例1: 2 4
输入范例2: 65536 655360

范例2中,在分母部分,若采用1/(n*n),存放分母的int将会溢出;转而采取1/n/n的方法则可以使用浮点数避开溢出的可能

# include <stdio.h>

int main(){
	int n, m, kase = 0;
	double sum = 0.0;

	while(scanf("%d %d", &n, &m) ){
		// time to end
		if (n==0 && m==0) break;
		// exchange the value if n is larger 
		if (n>m){
			int t = m;
			m = n;
			n = t;
		} 

		while(n <= m){
			// sum += 1.0/(n*n);
			sum += 1.0/n/n;  // 防止溢出
			n += 1;
		}
		
		kase += 1;
		printf("Case %d: %.5f\n", kase, sum);
		
	}
} 

2.2 floor() 关于浮点数的精度问题和四舍五入问题

在写函数的过程中,由于浮点数的计算精度问题,类似将1.0表示为1.00001或0.9999998,单纯的数值运算上,这种误差的问题不大。但涉及到取整数时,如使用 floor() 函数,就可能会将floor(1)的结果判为0。

常见的一个解决方法是写为 floor(a+0.5) 的格式。
初看是将分段函数的跃迁点从整数点移动到刻度为0.5的位置,有了类似四舍五入的功能,如[0.5, 1.5) 范围的浮点数将被floor() 判为1。
实际上,这是一个修正方法,并没有解决上述提出的浮点数在末位上的微小误差,而是将该误差由影响较大的1.0前后转移到了无甚影响的1.5附近,毕竟浮点数误差再大也不能由0.5大,对吧?

2.3 慎用全局变量

在函数内部定义的变量称为局部变量,反之为全局变量

全局变量定义、使用方便,但其并不会虽函数的结束而释放或重置。
这意味着,若有两处依次调用同一全局变量并修改其值,即便是相同的语句,其结果也可能不同

# include <stdio.h>

int t = 0;
int g(){ return ++t; }

int main(){
	int a, b;
	a = g();
	b = g();
	printf("%d %d", a, b);
	return 0;
}

输出结果为
1 2

3 使用文件完成输入输出

3.1 使用文件输入输出——重定向(freopen)

# define LOCAL
# include <stdio.h>
# include <math.h>
# include <time.h>

# define M 1000000
// compute the max, min, average value of a given list
int main(){
	# ifdef LOCAL  // 若定义了LOCAL变量
	freopen("data.in", "r", stdin);
	freopen("data.out", "w", stdout);
	# endif  //编译结束
	int x, min = M, max = -M;
	int n = 0;
	int sum = 0; 
	// scanf 读取结束后,则完成最后一次while循环。
	// windows的退出方法:回车-ctrl+z-回车 
	while(scanf("%d", &x) == 1){
		sum += x;
		n += 1;
		if (min > x){
			min = x;
		}
		if (max < x){
			max = x;
		}
	}
	printf("the max number in the list : %d\n", max);
	printf("the min number in the list : %d\n", min);
	printf("the average number in the list : %f\n", sum*1.0/n);
	return 0;
} 

3.2 使用文件输入输出——fopen

# include <stdio.h>

# define M 1000000
// compute the max, min, average value of a given list
int main(){
	FILE *fin, *fout;
	// 声明变量 
 	fin = fopen("data.in", "rb");
 	fout= fopen("data.out", "wb");
	int x, min = M, max = -M;
	int n = 0;
	int sum = 0; 
	// fcanf三个参数:从哪读, 什么类型,赋给哪个参数 
	while(fscanf(fin, "%d", &x) == 1){
		sum += x;
		n += 1;
		if (min > x){
			min = x;
		}
		if (max < x){
			max = x;
		}
	}
	// 同样说明输出的位置 
	fprintf(fout, "the max number in the list : %d\n", max);
	fprintf(fout, "the min number in the list : %d\n", min);
	fprintf(fout, "the average number in the list : %f\n", sum*1.0/n);
	// 关闭文件 
	fclose(fin);
	fclose(fout);
	return 0;
} 

在fopen条件下,灵活性较大,可以反复打开并读写文件
当我们想要再次修改为标准输入输出,如下修改fin,fout,fclose即可

# include <stdio.h>
# define M 1000000
// compute the max, min, average value of a given list
int main(){
	FILE *fin, *fout;
	// 声明变量,直接定位到标准输入输出 
// 	fin = fopen("data.in", "rb");
// 	fout= fopen("data.out", "wb");
	fin = stdin;
	fout = stdout; 
	int x, min = M, max = -M;
	int n = 0;
	int sum = 0; 
	// fcanf三个参数:从哪读, 什么类型,赋给哪个参数 
	while(fscanf(fin, "%d", &x) == 1){
		sum += x;
		n += 1;
		if (min > x){
			min = x;
		}
		if (max < x){
			max = x;
		}
	}
	// 同样说明输出的位置 
	fprintf(fout, "the max number in the list : %d\n", max);
	fprintf(fout, "the min number in the list : %d\n", min);
	fprintf(fout, "the average number in the list : %f\n", sum*1.0/n);
	// 无需关闭文件 
//	fclose(fin);
//	fclose(fout);
	return 0;
} 

4. 数组和字符串

4.1 关于较大数组的定义位置

一般只有当定义在main函数外面时,数组才能开得很大

4.2 复制数组中部分元素到另一个数组memcpy && 数组归零memset

# include <stdio.h>
# include <string.h>
int main(){
	double a[10];
	double b[10];
	// 将数组 a 归零 
	memset(a, 0, sizeof(a));
	for (int i =0; i<10; ++i){
		a[i] = i;
	}
	
	for (int i =0; i<10; ++i){
		b[i] = i + 10;
	}
//	// 复制所有 a 中的元素到 b
//	memcpy(b, a, sizeof(a));
	// 复制 3个 a中的元素到 b 
	memcpy(b, a, sizeof(double)*3);
	for (int i=0; i<10; ++i){
		printf("%f ", b[i]);
	}
	return 0;
}

关于memset,其对数组做初始化的取值,仅限于0和-1。
这是由于,memset是在内存上逐字节进行的赋值,4字节的int经过memset赋值为1后,取到的二进制为00000001 00000001 00000001 00000001,转化为十进制并非为1,而这个值在long long 等其他类型的数据上就又有不同了。能够初始化为0和-1纯属巧合
在这里插入图片描述

4.3 strlen, sprintf, strchr, strcpy, strcmp, strcat

  • 字符串(字符数组)s标记的长度可能有很长,其中有些实际存有数据,而另一些位置的内容是不确定的,而函数strlen()可以获取字符串s的实际长度。
  • 类似于printf在屏幕上打印、fprintf在文件上打印,sprintf可以将内容输出到字符串
  • strchr(s, tmp[i])可以在一个字符串s中查找单个字符tmp[i]。若未找到,则返回值为NULL;若找到该字符,则返回该字符及之后的字符串
  • char *strcpy(char *dest, const char *src):将src所指向的字符串复制到dest
  • int strcmp(const char *str1, const char *str2):将str1所指向的字符串与str2所指向的字符串进行比较——大于0则str1大于str2(不一定是1);小于0则小于;等于0则等于
  • char *strcat(char *dest, const char *src):将src所指向的字符串追加到dest所指向的字符串的末尾,返回值为一个指向最终目标字符串dest的指针

4.4 getchar()逐个读入字符

getchar()可以从标准输入读取到一个字符时,将返回一个int类型。
这是因为,当文件结束时,将返回一个特殊标记 EOF ,因为EOF并非一个char,如果返回一个char,将无法吧特殊的EOF和普通字符区分开。

其实,getchar()等价于将 fgetc(fin) 中的fin替换为stdin

# include <stdio.h>
// replace the ' " ' with ' `` ' and ' !! ' in turn.
int main(){
	int c, q = 1;// getchar的返回值为int类型,故用int c记录
	while ((c = getchar()) != EOF ){
		if (c == '"'){
			// 因为双引号的出现,必然是前后相邻两个成对出现,这与括号的使用过程中可层层嵌套的用法不同。
			// 所以可以通过改变布尔值来交替输出两种符号
			printf("%s", q ? "``" : "!!");
			q = !q;
		}
		else printf("%c", c);
	}
	return 0;
}

在这里插入图片描述

4.5 isalpha、 isdigit、isprint

isalpha() : 判断字符是否为字母
isdigit() :判断字符是否为数字
isprint():检查所传的字符是否是可打印的,可打印的比如’k’、空格等,返回true;不可打印的比如\t,返回false
toupper()
tolower()

上述函数都在ctype.h中声明

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

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

相关文章

99.【Git】

Git(一)、什么是版本控制1.什么是版本控制2、常见的版本控制工具(二)、版本控制分类1、本地版本控制2、集中版本控制 SVN3、分布式版本控制 Git(三)、Git与SVN的主要区别1、Git历史(四)、Git下载与环境配置1.git下载2、启动Git(五)、常用的Linux命令1.Linux常用命令(六)、Git必…

hadoop兼容性验证

前言 Hadoop是一个由Apache基金会所开发的分布式系统基础架构&#xff0c;主要解决海量数据的存储和海量数据的分析计算问题&#xff0c;广义上来说&#xff0c;Hadoop通常是指一个更广泛的概念–hadoop生态圈 Hadoop优缺点&#xff1a; 优点&#xff1a; 1、高可靠性&#x…

使用WebSocket、SockJS、STOMP实现消息实时通讯功能

客户端 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html> <head><title>websocket client</title><script src"http://cdn.bootcss.com/sockjs-client/1.1.1/sockjs.min.js"></script>…

Softing smartLink网关——推进过程工业数字化转型

虽然在过程工业中各工厂所投入的运营时间千差万别&#xff0c;但仍需按照新标准来进行有效控制和管理&#xff0c;而这就需要使用一种能够聚合其异构数据的数字通信架构。对此&#xff0c;Softing提供了两种网关解决方案&#xff0c;可用于将过程工业通信架构集成到现有以太网系…

初次使用ESP32-CAM记录

模块的配置和图片 摄像头&#xff1a;8225N V2.0 171026 模块esp-32s 参考资料&#xff1a;https://docs.ai-thinker.com/esp32 配置环境 参考&#xff1a;https://blog.csdn.net/weixin_43794311/article/details/128622558 简单使用需要注意的地方 基本的环境配置和串口…

学习笔记:Java并发编程(补)ThreadLocal

【尚硅谷】学习视频&#xff1a;https://www.bilibili.com/video/BV1ar4y1x727【黑马程序员】学习视频&#xff1a;https://www.bilibili.com/video/BV15b4y117RJ 参考书籍 《实战 JAVA 高并发程序设计》 葛一鸣 著《深入理解 JAVA 虚拟机 | JVM 高级特性与最佳实践》 周志明 著…

大数据项目实战之数据仓库:用户行为采集平台——第3章 用户行为日志

第3章 用户行为日志 3.1 用户行为日志概述 用户行为日志的内容&#xff0c;主要包括用户的各项行为信息以及行为所处的环境信息。收集这些信息的主要目的是优化产品和为各项分析统计指标提供数据支撑。收集这些信息的手段通常为埋点。 目前主流的埋点方式&#xff0c;有代码…

流量与日志分析

文章目录1.流量与日志分析1.1系统日志分析1.1.1window系统日志与分析方法1.1.2linux 系统日志与分析方法1.2 web日志分析iis 日志分析方法apache日志分析**access_log****error_log**nginx日志分析tomcat 日志分析主流日志分析工具使用1.流量与日志分析 日志&#xff0c;是作为…

Dns域名解析服务器

前言 域名解析服务器的介绍 域名服务器的类型划分 DNS域名解析的过程 为什么需要DNS解析域名为IP地址&#xff1f; 通俗理解Dns DNS劫持 DNS污染 Dns面试经验 前言 DNS是一个应用层协议&#xff0c;用来获取域名对应的IP地址 域名解析服务器的介绍 DNS&#xff08;Dom…

大数据技术之HBase(二)HBase原理简介

一、HBase定义1.1 HBase定义HBase 是一种分布式、可扩展、支持海量数据存储的 NoSQL 数据库非结构化数据存储的数据库&#xff0c;基于列的模式存储。利用Hadoop HDFS作为其文件存储系统&#xff0c;写入性能很强&#xff0c;读取性能较差。利用Hadoop MapReduce来处理HBase中的…

HTTPS简介

HTTPS是HTTP开启TLS传输协议&#xff0c;客户端要拿到服务端的公钥&#xff0c;用公钥加密数据后再进行传输&#xff0c;防止数据泄露后背篡改。它要解决两个问题&#xff1a;怎么保证公钥可信怎么加密数据公钥可信问题客户端从服务端获取公钥的时候&#xff0c;存在请求被拦截…

Spring(一)Spring的7种事务传播行为

目录1.7种事务传播行为2.事务使用示例3.REQUIRES_NEW 事务传播行为使用示例3.1 事务传播图3.2 TUserAServiceImpl.java3.3 TUserBServiceImpl.java1.7种事务传播行为 Spring 中定义了七种事务传播行为&#xff0c;分别是&#xff1a;&#xff08;propagation&#xff1a;n.传播…

RabbitMQ的初始入门与理解

文章目录 目录 文章目录 前言 一、简单介绍 二、使用步骤 2.1 环境配置 2.2 测试使用--java 2.2.1 简单模式 2.2.2 Work queues 工作队列模式 2.2.3 Pub/Sub 订阅模式 2.2.4 Routing 路由模式 总结 前言 MQ全称 Message Queue&#xff08;消息队列&#xff09;&#xff0c…

OperWrt 启动过程03

文章目录 OperWrt 启动过程03OpenWrt启动脚本分析OperWrt 启动过程03 OpenWrt启动脚本分析 内核代码start_kernel函数执行的最后会调用kernel_init函数来启动用户空间的一号进程,标准linux默认是的/etc/init进程,但在OpenWRT里面会执行/etc/preinit,代码如下图992行: 下面…

在SNAP中用sentinel-1数据做InSAR测量,以门源地震为例

在SNAP中用sentinel-1数据做InSAR0 写在前面1 数据下载2 处理步骤2.1 split2.2 apply orbit 导入精密轨道2.3 查看数据的时空基线base line2.4 back-geocoding 配准2.5 Enhanced Spectral Diversity2.6 Deburst2.7 Interogram Formation 生成干涉图2.8 Multilook 多视2.9 Golds…

【Unity】接入Max广告聚合SDK

下载和导入MAX Unity插件&#xff1a; 官方SDK链接 在这里插入图片描述 2.初始化MAX SDK&#xff1a; MaxSdkCallbacks.OnSdkInitializedEvent (MaxSdkBase.SdkConfiguration sdkConfiguration) > {// AppLovin SDK is initialized, start loading ads };MaxSdk.SetSdkK…

JavaScript 高级4 :正则表达式

JavaScript 高级4 &#xff1a;正则表达式 Date: January 19, 2023 Text: 正则表达式、正则表达式特殊字符、正则表达式中的替换 目标&#xff1a; 能够说出正则表达式的作用 能够写出简单的正则表达式 能够使用正则表达式对表单进行验证 能够使用正则表达式替换内容 正则…

渗透测试自动化生成报告——ExportReport

Git仓库&#xff1a; https://github.com/ljy1058318852/ExportReport0x01 概述&#xff1a; 本项目用于自动化生成报告。可根据项目需求&#xff0c;通过简单的提取变量来自定义报告模板。内附常见扫描器API/原报告(awvs、xray、goby)数据提取模块&#xff0c;可直接生成全新…

电影《断网》观后感

上周看了电影《断网》这部电影&#xff0c;题材是网络攻击与防范的故事&#xff0c;这样的题材距离我们很远&#xff0c;又离我们很近&#xff0c;我们每天都在用网络&#xff0c;生活中也离不开网络&#xff0c;所以它离我们很近&#xff0c;但是真正涉及到网络攻击时&#xf…

【00后卷王秘籍】python自动化测试—Python自动化框架及工具

1 、概述 手续的关于测试的方法论&#xff0c;都是建立在之前的文章里面提到的观点&#xff1a; 功能测试不建议做自动化 接口测试性价比最高 接口测试可以做自动化 后面所谈到的 测试自动化 也将围绕着 接口自动化 来介绍。 本系列选择的测试语言是 python 脚本语言。由于其…