一本通编程启蒙例31及练习题解

例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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值