【基础语法】基础语法讲解(未完结)

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++中,有很多不同的数据类型。常见的有整型、浮点型、字符型、字符串型、布尔型。
以下的表格,左边为数据类型,右边为关键字。
image

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 输出

在输出时,我们可以使用coutprintf。(本人是一个蒟蒻,不太会用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 位运算符

详见表格
image

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结构标准图:
image
代码是这样写的:

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;
}

所以,接下来这种:
image

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++;
}
6 个赞

OK啊 让我来点评一下dalao的神作
0.蒟蒻の期待
期待后续更新,dalao顺便能不能教我一下时间复杂度O(n),没听懂
1.优点
推荐,哪哪都是优点,根本写不完,篇幅原因,就拿题目举例子吧,贴心的附上了luogu
链接,奈斯奈斯
2.缺点
原文链接

# 1. 头文件

C++里的头文件非常多,如:

#include <iostream>
#include <cstring>
#include <cmath>
#include <stack>
#include <queue>

这些都是常见的头文件。
如果不想打这么多的字符,建议使用#include <bits/stdc++.h>,也就是我们常说的“万能头”,包含了C++中绝大多数头文件。

这里的头文件是不是……有点少咯?建议补充

蒟蒻做

勿喷

3 个赞

ok,感谢感谢

2 个赞

做的是真的好 比我那个《重生之我在信友队学基础算法I》前几章好多了

1 个赞

时间复杂度那个是什么意思啊?
是说怎么计算吗

3 个赞

dui

会持续更新的,直到更完再说

3 个赞