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

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

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 endif (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中声明

相关文章:

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

1. 关于scanf 1.1 读入数字 scanf 的返回值表示成功输入的变量个数&#xff0c;当输入结束时&#xff0c;scanf将无法再次读取数据&#xff0c;返回0 # include <stdio.h> # include <math.h> # include <time.h># define M 1000000; // compute the max,…...

LearnDash Groups学习群组:您需要了解的一切

大约131k 网站使用 LearnDash。因此&#xff0c;毫无疑问&#xff0c;LearnDash是 WordPress 领域中最受欢迎的 LMS。而且&#xff0c;这是因为它具有强大的功能。但让它更受欢迎的是它与大多数第 3 方扩展很好地集成&#xff0c;并且比现有的任何其他 LMS 都更灵活。群组和群组…...

软件开发过程中遇到一个傻嘚业主能让你抓狂

背景 之前的一个网站交付了之后&#xff0c;业主一直未验收&#xff0c;今天忽然间开始了他的扯淡需求调整。 问题1 有一个问题是pdf文件上传显示问题&#xff0c;目前是pdf有一个封面要上传&#xff0c;排序字段可自动调整控制。但是就这么好用的功能&#xff0c;被他给pas…...

信创系统借力小程序应用生态的可能性

随着国内市场需求的不断增长&#xff0c;国产操作系统的应用也开始逐步发展壮大。国产操作系统在与其他操作系统的竞争中&#xff0c;越来越受到用户的青睐。国产操作系统作为一个全新的市场&#xff0c;给应用开发带来了新的机遇和挑战。本文将从国产操作系统应用的现状分析、…...

ISFP型人格的优势和劣势分析(mbti性格测试)

isfp型人格的优势分析ISFP在艺术上具有令人惊叹的天分&#xff0c;他们充沛且敏锐的情感能够轻易捕捉到那些细腻的情感变化。他们具有强大的表现力和感染力&#xff0c;能够通过自己的作品&#xff0c;将情感描绘出来并令观众感同身受&#xff0c;这使得他们在艺术和人文领域能…...

电影《断网》观后感

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

查看python第三方库的依赖pkgs

课题组的服务器不给连外网&#xff0c;安装python第三方库就只能手动离线安装。但是python第三方库可能会迭代依赖&#xff0c;单纯的pip show [pkg]是看不出来的…… 参考链接&#xff1a;查看python第三方库的依赖 https://blog.csdn.net/qq_38316655/article/details/127943…...

CF756div3 vp

又被薄纱了&#xff0c;rk就不放了&#xff0c;好丢人QwQDashboard - Codeforces Round 756 (Div. 3) - CodeforcesA. Make Even小分类讨论题意&#xff1a;给定一个数&#xff0c;每次操作可以选取其前缀然后翻转其前缀&#xff0c;问你最少操作几次可以把该数变为偶数思路&am…...

Linux命令·less

less 工具也是对文件或其它输出进行分页显示的工具&#xff0c;应该说是linux正统查看文件内容的工具&#xff0c;功能极其强大。less 的用法比起 more 更加的有弹性。在 more 的时候&#xff0c;我们并没有办法向前面翻&#xff0c; 只能往后面看&#xff0c;但若使用了 less …...

修改redis改key值不改过期时间

今天在做图片验证码的时候遇到一个问题。用redis的生命周期来存放&#xff0c;用户输入错误次数。 三十秒内输错三次就&#xff0c;等待三十分钟。 那么问题来了&#xff0c;如果说第一次输入错误&#xff0c;应该是 key为用户用&#xff0c;value 为 次数2 ex就为30秒 &…...

Spark的DataFrame使用

内容目录创建SparkSession对象从CSV文件中读取从JSON文件中读取从Parquet文件中读取从数据列表中创建DataFrame从字典列表中创建DataFrame选择一列选择多列过滤年龄大于30的数据过滤名字为Alice的数据可以使用and、or、not等操作符进行组合查询按照年龄分组并计算平均年龄和最大…...

【Flutter】入门Dart语言:操作符的基本用法

文章目录 一、前言二、常用的操作符1.算术操作符2.关系操作符3.逻辑操作符4.赋值操作符5.三元运算符三、总结一、前言 当我们在编写Flutter应用程序时,操作符是我们不可或缺的工具。它们是用于执行各种操作的关键字和符号,可以帮助我们简化代码并提高效率。熟练掌握各种类型…...

Linux线程概念

重新认识一下进程 在之前写过的与进程相关的博文中&#xff0c;都把进程看作是只有一个PCB的进程。如图&#xff1a; 而实际上&#xff0c;在Linux中&#xff0c;进程不止一个执行流&#xff0c;而是可能会有几个或很多个。同一个进程中&#xff0c;每一个执行流都指向同一个虚…...

C#基础教程10 方法

C#方法 方法的语法访问修饰符:返回类型:方法名称:参数列表:方法体:返回值:方法的调用参数传递按值传递按引用传递输出参数方法的重载总结方法是C#中最基本的代码结构之一。方法是一组可重复使用的代码,它接受输入,执行一些操作并返回结果。在本教程中,我们将深入了解C…...

java高性能并发计数器之巅峰对决

并发计数器各个方案介绍方案概述1. jdk5提供的原子更新长整型类 AtomicLong2. synchronized3. jdk8提供的 LongAdder 【单机推荐】4. Redisson分布式累加器【分布式推荐】方案介绍jdk5提供的原子更新长整型类 AtomicLong在JDK1.5开始就新增了并发的Integer/Long的操作工具类Ato…...

HTTPS简介

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

K-means聚类

原理说明 Kmeans是一种常见的聚类算法&#xff0c;用于将相似的数据点归类到不同的群组中。Kmeans的原理如下&#xff1a; 初始化&#xff1a;Kmeans算法首先需要初始化一个用户指定数量的聚类中心点&#xff0c;通常是随机选取K个数据点作为聚类中心点。 分配&#xff1a;对…...

04-SQL基础(表管理,约束,多表连接,子查询)

本文章主要内容 1、表的管理&#xff1a;创建表&#xff0c;修改表结构&#xff0c;删除字段&#xff0c;修改字段&#xff0c;添加字段&#xff0c;删除表&#xff0c;添加表约束&#xff1b; 2、数据管理&#xff1a;新增记录&#xff0c;修改记录&#xff0c;删除记录&…...

统计学 一元线性回归

统计学 一元线性回归 回归&#xff08;Regression&#xff09;&#xff1a;假定因变量与自变量之间有某种关系&#xff0c;并把这种关系用适当的数学模型表达出来&#xff0c;利用该模型根据给定的自变量来预测因变量 线性回归&#xff1a;因变量和自变量之间是线性关系 非线…...

【软件开发】基于PyQt5开发的标注软件

这里是基于PyQt5写的面向目标检测的各类标注PC端软件系统。目前现有的labelme软件和labelImg开源软件无法满足特殊数据集的标注要求&#xff0c;而且没有标注顺序的报错提示。当然我设计的软件就会不具有适用性了&#xff08;毕竟从下面开发的软件可以明显看出来我做的基本上是…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

给网站添加live2d看板娘

给网站添加live2d看板娘 参考文献&#xff1a; stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下&#xff0c;文章也主…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…...

Unity VR/MR开发-VR开发与传统3D开发的差异

视频讲解链接&#xff1a;【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...

32单片机——基本定时器

STM32F103有众多的定时器&#xff0c;其中包括2个基本定时器&#xff08;TIM6和TIM7&#xff09;、4个通用定时器&#xff08;TIM2~TIM5&#xff09;、2个高级控制定时器&#xff08;TIM1和TIM8&#xff09;&#xff0c;这些定时器彼此完全独立&#xff0c;不共享任何资源 1、定…...