全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(实战训练三)
打标记思想:
标记的思想类似于贴封条,采用标记的方法,可以形象地将其比喻为“贴上封条”来确保某地的状态未被改变。为了监控某个地点在进行操作后是否遭到了未经授权的变动,可以在该地点设置一个标记,随后只需检查这个标记的位置或状态是否发生了变动。
以布尔类型变量flag为例,可以在初始阶段将其设定为“true”,这个过程称之为变量的初始化。接着,一旦某个特定的操作成功完成,就可以将flag的值修改为“false”。最后,通过检查flag的值是否发生了改变,就可以准确地判断先前的操作是否已经成功执行。
实战训练1—阅读下面程序,写成结果。
#include<bits/stdc++.h>
using namespace std;
int main() {
bool flag = true;
int n;
cin>>n;
if(n%2==0){
flag = false;
}
if(flag){
cout<<"YES"<<endl;
}else{
cout<<"NO"<<endl;
}
return 0;
}
键盘输入: 9
输出结果:YES
问题分析:
代码第4行定义了一个bool类型变量flag并初始化为true,第5行定义一个变量n,第6行输入值,假设输入值为9;紧接着在if中判断n对2取余是否为0,即是否能被2整除,是否是偶数,如果条件成立,将flag设置为false;第10行的if语句通过flag的取值来判断数的奇偶性,如果flag的值为true,则n为奇数,如果flag的值为false,则n为偶数。本题输入9,9为奇数,所以输出结果为“YES”
实战训练2—字母排序
问题描述:
输入三个字母(严格区分大小写),按字典顺序输出它们。
输入格式:
输入三个字母
输出格式:
输出字母,按照字典顺序输出它们。
输入输出样例:
输入样例1 | 输出样例1 |
dcb | bcd |
输入样例2 | 输出样例2 |
AaB | ABa |
问题分析:
根据题意,首先定义三个字符变量a、b、c并输入值,字符比较首先将字符转换成Unicode值(即整数值),根据值的大小确定先后顺序,大写字母的值小于小写字母,所以大写字母在前,小写字母在后。先让a与b进行比较,如果a比b大,则交换a和b;再将a和c进行比较,如果a比c大,则交换a和c,这样a就存储了这三个字符中最小的字符;接下来比较b和c的值,如果b大于c,则交换b和c,这样b中存储了次小字符,c中存储最大字符,这样三个字符就完成了排序,具体程序代码如下:
#include<bits/stdc++.h>
using namespace std;
int main() {
char a,b,c;//定义字符变量a、b、c
cin>>a>>b>>c;//输入a、b和c
if(a>b){//比较字符a和b的大小,如果a比b大 ,交换a和b
char tmp = a;
a = b;
b = tmp;
}
if(a>c){//比较字符a和c的大小,如果a比c大,则交换a和c
char tmp = a;
a = c;
c = tmp;
}
if(b>c){//比较字符b和c的大小,如果b比c大,则交换b和c
char tmp = b;
b = c;
c = tmp;
}
cout<<a<<b<<c<<endl;//从小到大输出a b c 的值
return 0;
}
实战训练3—最大值与最小值
问题描述:
小明和小敏玩一个游戏,他们手中各有三个整数,小明用手中的一个数字乘以小敏手中的一个数字,这样三个数配对得到乘积,并将三个乘积求和。请帮忙编写程序实现求得这个和的最大值maxv 和最小值minv。
输入格式:
第一行三个整数 a1,a2,a3,用空格隔开,表示小明手中的三个数。
第二行三个整数 b1,b2,b3,用空格隔开,表示小敏手中的三个数。
0<=a1,a2,a3<=9999
0<=b1,b2,b3<=9999
输出格式:
一行两个整数,minv和maxv表示最小值和最大值,用空格隔开
输入输出样例:
输入样例1 | 输出样例2 |
4 8 3 6 2 5 | 54 74 |
问题分析:
将小明和小敏手中的三个数字分别从小到大排序,将小明手中的数字从小到大和小敏手中的三个数从大到小对应相乘求和,得到最小值;将小明和小敏手中的三个数字从小到大排序,然后依次配对相乘求和,得到就是最大值。具体程序代码如下:
#include<bits/stdc++.h>
using namespace std;
int main() {
int a1,a2,a3;//定义小明手中的数字变量a1,a2,a3
int b1,b2,b3;//定义小敏手中的数字变量b1,b2,b3
int minv,maxv;//定义乘积和的最大值maxv和最小值minv
cin>>a1>>a2>>a3;//输入a1,a2,a3的值
cin>>b1>>b2>>b3;//输入b1,b2,b3的值
//首先将a1,a2,a3从小到大排序
if(a1>a2) {
int tmp = a1;
a1 = a2;
a2 = tmp;
}
if(a1>a3) {
int tmp = a1;
a1 = a3;
a3 = tmp;
}
if(a2>a3) {
int tmp = a2;
a2 = a3;
a3 = tmp;
}
//将b1,b2,b3从小到大排序
if(b1>b2) {
int tmp = b1;
b1 = b2;
b2 = tmp;
}
if(b1>b3) {
int tmp = b1;
b1 = b3;
b3 = tmp;
}
if(b2>b3) {
int tmp = b2;
b2 = b3;
b3 = tmp;
}
minv = a1*b3+a2*b2+a3*b1; //求对应数字相乘求和(a1,a2,a3从小到大,b3,b2,b1从大到小)
maxv = a1*b1+a2*b2+a3*b3;//求对应数字相乘求和(a1,a2,a3从小到大,b1,b2,b3从小到大)
cout<<minv<<' '<<maxv<<endl;
return 0;
}
从程序中可以看出,交换两个数的代码相对多,在C++中交换两个数有一个专门的函数swap可以实现交换,例如将a和b的值交换,可以使用swap(a,b)来实现,所以针对上述代码可以修改为:
#include<bits/stdc++.h>
using namespace std;
int main() {
int a1,a2,a3;//定义小明手中的数字变量a1,a2,a3
int b1,b2,b3;//定义小敏手中的数字变量b1,b2,b3
int minv,maxv;//定义乘积和的最大值maxv和最小值minv
cin>>a1>>a2>>a3;//输入a1,a2,a3的值
cin>>b1>>b2>>b3;//输入b1,b2,b3的值
//首先将a1,a2,a3从小到大排序
if(a1>a2) {
swap(a1,a2);
}
if(a1>a3) {
swap(a1,a3);
}
if(a2>a3) {
swap(a2,a3);
}
//将b1,b2,b3从小到大排序
if(b1>b2) {
swap(b1,b2);
}
if(b1>b3) {
swap(b1,b3);
}
if(b2>b3) {
swap(b2,b3);
}
minv = a1*b3+a2*b2+a3*b1; //求对应数字相乘求和(a1,a2,a3从小到大,b3,b2,b1从大到小)
maxv = a1*b1+a2*b2+a3*b3;//求对应数字相乘求和(a1,a2,a3从小到大,b1,b2,b3从小到大)
cout<<minv<<' '<<maxv<<endl;
return 0;
}