【信息学奥数】—— 第一部分 C++语言 知识总结
【信息学奥数】—— 第一部分 C++语言 知识总结
- C++语言
- 一、C++语言入门
- 二、顺序结构程序设计
- 运算符和表达式
- 常量和变量
- 标准数据类型
- 数据输入输出
- 三、控制结构程序设计
- if语句
- switch语句
- 四、循环结构程序设计
- for语句
- while语句
- do-while语句
- 五、数组
- 一维数组
- 二维数组
- 字符数组
- 六、函数
- 七、文件和结构体
- 文件
- 结构体
- 八、指针及其应用
C++语言
先学习,再应用。先简单,再复杂。
一、C++语言入门
1、C++程序基本结构。
//头文件(必须)
#include<iostream> //cin cout头文件
#include<cstdio> //scanf printf头文件
//命名空间(必须)
using namespace std; //C++标准库中所有标识符都被定义在一个名为std的namespace中
//全局变量
vector<vector<int>> result; //诸如此类
//宏定义
#define PI 3.1415 //诸如此类
//函数声明
函数返回值类型 函数名(参数列表);
//主函数(必须)
int main() //程序入口
{//处理输入//处理输出return 0; //0代表正常结束 非0代表异常
}
//函数定义
函数返回值类型 函数名(参数列表)
{//函数体//返回值
}
//示例
#include<iostream>
using namespace std;
int main()
{cout<<"Hello World"<<endl;return 0;
}
二、顺序结构程序设计
顺序,顾名思义,分析问题,按照步骤顺序,一步一步的执行。
运算符和表达式
1、常见运算符类型以及优先级与结合性。
运算符优先级:各类运算符在同一个表达式中运算先后顺序
运算符结合性:同类运算符在表达式相邻位置运算左右方向
单目运算符优先级 > 双目运算符优先级 > 三目运算符优先级
算术运算符优先级 > 关系运算符优先级 > 逻辑运算符优先级 > 赋值运算符优先级
左结合性:某一个变量左右两个运算符优先级相同,将该变量先与左边的运算符结合,计算完后再与右边的运算符结合,从左向右计算。
右结合性:某一个变量左右两个运算符优先级相同,将该变量先与右边的运算符结合,计算完后再与左边的运算符结合,从右向左计算。
先将表达式中的运算符找出来,然后根据运算符优先级从高到低依次计算,当遇到相邻的优先级相同的运算符时,再根据运算符结合性是左结合性还是右结合性计算。
类型 | 示例 |
---|---|
算术运算符 | +、-、*、/、%、++、– |
关系运算符 | >、<、>=、<=、==、!= |
逻辑运算符 | &&、||、! |
位运算符 | &、|、~、^、>>、<< |
赋值运算符 | =、+=、-=、*=、/=、%=、&=、|=、^=、>>=、<<= |
2、赋值运算符。
- 赋值运算符=是右结合性,即a=b=c=d=e=5,等价于(a=(b=(c=(d=(e=5))))),即e=5、d=e、c=d、b=c、a=b。
- 如果赋值运算符左右两边数据类型不同,系统会自动隐式将赋值运算符右边的数据类型转换为左边的数据类型,也可以手动显式进行数据转换。
3、逗号表达式。
表达式1,表达式2,……,表达式n 逗号表达式的值为表达式n的值
常量和变量
1、常量。
程序中需要经常用到的常量一般使用符号常量来进行保存:一方面可以增加程序的可读性,另一方面可以增加程序的易改性。
2、变量。
变量包含变量名(命名规则)、变量对应的数据类型(数据操作)、变量的取值范围(有效位数)。
类似于鸡兔同笼求解方程问题,使用已知变量表示未知变量,再进行求解即可。
标准数据类型
1、标准数据类型。
数据类型 | 注意事项 |
---|---|
整型 short int long unsigned | 先使用sizeof计算字节数a,再乘以8得到位数b,有符号整型范围就是2(b-1),无符号整型范围就是2b |
实型 float double | 科学计数法为:aEb,a是十进制表示的小数尾数,E是以10为底的底数,b是十进制表示的整数指数 |
字符型 char | 字符对应ASCII码为整数 |
布尔型 bool | 真为true对应1 假为false对应0 |
2、数据类型转换。
- 显式转换(人为手动)。
- 隐式转换(程序自动)。
数据输入输出
1、输入输出函数。
- ch=getchar();
- putchar(ch);
- cin>>a;
- cout<<a<<endl;
- scanf(“%d”,&a);
- printf(“%d\n”,a);
2、scanf、printf和cin、cout的区别。
scanf/printf相对于cin/cout的区别:
- 优点:速度快。
- 缺点:写麻烦。
一般数据量较大时使用scanf/printf。
3、printf标准输出格式。
格式 | 含义 |
---|---|
%d %f %c %s %e %g | 整数 浮点数 字符 字符串 科学计数法 实数(小数尾部不会显示多余的零) |
%- %+ %0 | 左对齐 右对齐 位数不够前方补零 |
%m.n | m是宽度 n是精度 |
4、scanf(“%d”,&x)返回值问题。
- scanf(“%d”,&x)==1:表示所输入的数据与格式字符串匹配的次数(一般用于while循环)。
- scanf(“%d”,&x)!=EOF:表示所输入的数据是否到达文件尾部(一般用于while循环)。
三、控制结构程序设计
控制,顾名思义,分析问题,根据情况的不同,按需选择执行。
if语句
if语句适合分支较少的情况。如果是多分支组合情况,可以考虑将复杂的多分支拆分为一个个的单分支。如题目2053三个数和题目1047判断能否被3,5,7整除。
//单分支结构
if(条件表达式)
{语句;
}
//双分支结构 等价于 ?:
if(条件表达式)
{语句;
}
else
{语句;
}
//多分支结构
if(条件表达式)
{语句;
}
else if(条件表达式)
{语句;
}
……
else
{语句;
}
switch语句
switch语句适合分支较多的情况。其首先计算switch变量表达式,然后计算case常量表达式,最后根据两者匹配情况执行对应语句。
switch(expression)
{case (constant-expression):语句;break;……default:语句;(此处是最后一种情况可以不加break)
}
四、循环结构程序设计
循环,顾名思义,分析问题,执行规律性的重复计算。
for语句
for语句适合循环次数确定的情况。分析变量从A到B增量为C。
for(控制变量初始化表达式;条件表达式;增量表达式)
{语句;……
}
while语句
while语句适合循环次数不确定的情况。分析循环条件。
while(条件表达式)
{语句;……
}
do-while语句
do
{语句;……
}
while(条件表达式);
如果单词之间使用空格分割,且至少读入一个单词,那么可以使用do while语句,且while的判断条件是是否输入空格。其他情况一般不常用。
五、数组
如果需要处理的相同类型的数据较多,那么就需要使用数组来存储元素。
一维数组
注意,定义数组时,数组的大小只能是常量表达式,而不能是变量。
const int N=100; int a[N+1]; √ 常量表达式
#define N 100 int a[N+1]; √ 符号常量表达式
int a[101]; √ 常量
int N=100; int a[N+1]; × 变量
二维数组
二维数组主要用于处理矩阵信息。
字符数组
1、字符数组存放若干字符与字符串的区别。
- 字符数组存放若干字符时,其每一个位置均可以存放任意字符,如果字符数组没有存满,那么剩余元素默认为空字符,如果字符数组存满了,那么不能使用printf(“%s\n”,a)打印;
- 字符数组存放字符串时,其最后一个位置必须为结束符’\0’,如果字符数组最后有多个’\0’,那也是字符串,可以使用printf(“%s\n”,a)打印,字符串的结束符’\0’占内存空间,但是不占字符串长度;
2、字符串的输入与输出。(头文件为cstdio)
- scanf(“%s”,字符串名称) //字符串名称前面没有&;scanf读取到空格即结束;
- gets(字符串名称) //gets只能一次读取一个字符串;gets读取到换行即结束;
- printf(“%s\n”,字符串名称) //%s只能输出字符串而不能是字符串元素;
- puts(字符串名称) //与printf等价
如果是需要截取以空格为分割的字符串,那么就使用scanf;
如果是需要一行一行的读取字符串,那么就使用fgets;
注意:gets函数在C++14中被移除了,但是可以使用fgets函数来替代gets函数。
char *fgets(char *str,int n,FILE *stream)//str:指向一个字符数组的指针,该数组存储了要读取的字符串;
//n:要读取的最大字符数(包括最后的空字符),通常使用str的数组长度;
//stream:指向FILE对象的指针,其标识了要从中读取字符的流;//fgets从指定的流stream读取一行并将其存储在str所指向的字符串中,当读取(n-1)个字符时,或者读取到换行符时,或者到达文件尾时,其就会停止;如果读取键盘,那么stream参数应该为stdin;
3、字符串处理函数。(头文件为cstring)
函数格式 | 函数功能 |
---|---|
strcat(字符串名1,字符串名2) | 将字符串2连接到字符串1后面并返回字符串1的值 |
strncat(字符串名1,字符串名2,长度n) | 将字符串2前n个字符连接到字符串1后面并返回字符串1的值 |
strcpy(字符串名1,字符串名2) | 将字符串2复制到字符串1并返回字符串1的值 |
strncpy(字符串名1,字符串名2,长度n) | 将字符串2前n个字符复制到字符串1并返回字符串1的值 |
strcmp(字符串名1,字符串名2) | 比较字符串1和2的大小:1>2则返回正整数;1=2则返回0;1<2则返回负整数 |
strncmp(字符串名1,字符串名2,长度n) | 比较字符串1和2的前n个字符的大小 |
strlen(字符串名) | 计算字符串的长度,终止符’\0’不算在长度内 |
strlwr(字符串名) | 将字符串中大写字母转换为小写字母 |
strupr(字符串名) | 将字符串中小写字母转换为大写字母 |
strstr(字符串1,字符串2) | 在字符串1中查找第一次出现字符串2的位置,未找到则为null |
字符串相关题目先考虑所需功能是否可以使用库函数,如果不可以再考虑可以由什么实现。
字符数组一般容易出错,之后可以使用string来替代。
六、函数
//函数声明返回值 函数名(形参列表);//函数定义返回值 函数名(形参列表)
{函数体……return ……
}//函数调用函数名(实参列表)函数调用将流程从主调函数转向被调函数,函数返回将流程从被调函数转向主调函数。
1、函数调用方式。
- 传值调用:将实参值拷贝一个副本传递给形参;形参值可以改变,但不影响主调函数的实参值;
- 传址调用:将实参变量的地址值传递给形参;形参值改变,实参值也会相应的改变;
//传值调用void swap(int a,int b){}//传址调用void swap(int &a,int &b){}
2、递归算法。
递归函数,即在函数内部直接或者间接的调用函数自身。递归,即一条路走到黑然后到底了再返回。
递归三部曲:
- 递推公式(函数体)。
- 函数参数以及返回值(函数头)。
- 终止条件(函数边界)。
七、文件和结构体
文件
C++把每一个文件都看成是一个有序的字节流,每一个文件都以文件结束标志结束。如果要操作某一个文件,程序必须首先打开文件,当一个文件被打开后,该文件就和一个流关联起来,这里的流其实是一个字节序列。
文件操作的基本步骤:
- 打开文件,将文件指针指向文件,决定打开文件类型。
- 对文件进行读、写操作。
- 使用完文件后,关闭文件。
1、常见的文件操作函数。
FILE *freopen(const char *filename,const char *mode,FILE *stream)//filename表示要打开的文件名
//mode表示文件打开的模式
//stream表示文件指针 stdin标准输入流 stdout标准输出流 stderr标准错误流//引号内是读取的对象 引号外是输出结果的地方
freopen("in.txt","r",stdin); //输入文件 从in.txt文件读入输出到stdin
freopen("out.txt","w",stdout); //输出文件 从out.txt文件读入输出到stdout
//使用scanf以及printf即可
fclose(stdin);
fclose(stdout);
FILE *fopen(const char *filename,const char *mode)//filename表示要打开的文件名
//mode表示文件打开的模式FILE *fin,*fout;
fin=fopen("in.txt","rb"); //输入文件
fout=fopen("out.txt","wb"); //输出文件
//使用fscanf(fin,)和fprintf(fout,)即可
fclose(fin);
fclose(fout);
ifstream fin("输入文件名.扩展名"); //文件输入流
ofstream fout("输出文件名.扩展名"); //文件输出流
//使用fin>>和fout<<即可
fin.close();
fout.close();
结构体
当一组数据有不同的数据类型是使用结构体。
struct 结构体类型名
{成员表;成员函数;
}结构体变量表;struct 结构体类型名
{成员表;成员函数;
};
结构体类型名 结构体变量表;//使用.访问结构体成员
八、指针及其应用
1、指针定义。
类型说明符 *变量名;
//*表示这是一个指针,变量名是指针名字,类型说明符是指针变量所指向的变量的数据类型int *p=&a;&a表示取地址;
*p表示取值;p++表示根据类型sizeof(类型)增加一个单位;
p--表示根据类型sizeof(类型)减少一个单位;指针本身是地址;数组名本身也是地址;
相关文章:

