ACM编程队训练记录(二)
身为学校acm队的队长,对上个学期的训练做一下记录。本次训练针对的是大一新入学的学生,没有相应的编程基础,因此本次进行基础的编程教学。本次记录的训练时间为2019年10月26日
变量
变量也就是数学中的变量,一个可以变化的值,在计算机语言中能储存计算结果或能表示值抽象概念。
通俗的说,在c++编程中,变量就是你声明的一个用来存储内容的容器。你可以给这个变量随意的赋值并在程序运行过程中进行肆意的更改。
int a;
如上述的例子,前面的int,表示的是变量的数据类型是int(整型),而a就是变量的名称。在后续的程序中你可以通过赋值符号,输入符号等等来改变这个变量a的值,如下:
a=1;
cin>>a;
a=a+1;
这些方法都可以改变a的值,从上往下看最开始如果仅仅使用int a
,那么a将处于初始值0。
在使用了a=1
后,a的值就变成了1。之后的cin>>a
,你就可以在命令行内输入一个数值,它将代替原先的1变成a的数值。比如我输入了3,则a的值就变成了3。
后面使用了a=a+1
则是代表着将a原先的值+1之后重新赋予给a,这一行运行之后,a的值就会变成4。
常量
相对于上述的可以在程序运行之中可以改变数值的变量,那同样也存在着不能够再程序运行过程中改变的值,这便是常量。
常量,可以是任何的基本数据类型,可分为整型数字、浮点数字、字符、字符串和布尔值。与变量相比,常量就是常规的变量,只不过常量的值在定义后不能进行修改。
声明方式
在c++中常量有两种声明方式,一种是使用#define预处理器,另一种是使用const 关键字。
#define 预处理器
#define这种定义方式一般用在#include引用库之后,在这个位置使用#define定义的变量将直接被赋予相应的数值,并且在运行过程中一直固定不可改变。
使用方法:
#define identifier value
具体示例:
#include <iostream>
using namespace std;
#define LENGTH 10
#define WIDTH 5
int main()
{
int area;
area = LENGTH * WIDTH;
cout << area<<endl;
return 0;
}
当上面的代码被编译和执行时,它会输出一个固定值50。
同时,#define属于一种宏定义,也就是说它所定义的变量不论在本程序本次运行的哪个位置,只要使用了这个变量,它就是被定义的值。想要对其进行修改,必须结束程序后在程序中进行改变。
const 关键字
相对于#define的定义,const就相对灵活,它可以定义在任何位置,但是在使用时,需要给该常量一个明确的数据类型。
使用方法:
const type variable = value;
实际样例:
const int a=100;
在上述样例中,只要程序还在继续运行,那变量a的值在该语句生效的作用域内就将一直为100不再改变。
作用域
变量和常量讲完了,咱们还需要考虑变量和常量的作用域。故名思意,作用域就是这个变量和常量可以展现其正常功能的作用范围。
局部变量
倘若你在主函数
中定义了一个值为10的变量a,但在F函数
中也存在一个变量a,此时F函数
中的a便和主函数
变量a的值不互通。之所以出现这样的状况,便是两个变量a之间的作用域
不同。主函数
中的变量a,他的作用范围只在主函数运行范围内,而F函数
中的变量a只在该函数的运行过程中存在,对于主函数并没有影响。这种变量便是所说的局部变量
,只能够在某个范围内生效。
全局变量
但是,如果你在所有函数外(包括主函数)
定义了一个变量b,此时只要你在主函数里给b进行了赋值,那在其他函数中只要你调用了变量b,那么只要你没有在其他函数中重新声明一个局部变量b,那么这个变量b都将是主函数中富裕的那个值。而这个变量便是全局变量
,它可以在全部程序中生效,但是它可以被局部变量在局部范围内覆盖。
基础逻辑
在编写程序的时候我们通常要以一定的逻辑进行编写,而最常用的就是选择
和循环
。
选择逻辑
选择逻辑也被称为判断逻辑,使用这个的时候你会进行一个判断,如果某件事情是对的就进行步骤一,是错的就行步骤二。如下图
这是标准的判断形式,通常这个结构在程序中使用if-else
来实现。
除了这种还有几种经常会使用的语句。
语句 | 描述 |
---|---|
if | 一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。 |
if-else | 一个 if 语句后可跟一个可选的 else 语句,else 语句在布尔表达式为假时执行。 |
if-else if-else | 可以在一个 if 或 else if 语句内使用另一个 if 或 else if 语句。 |
switch-case | 一个 switch 语句允许测试一个变量等于多个值时的情况。 |
if-else
上面表格中的前三种语句都可以看成是if-else类型。
第一种,便是仅进行一次判断,如果判断不为真便不在进行考虑。如:
if (a>b){
cout<<"a>b"endl;
}
第二种,则是在判断后就分成两种结果进行执行。如:
if (a>b){
cout<<"a>b"<<endl;
} else{
cout<<"a<=b"<<endl;
}
第三种则是在一个判断会出现三种及以上结果时使用。如:
if (a>b){
cout<<"a>b"<<endl;
} else if(a==b){
cout<<"a=b"<<endl;
}else{
cout<<"a<b"<<endl;
}
switch-case
这个分支语句通常用于多种判断结果进行使用,case可以讲多种情况进行一一列举,而default可以代替剩下所有的情况。如:
switch(a){
case 1:
b=1;
break;
case 2:
b=2;
break;
case 3:
b=3;
break;
default:
b=4;
break;
}
循环逻辑
除了选择逻辑还有之中经常使用的逻辑,就是循环逻辑。
有的时候,可能需要多次执行同一块代码。而一般情况下,程序是顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推。如果把每一次过程都写出那么程序将会相当繁杂。因此需要用循环语句来精简这次额内容。
常见的循环语句
循环语句 | 描述 |
---|---|
while循环 | 当给定条件为真时,重复语句或语句组。它会在执行循环主体之前判断条件是否为真。 |
for循环 | 多次执行某一语句直到达成某一条件 |
do…while 循环 | 先执行一次循环体,再进行判断,与while类似 |
相对来说,三种循环中for与while是经常使用的,第三种的使用已经越来越少。同时这几种循环的使用也是可以相互嵌套,层层相扣的。
循环控制语句
对于循环来说,有时会出现一些特殊情况,比如打断或者跳过某一循环。这个时候就需要一些语句去控制循环的进行。
语句 | 描述 |
---|---|
break | 中止循环,让程序则直接进入循环后的语句 |
continue | 跳出本次循环,但依旧在循环中继续执行 |
这两种语句是经常使用的控制语句,除此之外,还有一种goto语句,可以将控制转移到被标记的语句。但是不建议在程序中使用 goto 语句,容易引起程序产生冲突。同时这几种语句不仅能在循环语句中使用,也可以在程序中的其他的方式使用。
while
该语句会先进行一次判断,如果判断结果为真就执行循环体,示例如下:
int a=0;
while(a<10){
cour<<a<<endl;
a++;
}
在这个代码里,将会输出从0到9一共十个数,但是仅仅写了一个输出代码,这便是循环体的应用。
for循环
相对于while循环,for循环需要三个参数来进行循环,示例如下:
for(int i=o;i<10;i++){
cout<<i<<endl;
}
这个程序与上面while循环的效果一样,但是其中的i变成了循环内置的函数,仅仅在循环中生效,循环结束了,这个变量也就消失了。
作业
1、有一个猴子摘了好多桃子,第一天吃了一半扔了一个,第二天又吃了一半扔了一个,第十天结束只剩下了一个,求他一开始摘了多少桃子。
2、给一个年份判断他是什么年,如:甲午年、乙未年
3、输入十个数将其进行从小到大排序
4、(扩展)输入n个数,将其从小到大进行排序
5、(思考)一个监狱里有n个囚牢,一天狱警买来m瓶酒,和罪犯玩了一个游戏,他喝第1瓶酒时,把1的倍数的牢房都打开,喝第二瓶酒时把2的倍数的牢房,开着的都关上,关着的都打开,喝第三瓶酒时把3的倍数的牢房,开着的都关上,关着的都打开,直到他喝完第m瓶,并关完房门,这是房门打开的罪犯便可以获得释放,请您写出算法,计算最后能有多少人被释放。不考虑狱警最多能喝多少酒,同时牢房里的罪犯也无法在游戏过程中逃脱。