星期三, 10月 18, 2006

problem-平均氣溫

五月份的台北天氣已經開始轉熱,其整月的日平均溫度如下:

T=[25 26 24 23, 18 17 20 30 29, 25 19 19 21 20, 23 24 23 25 23,…
27 28 24 26 27, 23 25 24 21 19, 20]C


1. 試撰寫一程式,以上述之溫度資料為輸入值,求其月平均、最高及最低溫度。

2. 試撰寫另一程式,以交談式輸入之方式,按月份輸入每日之溫度,(必須分清楚每月應有之輸入日數)然後呼叫第一項之程式進行分析。

%第一題程式碼%

close all;
clc;
disp('這是個計算每月溫度的平均溫度和最高,最低溫')
x=input('請輸入溫度');
temp1(x);

%function temp1%
function [meantemp,maxtemp,mintemp]=temp1(a);
meantemp=mean(a)
maxtemp=max(a)
mintemp=min(a)

%第二題程式碼%

close all;
clc;
disp('這是個計算每月溫度的平均溫度和最高,最低溫')
y=input('請輸入您要的月份(請輸入阿拉伯數字)');
fprintf('您選擇的為%d月份',y)
if (y==1| y==3| y==5| y==7| y==8| y==10| y==12)
disp('請依序輪入31天的溫度')
elseif y==2
disp('請依序輸入28天或29天的溫度')
else
disp('請依序輸入30天的溫度')
end
x=input('請輸入溫度');
temp1(x);

也可以改成這樣
close all;
clear;
clc;
disp('這是個計算每月溫度的平均溫度和最高,最低溫')
disp('輸入一整年的溫度')
for nw=1:12;
fprintf('您現在所填的為%d月份',nw)
if (nw==1| nw==3| nw==5| nw==7| nw==8| nw==10| nw==12)
disp('請依序輪入31天的溫度')
elseif nw==2
disp('請依序輸入28天或29天的溫度')
else
disp('請依序輸入30天的溫度')
end
x=input('請輸入溫度\n');
temp1(x);
end


上課同學的做的很好,以下則是它的程式碼...用到GUI 的MSGBOX,我想學的但都沒空看的呵
% Month calculation
clear all
prompt = {'請問要計算幾月份的溫度(1-12)'};
dlg_title = '請輸入月份';
num_lines = 1;
answer = inputdlg(prompt,dlg_title,num_lines);
a=str2num(answer{1,1});
if a == 1 | a==3 | a==5 | a==7 | a==8 | a==10 | a==12
prompt_1 = {'每日溫度(共31天)(溫度間請空格)'}; % 告知使用者當月應輸入之溫度數
dlg_title_1 = '輸入溫度';
num_lines = 2;
answer_1 = inputdlg(prompt_1,dlg_title_1,num_lines);
t=str2num(answer_1{1,:});
c=size(t);
if c(1,2)<31>31
msgbox('輸入日期太多,請重新輸入','Error msg','error')
else
[avg mx mn]=month(t); % 呼叫month這個函數來執行計算最大值最小值與平均值
figure('Position',[400 400 400 120],'Name','Results')
uicontrol('style','text','position',[150 90 45 15],'string','平均溫度')
uicontrol('style','text','position',[200 90 45 15],'string',avg)
uicontrol('style','text','position',[150 60 45 15],'string','最高溫度')
uicontrol('style','text','position',[200 60 45 15],'string',mx)
uicontrol('style','text','position',[150 30 45 15],'string','最低溫度')
uicontrol('style','text','position',[200 30 45 15],'string',mn)
end
elseif a == 4 | a==6 | a==9 | a==11
prompt_2 = {'每日溫度(共30天)(溫度間請空格)'};
dlg_title_2 = '輸入溫度';
num_lines = 2;
answer_2 = inputdlg(prompt_2,dlg_title_2,num_lines);
t=str2num(answer_2{1,:});
c=size(t);
if c(1,2)<30>30
msgbox('輸入日期太多,請重新輸入','Error msg','error')
else
[avg mx mn]=month(t);
figure('Position',[400 400 400 120],'Name','Results')
uicontrol('style','text','position',[150 90 45 15],'string','平均溫度')
uicontrol('style','text','position',[200 90 45 15],'string',avg)
uicontrol('style','text','position',[150 60 45 15],'string','最高溫度')
uicontrol('style','text','position',[200 60 45 15],'string',mx)
uicontrol('style','text','position',[150 30 45 15],'string','最低溫度')
uicontrol('style','text','position',[200 30 45 15],'string',mn)
end
elseif a == 2
prompt_3 = {'每日溫度(共28天)(溫度間請空格)'};
dlg_title_3 = '輸入溫度';
num_lines = 2;
answer_3 = inputdlg(prompt_3,dlg_title_3,num_lines);
t=str2num(answer_3{1,:});
c=size(t);
if c(1,2)<28>28
msgbox('輸入日期太多,請重新輸入','Error msg','error')
else
[avg mx mn]=month(t);
figure('Position',[400 400 400 120],'Name','Results')
uicontrol('style','text','position',[150 90 45 15],'string','平均溫度')
uicontrol('style','text','position',[200 90 45 15],'string',avg)
uicontrol('style','text','position',[150 60 45 15],'string','最高溫度')
uicontrol('style','text','position',[200 60 45 15],'string',mx)
uicontrol('style','text','position',[150 30 45 15],'string','最低溫度')
uicontrol('style','text','position',[200 30 45 15],'string',mn)
end
elseif a > 12
msgbox('輸入錯誤,請重新輸入','Error msg','error')
end

