C++

C++实验(三):打印温度柱状图

Posted by HK on May 22, 2019

问题描述

下图是某城市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;
}

等待网络加载图片···