0. 前言
我是一个蒟蒻,如果讲的不好,可以提出意见。
建议各位新手都使用洛谷,非常好用。
1. 头文件
C++里的头文件非常多,如:
#include <iostream>
#include <cstring>
#include <cmath>
#include <stack>
#include <queue>
#include <algorithm>
#include <map>
#include <iterator>
#include <list>
#include <cstdlib>
#include <set>
#include <ctime>
这些都是常见的头文件。
如果不想打这么多的字符,建议使用#include <bits/stdc++.h>
,也就是我们常说的“万能头”,包含了C++中绝大多数头文件。
但是,在一些比赛中,是不允许使用万能头文件的,所以大家在感受万能头的方便时,也需要背一些常见头文件。
2. 数据类型
C++中,有很多不同的数据类型。常见的有整型、浮点型、字符型、字符串型、布尔型。
以下的表格,左边为数据类型,右边为关键字。
3. 输入、输出
3.1 输入
C++的输入一般使用cin
,或使用scanf
。
常见输入方式:
#include <bits/stdc++.h>
using namespace std;
int main(){
int a,b;
cin>>a;
scanf("%d",b);
}
再输入时,若想多次输入,可以这样写:
#include <bits/stdc++.h>
using namespace std;
int main(){
int a,b;
cin>>a>>b;
return 0;
}
3.2 输出
在输出时,我们可以使用cout
或printf
。(本人是一个蒟蒻,不太会用printf)
比如:
#include <bits/stdc++.h>
using namespace std;
int main(){
int a,b;
cin>>a>>b;
cout<<a<<b;
return 0;
}
在输出时,想要输出空格:cout<<" ";
在输出时,想要输出换行:cout<<endl;
注意:
如果这样写:
#include <bits/stdc++.h>
using namespace std;
int main(){
int a,b;
cout<<a<<b;
return 0;
}
也就是a,b在主函数定义,而且没有赋值,这样输出会输出随机的数。
所以,可以这样:
#include <bits/stdc++.h>
using namespace std;
int a;
int main(){
cout<<a;
return 0;
}
这样输出就是0啦!
练习题: Hello,World!
4. 运算符
运算符有很多,分这几类:
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 杂项运算符
4.1 算术运算符
假设有两个数A,B;
算术运算符的操作:
+ 将A与B相加
- 让A减去B
* 将A乘上B
/ 让A除以B
% 取余符号,为A除以B的余数
++ 让一个数自增
-- 让一个数自减
这里先说一下赋值运算符=
,A=B,就是将B的值赋值给A。
如:
#include <bits/stdc++.h>
using namespace std;
int main(){
int a,b;
a=20;
b=10;
cout<<a+b<<endl;
cout<<a-b<<endl;
cout<<a*b<<endl;
cout<<a/b<<endl;
cout<<a%b<<endl;
a++;
b--;
cout<<a<<endl;
cout<<b<<endl;
return 0;
}
练习题目:
B2003 输出第二个整数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
B2007 A+B Problem - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
B2009 计算 (a+b)/c 的值 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
B2010 带余除法 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
4.2 关系运算符
关系运算符有以下六种
== 检查两个操作数的值是否相等,如果相等则条件为真。
!= 检查两个操作数的值是否相等,如果不相等则条件为真。
> 检查左操作数的值是否大于右操作数的值,如果是则条件为真。
< 检查左操作数的值是否小于右操作数的值,如果是则条件为真。
>= 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。
<= 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。
如:
#include <bits/stdc++.h>
using namespace std;
int main(){
int a,b;
a=10;
b=20;
cout<<(a<=b)<<endl<<(a>=b)<<endl<<(a!=b);
}
输出结果为:
1
0
1
4.3 逻辑运算符
逻辑运算符有3种:
&& 逻辑与 如果两个操作数都 true,则条件为 true。
|| 逻辑或 如果两个操作数中有任意一个 true,则条件为 true。
! 逻辑非 用来逆转操作数的逻辑状态,如果条件为 true 则逻辑非运算符将使其为 false。
4.4 位运算符
详见表格
4.5 赋值运算符
也就是说,A+=B与A=A+B作用相同,A-=B与A=A-B作用相同,以此类推。
5.顺序结构
5.1 顺序结构的含义
我们编写计算机程序,将一个任务分解成一条一条的语句,计算机会按照顺序一条一条的执行这些语句,这就是顺序结构程序设计 。
5.2 顺序结构常见函数
5.2.1 函数头文件
函数的头文件可以使用万能头,但是如果不喜欢用,大多数函数都是用的是#include <cmath>
,但是有一些用的可能不是#include <cmath>
头文件。类似max函数,使用的是#include <algorithm>
。
5.2.2 常见函数
我们先从比较简单的说起:
1.max函数
作用:求两个数的最大值。
如:
#include <bits/stdc++.h>
using namespace std;
int main(){
int a=5,b=3;
cout<<max(a,b);
}
输出的是5和3的最大值,5。
2.min函数
与max函数相反,求的是最小值。
#include <bits/stdc++.h>
using namespace std;
int main(){
int a=5,b=3;
cout<<min(a,b);
}
输出应为5和3的最小值,3。
3.swap函数
作用:交换两数。
如:
#include <bits/stdc++.h>
using namespace std;
int main(){
int a=5,b=3;
swap(a,b);
cout<<a<<" "<<b;
}
输出应该为3 5。
4.abs函数
作用:求绝对值
#include <bits/stdc++.h>
using namespace std;
int main(){
int a=5,b=-5;
cout<<abs(a)<<" "<<abs(b);
}
输出应该是5 5。
5.pow函数
作用:pow(a,b),就是求a的b次方。
#include <bits/stdc++.h>
using namespace std;
int main(){
int a=3,b=5;
cout<<pow(a,b);
}
输出应该是243。
6.sqrt函数
作用:求平方根。
#include <bits/stdc++.h>
using namespace std;
int main(){
int a=9;
cout<<sqrt(a);
}
输出为3。
7.sort函数
sort大法好用!!!
虽然sort需要用到数组,数组解释:
就是一个存储多个变量的一种结构。
作用:对数组排序。
5.3 例题
还是一样的,把洛谷打开!!!
5.3.1 洛谷B2014
B2014 与圆相关的计算 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
先读题,题目让我们计算圆的直径、周长、面积。
随后看输入,需要输入一个实数。
所以,在定义时,定义double r;
随后,整理公式:
直径: d=2r
周长: C=2πr
面积: S=πr×r
根据公式写代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
double r,d,c,s,pi=3.14159;
cin>>r;
//套公式
printf("%0.4f %0.4f %0.4f",d,c,s);
return 0;
}
5.3.2 B2028
B2028 反向输出一个三位数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
乍一看,这道题非常简单,但是在输入时遇到了麻烦
#include <bits/stdc++.h>
using namespace std;
int main(){
int a,b,c;
cin>>a>>b>>c;
cout<<c<<b<<a;
}
如果说有空格的话,就可以这么干。
但是,没有空格怎么办呢?
我们注意到,char类型的字符一次只能输入一个,所以,就可以这么干:
#include <bits/stdc++.h>
using namespace std;
int main() {
char a,b,c;
cin>>a>>b>>c;
printf("%c%c%c",c,b,a);
return 0;
}
或者,我们可以输入一个三位数,随后验算出:
百位:x/100
十位:x/10%10
个位:x%10
然后输出:
#include <bits/stdc++.h>
using namespace std;
int main() {
int x;
int a, b, c;
cin>>x;
a=x/100;//百位
b=x/10%10;//十位
c=x%10;//个位
cout<<c<<b<<a;//反向输出
return 0;
}
5.4 练习题目
B2012 甲流疫情死亡率 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
B2031 计算三角形面积 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
B2034 计算 2 的幂 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
6.分支结构
警笛长鸣!
6.1 if 结构
if结构标准图:
代码是这样写的:
if(判断的条件){
如果判断条件为真,要干什么
}
如:判断是不是3的倍数:
if(n%3==0) cout<<"YES";
但是,我们发现,怎么输出NO呢?
只能这样:
if(n%3==0) cout<<"YES";
if(n%3!=0) cout<<"NO";
这么麻烦!
这时:
6.2 if-else结构
这种结构可以完美解决这种问题。
像这样:
if(判断的条件){
如果判断条件为真,要干什么
}else{
如果判断条件为假,要干什么
}
完美!
但是,还是有不完美之处:
如果有三种可能情况,如这种题目:
判断n,如果n是正数,输出1,如果n为0,输出0,如果n是负数,输出-1。
如果是这种结构,代码如下:
if(n>0){
cout<<1;
}else{
if(n==0) cout<<0;
else cout<<-1;
}
所以,接下来这种:
6.3 多重if
if(n>0){
cout<<1;
}else if(n==0){
cout<<0;
}else{
cout<<-1;
}
非常简便。
6.4 三目运算符
语法: 表达式1 ? 表达式2:表达式3
如果表达式1的值为真,执行并返回表达式2的结果;
如果表达式1的值为假,执行并返回表达式3的结果。
6.5 switch 语句
switch语句是一种更方便的多重if语句。
对于多种结果,switch可以这样:
switch(op){
case 1:???
case 2:???
...
这种方法更加的快速,方便。
例题:洛谷分支结构的标签
B2035~B2053
7.循环结构
循环结构是一种非常方便的结构。
7.1 for循环
语句结构:
for(int i=起始值;i<=结束值;让i如何变化){
循环中要干的事情;
}
比如说
求阶乘(1~n的积)
int n;
cin>>n;
int s=1;
for(int i=1;i<=n;i++){
s*=i;
}
cout<<s;
这时,s的值就是i从1到n的积。当然,还有许多其他for循环写法。
7.2 while循环
while循环的语法结构:
while(执行条件){
循环中要干的事情;
}
我们可以认为,for循环能干的,while循环也可以干。
比如阶乘,使用while循环可以这么写:
int n;
cin>>n;
int s=1;
int i=1;//i当作目前乘到哪里了
while(i<=n){
s*=i;
i++;
}