C++从零开始の教程

Date: Mar 17 2020
Tag: Code


这是一个从零开始的C++教程,主要教基本语法,算法和数据结构。


本人是个OIer,更注重算法类的设计,不善于生活应用程序,但希望能将编程共同的算法精华传给更多人。


算法的写法不是最重要的,更重要的是算法和实际问题结合的思维,学习编程对学习生活也大有所益。


希望能有更多的Coder加入!


Menu

  • 1.C++编辑器和环境
  • └─ 1.1 C++IDE
  • 2.C++基础语法
  • ├─2.1 第一个程序HelloWorld.cpp —— 简单的输出与输入
  • │    ├─cin & cout
  • │    └─scanf & printf
  • ├─2.2 “a+b”Problem —— 变量的定义及运算
  • ├─2.3 “To be or not to be” —— if判断语句(计划中)
  • │    ├─if & else
  • │    ├─if条件中的逻辑运算
  • │    └─switch & case
  • ├─2.4 “Sumary 1 to 100” —— for & while循环 (计划中)
  • │    ├─for
  • │    └─while
  • ├─2.5 “the game of a salty fish” —— 数组的存储及应用 (计划中)
  • └─2.6 Point —— 简单了解指针 (计划中)

1.C++编辑器和环境


1.1 C++IDE

学习一门语言当然要先有一个IDE与之配套啦。

以下是2个推荐的C++のIDE

1.Dev-C++

轻量级的编辑器,使用方便,下载简单。

主要的问题是调试能力比较弱。

[Download from sourceforge.net]

2.Vscode

轻量版Visual Studio,可自定义化模块、拓展,使用方便,界面清爽。

主要问题是安装须配置调试环境,不方便临时安装,建议安装在常用电脑上。

[Download from microsoft]

建议使用Code runner插件,支持多语言,不用配置环境,只需提前安装好对应语言的编译/解释器。

网上关于这两个软件的安装教程众多详细,不在此赘述。


2.C++基础语法


2.1 第一个程序HelloWorld.cpp —— 简单的输出与输入

好啦,安装完了IDE,就开始写第一个属于自己的HelloWorld程序吧!

  • 1.打开你的编辑器
  • 2.创建一个test.cpp
  • 3.输入以下代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    //引用头文件 
    //#include <官方头文件>
    //#include "自己的头文件/代码"
    #include <iostream>
    #include <cstdio>

    using namespace std; //引用std命名空间,包括cin,cout函数等

    int main() //定义主程序入口,程序从这里开始运行
    { //使用{}大括号限定范围
    cout << "Hello World!" << endl; //输出Hello World/endl表示换行
    return 0; //结束主程序,并返回0(运行正常)
    }
  • 4.[DevC++]按f11编译运行这段代码。

怎么样?看到输出的Hello World了吗?这就是属于你的第一个程序了。


2.1.a cin & cout

cin cout 顾名思义 c in 是输入 c out 是输出。

cin cout 是c++特有的输入输出方式,属于namespace std

如果不在程序开头写 using namespace std;
在调用时需要添加 std::表示调用std命名空间
具体方法会在下方样例程序中展示

我们继续修改上个程序,并展示不使用using namespace std的调用cin cout方法。

1
众所周知,每个OIer都有对Visual Girlfriend的幻想,我们来写一个对VG(幽灵军校[确信])表白的程序。
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <cstdio>

//using namespace std;
//这里注释掉方便演示

int main()
{
char name[100];//定义一个长度为100的字符串,在下一章会做详细讲解
std::cin >> name;
std::cout << "I love u, " << name << endl;//输出"I love u, Girlfriend的名字"
return 0;
}

这里总结一下cin和cout的优缺点:

  • Advantages
  1. 使用方便,在输入较少数据和字符串的时候,快捷方便
  2. 对数据有一定自适应能力,不容易出错。
  • Disadvantages

1.处理大量数据的时候速度远不如scanf和printf,1e5个以上的输入输出需求不建议使用
2.使用cout输出时,要””和变量拼接,比较麻烦。如