【信息学奥数】—— 第一部分 C++语言 知识总结
【信息学奥数】—— 第一部分 C语言 知识总结C语言一、C语言入门二、顺序结构程序设计运算符和表达式常量和变量标准数据类型数据输入输出三、控制结构程序设计if语句switch语句四、循环结构程序设计for语句while语句do-while语句五、数组一维数组二维数组字符数组六、函数七、…...

video层级过高,以及界面使用多个video时,在安卓APP上同时播放的问题(uniapp)
1、video层级过高的问题 问题一: 我的界面由于是自定义导航栏,所以使用video时,上滑界面video会直在最上层,盖着 头部导航栏 解决方法:使用cover-view,自定义头部使用cover-view替换view 问题二:自定义…...

C++基础了解-14-C++ 字符串
C 字符串 一、C 风格字符串 C 风格的字符串起源于 C 语言,并在 C 中继续得到支持。字符串实际上是使用 null 字符 \0 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。 下面的声明和初始化创建了一个 RUNOOB …...

浅谈几种网络攻击及攻防原理
HTTP Flood攻击 https://zhuanlan.zhihu.com/p/337399808 HTTP Flood攻击是针对Web服务在第七层协议发起的攻击。第七层主要是应用层,是一些终端的应用,比如(各种文件下载)、浏览器、QQ等,可以将其理解为在电脑屏幕上可…...

