『壹』 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;
}