1
cout<<my_name<<" love "<<girl_name<<"!";

2.1.b scanf & printf

我们还是以上面两个程序为模板,只不过把cin&cout换成scanf和printf

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <cstdio>


int main()
{
char name[100];
scanf("%s", name);
printf("I love u, %s", name);
return 0;
}

可以很明显发现:

  • scanf和printf用法相似,格式为(“%xxx”,value);
  • %xxx是控制符
  • 其中%xxx代表后面的变量,%xxx与变量类型对应关系如下
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //%控制符关系表
    %d int(十进制)
    %x/%X 16进制输出某数
    //16进制下A-F字母大小写,与x大小写相同
    %lld long long int
    %f float
    %lf double
    %LLF long double
    %s string //字符串 char[]
    %c char
    如果想要用scanf输入一个数字则需以下格式:
    1
    2
    3
    int a;
    scanf("%d", &a); //&表示取a在内存中的地址,将输入内容写到a的内存地址里
    printf("%d", a); //print时不需要加&,直接输出a的变量值
    P.S.输入字符串时(%s)不应+&,因为字符串本身就是一个指针,一个内存地址,不需要添加&转译地址。

同时scanf和printf可以同时输入输出多个数值:

1
2
3
int a, b;
scanf("%d%d", &a, &b); //多个变量间以英文半角逗号","隔开
printf("%d %d", a, b); //会输出a空格b。

在printf中无法使用endl换行,但可以使用”\n”表示换行,一下还有一些使用技巧

1
2
3
4
5
6
7
8
9
10
11
\n    换行
\b 光标回到本行开头
%.5f 保留小数点后五位,四舍五入
//同样适用于%lf %LLF
%5f 设置输出敞宽为5
//比如变量值为233,则会输出" 233"以空格补在开头至5个字符
//若超过设置长度则以实际位数输出
//适用于绝大部分控制符
\\ 输出\
\" 输出"
%% 输出%

2.2 “a+b”Problem —— 变量的定义及运算

题源:LuoguP1001

[题目描述]

输入两个整数 a,b 输出它们的和(|a|,|b|<=10^9)。

[分析]
很简单的题目,只要定义a,b两个变量,进行输入,输出a+b即可

1
2
3
4
5
6
7
8
9
#include <bits/stdc++.h> //万能库

int a, b; //定义a,b两个整形
int main()
{
std::cin >> a >> b;
std::cout << a + b;
return 0;
}

提交一发轻松AC。

很显然,上述解题过程中,我们使用了a,b两个int变量

  • 但如果我们对题目稍加修改
  • 变为:

    输入两个数 a,b 输出它们的和(保留3位小数)(|a|,|b|<=10^9)。

[分析]
这里没有说明a,b是整数,可能存在浮点数,这里我们就需要用到float浮点数

1
2
3
4
5
6
7
8
9
#include <bits/stdc++.h> //万能库

float a, b;
int main()
{
scanf("%f%f", &a, &b);
printf("%.3f", a + b);//保留三位小数 %.3f
return 0;
}
  • 那假如a,b的范围再大一些呢?

    输入两个整数 a,b 输出它们的和(|a|,|b|<=10^12)。

此时 a+b <=2e12 超过了2^31,也就是int的最大范围
为了解决这个问题,我们可以使用long long来代替int即可

可见我们应当注意数据类型的大小范围,来选取数据类型。

以下是各数据类型的范围

1
2
3
4
5
6
7
8
int         -2^31 ~ 2^31  整数  %d
long long -2^63 ~ 2^63 整数 %lld
// 符号位 + 指数位 + 尾数位
float1bit + 8bits + 23bits 浮点数(精度6~7位) %f
double1bit + 11bits + 52bits 浮点数(精度15~16位)%lf
long double 128bit in total 浮点数(精度17~18位)%llf
// 此外 这些数据类型可以在其之前加上unsigned 舍去负数范围,整数范围翻倍,控制符为%u
// 以int为例 unsigned int 0 ~ 2^32 控制符%ud

今天先写到这里,上网课去了,该教程会保持更新。

– Mar 17 8:17


 
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×