lesson_0 preface
方法
自学,自学,自学(重要的事说三遍)
编程学习和一般的课程学习不一样,在网络上有非常多优秀的资源(文档,网课,代码托管平台 github 等),如果想要走竞赛的路线,每周一两次课绝对是不够的,非常需要自身的主动性。
Do
学习编程最快的办法就是直接上手写代码,运行,debug。
教学
- 布置下一周的学习任务。
- 每周的小测验和讲解。
- 答疑(,手机号)
思路:实用主义,我们只学需要用到的,比如语言,我们只学你会用到的,不相干的比如成员,类,异常处理都一概不管
学习准备
- 一台笔记本(windows mac都行,能coding,上网,尽量轻薄)
- 一个记笔记的软件(typora或者vscode+插件,markdown语法)
- C++编译环境(MINGW64),一个代码编辑器(vscode或者sublime text),虽然更多的是用网上的编译器运行代码,但是你可以保存你的代码,便于复习等等
- 勤洗手,多学多写多练
学习路线&资源
-
C/C++语法 + 数据结构
-
网课
- 浙江大学翁恺C语言程序设计 (部分)
- 浙江大学数据结构(部分)
-
书籍
- Essential C++
-
算法
系统的学习算法,掌握模板(相当于背单词,非常重要),多练多学思路(需要沉淀)
- 代码测试平台(不推荐leetcode,不适合算法学习)
-
书籍
- 算法导论(暂时不需要)
- 算法竞赛进阶指南(暂时也不需要)
-
多参加比赛,积累经验
Lesson_1 变量&运算符&顺序语句
变量
类型 | 大小(64位系统) | |
---|---|---|
bool | 1Byte | 0,1 |
int, long long | 4Byte, 8Byte | 整数 |
char(string) | 1Byte | 字符 |
float, double | 4Byte, 8Byte | 浮点数(小数) |
指针 (int * ) | 8Byte | 地址(计算机寻址) |
这里都是有符号数(signed),无符号数(unsigned)基本上用不到
定义一个变量
变量类型 + 变量名
如下:
int a = 1;
char b = 'a'; // ASCII码值(0 ~ 255, 2^8)
float c = 0.1;
全局变量和局部变量(函数部分再将讲)
转义字符:
\n
:换行
\t
:制表位(tab键)
\0
:null
\'
:
\\
:
\"
:
运算符
算数运算符(一些小细节)
符号 | 含义 |
---|---|
+ | 加 |
- | 减 |
* | 乘 |
/ | 除( int / int 是舍去) |
% | 取余 |
此外还有关系运算符,逻辑运算符,
类型转换
强制类型转换
隐式类型转换
顺序语句
#include <iostream> // 头文件申明,相当于工具包,编译的过程中,编译器会连接这些库。
#include <cstring>
#include <algorithm>
using namespace std; // 省略std::,stl库
int main() // 主函数,顺序执行
{
expr1;
expr2;
return 0; // 函数返回值,0表示程序正常结束,其他数表示异常
}
标准输入输出
用于读数据和输出数据。
- C中的
scanf, printf
写起来相对繁琐,需要知道输入的具体格式,以\t, 空格, \n
作为 delimited
int scanf(const char *format, ...)
type | 输入格式 | 变量类型 |
---|---|---|
%c |
字符 | char * |
%d |
整型数据 | int * |
%f |
浮点数/小数 | float * |
%s |
字符串(这将读取后续字符,直到找到空格为止) | cahr * |
%p |
指针 |
#include <stdio.h>
int main()
{
int a, b;
scanf("%d%d", &a, &b); // 这里的`&`是引用,即取地址,地址在计算中是非常重要概念
printf("%d%d", a, b);
return 0;
}
- C++ 中的
cin, cout
C++中的cin, cout
对象是iostream
类的对象
#include <iostream>
int main()
{
int a, b;
cin >> a >> b;
cout << a << b;
return 0;
}
如果在数据量较大时,建议使用
scanf, printf
,会比较快。
判断语句
if, else, else if, expr1?expr2:expr3, switch...case
int main()
{
bool a = 1;
if (a == 0)
{
expr;
}
else if (a < 0)
{
expr;
}
else
{
expr;
}
var = expr1 ? expr2 : expr3;
switch (expr)
{
case constant1:
// statements
break;
case constant2:
// statements
break;
.
.
.
default:
// default statements
}
}
## Lesson_2 循环结构和数组
在顺序语句中,程序里面的每一行都被**依次**执行一遍。
在循环语句中,如果**条件**一直成立,会循环执行当前语句。
```c++
int main()
{
int n;
cin >> n;
while (n -- ) // while 循环
{
expr1;
}
for (int i = 1; i <= n; i ++ ) // for循环
{
expr2;
}
}
while
和for
循环基本上可以互相代替的(python 中就不存在while
循环)。
数组
[HTML_REMOVED]intuition:[HTML_REMOVED] 我们希望把一群相同类型的变量放在一起,并且不需要为他们单独的取名。
- array
直接对内存操作速度快,但是存在安全问题,并且难以扩容(算法中常用而现实工程建议使用vector)。
// 定义方式
// 1. 显示定义num_size
int a[8]; // 和之前的变量一样,变量类型 + 变量名 + [num_size]
for (int i = 0; i < 8; i ++ )
a[i] = i; // 利用for循环,输入array中的值
// 2 .
int b[] = {0, 1, 2, 3, 4, 5, 6, 7}
//主要区别在于,第一种显示定义了array长度,而第二种方式是程序自动计算出了我们数组的长度
// 操作方式
// 1. 索引操作
a[index]; // 数组名 + [index]
// 2. 指针操作
sort(a, a + num_size);
memset(a, 0, sizeof(a));
reverse(a, a + num_size);
- vector
STL中实现的数组,速度会慢一些,但是有很多内置的函数(书上记一些常用的)。
#include <vector> // 导入vector包
// 定义方式
// 1.定义长度
vector<int> a(8); // 与array一样,定义了一个长度为8的vector,里面保存的变量类型为`int`
// 2.不定义长度
vector<int> b = (a, a + num_size); // 利用array来定义vector
vector<int> c; // 只vector名称(其实就是开头),不指定大小,后续可以用append()来添加元素
利用循环结构和数组我们可以实现很多之前重复的操作。
```
Lesson_4 字符串
ASCII码
string类型的读写
cin >> str
该方法会跳过空格, \n, \t
getline(cin, str)
读取一行数据, 并且该方法会丢弃结尾的 \n
cin.get()
读取一行, 并且不会丢弃结果的\n
索引,属性
字符串的索引方式同数组
str.size()