C++入门铺垫

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011190734/article/details/82557779

C++入门铺垫

这是一篇朴实的入门教程,咳咳,好吧它并不准确,因为掌握了这里面的所有内容也并不能算是C++入门了。
写这个是因为感觉很多书里一上来就有很多理论知识和专业术语,0基础的童鞋看起来很费劲。所以我想写个能帮助0基础的童鞋能在读教程的时候不那么头疼的……初级教程。这里便是在简要地介绍其中的代码编写部分。
我是觉得编程中的很多理论知识,如果自己不亲自实践的话是很难体会的,所以我想,把”怎么做”暂时放在”是什么”、”为什么”之前,之后再理解”是什么”、”为什么”也是可行的吧。(当然也有必要的”是什么”的环节)
这里用到的术语如果看不懂也没有关系,不用管它,它不会影响阅读的。
可能会存在错误,恳请各位指正并多多包涵。有一些代码写的不是最佳方案,但是更易于理解。
顺便注意,C系语言区分大小写,以及字符串的两边必须是英文引号,分号也必须打英文分号,其他有特殊意义的符号同理。
一、程序的控制流
1、 顺序结构
在不存在其他控制语句(如if,goto,for,while,break,continue等)时,C++程序按照从上到下的语句依次执行(应该没有采用别的顺序的语言)。
练习1:实现一个程序,在屏幕上输出”Hello World”。
实现代码:

#include <iostream>

int main(){
std::cout << “Hello World” << std::endl;
system(“pause”); 
return 0;
}

具体解释:

#include <iostream>

引用系统头文件。该文件中含有我们需要调用的成员cout。
iostream:I/O Stream——I(Input),O(Output),Stream(流),该文件中含有输入输出流的相关内容(流:流是一种计算机对于数据的抽象,实质上就是一段数据序列)。可以使用其中的标准输入输出流(std::cout——标准输出流、std::cin——标准输入流)进行输入输出操作。
输入:将数据传递给程序的过程。
输出:程序中的数据以某种方式呈现的过程。
std:一个命名空间。如果把一些成员(函数可以是成员,变量也可以是成员)的比作文件,那么命名空间可以理解成一个文件夹(当然这个比喻并不准确)。
“::”:域解析运算符:放在命名空间后面,用于访问命名空间中的成员。std::cout即是访问std命名空间中的cout成员。
int main():一个函数。main函数是默认的程序入口点函数(即正常运行这个程序时第一个调用的函数)。程序必须有一个入口点函数(有的语言把这个函数做成了默认不对用户可见的,但实际上是有的)。
函数:用于表达一个具体的过程,主要用于减少代码的编写量(注1)、提高程序的可读性以及实现”约定”(这个说法不专业,另外我觉得程序入口点设为函数就有这个目的,不过这个用途在之后的多态的概念的学习时才能更加凸显)。
函数的结构:
返回值类型 函数名称(参数){
函数主体
}
int:基本类型之一,表示有符号整数,占用空间为4字节或8字节(32位系统上是4字节,而64位系统上是8字节,可以以此计算出可以表示的数值范围)。
除非返回值类型设置为void,否则C++的函数必须有一个返回值(返回值类型为void就意味着没有返回值吗?我不太清楚,但我觉得这样比较合理,我觉得没有必要浪费时间和空间去返回一个空值)。通过return关键字传回返回值。
以数学中的绝对值函数举个例子。
C++中我们可以这样实现对一定范围的整数的绝对值函数:

int abs(int arg){
    if(arg >= 0){return arg;} else {return -arg;} 
    //这句话的意思是,如果arg大于等于0则返回arg本身,否则返回arg的相反数。
}

int arg:声明一个int类型的参数arg。函数可以拥有参数,在程序运行过程中调用这些函数时可以向其传递参数。表达式abs(5)中5即是参数,5将传入arg中。

int f(int arg){
return arg * 2 + 1;
}

这样我们在程序中写下的f(5)时就和数学上的意义一样了。
比如我们可以看下面的例程:

#include <iostream>

int f(int arg){
return arg * 5 + 1;
} 
int main(){
int a = f(5) + f(10); //声明一个……整数a,初始值设定为f(5)+f(10)。
std::cout << a;  // std中的cout可以用来实现数据的输出。这句会将a的值输出到屏幕上。
system(“pause”); //仅仅用来暂停,避免”闪退”
return 0;
}