Kafka消息中间件(Kafka与MQTT区别)
文章目录KafkaKafka重要原理Topic 主题Partition 分区Producer 生产者Consumer 消费者Broker 中间件Offset 偏移量Kafka与mqtt区别Kafka Kafka是一个分布式流处理平台,它可以快速地处理大量的数据流。Kafka的核心原理是基于发布/订阅模式的消息队列。Kafka允许多个…...

Go垃圾回收原理
术语介绍 赋值器:说白了就是你写的程序代码,在程序的执行过程中,可能会改变对象的引用关系,或者创建新的引用。 回收器:垃圾回收器的责任就是去干掉那些程序中不再被引用得对象。 STW:全称是stop the word,GC期间某个阶段会停止…...

Coredump-N: stack 空间被临时变量吃满,导致内存访问出现问题
文章目录 代码寄存器汇编代码 int main() {fun(0); #define S 0x0019fd08UL 、、 乘5 等0x81F128 char buff4[S]; char buff3[S]; char buff2[S]; char buff1[S]; char buff[S]; memset(buff, 0, sizeof(buff)); memset(buff4, 0, sizeof(buff)); memset(buff3, 0, sizeof(buf…...

GO中使用viper读取配置文件
文章目录 viper的使用例子一:例子二:viper的使用 viper的源码地址https://github.com/spf13/viper,它是一个可以用来读取配置文件的工具。在项目中可以通过下面指令安装: go get github.com/spf13/viper 下面我们通过两个例子,来介绍一下viper在项目中应该如何使用…...

webpack dll 提升构建速度
DLL,动态链接库(Dynamic Link Library 或者 Dynamic-link Library),由微软公司提出。目的是为了节约应用程序所需的磁盘和内存空间。 在一个传统的非共享库中,如果两个程序调用同一个子程序,就会出现两份那…...

C++面向对象编程之三:初始化列表、类对象作为类成员、静态成员
初始化列表C提供了初始化列表语法,可以用于成员属性初始化。语法规则:无参构造函数():属性1(值1), 属性2(值2), ... { }有参构造函数(形参1, 形参2, ...):属性1(形参1), 属性2(形参2), ... { }example:写一个怪物类,有怪物id和血量…...

跨域问题解决方案
目录 1.同源策略 2.解决方案(后端) (1)在后端方法添加CrossOrigin (2)添加CORS过滤器 (3)实现WebMvcConfigure接口,重写addCorsMappings方法 3.解决方案(前端) (1)前端配置代理 1.同源策略 同源策略(Same origin policy)是一种约定&am…...

Vue3电商项目实战-购物车模块7【20-登录后-批量删除、21-登录后-选中状态修改数量、22-登录后-全选反选、23-登录后-修改规格、24-下单结算】
文章目录20-登录后-批量删除21-登录后-选中状态&修改数量22-登录后-全选反选23-登录后-修改规格24-下单结算20-登录后-批量删除 目标:完成批量删除选中商品,完成清空失效的商品 大概步骤: 完成cart.js模块中的批量删除actions的登录状态…...

软件测试之快速熟悉项目
快速熟悉项目 1、了解项目架构 C/S架构 C/S 代表的是客户端/服务器(client/server),这类软件的使用者需要在本地电脑安装客户端程序,例如:QQ。 优点:安全性高。 缺点:一旦软件有更新,用户需要手动下载&am…...

软考高级信息系统项目管理师系列之二十一:项目风险管理
软考高级信息系统项目管理师系列之二十一:项目风险管理 一、项目风险管理内容整理二、项目风险管理1.风险及项目风险管理定义2.项目风险的特点3.风险的分类4.风险成本5.项目风险管理与其他管理的关系三、规划风险管理1.规划风险管理2.输入3.工具与技术4.输出四、识别风险1.识别…...

打包成JAR文件和WAR文件,到底有什么区别?
Spring Boot是一种基于Spring框架的快速开发应用程序的工具,可以轻松地构建可部署的独立应用程序。在使用Spring Boot时,你可能会注意到有两种不同的部署选项:打包成JAR文件和WAR文件。在这篇文章中,我们将深入探讨这两种部署选项…...

STM32 OTA应用开发——通过串口/RS485实现OTA升级(方式1)
STM32 OTA应用开发——通过串口/RS485实现OTA升级(方式1) 目录STM32 OTA应用开发——通过串口/RS485实现OTA升级(方式1)前言1 环境搭建2 功能描述3 程序编写3.1 BootLoader部分3.2 APP的制作4 修改工程中的内存配置4.1 Bootloader…...

在教学中常被问到的几个vue3.x与typescript的问题,统一解答
在教学当中,学生在学习vue3.x时,常常会问到typescript和vue3.x之间的关系,感觉这两个技术总是绑在一起的,下面老赵来统一解答一下: 那学vue3.x,为什么要求也要掌握typescript Vue 3.x是一个使用TypeScript编…...

纯css实现超炫酷的星空背景按钮
也是在制作项目时发现的,找了很多demo,一点一点测试,发现这个按钮也是非常的炫酷 用到了几个属性,keyframes,::after,::before 先了解一下他们分别都是干嘛的 keyframes 关键帧 keyframes at-rule 规则通过在动画序…...

openpnp - 贴片前, 放入一块新板子后, 对板子的坐标矫正
文章目录openpnp - 贴片前, 放入一块新板子后, 对板子的坐标矫正概述笔记实验前置条件实验开始建立自己板子上的Mark点封装, 用于自己人工圈定判断Mark点位置是否正确建立mark点封装根据多个mark点, 来精确定位板子左下角原点坐标ENDopenpnp - 贴片前, 放入一块新板子后, 对板子…...

计及需求响应的改进灰狼优化算法求解风、光、柴、储容量优化配置(Matlab代码实现)
👨🎓个人主页:研学社的博客💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密…...

Elasticsearch使用——高级篇
1.数据聚合**聚合(aggregations)**可以让我们极其方便的实现对数据的统计、分析、运算。例如:什么品牌的手机最受欢迎?这些手机的平均价格、最高价格、最低价格?这些手机每月的销售情况如何?实现这些统计功…...

Java网络爬虫-HttpClient工具类
关于用Java进行爬虫的资料网上实在少之又少,但作为以一名对Java刚刚初窥门径建立好兴趣的学生怎么能静得下心用新学的Python去写,毕竟Java是世界上最好的语言嘛 (狗头)关于Java爬虫最受欢迎的一个框架Jsoup常常搭配HttpClient来使用,因为Jsou…...

LeetCode203_203. 移除链表元素
LeetCode203_203. 移除链表元素 一、描述 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出:[1,2…...

【洛谷 P1443】马的遍历 题解(广度优先搜索)
马的遍历 题目描述 有一个 nmn \times mnm 的棋盘,在某个点 (x,y)(x, y)(x,y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。 输入格式 输入只有一行四个整数,分别为 n,m,x,yn, m, x, yn,m,x,y。 输出格式 一个 nmn \t…...

为什么gpt输出有随机性?
以下答案由chatGPT产生! 为什么gpt输出有随机性? GPT(Generative Pre-trained Transformer)是一种基于Transformer架构的神经语言模型,它是一个深度学习模型,通过在大规模文本数据上进行预训练࿰…...

配置Clion用于STM23开发(Makefile)
前言 对于Clion配置STM32开发环境的教程在网上一搜一大堆,但是大部分都是22年之前的,使用的方法都是在STM32CubeMX生成SW4STM32工程。但是在22年不知道哪个版本后,CubeMX已经不再支持生成SW4STM32工程了,这也是我本人遇到的问题。…...

如何在 Istio 中使用 SkyWalking 进行分布式追踪
在云原生应用中,一次请求往往需要经过一系列的 API 或后台服务处理才能完成,这些服务有些是并行的,有些是串行的,而且位于不同的平台或节点。那么如何确定一次调用的经过的服务路径和节点以帮助我们进行问题排查?这时候…...

HBase高手之路1-Hbase简介
文章目录HBase高手之路1-Hbase简介一、什么是HBase1. HBase简介2. HBase的发展过程二、HBase特点1. 海量存储2. 列式存储3. 极易扩展4. 高并发5. 稀疏6. 强一致性读/写7. 自动分块8. 自动RegionServer故障转移9. Hadoop/HDFS集成10. MapReduce11. Java Client API12. Thrift/RE…...

计算机视觉手指甲标注案例
关键点标注是指识别和标注图像或视频中特定的相关点或区域的过程。在机器学习行业,它经常被用来训练计算机视觉模型,以执行诸如物体检测、分割和跟踪等任务。 关键点注释可用于以下应用: 面部关键点检测:识别图像中人脸上的眼睛…...

linux 字符串截取(cut)
-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。 -c :以字符为单位进行分割。 -d :自定义分隔符,默认为制表符。 -f :与-d一起使用,指定显示哪个区域。 -n…...