目录
1.第一个C++程序
1.1 创建文件
博主有一定的C语言基础,于是就不从“Hello World!”开始写了哈哈,因为那样显得我很呆。
【博主的编程环境是Visual Studio 2019,因为我看它比较顺眼】
我将编写一个C++程序分为四步:
1.创建项目
2.创建文件(包括源文件和头文件)
3.编写代码
4.运行程序
首先打开VS2019,并创建一个项目,图中显示的即为编写C++的界面,中间那最大的一块儿就是写代码的地方,右边的红色框显示了我已经创建好的头文件和源文件,上文提到如果从写“Hello World!”程序开始就显得我太呆了,于是我写了一个“Hello C++”的程序。
#include<iostream>
#include<ctime>
using namespace std;
int main() {
/*这是一个输出“hello C++”的程序*/
cout << "hello C++" << endl;//这一条语句打印输出hello world
system("pause");
return 0;
}
#include<iostream>
#include<ctime>
这两行代码是用来调用头文件的,我们可以使用系统提供的一些头文件,也可以调用我们自己设计的头文件,在调用自己设计的头文件时,最好用下面这种格式。
#include "mp.h"
#include"swap.h"
引号的意思是,编译器会优先在你的项目中寻找头文件,如果没找到的话,再去系统指定的区域去找。
using namespace std;
这一行代码直接翻译过来就行,“使用命名空间”,std的意思是标准的。我们要使用一块标准的命名空间,才能继续我们的代码操作。有没有不标准的?我也不知道,以后再说吧。
int main() {
/*这是一个输出“hello C++”的程序*/
cout << "hello C++" << endl;//这一条语句打印输出hello world
system("pause");
return 0;
}
这就是我们代码的主体内容了,整个代码块有且仅有一个主函数(main函数),在主函数我们开始我们的操作了。
1.2 注释
注释的作用是:方便阅读,让自己和其他阅读你的代码的人明白你这个函数或者你这条语句的作用。注释不会被编译器执行。一个优质的程序都要有明确的注释,让人读来心情愉快!
注释有两种形式:单行注释和多行注释
/* 这是多行注释的形式 */
// 这是单行注释的形式
具体使用哪一种,看我心情吧!
cout << "hello C++" << endl;
这一条语句的作用是用来打印输出“hello C++”这句话的,C语言中的打印输出是用printf关键字,C++与之不同,使用cout关键字和“<<”符号,endl的作用相当于C语言中的换行符“\n”。
大家可以这样记忆它:cout = c + out,c是C++;out是输出。endl = end + l,end是结束;l是line行,意思是结束这一行,开始下一行,也就是换行。
这样我们的第一个C++程序就创建完成了,点击上方绿色小三角,我们的程序就可以跑起来了!
1.3 变量和常量
下面我们试着在程序中定义和输出一些变量和常量。
变量的作用是:给一段内存起名,方便管理与使用。
定义变量的语法是:数据类型 变量名 = 初值
int a = 10;
常量的作用是:记录一些不可改变的数据,以防有图谋不轨的某某篡改捏数据。
定义常量有两种常用的形式:使用宏定义、使用const关键字。
宏定义一般会写在头文件和命名空间之下、程序之前,下面是宏定义形式。
#define b 10;
一旦进行了宏定义,就意味着b这个字符和10这个数值绑在一起了。
我们也可以在数据类型前面加上const关键字,告诉系统这个变量已经不能更改了!
const int a = 10;
2.数据类型
意义:给每个数据分配合适的内存空间,比如字符型数据,它本来需要一个内存空间就能保存下来了,如果你非要用4个内存空间去保存它,这就会造成空间浪费!可能你觉得这没什么,但是你的计算机过不了多久就会抗议了!
数据类型有很多,这里我就列举一些最常用的。
整型 :short、int、long、long long
实型:float、double
字符型:char
字符串型:string
布尔类型:bool
我们可以用关键字sizeof()查看它们占用内存的大小。
有的数据类型,有多种定义方法,它们之间的不同是字节长度不同,即:可以定义的数值的取值范围不同。我平时也用不到那么大的数据,所以我就没记住它们的取值范围。
const int a = 10;
cout << "sizeod(short)= " << sizeof(short) << endl;
cout << "sizeof(int)= " << sizeof(int) << endl;
cout << "sizeof(a)=" << sizeof(a) << endl;
cout << "sizeof(long)=" << sizeof(long) << endl;
cout << "sizeof(long long)=" << sizeof(long long) << endl;
使用sizeof关键字查看它们的字节长度,我们一起看一下结果。
这里输出了它们的字节长度,并且我们发现,我在上面定义了一个整型变量a,当输出a的长度时也可以输出整型的字节长度!
其他的数据类型长度博主就不一一演示了,大家可以自行探索。
最后,说一下一些比较懵逼的问题。
(1)string字符串类型怎么创建字符串
C++的字符创创建于C语言有些许的差别。
C语言创建字符串的形式:
char 变量名[ ] = “字符串”;
char str[] = "abcd";
C++创建字符串的形式:
string 变量名 = “字符串”;
string str = "abcd";
VS2019不需要调用“string”这个头文件,其他编译器可能需要你提前调用一下这个头文件,不然会报错。
(2)布尔数据类型是个啥子
布尔数据类型的变量只有两个值:True/False,也就是说它的返回值只有1/0,它的定义方法如下:
bool 变量名;
bool n = 10;
cout << n << endl;
输出结果如下:
为什么定义的n等于10,而输出却是1呢?因为布尔数据类型只有1和0两个返回值,只要你给它的数据不是0,其他的任何东西它都会认为是1。
最最后,补充一点点知识:从键盘输入数据。使用关键字cin,大家也可以拆分记忆,cin = c + in,c就是C++,in就是进入,也就是从键盘输入。
它的语法如下:
int x = 0;
cin >> x;//从键盘输入一个值x
cout << "x= " << x << endl;
输入结果如下:
你会了cin这个关键字,那么恭喜你!就已经会进行初级人机交互了!
3.程序流程结构
程序流程结构分为顺序结构、选择结构、循环结构、跳转语句等,顺序结构太简单了,就是一行一行的无脑执行,这一部分就不介绍了。
程序流程结构是程序的骨架,有时候决定了你程序运行的效率与算法的牛批程度,所以我们一起来认识一下吧!
3.1 选择结构
3.1.1 if语句
(1)单行if语句
语法:if(条件){语句}
讲解:如果括号内的条件成立,那么就会执行大括号里的语句。
示例如下:
int a = 10;
int b = 20;
if (b > a)
{
cout << "b比a大" << endl;
}
我们一般会把大括号换行一下,并使用一些缩进,这样会让程序的可读性更强。
(2)多行if语句
语法:if(条件){语句1} else{语句2}
讲解:如果括号内的条件成立就执行语句1,否则就执行语句2。
示例如下:
int a = 10;
int b = 20;
if (b > a)
{
cout << "b比a大" << endl;
}
else
{
cout << "b比a小" << endl;
}
当你学会了这两种基本的使用方法后就可以随便耍了!比如下面这种玩法。
(3)嵌套if语句
int a = 10;
int b = 20;
int c = 30;
if (b > a)
{
if (c > b)
{
cout << "c最大" << endl;
}
}
当然,你也可以做无数层选择结构。
【此处严禁套娃】
3.1.2 三目运算符
三目运算符不是很常用,至少我很少用,但是有时候它可以简化代码,让代码的可读性更好。
语法:表达式1 ?表达式2:表达式3
讲解:若表达式1为真,则执行表达式2,否则执行表达式3
示例如下:
int a = 10;
int b = 20;
b > a ? (cout << "b比a大" << endl) : (cout << "a比b大" << endl);
可以看到,刚才我们的if语句可以被这一行代码所代替,而作用却是相同的。
3.1.3 swich语句
语法:swich(表达式){
case 结果1:语句1;break;
case 结果1:语句1;break;
…
default:语句n+1;break;
}
讲解:表达式一般是一个变量,case1到n是这个变量不同的取值。当取到对应值时,会执行后面相应的语句。如果所有取值都没找到,那么就会执行最后的default后的内容。
示例如下:
我写了一个电影评分的程序,用户输入自己心中的评分,会输出对应的电影水平。
cout << "请给电影打分" << endl;
int s = 0;
cin >> s;
cout << "您打的分数是" <<s<< endl;
switch (s)
{
case 10:
cout << "您认为是经典电影" << endl;
break;
case 8:
cout << "您认为是好片" << endl;
break;
case 6:
cout << "您认为一般" << endl;
break;
default:
cout << "您认为是烂片" << endl;
break;
}
运行结果如下:
细心地人会发现,每一条case语句后都会有一个break,那么这个break有什么作用呢?
我们先试一下如果去掉break会怎么样。
可以看到,我输入了一个10分,但是没有输出对应的“经典电影”,而是将所有的评价都输出了。
所以,break的作用:在找到这个变量对应值,并执行完响应语句后,跳出swich这个选择结构,不让系统继续执行下面的语句了。
3.2循环结构
3.2.1 while循环
语法:while(条件){语句}
讲解:如果while括号内的条件成立,则会一直循环执行大括号内的语句
这里用一个猜数字的趣味小程序对while循环进行演示:
首先,我们需要先学习一些生成随机函数rand()%n
int num = rand() % 100 + 1;//生成一个0+1-99+1的随机数
但是这条语句生成的是一个伪随机数,每次执行程序时得到的随机数都相同,因此我们需要调用一个头文件,并写一行代码,让我们的随机数是根据系统时间生成的随机数,这样的随机数才是真正的随机数!
下面是需要调用的头文件ctime
#include<ctime>
下面是根据系统时间生成随机数的语句
srand((unsigned int)time(NULL));//根据系统时间生成一个随机数种子
下面我们让用户输入一个数val:
int val = 0;
cout << "请输入一个1-100之间的值:" << endl;
cin >> val;
下面是while循环的主体:
while (1) {
if (num < val) {
cout << "猜大了" << endl;
cin >> val;
}
else if (num == val){
cout << "猜对了!" << endl;
break;
}
else {
cout << "猜小了" << endl;
cin >> val;
}
}
while的条件是1,也就是说条件一直为真,也就是说如果没有例外的话,这个程序会无限的执行下去!
但是我们的本意是:用户猜对了数字后程序退出,所以我们在用户猜对数字的if选择语句时,添加了一条break语句,break语句可以让我们跳出当前循环。
else if (num == val){
cout << "猜对了!" << endl;
break;
运行结果:
随便提一句,这里博主猜数字时使用了二分法,这可以让程序时间复杂度由O(n)优化到O(logn),大大提高了程序执行效率!
3.2.2 do-while循环
语法:do{循环语句} while(循环条件);
讲解:do-while与while稍有不同,do-while结构是先执行一遍循环语句,在判断while小括号中的循环条件,如果循环条件为真,则会再次循环执行do中的循环语句
示例如下:
int a = 1;
do {
cout << "我是大帅比!" << endl;
}while(a < 1)
结果如下:
执行过一遍do中语句后,程序发现a不满足while中的条件,于是博主就当了一次大帅比就退出了。
如果我想当多次大帅比,那么我们只需将while中的条件改一下:
int a = 1;
do{
cout << "我是大帅比!" << endl;
} while (a < 2);
结果如下:
这时,程序会无限的执行下去,可以当无数次的大帅比!
但是这时非常危险的,我们在实际编程中应该避免出现死循环的情况,否则会导致程序崩溃!
3.2.3 for循环
for循环可以说是最常用的一种循环结构了,接下来我们一起认识一下它。
语法:for(起始表达式;条件表达式;末尾循环体){语句}
讲解:在起始表达式处会有一个初始值,起始值满足条件表达式,则会进行一次循环,执行一次循环后,会执行一次末尾循环体;之后再次判断是否满足条件表达式,知道不满足时,循环结束。
示例如下:
int i;
for (i = 0; i < 10; i++)
{
/*这是一个打印0-9的程序*/
cout << i << endl;
}
我们初始化了一个变量i(我们在定义循环的变量时一般都会优先选用i,j,k这些变量,应该是一种约定俗成吧,但是博主用就是单纯看它们顺眼),使它的初值为0,0当然小于10咯,所以就执行下面的循环语句,每进行一次循环i就加1,知道i等于10时。不满足条件,循环结束。
结果如下:
当然,你也可以像if选择结构的嵌套一样,使用多层嵌套循环结构
多层循环结构多用于输出一个矩阵
int i,j;
for (i = 0; i < 10; i++)
{
/*这是一个打印0-9矩阵程序*/
for (j = 0; j < 10; j++)
cout << j << " ";
cout << endl;
}
结果如下:
如果今后你变成了一只大牛,在编写大型程序,特别是在写人工智能领域或者机器人视觉领域的代码时,可能会经常与矩阵打交道。
3.3跳转语句
上面提到了break跳转语句,下面我将详细阐述一下三种跳转语句。
3.3.1 break语句
作用:跳出当前循环
示例如下:
int i,j;
for (i = 0; i < 10; i++)
{
/*这是一个打印0-9的程序*/
cout << i << endl;
if (i == 5)
break;
}
如果我不想打印5之后的数字,就写一条if语句,并执行break语句。
结果如下:
3.3.2continue语句
作用:跳出最近的一次循环,继续接下来的循环
如果你只是不想要5这一个数字,而想保留后面的数字输出,那么continue将会是一个很好的选择。
示例如下:
int i,j;
for (i = 0; i < 10; i++)
{
/*这是一个打印0-9的程序*/
cout << i << endl;
if (i == 5)
continue;
}
结果如下:
3.3.3 goto语句
作用:无条件地跳转语句
语法:goto 标记(标记一般为纯大写)
goto语句会自动识别标记,并无条件跳转至标记点,但一般不建议使用,一个是如果goto语句使用多了,满屏都是各个标记,容易把人搞傻;二是目前来说,我感觉用处不大,纯属脱裤子放屁…
但我们还是一起看一下它的代码
示例如下:
cout << "x= " << 1 << endl;
cout << "x= " << 2 << endl;
goto FLAG;
cout << "x= " << 3 << endl;
FLAG:
cout << "x= " << 4 << endl;
cout << "x= " << 5 << endl;
结果如下:
可以看到,程序直接跳过了打印x=3这条语句,跳转到了FLAG标记处,继续向下执行
这就是我与C++的一场邂逅,不能说是美好吧,可以说是灰常无聊…我很努力的激起我对它的兴趣了,但是今天洗澡掉的头发让我非常恐慌…【危!!!】 φ(..)
希望C++能善待我,我们能互相珍惜,共同进步
(^ω^)人(^ω^)
最后,还是象征性的放一下我最近最喜欢的一句话:
“我心中的一团火不会熄灭!”