(注2)
能想象得出输出到屏幕上的是几嘛?没错,就是77(5×5+1 + 10×5+1)。
其实int a这行语句还隐藏着奥妙,这是一句变量声明(变量声明格式:
[修饰符] 变量类型 变量名称 [= 初始值];
)。
这条语句翻译成中文,就是”定义一个在一定范围内的整数a”。
为什么要声明变量呢?
因为声明变量可以让我们把数据存储起来,方便修改和读取,给变量起一个好的名字也能增加代码的可读性(比如int 金钱=5,金钱+5之类的)。
什么?没有”金钱+5”这种写法?要写成”金钱=金钱+5”?金钱怎么可能和+5的金钱相等呢?
这是个数学问题,那个等号不是逻辑上的相等,而是赋值,等号这里也不叫等号而叫做赋值号。这里的意思是把先获得目前金钱数,然后计算它+5,最后再把得到的值储存在金钱这个变量里。你还可以写”存款=金钱+5”,意思是把金钱+5储存在存款这个变量里,而金钱没有变化。赋值号的左边叫做左值,右边要求是一个表达式。表达式不能作为左值(赋值对象),因为表达式不能存储内容,而赋值的目标必须要能够储存内容(我的理解)。所以函数也同样只能放在赋值符号的右侧,而不能放在左侧。
std::cout << “Hello World” << std::endl;:实际上会是”(std::cout << “Hello World”) << std::endl;”,先将”Hello World”输入到cout(标准输出流)中,然后把std::endl(暂时可以理解成换行符,虽然这是错误的)输入到进行完刚才的操作的流中(此时为在末尾添加了”Hello World”文本的cout)。<<:输出操作符,我的理解是把右侧的流的内容输入到左侧的流。类似的,>>作为输入操作符,是把左侧的流的内容输入到右侧,是不是很形象?
2、 分支结构
很明显,光有顺序结构,让程序按照死的顺序执行语句将有非常多的功能不能实现,比如刚才的绝对值函数,还有随机情况的处理等等。分支结构即是让程序可以根据不同的情况执行不同的代码。
一)简单的if语句
练习2:输入一个int类型的整数,判断它是否大于5。
实现代码:

#include <iostream>

int main(){
int a;
std::cout << “请输入一个数,之后按下回车~” << std::endl; //仅仅是提示文字,建议同时试试去掉这一行
std::cin >> a;
if(a>5){
std::cout << “您输入的数字非常地大以至于它甚至超过了5!”;
}
else{
    std::cout << “您输入的数字一定不会超过6。”;
}
system(“pause”);
}

具体解释:
int a;:先声明了一个int类型的变量a。
std::cin >> a;:将标准输入流中的数据输入a。在控制台应用程序(窗体和命令提示符的样子基本一样)中,这会等待用户输入内容,按下回车表示输入完毕。
二)else if
练习3:输入成绩,返回评价。85~100:优秀 75~84:良好 60~74:合格 0~59:凉凉
实现代码:

#include <iostream>

int main(){
  int grade;
std::cin >> grade;
if(grade > 84){
  std::cout << “优秀”;
}else if(grade > 74){
  std::cout << “良好”;
}else if(grade > 59){
  std::cout << “合格”;
}else{
  std::cout << “凉凉”;
}
system(“pause”);    
return 0;
}

具体解释:
整个if块的意思是:如果成绩在85分之上就输出优秀,再不然在75分之上输出良好,再不然合格,最后就凉凉了。只要if、elsif中有一个测试语句满足了条件,就会不再测试其他的条件。可以对比一下下面的写法:
if(grade > 84){
std::cout << “优秀”;
}
if(grade > 74){
std::cout << “良好”;
}
if(grade > 59){
std::cout << “合格”;
}
If(grade < 60) {
std::cout << “凉凉”;
}
如果输入的成绩大于85分,会发现输出的结果变成了”优秀良好合格”,显然这是不合适的。
还有一种写法:
if(grade > 84){
std::cout << “优秀”;
}
if(grade > 74 && grade < 85){
std::cout << “良好”;
}
if(grade > 59 && grade < 75){
std::cout << “合格”;
}
If(grade < 60) {
std::cout << “凉凉”;
}
&&:逻辑运算符之一,表示”且(And)”的意思,只有左右两边都为真时它们的和才为真。||是或。
这种写法虽然思路、结果都是正确的,但是效率不如第一种高。原因在于只要大于等于85分就不需要再判断这个成绩是否属于良好了,以此类推。
三)嵌套的if语句
其实细心的盆友会发现,刚才我们输入的成绩可以输入负数,也可以输入超过100的数值,这是不符合我们的要求的。需要在判断这个成绩的好坏之前,对它的真实性进行检查。
实现代码:

