第 7 课:顺序结构及复合运算
经过几天的学习,蛙蛙已经从一个编程小白进阶为编程入门者了,对于 int、char、double 等数据类型以及数据类型之间的转换等知识的应用已经得心应手了。
蛙蛙还能利用所学的编程知识解决一些现实生活中的问题,比如购物折扣计算、超市购物结算、家庭水电费计算等。
但这远远不能满足蛙蛙的需求,他想学习更高深的知识,以便解决更复杂的问题。
氪町博士决定带着蛙蛙对所学知识进行一个总结,再学些新知识,然后进入更高级的编程"关卡"。
他告诉蛙蛙,目前我们所学的知识都还在顺序结构的范畴内,后面还会学习选择结构、循环结构等内容,这里先来整体了解一下什么是编程中的顺序结构吧!
7.1 顺序结构总结
顺序结构是指程序中的语句按照书写的先后顺序依次执行,就像我们日常生活中的做事步骤一样,一件事情做完再做下一件事情,没有跳跃或分支。这点我们在本章开篇的时候已经讨论过了,现在仅讨论在 C++ 中的顺序结构。
比如我们想要计算圆的面积,程序如下:
#include <iostream>
using namespace std;
int main()
{
double radius; // 声明一个变量 radius 来表示圆的半径
cout << "请输入圆的半径:";
cin >> radius; // 输入圆的半径
double area = 3.14 * radius * radius; // 圆的面积等于 3.14 * 半径的平方
cout << "圆的面积是:" << area; // 输出圆的面积
return 0;
}在这个程序中,语句是按照顺序执行的。
首先,程序通过 cout 输出提示信息,要求用户输入圆的半径。
然后,使用 cin 读取用户输入的半径值。
接着,根据圆的面积公式计算面积,最后再通过 cout 输出圆的面积。
每一步都在前一步完成之后执行,这就是顺序结构。
再比如下面这个程序:
#include <iostream>
using namespace std;
int main()
{
int a = 1;
a = 2;
a = 3;
a = 4;
a = 5;
cout << a;
return 0;
}编译运行后,我们发现输出结果为 5,这是因为后一个值会覆盖前面的值,所以最后变量里的值为 5。
从这里我们也可以看出,顺序结构的程序是自上而下按顺序执行的。
7.2 变量的连续赋值
蛙蛙手里有很多一样的小盒子,他给小盒子分别进行编号。这些小盒子都需要装载同一种物品,但需要一个个打开装进去,他觉得这很麻烦。
这时候,他想到了刚刚学习的编程知识——变量,如果有很多相同类型的变量,需要装同一个数,是不是也需要一个个赋值呢?比如:
int a,b,c,d;
a = 7,b = 7,c = 7,d = 7;
cout << a << " " << b << " " << c << " " << d;氪町博士告诉他,对于这种赋相同值的变量,可以采用连续赋值操作,不用对单个变量一一赋值,基本格式如下:
变量 = 变量 = 变量 = …… = 变量 = 表达式 ;如果将上述程序改成连续赋值,则可以这样写:
int a,b,c,d;
a = b = c = d = 7; // 只需要赋值一次即可
cout << a << " " << b << " " << c << " " << d;第二行代码的意思是将 7 这个数值赋给 a、b、c 和 d 这四个变量。
在程序内部执行的顺序如下:
d = 7;
c = d;
b = c;
a = b;要注意,值是从后往前赋给变量的。
7.3 实例讲解一
例 1:妈妈分糖果
蛙蛙邀请三个小伙伴来家里做客,妈妈刚好买回来一袋糖果准备分给蛙蛙及他的三个小伙伴,每个人分 3 颗糖果。但是还没等大家动口吃,第三个拿到糖果的人已经把糖果吃完了,于是蛙蛙妈妈又给了他 5 颗。请问最后每个人还有几颗糖果?(要求:用变量赋值完成上述操作。)
【输入样例】无
【输出样例】3 3 5 3
解析
先声明四个整型变量 a、b、c 和 d,表示蛙蛙及三名小伙伴手中糖果的数量。
每个人手中都有 3 颗糖果,可以采用连续赋值操作,从右向左依次赋值,首先将 3 赋给 d,然后将 d 的值赋给 c,接着赋给 b,最后赋给 a,使得四个变量的值都为 3。
第三个拿到糖果的同学,这里用 c 表示,他手中糖果的数量需要修改,将其设置为 5,这样最终 a、b 的值是 3,c 的值是 5,d 的值是 3。
最后使用 cout 输出,用空格隔开:
cout << a << " " << b << " " << c << " " << d;。
参考代码
#include <iostream>
using namespace std;
int main()
{
int a,b,c,d;
a = b = c = d = 3; // 前期每个小伙伴都有 3 颗糖果
c = 0; // 第三个拿到糖果的人把糖果吃完了
c = 5; // 又重新给第三个人分 5 颗糖果
cout << a << " " << b << " " << c << " " << d;
return 0;
}注:原书参考代码中
c = 0;与c = 5;两行连续出现,实为分步演示(先吃完、再补发),保留原样以对应解析中的步骤说明。
7.4 变量的自增自减
当我们需要将变量的值增加 1 或者减少 1 的时候,可以利用自增运算符(++)或自减运算符(--)来完成这个操作。
例如:
++a; 和 a++; 相当于 a = a + 1;
--a; 和 a--; 相当于 a = a - 1;但是需要注意的是,++a 和 a++ 虽然单独使用的时候是一样的,但是与赋值运算符一起用的时候就有区别了。
例如,b = a++; 表示的是先将 a 赋值给 b,然后再把 a + 1 赋值给 a,即先赋值,后增加。
假设 a 等于 5,执行 b = a++; 这行代码后,b 先被赋值为 5,然后再把 a + 1 赋值给 a,也就是把 5 + 1 赋值给 a,此时 a 为 6。所以执行后的结果是,a 为 6,b 为 5。
b = ++a; 表示的是先把 a + 1 赋值给 a,然后再将 a 赋值给 b,即先增加,后赋值。
再举个例子,假设 a 还是等于 5,执行 b = ++a; 这行代码后,先把 a + 1 赋值给 a,也就是把 5 + 1 赋值给 a,此时 a 为 6。再把 a 赋值给 b,此时 b 也为 6。所以执行后的结果是,a 为 6,b 也为 6。
同样,自减运算符也类似。
b = a--; 也是先将 a 赋值给 b,再把 a - 1 赋值给 a。若 a 等于 5,执行这行代码后的结果是,a 为 4,b 依然是 5。
b = --a; 同样是将 a - 1 先赋值给 a,再将 a 赋值给 b。若 a 等于 5,执行这行代码后的结果是,a 为 4,b 也是 4。
7.5 复合运算符
蛙蛙觉得像 ++、-- 这样的符号特别好用,能减少一些代码书写。氪町博士告诉蛙蛙,在 C++ 中还有很多方便书写的符号,比如复合运算符,用得比较多的有如下几个:
+=、-=、*=、/=、%=
这些符号都是什么意思呢?
举个例子,比如 a += b; 表示把变量 a 的数值增加 b。假设 a = 1,在执行 a += 3; 后,a 的值等于 4。这相当于把 a + 3 赋值给 a,原来 a 为 1,加 3 后为 4,所以 a 便等于 4 了。
其他运算符也与之类似,这里简要说一下其他复合运算符。
a -= b; 表示将 a − b 赋值给 a。若 a 等于 5,b 等于 3,执行这行代码后,相当于把 5 − 3 赋值给 a,a 的值便为 2。
a *= b; 表示将 a × b 赋值给 a。若 a 等于 6,b 等于 3,执行这行代码后,相当于把 6 × 3 赋值给 a,a 的值便为 18。
a /= b; 表示将 a / b 赋值给 a。若 a 等于 6,b 等于 2,执行这行代码后,相当于把 6 / 2 赋值给 a,a 的值便为 3。
a %= b; 表示将 a % b 赋值给 a。若 a 等于 7,b 等于 3,执行这行代码后,相当于把 7 % 3 赋值给 a,a 的值便为 1。
7.6 实例讲解二
例 2:背单词
蛙蛙为了学好英语,准备进行一项挑战,决定在接下来的五天里每天都多背一个单词。
已知他第一天背了 10 个单词,第二天背 11 个单词。以此类推,到第五天结束,蛙蛙按计划一共能背诵多少个单词?(请用变量与复合运算符的知识完成本道题目。)
【输入样例】无
【输出样例】60
解析
首先声明并初始化一个整型变量 sum,将其初始值设置为 0,该变量用于存储累计的单词数量。
然后使用
+=复合运算符,将 10 加到 sum 变量上,此时 sum 的值为 10。接着将 11 累加到 sum 上,sum 的值更新为 21,再将 12、13、14 分别累加到 sum 上,sum 的值更新为 60。
最后使用 cout 输出 sum 的值,将 sum 的最终结果输出到控制台。
参考代码
#include <iostream>
using namespace std;
int main()
{
int sum = 0;
sum += 10;
sum += 11;
sum += 12;
sum += 13;
sum += 14;
cout << sum;
return 0;
}7.7 交换两个变量的值
蛙蛙想交换两个变量的数值,他觉得自己所学的编程知识能够支撑他完成这一操作,于是写下了下面的代码,你觉得他能成功交换两个变量的数值吗?
#include <iostream>
using namespace std;
int main()
{
int a = 4,b = 3;
a = b;
b = a;
cout << a << " " << b;
return 0;
}蛙蛙想把 a 的值变成原来 b 的值,也就是 4,然后将 b 变成 3,但运行后,发现结果都是 3,这是为什么呢?
氪町博士看了一眼代码就发现了问题所在:代码将 b 赋值给 a,那么此时 a 为 3,然后又将 a 赋值给 b,那么 b 的值也为 3,输出 a 和 b 的结果自然也都是 3 了。
那怎么能交换两个变量的数值呢?蛙蛙陷入了沉思。
氪町博士拿来了两杯饮料,让蛙蛙尝试交换两个杯子中的饮料。这两个杯子标有标签,分别是 a 和 b。
蛙蛙认为直接倒肯定是不行的,于是找来了第三个杯子,标签为 t。第三个杯子是空的,蛙蛙将 a 杯子中的饮料倒进 t 杯子中,此时 a 杯子空了。然后他将 b 杯子里面的饮料倒进 a 杯子,此时 b 杯子也空了。他再将 t 杯子中的饮料倒进 b 杯子,就完成了两个杯子中饮料的交换。
氪町博士露出了欣慰的笑容:"你这不是已经学会如何交换两个变量的值了吗?"
蛙蛙拍了拍自己的脑袋,是啊!只要再多声明一个变量就可以了,把这个变量当作中间变量。于是蛙蛙又声明了一个变量 t,并重新写了下列代码:
#include <iostream>
using namespace std;
int main()
{
int a = 4,b = 3,t; // 声明一个变量 t,相当于拿了一个空杯子
t = a; // 类似于将 a 杯子里面的饮料倒进 t 杯子
a = b; // 类似于将 b 杯子里面的饮料倒进 a 杯子,此时 a 的值为原来 b 的值
b = t; // 类似于将 t 杯子里面的饮料倒进 b 杯子,此时 t 和 b 的值为原来 a 的值
cout << a << " " << b; // 输出
return 0;
}编译运行后,a 和 b 的值总算是交换过来了。
除此之外,你还能想到其他方法吗?
