问题描述
下图是某城市15天的气温变化曲线。其中标注为A的地方称为峰点,标记为B的地方称为谷点,而标记为C的地方称为崮。要求编写1个函数输入15天的气温,然后通过3个函数分别实现下述功能:
(1)打印每天温度的柱状图(仅考虑温度为正值的情况)。
(2)打印所有峰点的位置(该月的第几天)及峰值。如果没有,则打印没有峰值。
(3)打印最长的崮的长度。只使用一重循环即可求出。
问题要求
请实现以下函数声明,要求能得到如下图所示的运行结果。
且要求柱状图能够处理多个零下温度的情况,以如下形式打印。
求出现次数最多的温度,及其出现次数。
例如:12 13 12 12 14 13 13 12 13 13 中,出现次数最多的是13度,出现了5次。
实验代码及结果
#include <iostream>
#include <cmath>
using namespace std;
//输入n个温度
void inputTemps(int temp[], int n);
//找到温度中的最小值,便于控制输出格式
int minTemp(int temp[], int n);
//显示柱状图
void displayTemps(int temp[], int n);
//显示月间温度中的所有峰值
void displayPeaks(int temp[], int n);
//显示月间持续最久的温度
void displayFlat(int temp[], int n);
//寻找出现次数最多的温度
int maxNum(int num[], int n);
//开辟动态数组,存放每个温度出现次数
void mostNum(int temp[], int n);
//主函数
int main()
{
int temps[30];
inputTemps(temps, 15);
displayTemps(temps, 15);
displayPeaks(temps, 15);
displayFlat(temps, 15);
mostNum(temps, 15);
}
void inputTemps(int temp[], int n) {
int i;
cout << "请输入相应的温度数值" << endl;
for (i = 0; i < n; i++) {
cin >> temp[i];
}
cout << endl;
}
int minTemp(int temp[], int n) {
int min = temp[0];
for (int i = 1; i < n; i++) {
if (min > temp[i]) {
min = temp[i];
return min;
}
}
}
void displayTemps(int temp[], int n) {
int min = abs(minTemp(temp, n)) + 3;
cout << "显示柱状图如下:" << endl;
for (int i = 0; i < n; i++) {
cout.width(3); //设置温度所占域宽
cout << temp[i];
if (temp[i] < 0) {
for (int j = 0; j < min - abs(temp[i]); j++) {
cout << " ";
}
}
else //if(temp[i]>0)
{
for (int j = 0; j < min; j++) {
cout << " ";
}
cout << "|";
}
for (int k = 0; k < abs(temp[i]); k++) {
cout << "*";
}
if (temp[i] < 0) {
cout << "|";
}
cout << endl;
}
cout << endl;
}
//显示月间温度中所有的峰值
void displayPeaks(int temp[], int n) {
int i;
cout << "月间温度的峰值为:" << endl;
for (i = 1; i < n - 1; i++)
{
if (temp[i] > temp[i - 1] && temp[i] > temp[i + 1]) {
cout << "第"<< i + 1 << "天的温度 " << temp[i] << endl;
}
}
cout << endl;
}
void displayFlat(int temp[], int n) {
int i;
int t = 1;
int Max = 0;
for (i = 0; i < n; i++) {
if (temp[i] == temp[i + 1]) {
t = t + 1;
}
if (temp[i] != temp[i + 1]) {
t = 1;
}
if (t > Max) {
Max = t;
}
}
cout << "月间持续最久的温度为" << Max << endl;
cout << endl;
}
int maxNum(int num[], int n) {
int max = num[0];
for (int i = 0; i < n; i++) {
if (max < num[i]) {
max = num[i];
}
}
return max;
}
void mostNum(int temp[], int n) {
int *point = new int[n](); //存放每个温度出现次数
for (int i = 0; i < n; i++) { //记录n个温度每个温度出现次数
int m = 1;
for (int j = 0; j < n; j++) {
if (i != j) { //可先判断下标,也可先判断温度
if (temp[i] == temp[j]) {
m++;
}
}
}
point[i] = m;
}
int b = maxNum(point, n);
point = NULL;
for (int q = 1; q < n; q++) {
int p = 1;
for (int r = 0; r < n; r++) {
if (temp[q] == temp[r]) {
if (r > q) {
p++;
}
}
}
if (p == b) {
cout << "出现次数最多的温度为" << temp[q] << ",出现了" << b << "次。" << endl;
}
}
cout << endl;
}