#include <iostream>

int main(){
  int grade;
std::cin >> grade;
if(grade > -1 && grade < 101){
if(grade > 84){
    std::cout << “优秀”;
}else if(grade > 74){
    std::cout << “良好”;
}else if(grade > 59){
  std::cout << “合格”;
}else{
    std::cout << “凉凉”;
}
}else{
std::cout << “你可能输入了一个假成绩!” << std::endl;
}
system(“pause”);    
return 0;
}

3、 循环结构
即使使用了分支结构使得程序可以产生不同的变化,还是会有很多无法完成的任务。比如游戏中的画面时刻都需要刷新(渲染),绘制的画面内容时刻会产生变化,如果打开游戏的时间越来越长那么执行代码的长度也应该会越来越长,如果期间不修改程序的代码的话,这是不可能的,况且也没见哪个游戏玩了一会之后发现游戏的程序本体大小变大了的。
需要一个代码能……往回返的机制,于是我们现在就开始学习循环啦。
一) 简单的for循环
练习4:使用for循环粗略计算根号1+根号2+根号3+……+根号100的值。
实现代码:

#include <iostream>
#include <math.h> //开根号需要的函数的声明在这个头文件里

int main(){
double sum = 0; //double类型:双精度浮点数类型,是计算机用于表示小数/分数的一种类型。
for(int i = 1; i <= 100; i = i + 1){
sum = sum + sqrt(i); //sqrt:开方函数。
}
std::cout << sum; //输出结果。
system(“pause”);
return 0;
} 

具体解释:
for(int i = 1; i <= 100; i = i + 1){
sum = sum + sqrt(i);
}:
可以这样理解上面的语句(实际上好像也是这样的):
int i = 1;

if(i <= 100){
sum = sum + sqrt(i);
i = i + 1;
//返回到if继续执行……
}
for循环语句我觉得只是简化了写法。
二) while循环
练习5:使用while循环粗略计算根号1+根号2+根号3+……+根号100的值。
实现代码:

#include <iostream>
#include <math.h> //开根号需要的函数的声明在这个头文件里

int main(){
double sum = 0; //储存数值的和。double类型:双精度浮点数类型,是计算机用于表示小数/分数的一种类型。
int i = 1;
while(i <= 100){
sum = sum + sqrt(i);
i = i + 1;
}
std:cout << sum; //输出结果。
system(“pause”);
return 0;
} 

while用在事先不知道要执行多少次的循环中更能体现作用。
练习6:一直要求用户输入int类型的数字,直到用户输入的数字和超过100。之后输出用户输入数字的次数。
实现代码:

#include <iostream>

int main(){
int sum = 0;
int times = 0; //存储用户的输入次数。
int a;
while(sum <= 100){
std::cin >> a;
sum = sum + a;
times = times + 1;
}
std::cout << times;
system(“pause”);
return 0;
}

三) 在循环中改变执行路径
break:跳出最近的循环。
continue:直接进行下一次循环(最近的循环)。

注1:
比较下面两种写法。
第一种:
int f(int arg){
return arg * arg + arg * 2 + 5
}
……
int a = f(b) + f(c) + f(d); //b,c,d都是int类型的变量
第二种:
int a = b * b + b * 2 + 5 + c * c + c * 2 + 5 + d * d + d * 2 + 5;
好吧这样的函数还属于比较简单的函数,还不太显,不过已经有点意思了。

注2:
推荐的写法是先声明再定义,否则需要注意繁琐的定义顺序。不过这里不做过多介绍。

猜你喜欢

转载自blog.csdn.net/u011190734/article/details/82557779