这是我自创的C++教程捏~
藏起来的东西居然被你发现了!
\color{white}{藏起来的东西居然被你发现了!}
藏起来的东西居然被你发现了!
一、搭建C++编程环境
1.下载
先在网上找到一个你喜欢的IDE,下载即可。如Dev-C++, Visual Studio, Visual C++, …
以下默认IDE为Visual Studio。
2.创建项目
欢迎界面:
如何创建项目:
点新建项目:
点确定:
点下一步:
点确定,好,项目创建完毕!
点右边“解决方案资源管理器”:
右键“源文件”,选择“添加”,点“新建项”:
下面的“名称”可以随便更改,只要最后是.cpp
就行。
点“添加”:
以后写代码就在这里写:
注:因为我写的代码不是真正的代码,有错误,所以会提示语法错误(下标红色波浪线) \color{gray}{注:因为我写的代码不是真正的代码,有错误,所以会提示语法错误(下标红色波浪线)} 注:因为我写的代码不是真正的代码,有错误,所以会提示语法错误(下标红色波浪线)
点击“本地Windows调试器”运行。
二、Hello World
1.正常
直接输入以下代码:
#include <cstdio>
using namespace std;
int main()
{
printf("Hello World!\n");
getchar();
return 0;
}
样子:
运行一下,出来了个大黑框,长这样:
按一下Enter,或者按右下角的
×
\times
×都可以关掉。
2.实验
1.内容
接着,做个实验:把程序双引号中的Hello World!\n改成其他的(一定要加双引号),比如ooo
,中文English
,普通符号+-*/
,特殊符号△▲☺☀▁▂▃▄▅▆▇█ʊəнъㅆㅘ㉮₃²
,双引号"
,反斜杠-\beautiful
和反斜杠在末尾呢?\
。
2.结果
ooo
输出结果ooo
,符合预期中文English
输出结果中文English
,符合预期普通符号+-*/
输出结果普通符号+-*/
,符合预期特殊符号△▲☺☀▁▂▃▄▅▆▇█ʊəнъㅆㅘ㉮₃²
这个要看你电脑怎么样,IDE怎么样。。我的结果是特殊符号△▲??▁▂▃▄▅▆▇█??нъ?????
,后面的输出不了双引号"
错误,没法运行反斜杠-\beautiful
输出反斜杠eautiful
,看起来很奇怪,以后再探讨反斜杠在末尾呢?\
错误,没法运行
三.输入,输出,变量
1.代码模板
这是写代码时候的模版
#include <cstdio>
using namespace std;
int main()
{
//在这里写上你的代码。。。
//代码最后面一定要加上;(分号)
getchar();
return 0;
}
2.输出
输出通常会用printf,比如前面说的Hello World,用的就是printf("Hello World!")
,最后一定要加上个分号别问我为什么,问C++创始人去。
输出数字
先上代码:
#include <cstdio>
using namespace std;
int main()
{
printf("%d", 114514);
getchar();
return 0;
}
输出结果:114514
发现了什么了吗?
输出数字时要在printf的两个双引号之间加上%d
,再在双引号后面加上逗号,逗号后面加上数字。(中间的空格可加可不加)
数字+文字
还可以这样:
#include <cstdio>
using namespace std;
int main()
{
printf("我今天吃了%d个苹果", 3);
getchar();
return 0;
}
输出结果:我今天吃了3个苹果
输出数字的时候还可以和文字一起输出,就像这样,printf会把%d自动换成数字。
多个数字
还有这样:
#include <cstdio>
using namespace std;
int main()
{
printf("妈妈去超市买了%d个苹果,%d个梨,%d卷纸巾", 123, 456, 114514);
getchar();
return 0;
}
输出结果:妈妈去超市买了123个苹果,456个梨,114514卷纸巾
发现:妈妈好有钱啊输出的时候还可以有多个数字,printf会把第一个%d换成第一个数字,第二个%d换成第二个数字…以此类推
但是,如果两个%d一起,这两个数字会连在一起,比如printf("%d%d", 123, 456);
会输出123456。
输出小数
printf功能非常强大,还可以输出小数(其他的也可以,只是暂时不需要):
#include <cstdio>
using namespace std;
int main()
{
printf("%g+%g=%g", 1.2, 3.4, 4.6);
getchar();
return 0;
}
输出结果:1.2+3.4=4.6
输出小数和输出整数一模一样,只是把%d换成了%g而已。
别的教材中可能会说,不是%g,是%f,%lf这些,其实都差不多,但是有细微的差别:%f输出会有6位小数,%g是有几位就输出几位,比如把例子中的%g改成%f,就是1.200000+3.400000=4.600000。
算式
还可以输出算式,不过这不是printf的功能,在C++哪里都可以用:
#include <cstdio>
using namespace std;
int main()
{
printf("%g*%d+%g=%g\n", 1.25, 8, -9.0, 1.25*8+(-9));
getchar();
return 0;
}
输出结果:1.25*8+-9=1
这个就不多说了。
注意
注意:不能把%d对应的数字打成小数,也不能把%f对应的数字打成整数,要不然会是0或者乱码(如1911829346)
2.变量
C++有个东西呢,叫变量,它常常把人们搞得头昏脑涨,失魂落魄,不明所以,泪如雨下,熬夜到凌晨3点半。。。
好了不废话了,我们先来看看这个:
定义
#include <cstdio>
using namespace std;
int main()
{
int IAKIOI;
getchar();
return 0;
}
输出结果:没输出
这些代码定义了一个变量叫做IAKIOI,可以存放整数,还没存放:
int IAKIOI ;
↓ ↓ ↓
这个变量可以存放整数 这个变量叫IAKIOI 这里也要加分号
类型
(int是integer的缩写)
类型 | 前面的东西 | 范围(太大存不下) |
---|---|---|
整数 | int | − 2 64 → 2 64 − 1 -2^{64} \to 2^{64}-1 −264→264−1 |
小数 | double | 我有一个绝妙的数字,可以这里空白太小,写不下 |
逻辑(后面会讲) | bool | 0 , 1 0,1 0,1(假,真) |
字符(就一个) | char | 不同的不一样:实际上有用的是 0 → 127 0 \to 127 0→127 |
注意,这里和printf不同,把小数放到整数变量里面没错,只是小数部分没了,把整数放到小数变量里面就更没错了,相当于小数放进去。
变量名命名规则:
- 只能由数字,字母和下划线组成
- 数字不能在开头
- 不能是关键字(关键字是什么后面讲)
比如:abcdef
可以,Apple
可以,I_AK_IOI_AND_IOI_AK_YOU
可以,a1145141919810
可以,s123!2j
不可以,一个小变量
要看IDE,标准是不支持,有些IDE有额外拓展,1gexiaobianliang
不可以,int
不可以,long
不可以,I see you
不可以。
初始化,赋值,注释
#include <cstdio>
using namespace std;
int main()
{
int a = 1;
getchar();
return 0;
}
输出:还是没有输出
这个程序定义了一个变量a,可以存放整数, = 1
代表一开始就放进去一个整数1。
所以最后a里面是1。
#include <cstdio>
using namespace std;
int main()
{
int a = 2; //初始化
a = 312; //赋值
getchar();
return 0;
}
输出:没有。
大家可能有疑惑:直接在代码里写初始化,赋值这些字,不会报错吗?其实大家注意到没有,这些子前面都有//
,//
代表注释,专门在代码里面写解释,从//
到这一行末尾的字全都没用,会被忽略掉,就是给人看的。
同样的注释符号还有/**/
,从/*
到*/
之间的字也是全都被忽略掉,但是如果只有/*
或者只有*/
,会报错。
回归正题(敲黑板):
int a=2;
这个大家都熟悉,那么a=312
呢?
a=312
就是把原本a里面的数字扔掉(不管他是几,都扔),然后再把312放进去(因为只有一个位置)。
也就是,执行完后,a就会是312而不是2了,再也找不到2了,所以操作时要慎重。
自更新
变量还可以自更新,比如:
#include <cstdio>
using namespace std;
int main()
{
int a = 1; //放进去1
a = a + 3; //把1扔出来,放进去a+3,也就是1+3,也就是4
a /= 2; //把4扔出来,放进去a/2,也就是4/2,也就是2
getchar(); //最后a是2
return 0;
}
输出:无
a = a+3
这行代码是怎么执行的呢?
- 先算出a+3
- 计算a+3时,发现有变量a,替换成a里面的东西,变成1+3
- 计算1+3=4
- 把a原来的东西扔出来
- 把刚刚算出来的4放进去
所以执行完后,a=4。
那a /= 2
又是什么意思呢?
其实,a /= 2
就相当于a = a/2
。
举一反三:
a += x
就相当于a = a + x
a -= x
就相当于a = a - x
a *= x
就相当于a = a * x
输出
再也不是漆黑一片啥都没有咯~
输出,也用printf,只是把数字改成了变量名而已。
#include <cstdio>
using namespace std;
int main()
{
int a = 21; //a = 21
a += 7; //a = 28
a /= 7; //a = 4
a -= 7; //a = -3
a *= 7; //a = -21
a = -a; //a = 21
printf("a是:%d", a);
getchar();
return 0;
}
输出:a是:21
这个相信大家都能看懂,就不多说了啊~
输入
以前我们的程序都是每次运行都一样,想要不一样就得修改我们的程序,但是现在我们有了一种在程序运行的时候就可以“修改”我们的程序的方法:输入。
比如,我们写了一个计算器,要计算1+3,可以是这样:
#include <cstdio>
using namespace std;
int main()
{
int a = 1;
printf("%d+3=%d", a, a+3);
getchar();
return 0;
}
要计算2+3,就得把1改成2。
但是现在,我们要计算n+3,这个n要求不能修改程序,并且每次都可以用敲键盘来决定,这就要用到输入
正像输出有一个printf函数,输入也有一个函数,叫做scanf。
用法:scanf("类似printf的字符串,比如%d,%d%d,%lf%d", &变量名1, &变量名2, ...);
还有,scanf输入小数就不能用%g了,要用%lf,不过敲键盘的时候不用6位小数。
注意:
- 变量名前面一定要加
&
! - 变量名前面一定要加
&
! - 变量名前面一定要加
&
! - 重要的事情说三遍!
比如:
#include <cstdio>
using namespace std;
int main()
{
printf("妈妈买了一些苹果,我吃了3个,还剩几个呢?\n妈妈买了几个苹果呀:");
int apples;
scanf("%d", &apples);
apples -= 3;
printf("还剩%d个苹果。\n", apples);
getchar();
return 0;
}
怎么输入呢?先敲键盘输入数字,再按下Enter,表示“我输完了”
第一次输入:123
第一次输出:
妈妈买了一些苹果,我吃了3个,还剩几个呢?
妈妈买了几个苹果呀:(在这里输入了123)
还剩120个苹果。
第二次输入:114514
第二次输出:
妈妈买了一些苹果,我吃了3个,还剩几个呢?
妈妈买了几个苹果呀:(在这里输入了114514)
还剩114511个苹果。
看,输出不一样了!
注意看
双引号里面的\n是什么意思呢?表示的是“换行”,也就相当于我们按下Enter键,换新的一行。
注意!!!
scanf不能像printf一样在里面还插入文字,如果插入了的话,比如scanf("妈妈买了几个苹果呀:%d", &apples);
,就会先一直等待,知道输入妈
字,然后还会一直等待,知道输入第二个妈
,然后会等待输入买
,然后会等待输入了
…输入完这些之后,在输入数字才能行,很多人都会犯这个错误,尤其是从Python转来的
四、表达式,分支,循环,数组
注!
我的代码里会有{
}
,有的教程里说如果只有一条语句(比如printf("Hello World!");
就是一条),就不用加{
}
,但是可能会犯糊涂。(我同学就在最近犯了这个错,if
错位。。。惨)
表达式
数学表达式
数学 | 程序 | 注 |
---|---|---|
a + b a+b a+b | a+b | |
a − b a-b a−b | a-b | |
a × b a \times b a×b | a*b | |
a ÷ b a \div b a÷b | a / b | 如果 a , b 均为整数,则结果向0取整。如果要得到精确的结果,需要1.0*a/b |
a b a^b ab | pow(a, b) | 使用前需要再整个程序的最前面加上 #include <cmath> |
a \sqrt{a} a | sqrt(a) | 使用前需要再整个程序的最前面加上 #include <cmath> |
{ [ ( ) ] } \{[()]\} {[()]} | () | 数学中的所有括号在编程中都是小括号。 |
常用的就这么多,其他自己查。
比如:
a
×
(
b
+
c
÷
d
)
a \times (b+c \div d)
a×(b+c÷d) 就是 a*(b+1.0*c/d)
逻辑表达式
这个。。。学过逻辑学的会更好理解,但是我也没学过。
逻辑 | 程序 |
---|---|
a与b(a,b同时成立) | a && b |
a或b(a,b至少一个成立) | a ∣ ∣ || ∣∣ b (你猜我为什么不用Markdown?) |
非a(a成立->不成立 a不成立->成立) | !a |
在程序中,定义一个逻辑变量(假设名字为miao)代码为:
bool miao;
或者
bool miao = ......;
把…替换成逻辑表达式。
当然bool变量也可以像普通变量一样赋值:
bool miao = ......;
miao = miao || !miao; //莎士比亚电路(有兴趣的自己查)
附吐槽:CSDN的KATEX真不好用,字都是斜着的
附连续吐槽:CSDN的表格真难用,都不能有字符 |
的
分支
分支就是这个:
我看见有人一脸懵逼。。。
没事,更简单的解释:分支就是分支。
好吧,分支就是选择,有一个逻辑表达式(见上),如果为真,则执行…。如果为假,执行…。
比如:
老师改作业时,如果对,打钩,如果错,打叉。这就是分支。
大概就是这样:
如果 题目正确:
打钩
否则:
打叉
if
在C++中,分支用if
关键字:
if(problem_correct)
{
printf("√");
}
else
{
printf("×");
}
那么else是什么意思呢?
else
else代表否则。
if(problem_correct)(代表如果):√
else(代表否则):×
多条件判断
if(第一个条件)
{
aaa
}
else if(第二个条件)
{
bbb
}
else if(第三个条件)
{
ccc
}
......
else if(倒数第二个条件)
{
yyy
}
else
{
zzz
}
暂时不用理解原理。。。。。。
什么?你想知道原理?
if(...)
{
...
}
else
{
if(...)
{
...
}
else
{
if(...)
{
...
}
else
{
......
}
}
} //请自行理解。
switch-case
switch(abcdefg)
{
case a: ......; break;
case b: ......; break;
case c: ......; break;
...
case z: ......; break;
default: .....; break; //可以不加
相当于:
if(abcdefg == a) ......
else if(abcdefg == b) ......
else if(abcdefg == c) ......
...
else if(abcdefg == z) ......
else ......
为什么要有个break呢?
不加试试
有时候故意踩坑是一种好的学习方法(真的)
#include <cstdio>
using namespace std;
int main()
{
int x;
printf("输入一个正整数x:");
scanf("%d", &x);
switch(x)
{
case 1: printf("1\n");
case 2: printf("2\n");
case 3: printf("3\n");
case 4: printf("4\n");
case 5: printf("5\n");
default: printf("都不是。\n");
}
//自己看看吧~
return 0;
}
循环
循环,就是重复很多次。
比如我们要输出一百个 Hello World!
,要不要写100次printf呢?呵呵。
for循环
代码:
#include <cstdio>
using namespace std;
int main()
{
for(int i=1;i<=100;i++)
{
printf("Hello World!\n"); //输出
}
getchar();
return 0;
}
如果你很闲的话,数一数有多少个 Hello World!
,是100个没错QwQ。
我就写了一个Hello World,所以1=100。
Why?
#include <cstdio>
using namespace std;
int main()
{
for(int i=1;i<=100;i++)
{
printf("循环:这是第%d次,共100次\n", i); //输出
}
getchar();
return 0;
}
是不是明白一点了?这里新建了一个变量 i
,从1开始,到100结束。
所以这个for循环相当于:
int i = 1;
if(!(i <= 100)) 结束。
printf("循环:这是第%d次,共100次\n", i);
i++;
if(!(i <= 100)) 结束。
printf("循环:这是第%d次,共100次\n", i);
i++;
if(!(i <= 100)) 结束。
printf("循环:这是第%d次,共100次\n", i);
............
哦,所以
for(a; b; c)
{
d
}
相当于
a;
if(!(b)) 结束。
d
c
if(!(b)) 结束。
d
c
......
while循环
f
o
r
\color{purple}{for}
for 变成紫色的了!
w
h
i
l
e
\color{purple}{while}
while 也变成紫色的了!
while循环格式:
while(a)
{
b
}
简单吧?
说不简单的是小狗!
汪汪汪!
while循环:
if(a) 结束。
b
if(a) 结束。
b
if(a) 结束。
b
......
难吧?
说不难的是小猫!
喵呜!喵呜!喵呜!
附:
for(a; b; c)
{
d
}
=
a
while(b)
{
d
c
}
数组
数组是什么?
是很多数。
啊?????
比如你可以定义一个数组,长度为10000000000000000,相当于10000000000000000个变量。
不过这些变量都是在你自己电脑里的,先看看你电脑有多少内存,看看会不会爆。。
-----------------------------------------不是很华丽的分割线:上面的都是废话------------------------------------------
不完全是废话。
\color{white}{不完全是废话。}
不完全是废话。
定义数组:
int arr[1005];
这个数组里有1005个变量,他们分别是:
arr[0] arr[1] arr[2] arr[3] arr[4] arr[5] … arr[1004]
注意:没有arr[1005]!
通常,我们在定义数组时会多定义5~10个数,比如需要1000个数,我们就会定义int arr[1005]
,使用arr[1]到arr[1000]。
斐波那契数列:
#include <cstdio>
using namespace std;
//数组一定要定义在这里!
//这里!
//这里!
int feibonaqi[1005];
int main()
{
feibonaqi[1] = feibonaqi[2] = 1; //新奇的写法:连续赋值
// 相当于feibonaqi[1] = 1; feibonaqi[2] = 1;
for(int i=3;i<=1000;i++)
{
feibonaqi[i] = feibonaqi[i-1] + feibonaqi[i-2]; //这一项相当于前面两项之和
}
printf("斐波那契数列第1000项:%d\n", feibonaqi[1000]);
return 0;
}
注意!以上程序不可以正确求出斐波那契数列第1000项!!!会溢出!!!(详见三.输入,输出,变量->2.变量->类型)
懂?
吃饭去。