以上要是錯誤就要重新到EDITOR執行有點不便,所以我做小小的更改,因為我對GUI的對話方框不太了解,所以當它執行錯誤時
它的錯誤方框還來不及按OK,就會馬上執行下一個步驟,所以我這程式改的有點不太理想如下圖


clc
clear all
while 1
prompt = {'請問要計算幾月份的溫度(1-12)'};
dlg_title = '請輸入月份';
num_lines = 1;
answer = inputdlg(prompt,dlg_title,num_lines);
a=str2num(answer{1,1});
if a == 1 | a==3 | a==5 | a==7 | a==8 | a==10 | a==12
while 1
prompt_1 = {'每日溫度(共31天)(溫度間請空格)'}; % 告知使用者當月應輸入之溫度數
dlg_title_1 = '輸入溫度';
num_lines = 2;
answer_1 = inputdlg(prompt_1,dlg_title_1,num_lines);
t=str2num(answer_1{1,:});
c=size(t);
if c(1,2)<31>31
msgbox('輸入日期太多,請重新輸入','Error msg','error')
else
[avg mx mn]=month(t); % 呼叫month這個函數來執行計算最大值最小值與平均值
figure('Position',[400 400 400 120],'Name','Results')
uicontrol('style','text','position',[150 90 45 15],'string','平均溫度')
uicontrol('style','text','position',[200 90 45 15],'string',avg)
uicontrol('style','text','position',[150 60 45 15],'string','最高溫度')
uicontrol('style','text','position',[200 60 45 15],'string',avg)
uicontrol('style','text','position',[150 30 45 15],'string','最低溫度')
uicontrol('style','text','position',[200 30 45 15],'string',avg),break;
end
end
elseif a == 4 | a==6 | a==9 | a==11
while 1
prompt_2 = {'每日溫度(共30天)(溫度間請空格)'};
dlg_title_2 = '輸入溫度';
num_lines = 2;
answer_2 = inputdlg(prompt_2,dlg_title_2,num_lines);
t=str2num(answer_2{1,:});
c=size(t);
if c(1,2)<30>30
msgbox('輸入日期太多,請重新輸入','Error msg','error')
else
[avg mx mn]=month(t);
figure('Position',[400 400 400 120],'Name','Results')
uicontrol('style','text','position',[150 90 45 15],'string','平均溫度')
uicontrol('style','text','position',[200 90 45 15],'string',avg)
uicontrol('style','text','position',[150 60 45 15],'string','最高溫度')
uicontrol('style','text','position',[200 60 45 15],'string',avg)
uicontrol('style','text','position',[150 30 45 15],'string','最低溫度')
uicontrol('style','text','position',[200 30 45 15],'string',avg),break;
end
end
elseif a == 2
while 1
prompt_3 = {'每日溫度(共28天)(溫度間請空格)'};
dlg_title_3 = '輸入溫度';
num_lines = 2;
answer_3 = inputdlg(prompt_3,dlg_title_3,num_lines);
t=str2num(answer_3{1,:});
c=size(t);
if c(1,2)<28>28
msgbox('輸入日期太多,請重新輸入','Error msg','error')
else
[avg mx mn]=month(t);
figure('Position',[400 400 400 120],'Name','Results')
uicontrol('style','text','position',[150 90 45 15],'string','平均溫度')
uicontrol('style','text','position',[200 90 45 15],'string',avg)
uicontrol('style','text','position',[150 60 45 15],'string','最高溫度')
uicontrol('style','text','position',[200 60 45 15],'string',avg)
uicontrol('style','text','position',[150 30 45 15],'string','最低溫度')
uicontrol('style','text','position',[200 30 45 15],'string',avg),break;
end
end
else
msgbox('輸入錯誤,請重新輸入','Error msg','error')
continue
end
break
end

花蓮的海豚

花蓮的海豚