例31.1
解题思路:
1.定义变量n存储游戏局数,sum和sum2分别统计小明和小科的胜利次数
2.读取n
3.使用while循环读取n局游戏的情况
4.根据不同的组合判断胜负,使对应的变量加1
5.循环结束后,比较sum和sum2的大小
6.如果相等输出"QAQ",如果sum大于sum2输出"xiaoyan",否则输出"xiaoke"
#include <iostream>
using namespace std;
int main() {
int n, sum, sum2; //声明变量,n存储游戏局数,sum和sum2统计小明和小科胜利次数
cin >> n; //读取游戏局数
while (n--) { //使用循环读取每个游戏的情况
char a, b; //声明变量存储每个玩家的选择
cin >> a >> b; //读取每个玩家的选择
if (a == 'J' && b == 'S') //判断不同组合胜负
sum2++;
else if (a == 'J' && b == 'B')
sum++;
//其他组合判断略
//...
}
if (sum == sum2) //比较胜利次数
cout << "QAQ";
else if (sum > sum2)
cout << "xiaoyan";
else
cout << "xiaoke";
return 0;
}
例31.2
1.读取小蓝的成绩score和考生总人数n
2.定义vector存储其他考生成绩,读取输入
3.将小蓝的成绩也放入vector并排序
4.通过二分查找法找到小蓝在排序后的位置rank
5.根据rank/n计算排名百分比ans
6.根据ans区间判断证书等级输出相应字母
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int score, n; //声明变量存储小蓝成绩和总人数
cin >> score >> n;//读取输入
vector<int> scores(n - 1);//定义vector存其他成绩
for (int i = 0; i < n - 1; ++i)//读取其他成绩
cin >> scores[i];
scores.push_back(score);//加入小蓝成绩
sort(scores.rbegin(), scores.rend());//降序排序
int rank = 0;//声明变量存小蓝排名
for(; rank < n; ++rank)//通过循环找到小蓝在排序后的位置
if (scores[rank] == score) break;
double ans = static_cast<double>(rank) / n * 100;//计算排名百分比
if (ans < 10)//根据百分比判断等级并输出
cout << "A";
else if (ans < 30)
cout << "B";
//其他判断
return 0;
}
例31.3
解题思路:
1.定义变量sum记录当前正常小时数,maxn记录最大小时数
2.读取测量次数n
3.使用循环读取每次测量的收缩压a和舒张压b
4.判断a,b是否在正常范围内,是则sum加1,否则sum清零
5.每次循环比较sum和maxn,更新maxn为最大值
6.循环结束后输出maxn
#include <iostream>
using namespace std;
int main() {
int sum, maxn; //声明sum记录当前正常小时数,maxn记录最大小时数
int n; //声明变量存储测量次数
cin >> n;
for(int i = 1; i <= n; i++) { //使用循环读取每次测量
int a, b; //声明变量存储收缩压和舒张压
cin >> a >> b; //读取收缩压和舒张压
if((a >= 90 && a <= 140) && (b >= 60 && b <= 90)) //判断是否在正常范围
sum++; //在范围内sum加1
else
sum = 0; //不在范围内sum清零
if(sum > maxn) //每次循环比较更新maxn
maxn = sum;
}
cout << maxn; //输出最大连续正常小时数
return 0;
}
练31.1
解题思路:
1.定义数组a存储每个病人年龄,b统计不同年龄段人数,bb存储百分比
2.读取总人数n和每个病人年龄
3.使用循环判断每个病人年龄属于哪个段,相应的b数组元素加1
4.计算每个年龄段的比例bb数组
5.格式化输出每个年龄段的比例
#include <iostream>
using namespace std;
int main() {
int n, a[101], i, b[10]; // 声明变量n存储总人数,a数组存储每个病人的年龄,b数组统计不同年龄段的人数
double bb[10]; // 存储百分比
cin >> n; // 读取总人数
for (i = 1; i <= n; i++) {
cin >> a[i]; // 读取每个病人的年龄
if (a[i] <= 18 && a[i] >= 0)
b[1]++; // 年龄在0-18岁之间,对应的人数加1
else if (a[i] >= 19 && a[i] <= 35)
b[2]++; // 年龄在19-35岁之间,对应的人数加1
else if (a[i] >= 36 && a[i] <= 60)
b[3]++; // 年龄在36-60岁之间,对应的人数加1
else
b[4]++; // 年龄大于61岁,对应的人数加1
}
for (i = 1; i <= 4; i++)
bb[i] = (double)b[i] / n * 100; // 计算每个年龄段的百分比
for (i = 1; i <= 4; i++)
printf("%.2f%%\n", bb[i]); // 格式化输出百分比
return 0;
}
练31.2
解题思路:
1.声明变量n存储数字个数,m临时接收数字,sum sum2 sum3统计三种数字个数
2.读取n
3.使用while循环读取n个数字
4.判断每个数字是否为0,小于0,大于0,分别使对应的变量加1
5.循环结束后输出三个变量的值
(本题利用循环读取输入,分类统计数字,可以高效求解问题。)
#include <iostream>
using namespace std;
int main() {
int n, m, sum, sum2, sum3; //声明变量,n存储数字个数,m临时变量,sum sum2 sum3统计三种数字
cin >> n; //读取数字个数
while(n--) { //使用循环读取数字
cin >> m; //读取每个数字
if(m == 0) //判断是否为0
sum2++;
else if(m < 0) //判断是否小于0
sum++;
else //大于0
sum3++;
}
cout << sum << ' ' << sum2 << ' ' << sum3; //输出结果
return 0;
}
练31.3
解题思路:
1.读取输入的点数n,圆心坐标x,y和半径r
2.定义变量cnt统计圆内点个数
3.使用循环读取每个点的坐标xi,yi
4.计算点到圆心的距离,判断是否小于半径
5.如果在圆内,cnt加1
6.循环结束后输出cnt
#include <iostream>
#include <cmath>
using namespace std;
int main() {
int n, x, y, r; //声明变量存储点数、圆心坐标和半径
cin >> n; //读取点数
cin >> x >> y >> r; //读取圆心坐标和半径
int cnt = 0;//定义变量统计圆内点个数
for(int i = 0; i < n; i++) {//使用循环读取每个点坐标
double xi, yi;//声明变量存储点坐标
cin >> xi >> yi;//读取点坐标
if(sqrt((xi - x)*(xi - x) + (yi - y)*(yi - y)) <= r)//判断点到圆心距离是否小于半径
cnt++;//在圆内则cnt加1
}
cout << cnt;//输出圆内点个数
return 0;
}