‘壹’ c语言气温波动最大值
首先看下2011年到2015年苏州整体的温度表现是什么样的。
plot(suzhou$highestTemp,type="l",col="red",main="苏州2011-2015年气温图",xlab="时间轴",ylab="温度℃")
lines(suzhou$lowestTemp,type="l",col="blue")
legend("topright",c("最高气温","最低气温"),col=c("red","blue"),lty=1)
.png
红色是最高气温,蓝色是最低气温,年度季节性的特征很明显。每年都是先升再降,7、8月份是温度最高的时间,1、2月是温度最低时间。
因为时间太长,横轴没有具体的对应点。
同样,按月取平均值,再来看整体的表现。
avgTemper
diffTemper
length(avgTemper)
length(diffTemper)
for(i in2011:2014){
for(j in 1:12){
print((i-2011)*12+j)
avgTemper[(i-2011)*12+j]
diffTemper[(i-2011)*12+j]
}
}
avgTemperTS
plot.ts(avgTemperTS,main="苏州2011-2014年月平均气温图",xlab="时间",ylab="月平均温度℃")
.png
四年月平均气温有一个很明显的周期性规律,明显能看出来2013年7、8月份气温高于其他三年。
换一种方式,将每年的数据放在同一个时间轴上,可以更明显看出来每年的温度走势都非常接近,并且对比图中,2013年夏季比其他几年都热,查了一下,最高气温能达到41摄氏度,是2013-8-8,当天最高气温41度,最低气温也有31度。
plot.ts(avgTemperTS[25:36],col="red",main="苏州2011-2014年月平均气温图",xlab="月份",ylab="月平均温度℃")
lines(avgTemperTS[1:12],col="black")
lines(avgTemperTS[13:24],col="blue")
lines(avgTemperTS[37:48],col="green")
legend("topright",c("2011","2012","2013","2014"),col=c("black","blue","red","green"),lty=1)
.png
which.max(suzhou[,2])
suzhou[940,]
.png
那么苏州的温差又有什么特点呢,什么时候是一年中温差最大的时候?同样看四年的整体表现和对比图。
diffTemperTS
plot.ts(diffTemperTS,main="苏州2011-2014年月最大温差图",xlab="时间",ylab="月最大温差℃")
plot.ts(diffTemperTS[25:36],col="red",ylim=c(8,23),main="苏州2011-2014年月最大温差图",xlab="月份",ylab="月最大温差℃")
lines(diffTemperTS[1:12],col="black")
lines(diffTemperTS[13:24],col="blue")
lines(diffTemperTS[37:48],col="green")
legend("topright",c("2011","2012","2013","2014"),col=c("black","blue","red","green"),lty=1)
.png
.png
上面两个图中,都有一个好大的波峰,没错又是任性的2013年。整体上来看温差比较大的时间是3、4月,正是现在,换季的时节天气很是自在随性。那么那个孤高的波峰是哪一天呢?我们可以看看。
which.max(suzhou$highestTemp[grep(paste(2013,"-",3,"-",sep=""),suzhou$date)]-suzhou$lowestTemp[grep(paste(2013,"-",3,"-",sep=""),suzhou$date)])
suzhou[grep("2013-3-9",suzhou$date),]
.png
最后,我想用时间序列来做温度走势的预测。因为R中周期性的时间序列数据需要每期数据项相同,但是这里2011年-2014年每年的数据项都不同(天气篇中开篇讲到了分别是354、366、365、365),所以我把这个时间序列的周期定为360,按顺序取数据的话,2011年因为1月份少了10天,所以2011、2012年会有一些时间和对应的温度错位。考虑到温度是连续型变量,小范围的变动应该不会对整体的时间序列的预测产生很大的影响。
最高温度和最低温度分别定为一个时间序列,并将其在同一个图上显示出来。
highestTS
plot.ts(highestTS,col="red")
lowestTS
lines(lowestTS,col="blue")
.png
这是周期性特别明显的数据,所以考虑使用HoltWinters指数平滑方法来做时间序列的分析预测,用这个方法分别对最高温时间序列数据和最低温时间序列数据分别做平滑得到平滑模型然后来做气温的预测。
highestForecasts
highestForecasts
lowestForecasts
lowestForecasts
.png
.png
上面模型的平滑参数alpha、beta、gamma,分别是平滑指数、趋势指数、季节指数,参考http://www.voidcn.com/article/p-mlimehjx-pw.html,值alpha越大说明对远期也就是以前年份的数据参考权重越大,另外gamma越大说明这个时间序列的季节性特点会越明显。
接下来对这两个时间序列做预测。要用到forecast包,定义预测150天的气温。
library("forecast")
highestForecast2
lowestForecast2
plot(highestForecast2$mean,ylim=c(-4,32),col="red",main="苏州2015年最高最低气温预测时序图",xlab="时间",ylab="温度℃")
lines(lowestForecast2$mean,col="blue")
legend("topright",c("最高气温","最低气温"),col=c("red","blue"),lty=1)
.png
这个是预测的最高最低气温的图,但是到底预测结果可信度高不高呢?
Box.test(highestForecast2$resials,lag=20,type="Ljung-Box")
Box.test(lowestForecast2$resials,lag=20,type="Ljung-Box")
.png
参考文章里面讲到了几种检验方式,这里我们用Ljung-Box检验方式,可以看到两个时间序列的检验结果p值都非常小,所以模型的预测是有效的。
突然想起来,2015年不是已经过了三个月了嘛,我们也有前面三个月的数据,那么接下来就把预测结果和实际结果放在一个图中对比看预测效果。本来想把四条线放在一起查看,但是比较混乱所以还是分开看。
highestFactTS
lowestFactTS
plot(highestForecast2$mean,col="red",main="苏州2015年最高气温预测观察值时序图",xlab="时间",ylab="温度℃")
lines(highestFactTS,col="orange")
legend("topleft",c("实际值","预测值"),col=c("orange","red"),lty=1)
.png
plot(lowestForecast2$mean,col="blue",main="苏州2015年最低气温预测观察值时序图",xlab="时间",ylab="温度℃")
lines(lowestFactTS,col="green")
legend("topleft",c("实际值","预测值"),col=c("green","blue"),lty=1)
.png
没有重合,怎么可以不重合!开玩笑,重合是不太可能的,从上面两个最高气温和最低气温的预测值与观察值的图都能看出来预测值比实际值都有些偏低。但是预测结果与实际结果相比相差不大,并且整个变化趋势还是接近的。给出这个模型预测的接下来苏州地区50天的温度预测,当然,这个结果只能做一个参考,你是愿意看天气预报呢,还是看它呢?
predictTemp
predictTemp$date
predictTemp$highestTemp
predictTemp$lowestTemp
predictTemp
.png
.png
‘贰’ c语言编程
先上程序:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX_BUF_LEN 64
#define YEAR_LEN 365
int main(void)
{
char buf[MAX_BUF_LEN];
int count, i;
double sum;
char *pch;
double highTemperCity1[YEAR_LEN] = {0};
double lowTemperCity1[YEAR_LEN] = {0};
double highTemperCity2[YEAR_LEN] = {0};
double lowTemperCity2[YEAR_LEN] = {0};
FILE *in = fopen("./tmp.txt", "r");
if (in == NULL) {
perror("Can't open file.");
return;
}
count = 0;
while (fgets(buf, MAX_BUF_LEN, in) != NULL) {
pch = strtok(buf, " ,\t"); /*序号*/
if (pch != NULL) {
pch = strtok(NULL, " ,\t"); /*月份*/
pch = strtok(NULL, " ,\t"); /*年份*/
pch = strtok(NULL, " ,\t"); /*城市1最高温*/
highTemperCity1[count] = atof(pch);
pch = strtok(NULL, " ,\t"); /*城市1最低温*/
lowTemperCity1[count] = atof(pch);
pch = strtok(NULL, " ,\t"); /*城市2最高温*/
highTemperCity2[count] = atof(pch);
pch = strtok(NULL, " ,\t"); /*城市2最低温*/
lowTemperCity2[count] = atof(pch);
++count;
}
}
sum = 0;
for (i = 0; i < count; ++i) {
sum += highTemperCity1[i];
}
printf("城市1年平均最高气温: %.2f\n", sum / count);
sum = 0;
for (i = 0; i < count; ++i) {
sum += lowTemperCity1[i];
}
printf("城市1年平均最低气温: %.2f\n", sum / count);
sum = 0;
for (i = 0; i < count; ++i) {
sum += highTemperCity2[i];
}
printf("城市2年平均最高气温: %.2f\n", sum / count);
sum = 0;
for (i = 0; i < count; ++i) {
sum += lowTemperCity2[i];
}
printf("城市2年平均最低气温: %.2f\n", sum / count);
return;
}
tmp.txt :
1,1,2010,20.8,19.2,29.3,20.9
2,1,2010,22.5,15.5,30.7,23.3
C用的不熟, 许多地方可能不标准, 请见谅.
我是直接读取的token到各个数组, 一般来说要写一个struct, 把相关信息读到一个struct数组中, 再进行操作.
比如:
struct cityInfo{
int month;
int year;
float higherTemper;
float lowTemper;
//.....省略其他的
}cityTemper[YEAR_LEN];
再补充一点: "./tmp.txt"中的"./"是指的VC++的当前工程目录
‘叁’ c语言,编写一个程序处理一组日最高气温.程序需要统计并打印出高温天数(最高温度为华氏85或更高)
你好!
##include<stdio.h>
main()
{
inta[]={55,62,68,74,59,45,41,58,60,67,65,78,82,88,91,92,90,93,87,80,78,79,72,68,61,59};
inti=0;
intgao=0;
intdi=0;
intshu=0;
intsum=0;
for(i=0;i<26;i++)
{
if(a[i]<=85&&a[i]>=60)
shu++;
if(a[i]>85)
gao++;
if(a[i]<60)
di++;
sum=sum+a[i];
}
printf("高温天数:%d
舒适天数:%d
低温天数:%d
平均气温:%lf
",gao,shu,di,(double)sum/26);
}
‘肆’ C语言作业,输入一个月31天内的温度值,求最高和最低温度
首先输入时做一个31天数据取值的循环,
将31天的温度值进行比较,两两比较,取大值,即最后得到的是最大值,
将31天的温度值进行比较,两两比较,取大值,即最后得到的是最大值,
‘伍’ c语言 温度练习
#include <stdio.h>
void main()
{
int choice;
float temp;
printf("Input the date: ");
scanf("%d %f",&choice,&temp);
if(choice==1)
{
printf("The Centigrade is:%.2f",(temp-32)*5/9);
}
else if(choice==2)
{
printf("The Fahrenheit is %.2f",(temp*9/5)+32);
}
}
‘陆’ 如何编写一个华氏摄氏度与摄氏温度之间的C语言转换程序
C语言程序:
#include<stdio.h>
intmain()
{
doublef,c;
printf("请输入摄氏温度值:");
scanf("%lf",&c);
f=9.0/5*c+32;
printf("华氏温度值:%lf ",f);
printf("请输入华氏温度值:");
scanf("%lf",&f);
c=(f-32)*5/9;
printf("摄氏温度值:%lf ",c);
return0;
}
运行测试:
请输入摄氏温度值:35
华氏温度值:95.000000
请输入华氏温度值:95
摄氏温度值:35.000000
‘柒’ c语言求一个月最高气温
已知一个月的气温,先把第一天的气温赋值给变量max,然后用max和第二天比较,如果max大于第二天的气温,则max与第三天的气温比较,如果小于第二天的气温,则把第二天的气温赋值给max,然后再把max与第三天的气温比较,以此类推,直到与最后一天比较,然后得到的max就是最高气温。
‘捌’ C语言 输入一个月及每日气温(含有1位小数),程序输出该月平均,最高和最底气温
#include<stdio.h>
int main()
{
int days;
float sum,max,min,temp;
max=sum=0.0;
min=100.0;
printf("请输入当月的天数:");
scanf("%d",&days);
for(int i=0;i<days;i++)
{
printf("请输入%d日的气温:",i+1);
scanf("%f",&temp);
sum+=temp;
max=max<temp?temp:max;
min=min>temp?temp:min;
}
printf("当月最高气温:%.1f\n",max);
printf("当月最低气温:%.1f\n",min);
printf("当月平均气温:%.1f\n",sum/days);
return 0;
}
‘玖’ c语言程序设计 温度转换
#include<stdio.h>
intmain()
{intd;
floatt,t1;
printf("确定要转换的类型: 1)华氏转摄氏 ");
printf("2)摄氏转华氏 请选择1或2:");
scanf("%d",&d);
printf("请输入温度:");
scanf("%f",&t);
if(d==1)
{t1=(t-32)*5/9;
printf("摄氏温度为%.2f度 ",t1);
}
else
{t1=t*9/5+32;
printf("华氏温度为%.2f度 ",t1);
}
return0;
}
‘拾’ 用C语言编写程序,由键盘输入城市及所有温度值,并输出温度最高和温度最低的城市和日期
#include <stdio.h>
struct data{
char city[30];
double tem;
}
int main(){
double max;
double min;
for(int i = 0; i <10;i++){
scanf("%s %lf", &data[i].city, &data[i].tem);
if(i == 0){ // 第一个值
min = data[i].tem;
max = data[i].tem;
continue;
}
if(max < data[i].tem){ // 当前值大于max
max = data[i].tem;
}
if(min > data[i].tem){ // 当前值小于min
min = data[i].tem;
}
}
printf("min:%lf, max:%lf",min,max);
return 0;
}