C/C++ 基础语法(竞赛常用)
先附上一段 HelloWorld 的代码,熟悉一下框架
#include<iostream>
using namespace std;
int main()
{
cout << "HelloWorld" << endl;
return 0;
}
常用数据类型
-
i n t int int,整形,取值范围 [ − 2 31 , 2 31 − 1 ] [ -2^{31}, 2^{31}-1] [−231,231−1],占 4 4 4 个字节,范围记 2 × 1 0 9 2\times 10^9 2×109。
-
l o n g long long l o n g long long ,64位长整型,取值范围 [ − 2 63 , 2 63 − 1 ] [-2^{63},2^{63}-1] [−263,263−1],占 8 8 8 个字节,范围记 9 × 1 0 18 9\times 10^{18} 9×1018。
-
d o u b l e double double,双精度浮点型, 15 − 16 15-16 15−16 位有效数字,占 8 8 8 个字节。
-
$ char$,字符型,存储字符,占 1 1 1 个字节。
-
b o o l bool bool,布尔型,描述 t r u e / f a l s e true/false true/false,占 1 1 1 个字节。
-
s t r i n g string string,存储字符串,相当于 c h a r [ ] char[] char[]。
-
v o i d void void,表示无类型,常用在程序编写中对定义函数的参数类型、返回值、函数中指针类型进行声明。
转义字符和占位符
转义字符:
\n
代表换行。
占位符是格式化字符串中的占位符用来指定打印输出的数据类型和格式,常用的:
i n t − > % d int -> \%d int−>%d
l o n g long long l o n g − > % l l d long-> \%lld long−>%lld
d o u b l e − > % l f double-> \%lf double−>%lf,保留 x x x 位小数, % . x l f \%.xlf %.xlf
c h a r − > % c char->\%c char−>%c
c h a r [ ] − > % s char []-> \%s char[]−>%s
输入和输出
C 语言:(头文件 stdio.h)
输入:
后面变量被占位符代替,下面以输入一个整形为例:
int x;
scanf("%d", &x);
输出:
后面变量被占位符代替,下面以输出一个整形为例:
x = 3;
printf("%d", x);
C++:(头文件 iostream)
输入:
下面以输入一个整形为例
int x;
cin >> x;
输出:
下面以输出一个整形为例
x = 3;
cout << x;
(C++ e n d l − > endl -> endl−> 换行)
运算符和表达式
运算符如下 :
+ - * / = == % ! ^ | & << >>
+ - * /
四则运算(小学生都会吧,注意 /
代表整除,没有小数。
=
赋值符号, ==
判断符号
%
取余,
x
/
y
x/y
x/y 所剩下的余数。
|
或,分解为二进制,每一位,有
1
1
1 就出
1
1
1,都没
1
1
1 出
0
0
0。
&
与,分解为二进制,每一位,两个都是
1
1
1 才出
1
1
1,否则
0
0
0。
!
非,一般判断是否是
0
0
0,!x
:
x
x
x 为
0
0
0,
!
x
!x
!x 为
1
1
1,否则为
0
0
0。
^
异或,分解为二进制,每一位,相同为
0
0
0,不同为
1
1
1,两个相同数异或后值为
0
0
0。
<<
二进制,向左移动
>>
二进制,向右移动
表达式:
1、与:&& 短路原则,前面的条件不满足的话后面的条件不再判断。
2、或:||短路原则,前面的条件满足的话后面的条件不再判断 。
3、非 !如上。
优先级:非与或 !> && > ||
C++里只能同时比较两个数,不能同时比较三个数。
不可以写出这样 if(a > b > c) {;}
应该写成这样 if(a > b && b > c)
当判断一个数不等于 0 0 0 的时候,可以把 ! = 0 !=0 !=0 省略。
不能写 a == b == c
要写 a == b && b == c
。
x = x + 1
可以简写为 x += 1
;同理,其它表达式也是一样的。
++i
和 i++
的区别:
++i
表示先执行 i = i + 1
这个表达式,再执行别的,i++
表示先执行别的,再执行 i = i + 1
这个表达式。
判断语句
if
代码如下:
if(表达式)
{
代码块;
}
else if(表达式)
{
代码块;
}
……
else if(表达式)
{
代码块;
}
else
{
代码块;
}
表达式中,除了 0 0 0 其它判别都是 1 1 1。
顺序是先执行第一个条件,如果满足就执行第一个代码块,然后结束,如果不满足第一个条件,执行第二个 else if,如果满足第二个条件,执行代码块,然后结束,如果不满足,继续第三个第四个……最后都不满足,执行 else,然后结束。
e l s e else else i f if if 和 e l s e else else 可以省略不写,可以只存在一个 i f if if 语句,但不能单独存在 e l s e else else i f if if 和 e l s e else else 语句。
循环语句
for 循环:
for (初始化 init; 条件语句; 表达式)
{
代码块;
}
运行顺序:
先初始化 i n i t init init,
条件语句,代码块,表达式,
条件语句,代码块,表达式,
条件语句,代码块,表达式
……
直到不满足条件语句退出循环
条件语句,代码块,表达式,初始化 i n i t init init,都可以省略,但是分号不可以省略,注意别写死循环了。
while 循环
while(条件语句)
{
代码块;
}
运行顺序:
条件语句
代码块
条件语句
代码块
……
当不满足条件语句的时候,退出循环,注意别写死循环了。
跳转
b r e a k break break 语句可以提前从循环中退出。
c o n t i n u e continue continue 语句是直接跳到当前循环体的结尾,跳过本次循环。
一般这两个都和 i f if if 搭配使用。
数组
数组用于存储一个固定大小的相同类型元素的顺序集合。
声明:数据类型 数组名[ 整数值 ];
初始化数组: double a[5] = {1.0, 2.0, 3.0, 4.0, 5.0};
访问数组元素: 数组名[下标];
多维数组就是数组的数组,和一维同理。
二维数组:
int a[3][4]
; 表示大小为
3
3
3 的数组,每个元素是含有
4
4
4 个整数的数组。
a[0][2]
可以理解为第
0
0
0 行第
2
2
2 列位置的值。
然后三维数组、四位数组……同理。
数组的初始化:
头文件: c s t r i n g cstring cstring
m e m s e t ( ) memset() memset() 函数
用法:memset(初始化开始的位置,初始化的值,字节数)
它是按字节赋值的。一般来说,只赋值 0 0 0、 − 1 -1 −1、 0 x 3 f 0x3f 0x3f。
m e m c p y ( ) memcpy() memcpy() 函数
用法:memcpy(b, aizeof a)
把
a
a
a 复制到
b
b
b
注:
下标从 0 0 0 开始,一般数组写在全局,定义在 m a i n main main 函数内部的变量会开在栈里,栈空间默认一兆,数组太大会报错。但是定义在 m a i n main main 函数外部的变量会放在堆空间里。函数内部的变量不初始化都是随机的,但是定义在函数外部的变量不初始化都是 0 0 0。
定义数组大小一般用常变量,用 c o n s t const const 修饰。
const int N = 2e5 + 10;
int a[N];
函数
函数的组成包括函数的返回类型、函数名字以及由 0 0 0 个或者多个函数形参组成的列表,函数的返回值可以是任意类型。
定义函数:
(返回类型) 函数名 (参数列表)
{
代码块;
返回值;
}
函数的执行顺序:执行顺序先按照顺序执行,等到函数部分后,再去执行函数部分,输出返回值后,再回来按照顺序继续执行。
除了 v o i d void void 作为返回类型以外,其余的都要有返回值。
传参
传值:
参数传递进来之后只是一个局部变量,修改形参不会改变实参的值,在函数内部修改参数的值, m a i n main main 函数内该参数对应变量的值不会发生改变。
传址:
函数内部对形参进行修改, m a i n main main 函数内部实参随之发生修改。
注:开全局变量若在函数内改变,则在所有函数内该参数对应变量的值都会改变。
结构体
可以理解为一个集合存储不同类型的数据项。
结构体定义:
struct 结构体名
{
定义变量;
};
例如:
struct Stu
{
string name;
int id, score;
} stu;
这里定义了一个结构体变量 s t u stu stu,里面存储了姓名,学号,分数。
也可以用结构体数组。
struct Point
{
int x, y;
} p[10010];
这里定义了一个结构体数组 p [ ] p[] p[],里面存储了每个点的坐标 ( x , y ) (x, y ) (x,y)。
访问结构体里的元素用 .
几个常用 STL
vector 头文件(vector)
类似于数组……
vector<数据类型> 变量名;
v.size();
返回容器中元素的个数
v.empty();
判断容器是否为空
v.push_back(x)
往容器末尾插入
x
x
x
v.pop_back(x)
容器末尾删除
x
x
x
v.clear();
移除容器的所有数据
queue 头文件(queue)
当成排队,只能获取队头队尾信息,注意不能用下标访问。
queue<数据类型> 变量名;
q.size();
返回容器中元素的个数
q.empty();
判断容器是否为空
q.push(x)
往队列里面末尾插入
x
x
x
q.pop();
删除队头元素
q.front();
获取队头元素
stack 头文件(stack)
当成堆积木,每次获取顶部信息,注意不能用下标访问。
stack<数据类型> 变量名;
st.size();
返回容器中元素的个数
st.empty();
判断容器是否为空
st.push(x)
往栈顶放入
x
x
x
st.pop();
删除栈顶元素
st.top();
获取栈顶元素
set 头文件(set)
集合,每个元素有且只有一个,注意不能用下标访问。
set<数据类型> 变量名;
st.size();
返回容器中元素的个数
st.empty();
判断容器是否为空
st.insert(x);
往集合里添加元素
x
x
x
st.clear();
移除容器的所有数据
st.count(x);
查找元素
x
x
x 是否有
st.erase(x);
容器删除
x
x
x
map 头文件(map)
能帮你自动排序的哈希表,key - value 一一对应,根据 key 访问。
map<数据类型, 数据类型> 变量名
mp.clear();
清空容器所有东西
mp.size();
返回容器中元素的个数
mp.empty();
判断容器是否为空
头文件 algorithm 常用函数
max(), min(), abs()
顾名思义,最大值,最小值,绝对值。swap(x, y)
交换 x , y x, y x,y 两个值,也可以是迭代器。reverse(it1, it2)
数组或迭代器反转。sort(it1, it2(, func))
对数组或迭代器排序。lower_bound(st, ed, val)
找出 [ s t , e d ) [st, ed) [st,ed) 范围内第一个大于等于 v a l val val 的指针(迭代器)。upper_bound(st, ed, val)
找出 [ s t , e d ) [st, ed) [st,ed) 范围内第一个大于 v a l val val 的指针(迭代器)。
青年歌手大奖赛—评委会打分
#include<iostream>
#include<algorithm>
using namespace std;
int n;
int main()
{
while(cin >> n)
{
double sum = 0, mx = -1, mn = 110;
for(int i = 1; i <= n; i++)
{
double x;
cin >> x;
sum += x;
mx = max(mx, x);
mn = min(mn, x);
}
printf("%.2lf\n", (sum - mx - mn) / (n - 2));
}
return 0;
}