版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
課程提綱M文件介紹控制語(yǔ)句函數(shù)變量及變量作用域程序設(shè)計(jì)的輔助函數(shù)程序設(shè)計(jì)的優(yōu)化程序調(diào)試信息接口小結(jié)page2——華氏溫度和攝氏溫度的轉(zhuǎn)換%輸出攝氏溫度:print
T(C)9Problem:
設(shè)計(jì)一個(gè)
程序,
一個(gè)華氏溫度的輸入,輸出攝氏溫度。Solution:Step
1:清晰地陳述出你要解決的問(wèn)題;“將華氏溫度轉(zhuǎn)換為攝氏溫度并輸出”Step
2:
確定程序的輸入變量和輸出變量;“輸入變量:華氏溫度;輸出變量:攝氏溫度”Step3:
設(shè)計(jì)程序偽代碼;%
華氏溫度:input
T(F)%溫度轉(zhuǎn)換:T(C)
5
(T
(F)
32)page3Step
4:將偽代碼轉(zhuǎn)換為程序語(yǔ)句%
Script
file:temp_conversion.m%fprintf('%6.2f
degrees
Fahrenheit=
%6.2f
Celsius.\n',temp_f,temp_k);“程序信息”“名字”%Purpose:
“用途”%
To
convert
an
input
temperature
from
degrees
Fahrenheit
to%
an
output
temperature
in
Celsius.%%Record
of
revisions:“修改記錄”%
Date
Programmer
Description
of
change%
====
==========
================%
21/10/13
Y.Y.Guo Original
code%%Define
variables:“變量定義”%
temp_f--Temperature
in
degrees
Fahrenheit%
temp_k
--Temperature
in
Celsius%Prompt
the
user
for
the
input
temperature“.
華氏溫度”temp_f=input('Enter
the
temperature
in
degrees
Fahrenheit:');%
Convert
to
Celsius.temp_k=(5/9)*(temp_f-32);%
Writeout
the
result.“溫度轉(zhuǎn)換”“輸出攝氏溫度”page4Step
5:調(diào)試程序>>
run('C:\Program
Files\
\R2010a\bin\temp_conversion.m')Enter
the
temperature
in
degrees
Fahrenheit:120120.00
degrees
Fahrenheit
=
48.89
Celsius.Enter
the
temperature
in
degrees
Fahrenheit:100100.00
degrees
Fahrenheit
=
37.78
Celsius.初學(xué)者總是期望,拿到問(wèn)題就能寫(xiě)出漂亮的代碼與完美無(wú)誤的程序,而實(shí)際上這是不可能的!的變量、語(yǔ)句與語(yǔ)法只是血肉般的簡(jiǎn)單存在,在任何一種語(yǔ)言中都能找到,而一個(gè)良好的編程則是般的永恒存在!程序設(shè)計(jì)中,寫(xiě)代碼只是簡(jiǎn)單的一半,另一半則是問(wèn)題的分析與偽代碼的設(shè)計(jì)!page5M文件介紹是一種高級(jí)計(jì)算機(jī)語(yǔ)言,因而也能夠編制一種以.m為擴(kuò)展名的文本文件,簡(jiǎn)稱M文件。是一種解釋性語(yǔ)言,命令在運(yùn)行時(shí)被翻譯為機(jī)器語(yǔ)言被執(zhí)行,M文件就是命令的集合。M文件是純文本(ASCII碼)文件,因而便于進(jìn)行編寫(xiě)和修改。擴(kuò)展名必須為.m。M文件分類:命令式(Script):命令行的簡(jiǎn)單疊加函數(shù)式(Function):參數(shù)傳遞和函數(shù)調(diào)用page6M文件建立與編輯M文件建立:窗口中菜單項(xiàng)File-->New-->Script/Function單擊圖標(biāo)
,新建一個(gè)M文件M文件編輯:窗口中菜單項(xiàng)File-->Open單擊圖標(biāo)
,打開(kāi)一個(gè)M文件找到M文件,直接雙擊打開(kāi)page7page8命令式文件(Script)命令式文件的運(yùn)行相當(dāng)于在命令窗口(CommandWindow)中逐行輸入并運(yùn)行命令。需注意一下幾點(diǎn):標(biāo)點(diǎn)符號(hào)的運(yùn)用要恰當(dāng)好處,每行命令結(jié)束時(shí)用分號(hào)隔開(kāi),以免程序運(yùn)行時(shí)數(shù)據(jù)輸出造成不便;建立良好的書(shū)寫(xiě)風(fēng)格,保持程序的可讀性,比如程序的層次感,注釋行的書(shū)寫(xiě);注釋行以符號(hào)%開(kāi)頭,在程序運(yùn)行中不被執(zhí)行,只起解釋說(shuō)明作用;不需要用end語(yǔ)句作為命令式文件的結(jié)束標(biāo)志;運(yùn)行此文件時(shí),將其
設(shè)置為當(dāng)前
。實(shí)例1:建立一命令式M文件繪制的LOGO圖L
i
f
e
is
t
o
o
s
h
o
r
t
to
s
p
e
n
d
wr
i
t
i
ng
D
O
lo
o
ps
.
.
.%
Script
file:
logotu.m%%
Purpose:%
This
file
is
to
create
the
Logo
of%
softwareload
logosurf(L,R),
colormap(M)n=size(L,1)axis
offaxis([1
n
1n
-.2
.8])view(-37.5,30)title('Life
is
too
short
to
spend
writingDO
loops...')page9函數(shù)式文件(Function)函數(shù)式文件可以實(shí)現(xiàn)計(jì)算中的參數(shù)傳遞。函數(shù)式的標(biāo)志是第1行為function語(yǔ)句。函數(shù)式可以有返回值,也可有無(wú)返回值;函數(shù)式文件名與函數(shù)名應(yīng)一一對(duì)應(yīng);函數(shù)式中的變量?jī)H在函數(shù)起作用,為局部變量;養(yǎng)成良好的注釋,方便自己,方便他人。function
[outarg1,
outarg2,...]=
fname(inarg1,
inarg2,
...)%
H1
comment
line%
Other
comment
lines...(Executable
code)...(return)help命令運(yùn)行后將顯示M文件注釋語(yǔ)句中的第
續(xù)塊,被空行
的其它注釋語(yǔ)句,將被忽略;lookfor顯示第一個(gè)注釋行內(nèi)容,為了便于被搜索,第一行page10注釋盡可能包含特息。page11實(shí)例2:建立求一個(gè)向量元素平均值的函數(shù)function
y=average(x)%AVERAGE
求向量元素的平均值%語(yǔ)法%y=average(x)%其中,x是向量,y為計(jì)算得到向量元素的均值%若輸入?yún)?shù)為非向量時(shí)則出錯(cuò)%代碼行[m,n]=size(x);%判斷輸入?yún)?shù)是否為向量if(~((m==1)|(n==1))|(m==1&
n==1))%若輸入?yún)?shù)不是向量,則出錯(cuò)error('Input
must
be
a
vector!')end%計(jì)算向量元素的平均值y=sum(x)/length(x);>>
x=1:10;>>
y=average(x)y
=5.5000>>
x=[2
4
6
8
10];>>
y=average(x)y
=6page12控制語(yǔ)句順序語(yǔ)句選擇語(yǔ)句分支語(yǔ)句循環(huán)語(yǔ)句人機(jī)交互語(yǔ)句順序語(yǔ)句程序
令語(yǔ)句按固定的順序一個(gè)接一個(gè)的執(zhí)行,這樣的程序稱為順序語(yǔ)句。%
Script
file:
logotu.m%%
Purpose:%
This
file
is
to
createthe
Logoof%
softwareload
logosurf(L,R),
colormap(M)n=size(L,1)axis
offaxis([1
n
1
n
-.2
.8])view(-37.5,30)title('Life
is
too
short
tospendwriting
DOloops...')順序語(yǔ)句只能實(shí)現(xiàn)簡(jiǎn)單的功能,而在解決實(shí)際問(wèn)題時(shí)往往會(huì)
選擇執(zhí)行特定命令及重復(fù)性執(zhí)行特定命令的情形,因而需要學(xué)習(xí)選擇語(yǔ)句及循環(huán)語(yǔ)句。page13選擇語(yǔ)句選擇語(yǔ)句可以使
選擇性執(zhí)行指定區(qū)域內(nèi)的代碼(稱之為語(yǔ)句塊blocks),而跳過(guò)其他區(qū)域的代碼。if
control_expr_1Statements
(block
1)elseif
control_expr_2Statements
(block
2)elseif
control_expr_3Statements
(block
3)elseStatements
(block
4)end判斷表達(dá)式control_expr緊跟在if或elseif后面;若判斷表達(dá)式的結(jié)果為1,則執(zhí)行其后
令語(yǔ)句塊(block),若結(jié)果為0,則跳過(guò)其后
令語(yǔ)句塊;某一命令語(yǔ)句塊被執(zhí)行后,程序跳至end語(yǔ)句后一可執(zhí)行語(yǔ)句;elseif語(yǔ)句可有任意個(gè),else語(yǔ)句最多只有一個(gè)。page14實(shí)例3:輸入三角形三邊長(zhǎng),求面積>>
run('C:\ProgramFiles\
\R2010a\bin\triarea.m')請(qǐng)輸入三角形的三條邊(數(shù)組形式):[3
4
5]6>>
run('C:\ProgramFiles\
\R2010a\bin\triarea.m')請(qǐng)輸入三角形的三條邊(數(shù)組形式):[1
2
3]不能構(gòu)成一個(gè)三角形。S
p(
p
a)(
p
b)(
p
c)>>
%
Script
file:
triarea.m%
This
program
is
to
calculate
the
area
ofatriangularA=input('請(qǐng)輸入三角形的三條邊(數(shù)組形式):');if
A(1)+A(2)>A(3)
&
A(1)+A(3)>A(2)&A(2)+A(3)>A(1)p=(A(1)+A(2)+A(3))/2;s=sqrt(p*(p-A(1))*(p-A(2))*(p-A(3)));disp(s);elsedisp('不能構(gòu)成一個(gè)三角形。')end三角形面積
公式:2其中:p
1
(a
b
c)page15實(shí)例4:求一元二次方程的根ax2
bx
c
0(a
0)Step
1:清晰地陳述出你要解決的問(wèn)題;“求一個(gè)一元二次方程的根”Step
2:
確定程序的輸入變量和輸出變量;“輸入變量:方程系數(shù)a,b,c;輸出變量:兩根x1,x2”Step3:
設(shè)計(jì)程序偽代碼;%輸入方程系數(shù)input
a,b,c%求根公過(guò)程式:2apage16x
b
b2
4ac偽代碼整體框架:輸入方程系數(shù);求根過(guò)程;輸出求根結(jié)果。Step3:設(shè)計(jì)程序偽代碼-續(xù)%
if%%
else
if%輸出結(jié)果print
x1,x2b2
4ac
0b
b2
4acx1
2a
b
b2
4acx22ab2
4ac
0
b
x1
x22a%else
(對(duì)應(yīng)b2
4ac
0
)%e2nd2a2a
2ax
b
i4ac
b212ax
b
i4ac
b2Tips:偽代碼的設(shè)計(jì)由上而下,先分析總體框架,再局部細(xì)化;偽代碼不是真實(shí)的代碼,其書(shū)寫(xiě)類似于數(shù)學(xué)表達(dá)式;偽代碼只需在草稿紙寫(xiě),力求簡(jiǎn)潔、整齊、清晰。page17Step
4:將偽代碼轉(zhuǎn)換為程序語(yǔ)句%
Script
file:
calc_roots.m%%
Purpose:%
This
program
solves
for
the
roots
of
a
quadratic
equation%
of
the
form
a*x^2
+
b*x
+
c
=
0.
It
calculates
the
answers%%
Record
of
revisions:%
Date Programmer
Description
of
change%
======
========
================%
21/10/13
Y.Y.Guo Original
code%%
Define
variables:%
a
--Coefficient
of
x^2
term
of
equation%
b
--Coefficient
of
x
term
ofequation%
c
--Constantterm
of
equation%
discriminant
--Discriminant
of
the
equation%
imag_part
--Imagpart
of
equation
(for
complex
roots)%
real_part
--Real
part
of
equation(for
complex
roots)%
x1
-- solution
of
equation
(for
real
roots)%
x2
--Second
solution
of
equation
(for
realroots)“名字”“用途”“修改記錄”“變量定義”“程序信息”%
regardless
of
the
type
of
roots
that
the
equation
possesses.Tips:一般而言,變量的定義可以在后續(xù)程序編寫(xiě)過(guò)進(jìn)行,每出現(xiàn)一個(gè)新的變量時(shí),則在程序段前面進(jìn)行定義;若為物理變量,則最好將其單位列出。page18Step
4:
將偽代碼轉(zhuǎn)換為
程序語(yǔ)句-續(xù)%
Prompt
the
user
for
the
coefficients
of
the
equationdisp
('This
program
solves
for
the
roots
of
a
quadratic
');disp
('equation
of
theform
A*X^2
+
B*X
+
C
=0.');a
=
input('Enter
the
coefficient
A:
');b
=
input('Enter
the
coefficient
B:
');c
=
input('Enter
the
coefficient
C:');%
Calculate
discriminantdiscriminant
=
b^2
-
4
*
a
*
c;“輸入方程系數(shù)”“計(jì)算方程判別式”%
Solve
for
the
roots,
depending
on
the
value
of
the
discriminant.if
discriminant
>
0
%
there
are
two
real
roots,
so
...x1
=
(-b
+
sqrt(discriminant))
/(2*a);x2
=
(-b
-
sqrt(discriminant))
/
(2*a);disp('This
equation
has
two
real
roots:');fprintf('x1
=
%f\n',
x1);fprintf('x2
=
%f\n',
x2);elseif
discriminant
==
0
%
there
is
one
repeated
root,
so
...x1
=
(
-b
)
/(2*a);“方程有兩不等實(shí)根的情況”“方程有兩相等實(shí)根的情況”disp('This
equation
has
two
identical
real
roots:');fprintf('x1
=
x2
=
%f\n',
x1);page19Step4:
將偽代碼轉(zhuǎn)換為 程序語(yǔ)句-續(xù)else
%
there
are
complex
roots,
so
...real_part
=
(-b)
/(2*a);imag_part
=
sqrt(
abs(discriminant))
/(2*a);disp('This
equation
has
complexroots:');fprintf('x1
=
%f
+
i
%f
\n',real_part,imag_part);fprintf('x1
+
%f
-
i
%f
\n',
real_part,imag_part);end“方程有兩共軛復(fù)根的情況”Step
5:
調(diào)試程序>>
run('C:\ProgramFiles\
\R2010a\bin\calc_roots.m')This
program
solves
for
the
roots
of
a
quadraticequation
of
the
form
A*X^2
+
B*X
+C
=0.Enter
the
coefficient
A:
1Enter
the
coefficient
B:
4Enter
the
coefficient
C:
3This
equationhas
two
real
roots:x1
=
-1.000000
x2
=
-3.000000x2
4x
3
0(x1
1,
x2
3)page20Step
5:調(diào)試程序-續(xù)>>
run('C:\Program
Files\
\R2010a\bin\calc_roots.m')x2
2x
1
0(x1
x2
1)This
program
solvesfor
the
roots
of
a
quadraticequation
of
theform
A*X^2
+
B*X
+
C
=
0.Enter
the
coefficient
A:
1Enter
the
coefficient
B:
2Enter
the
coefficient
C:
1This
equationhas
two
identicalreal
roots:x1
=
x2
=
-1.000000>>
run('C:\ProgramFiles\
\R2010a\bin\calc_roots.m')This
program
solvesfor
the
roots
of
a
quadraticequation
of
theform
A*X^2
+
B*X
+
C
=
0.Enter
the
coefficient
A:
1Enter
the
coefficient
B:
1Enter
the
coefficient
C:
1This
equation
has
complex
roots:x1
=
-0.500000
+
i
0.866025x1
=
-0.500000
-
i
0.866025122
23
)2
2x2
x
1
0(x
1
i
3
,
x
1
ipage21分支語(yǔ)句switch
(switch_expr)case
case_expr_1,Statements
(block
1)case
case_expr_2,Statements
(block
2)otherwise,Statements
(block
3)end分支語(yǔ)句是一種特殊的選擇語(yǔ)句,可以實(shí)現(xiàn)多種情況下的開(kāi)關(guān)控制。switch_expr
可以是數(shù)字、字符串或者邏輯變量;當(dāng)case_expr表達(dá)式與switch_expr相符時(shí),其后的命令語(yǔ)句塊(block)將被執(zhí)行,不符時(shí),其后
令語(yǔ)句塊將被跳過(guò);當(dāng)某一命令語(yǔ)句塊被執(zhí)行后,程序跳至end語(yǔ)句后一可執(zhí)行語(yǔ)句。page22page23實(shí)例5:分支語(yǔ)句的簡(jiǎn)單應(yīng)用>>num=input('請(qǐng)輸入一個(gè)數(shù):');switch
numcase
-1disp('I
am
a
teacher.');case
0disp('I
am
a
student.');case
1disp('You
are
a
teacher.');otherwisedisp('You
are
a
student.');end循環(huán)語(yǔ)句實(shí)際問(wèn)題中,需要反復(fù)執(zhí)行某些語(yǔ)句,這時(shí)就需要用到循環(huán)語(yǔ)句。在循環(huán)語(yǔ)句中,一組被重復(fù)執(zhí)行的語(yǔ)句稱為循環(huán)體,每循環(huán)一次,都必須做出判斷,是繼續(xù)循環(huán)執(zhí)行還是終止執(zhí)行跳出循環(huán),這個(gè)判斷的依據(jù)稱為循環(huán)的終止條件。循環(huán)語(yǔ)句分類:for循環(huán):循環(huán)前循環(huán)次數(shù)已知;while循環(huán):循環(huán)前循環(huán)次數(shù)未知。page24循環(huán)語(yǔ)句之“for循環(huán)”for循環(huán)以指定的數(shù)目重復(fù)地執(zhí)行特定的語(yǔ)句塊。forindex=expr1:expr2:expr3statement
1……statement
nendpage25expr1為循環(huán)變量index的初始值,expr2為index的步長(zhǎng),expr3為index的終值;當(dāng)步長(zhǎng)expr2=1時(shí),可以省略不寫(xiě)。Example
1:for
i=1:2:9……endExample
2:for
i=1:9……end實(shí)例6:已知向量t=[-1
0
13
5],生成其Vandermonde矩陣>>
t=[-1
0
1
3
5];>>
n=max(size(t));>>
for
j=1:n
for
i=1:na(i,j)=t(i)^(n-j);endend>>
aa
=1
-1
1
-1
10
0
0
0
11
1
1
1125
25
5
1a
=1 -1
1 -1
10
0
0
0
11
1
1
1125
25
5
1另案>>
a(:,n)=ones(n,1);>>
for
j=n-1:-1:1a(:,j)=t.*a(:,j+1)';end>>
apage26實(shí)例7:計(jì)算給定日期是一年中的第幾天Step
1:
清晰地陳述出你要解決的問(wèn)題;“計(jì)算給定的一天是這一年中的第幾天”Step
2:確定程序的輸入變量和輸出變量;“輸入變量:年year,月month,日day;輸出變量:一年中的第幾天day_of_year”偽代碼整體框架:輸入年、月、日;計(jì)算第幾天:leap_day=0page27先加上當(dāng)月的天數(shù);加上這一年往月的天數(shù),若包括二月,則需考慮是否為閏年;輸出計(jì)算結(jié)果。Step
3:設(shè)計(jì)程序偽代碼;%輸入年、月、日input
year,
month,
day%計(jì)算第幾天%
首先判斷年份是否為閏年if
year/400余0
是閏年leap_day=1else
if
year/100余0不是閏年Step3:
設(shè)計(jì)程序偽代碼-續(xù)elseif
year/4余0
是閏年
leap_day=1else
不是閏年leap_day=0
end%開(kāi)始計(jì)算第幾天%首先加上當(dāng)月的天數(shù)day_of_year=day%加上這一年往月的天數(shù)for
i=1:month-1switch
(i)case
{1,
3,
5,
7,
8,10}
day_of_year=day_of_year+31case
{4,
6,
9,
11}
day_of_year=day_of_year+30case{2}
day_of_year=day_of_year+28+leap_dayend
end
%輸出結(jié)果print
day_of_yearpage28Step
4:將偽代碼轉(zhuǎn)換為程序語(yǔ)句%Script
file:dayofyear.m
“名字”%%Purpose:
“用途”%
This
programcalculates
the
day
of
year
corresponding%
to
a
specified
date.
It
illustrates
the
use
switch%
and
for
constructs.%%Record
of
revisions:
“修改記錄”%
Date Programmer
Description
of
change%
========
=========
===============%
21/10/13
Y.Y.Guo Original
code%%Define
variables:
“變量定義”%
day
--Day
(dd)%
day_of_year
--Day
of
year%
i
--Loopindex%
leap_day
--Extra
day
for
leap
year%
month
--Month
(mm)%
year
--Year(yyyy)“程序信息”page29Step
4:
將偽代碼轉(zhuǎn)換為
程序語(yǔ)句-續(xù)%
Get
day,
month,
and
year
to
convertdisp('This
program
calculatesthe
day
of
year
given
the
');disp('current
date.');month
=
input('Enter
current
month
(1-12):');day
=
input('Enter
current
day(1-31):');year
=
input('Enter
current
year(yyyy):
');%
Check
for
leap
year,
and
add
extra
day
if
necessaryif
mod(year,400)
==
0leap_day
=
1;
%
Years
divisible
by
400
are
leap
yearselseifmod(year,100)
==
0leap_day
=
0;
%
Other
centuries
are
not
leap
yearselseif
mod(year,4)
==
0leap_day=
1;
%
Otherwise
every
4th
year
is
a
leap
yearelseleap_day
=
0;
%
Other
years
are
not
leap
yearsend“輸入年、月、日”“判斷該年是否為閏年”page30day_of_year
=
day_of_year
+
31;case
{4,6,9,11},day_of_year
=
day_of_year
+
30;case
2,day_of_year
=
day_of_year
+
28
+
leap_day;endend% l
userfprintf('The
date
%2d/%2d/%4d
is
day
of
year
%d.\n',...month,
day,
year,
day_of_year)%
Calculateday
of
year
by
adding
current
day
to
the%
days
in
previous
months.day_of_year=day;
“首先加上當(dāng)月天數(shù)”for
i
=
1:
month
-
1%
Add
days
in
months
from
January
to
last
monthswitch
(i)case
{1,3,5,7,8,10},Step
4:
將偽代碼轉(zhuǎn)換為
程序語(yǔ)句-續(xù)“再加上往月天數(shù)”“輸出計(jì)算結(jié)果”page31Step
5:
調(diào)試程序>>
run('C:\ProgramFiles\
\R2010a\bin\dayofyear.m')This
program
calculatesthe
day
of
year
given
thecurrent
date.Enter
current
month
(1-12):10Enter
current
day(1-31):30Enter
current
year(yyyy):
2013The
date
10/30/2013
is
day
of
year
303.>>
run('C:\ProgramFiles\
\R2010a\bin\dayofyear.m')This
program
calculatesthe
day
of
year
given
thecurrent
date.Enter
current
month
(1-12):10Enter
currentday(1-31):30Enter
current
year(yyyy):
1992The
date
10/30/1992
is
day
of
year
304.page32循環(huán)語(yǔ)句之“while循環(huán)”while循環(huán)是一個(gè)通過(guò)邏輯判斷來(lái)確定重復(fù)次數(shù)的語(yǔ)句塊。while
expressionstatement
1……statement
nendpage33如果expression的值非零,程序?qū)?zhí)行代碼塊,然后返回到while語(yǔ)句執(zhí)行;當(dāng)expression的值為零時(shí),這個(gè)重復(fù)過(guò)程結(jié)束,程序?qū)⑻羍nd后面的一可執(zhí)行語(yǔ)句。實(shí)例8:矩陣冪運(yùn)算的近似解當(dāng)A矩陣的階數(shù)不太高且元素值不太大時(shí),可以用如下的展開(kāi)式近似求解。exp(A)
1
A
A2
/
2!
A3
/
3!...>>
a=[2
3;3
4];e=zeros(size(a));f=eye(size(a));k=1;while
norm(e+f-e,1)>0e=e+f;f=a*f/k;k=k+1;end>>
ee
=162.7871
224.6754224.6754
312.5707>>
expm(a)ans
=162.7871
224.6754224.6754
312.5707可見(jiàn)同
的函數(shù)計(jì)算所得結(jié)果比較,計(jì)算精度還很不錯(cuò)!page34實(shí)例9:計(jì)算給定數(shù)據(jù)的平均值和標(biāo)準(zhǔn)差Step
1:
清晰地陳述出你要解決的問(wèn)題;“計(jì)算給定數(shù)據(jù)的平均值和標(biāo)準(zhǔn)差,且數(shù)據(jù)的數(shù)目未知,但非負(fù)”Step
2:確定程序的輸入變量和輸出變量;“輸入變量:給定數(shù)據(jù);輸出變量:這些數(shù)據(jù)的平均值和標(biāo)準(zhǔn)差”偽代碼整體框架:輸入數(shù)據(jù);計(jì)算平均值和標(biāo)準(zhǔn)差;輸出計(jì)算結(jié)果。1Nx
ii1Nx
Ni1
N2
i1
s
N
(N
1)N
xi2
xi
Step3:
設(shè)計(jì)程序偽代碼;%輸入數(shù)據(jù)
input%計(jì)算平均值和標(biāo)準(zhǔn)差N=N+1;
sum_x=sum_x+x;sum_x2=sum_x2+x2page35Step
3:設(shè)計(jì)程序偽代碼-續(xù)page36%輸出計(jì)算結(jié)果:print
x_bar,std_dev%
To
calculate
mean
and
the
standard
deviation
of%
an
inputdata
set
containing
an
arbitrarynumber%
of
input
values.%
======
========
===============%
21/10/13
Y.Y.
Guo Original
code%程序語(yǔ)句Step
4:
將偽代碼轉(zhuǎn)換為%Script
file:stats_1.m
“名字”%%Purpose:
“用途”%
“修改記錄”%
Record
of
revisions:%
Date ProgrammerDescription
of
change“變量定義”%
Define
variables:%
n
--
The
number
of
inputsamples%
std_dev
--
The
standarddeviation
of
the
inputsamples%
sum_x
--
The
sum
of
theinput
values%
sum_x2--
The
sum
of
thesquares
of
the
input
values%
x
--
An
input
data
value%
xbar
--
The
averageof
theinput
samplesStep
4:將偽代碼轉(zhuǎn)換為程序語(yǔ)句-續(xù)page37%
Initializesums.n
=
0;
sum_x
=
0;
sum_x2
=
0;%
Readin
valuex
=
input('Enter value:
');%
WhileLoop
to
read
inputvalues.while
x
>=
0%
Accumulate
sums.n
=
n
+
1;sum_x
=
sum_x
+
x;sum_x2
=
sum_x2
+
x^2;%
Read
in
nextvaluex
=
input('Enternext
value:
');end%
Calculate
the
mean
and
standard
deviationx_bar
=
sum_x
/n;std_dev
=
sqrt(
(n
*
sum_x2
-
sum_x^2)
/
(n
*
(n-1))
);%
l
user.fprintf('The
mean
of
this
data
set
is:
%f\n',
x_bar);fprintf('The
standard
deviation
is:
%f\n',
std_dev);fprintf('The
number
of
data
points
is:
%d\n',n);“輸入非負(fù)數(shù)據(jù)并計(jì)算平均值和標(biāo)準(zhǔn)差”“輸出計(jì)算結(jié)果”Step
5:
調(diào)試程序>>
run('C:\Program
Files\
\R2010a\bin\stats_1.m')Enter
value:
1Enter
next
value:
3Enter
next
value:
5Enter
next
value:
9Enter
next
value:
-1The
mean
of
this
data
set
is:
4.500000The
standarddeviation
is:
3.415650The
number
of
data
points
is:
4Enter
next
value:98Enter
next
value:97Enter
next
value:
93Enter
next
value:76Enter
next
value:80Enter
next
value:
-9The
mean
of
this
data
set
is:
90.666667The
standarddeviation
is:
10.152175The
number
of
data
points
is:
6Note:當(dāng)輸入數(shù)據(jù)為負(fù)數(shù)時(shí),計(jì)算終止。在計(jì)算平均值和>>
run('C:\Program
Files\Enter value:
100\R2010a\bin\stats_1.m')標(biāo)準(zhǔn)差時(shí)只考慮之前輸入的非負(fù)數(shù)據(jù)。page38page39循環(huán)語(yǔ)句之“嵌套循環(huán)”如果一個(gè)循環(huán)完全出現(xiàn)在另一個(gè)循環(huán)當(dāng)中,則稱這兩個(gè)循環(huán)為帶嵌套的循環(huán)。此外,也會(huì)出現(xiàn)多重嵌套的循環(huán)。for
i
=
1:3for
j
=
1:3product
=
i
*j;fprintf('%d
*
%d
=
%d
\n',
i,
j,
product);endend1
*
1
=
11
*
2
=
21
*
3=
32
*
1
=
22
*
2
=
42
*
3
=
63
*
1
=
33
*
2=
63
*
3
=
9page40人機(jī)交互語(yǔ)句echo
on
指令:顯示其后所有執(zhí)行文件的指令;echo
off
指令:關(guān)閉其后所有執(zhí)行文件的指令顯示;input
指令:提示用戶從鍵盤(pán)輸入數(shù)值、字符串或表達(dá)式,并接受輸入;pause
指令:使程序運(yùn)行停止,等待用戶按任意鍵繼續(xù);disp指令:在屏幕上顯示字符串;fprintf指令:在屏幕上按一定格式輸出字符串。input命令調(diào)用格式為:input(提示信息,選項(xiàng))>>
reply
=
input('Do
you
want
more?
Y/N
[Y]:
',
's');Do
you
want
more?
Y/N
[Y]:
Y>>
replyreply
=Y>>
reply
=
input('Pleaseinput
your
height:
')Please
input
your
height:
177reply
=177Note:‘s’表示允許用戶輸入一個(gè)字符串,如果省略不寫(xiě),則表示數(shù)字變量。人機(jī)交互語(yǔ)句page41人機(jī)交互語(yǔ)句pause命令此命令有如下幾種調(diào)用格式:pause:程序暫停等待回應(yīng),直到用戶按任意鍵繼續(xù)運(yùn)行;pause(n):程序暫停n秒時(shí)間;pause
on:執(zhí)行其后的pause命令;pause
off:不執(zhí)行其后的pause命令。pause
命令在程序的調(diào)試過(guò)程或者用戶需要查看中間結(jié)果時(shí)十分有用。page42人機(jī)交互語(yǔ)句disp命令調(diào)用格式為:disp(輸出項(xiàng))>>
A='I
miss
you
very
much!';disp(A)I
miss
you
verymuch!fprintf命令>>
a=9;
fprintf('%d\n',a)9Note:常見(jiàn)輸出格式%d
--整型格式輸出;%f
--浮點(diǎn)型格式輸出;調(diào)用格式為:fprintf(格式,輸出項(xiàng))
%e--指數(shù)形式輸出;\n
--換行。的輸出格式控制與C語(yǔ)言相同!page43函數(shù)變量及變量作用域函數(shù)文件的
變量是局部變量,與其他函數(shù)文件及工作空間相互
。但是,如果在若干函數(shù)中,都把某一變量定義為全局變量,那么這些函數(shù)將公用這一個(gè)變量。在
中,全局變量用命令global定義。全局變量的作用域是整個(gè)
工作空間,即全程有效。所有的函數(shù)都可以對(duì)它進(jìn)行存取和修改。因此,定義全局變量是函數(shù)間傳遞信息的一種
。page44實(shí)例10:全局變量使用簡(jiǎn)例function
f=wadd(x,y)%
add
two
variableglobal
ALPHA
BETAf=cos(ALPHA)*x+sin(BETA)*y;求x,
y按照如下
方式的和:f
cos
x
sin
y>>
global
ALPHA
BETA>>
ALPHA=pi/3;BETA=pi/4;>>
wadd(5,6)ans
=6.7426Tips:使用全局變量時(shí),函數(shù)
以及命令窗口(或者命令式M文件)中均應(yīng)該定義相應(yīng)的全局變量;定義多個(gè)全局變量時(shí),用空格隔開(kāi),不能用逗號(hào)。page45在函數(shù)調(diào)用上有一個(gè)與眾不同之處:函數(shù)所傳遞參數(shù)數(shù)目的可調(diào)性。憑借這一點(diǎn),一個(gè)函數(shù)可完成多種功能。在調(diào)用函數(shù)時(shí),用兩個(gè)變量nargin
和nargout分別記錄調(diào)用該函數(shù)時(shí)的輸入實(shí)參和輸出實(shí)參的個(gè)數(shù)。只要在函數(shù)文件中包含這兩個(gè)變量,就可以準(zhǔn)確地知道該函數(shù)文件被調(diào)用時(shí)的輸入輸出參數(shù)個(gè)數(shù),從而決定函數(shù)如何進(jìn)行處理。函數(shù)變量及變量作用域-續(xù)page46實(shí)例11:nargin變量使用簡(jiǎn)例function
c=test_nargin(a,b)%
This
function
is
to
test
thenargin
%
variableif
nargin==1c=det(a);elseif
nargin==2c=a+b;end編制一個(gè)函數(shù),函數(shù)名為test_nargin,它能實(shí)現(xiàn)如下功能:如果調(diào)用函數(shù)時(shí)只有一個(gè)輸入變量,則求該變量的模(對(duì)矩陣而言則為行列式),如果有兩個(gè)輸入變量,則求兩個(gè)變量的和。>>
A=[1,2,3;4:6;10
1218];
B=eye(3);>>
test_nargin(A)ans
=-12.0000>>
test_nargin(B)ans
=1>>
test_nargin(A,
B)ans
=2
2
34
6
610
12
1961
2 3
A
4
5
10
12
180100B
0
10
0
1page47程序設(shè)計(jì)的輔助函數(shù)在語(yǔ)言的程序設(shè)計(jì)中,有幾組輔助函數(shù)可用以支持M文件的編輯,對(duì)這些函數(shù)的合理使用可以增加函數(shù)的魯棒性或豐富函數(shù)功能。輔助函數(shù)包括:執(zhí)行函數(shù)容錯(cuò)函數(shù)時(shí)間控制函數(shù)page48執(zhí)行函數(shù)函數(shù)名說(shuō)明函數(shù)名說(shuō)明eval字符串調(diào)用builtin外部加載調(diào)用函數(shù)evalc執(zhí)行表達(dá)式assignin工作間中分配變量feval調(diào)用M文件run運(yùn)行(script)evalin執(zhí)行計(jì)算工作間中的表達(dá)式中提供了一系列的執(zhí)行函數(shù)。page49容錯(cuò)函數(shù)一個(gè)程序設(shè)計(jì)的好壞在很大程度上取決于其容錯(cuò)能力的大小。語(yǔ)言中提供了相應(yīng)的報(bào)錯(cuò)及警告函數(shù)error,warning等。函數(shù)error可以在窗口中顯示錯(cuò)誤的信息,以提示用戶輸入錯(cuò)誤或者調(diào)用錯(cuò)誤,其調(diào)用格式如下:error(‘錯(cuò)誤信息’):如果調(diào)用M文件時(shí)觸發(fā)error,則程序?qū)⒅袛噙\(yùn)行,并顯示錯(cuò)誤信息。函數(shù)warning的用法類似于函數(shù)error,但與其不同的是,函數(shù)warning不會(huì)中斷程序的執(zhí)行,而僅僅給出警告信息。與容錯(cuò)相關(guān)的函數(shù)或命令還有:
lasterr、lastwarn以及errortrap
on/off等。
page50語(yǔ)言還提供了一個(gè)流程控制結(jié)構(gòu)用于容錯(cuò)處理,即try-catch-end結(jié)構(gòu),其調(diào)用格式如下:tryblock
1catchblock
2end容錯(cuò)函數(shù)在執(zhí)行該語(yǔ)句段時(shí),將先執(zhí)行block1,如果block1內(nèi)出現(xiàn)錯(cuò)誤,則將執(zhí)行block
2,如果block
2也出現(xiàn)錯(cuò)誤,則程序?qū)?bào)錯(cuò)并終止;如果block
1內(nèi)出現(xiàn)錯(cuò)誤,block
2執(zhí)行后,則可由容錯(cuò)函數(shù)lasterr獲得錯(cuò)誤詳情。page51page52實(shí)例12:容錯(cuò)控制結(jié)構(gòu)try-catch-end示例function
c=testtce(a,b)%
This
function
is
to
test
the%
try-catch-end
structuretryc=a+b;catchc=strcat(a,b);end>>
a='I
miss'a
=I
miss>>
b='
you
very
much!'b
=you
very
much!>>
c=testtce(a,b)c
=I
miss
you
very
much!>>
lasterrans
=Error
using
==>
plusMatrix
dimensions
must
agree.>>
a+b???
Error
using==>plusMatrix
dimensions
mustagree.時(shí)間控制函數(shù)中提供了一些時(shí)間控制函數(shù),可以用來(lái)監(jiān)視程序運(yùn)行的時(shí)間,如下表所示。函數(shù)名說(shuō)明函數(shù)名說(shuō)明Now數(shù)值形式顯示當(dāng)前Datevec轉(zhuǎn)換為向量形式顯時(shí)間和日期示日期Date字符形式顯示當(dāng)前Calendar當(dāng)月的日歷表日期Clock向量形式顯示當(dāng)前Weekday當(dāng)前日期對(duì)應(yīng)的星日期和時(shí)間期表達(dá)Datenum轉(zhuǎn)換為數(shù)值格式顯示日期Eomday制定年月的最后一天Datestr轉(zhuǎn)換為字符形式顯Datetick制定坐標(biāo)軸的日期示日期表達(dá)page53例如:>>
dateans
=22-Oct-2013另外,還提供了一些計(jì)時(shí)函數(shù),如下表所示。函數(shù)名
說(shuō)明cputime
以CPU時(shí)間方式計(jì)時(shí)tic,toc
計(jì)時(shí)器開(kāi)關(guān)etime
計(jì)算兩個(gè)時(shí)刻的時(shí)間差page54page55程序設(shè)計(jì)的優(yōu)化以矩陣作為操作主體,盡量避免對(duì)矩陣元素的操作;盡量避免循環(huán)運(yùn)算,尤其是多重循環(huán);數(shù)據(jù)的預(yù)定義:尤其在循環(huán)中使用數(shù)組變量時(shí),可以預(yù)先估計(jì)變量可能出現(xiàn)的最大維數(shù),進(jìn)行預(yù)定義;內(nèi)存的管理:即使清理內(nèi)容,clear。page56實(shí)例13:循環(huán)運(yùn)算和向量運(yùn)算時(shí)間對(duì)比f(wàn)unction
y=test_opt2x=[1:10000]*pi;y=sin(x);>>
tic;test_opt1;t1=toct1
=0.0658>>
tic;test_opt2;t1=toct1
=0.0172計(jì)算y=sin(x),其中
x
10000function
y=test_opt1for
i=1:10000y(i)=sin(pi*i);end程序調(diào)試使用pause函數(shù);在程序內(nèi)設(shè)置斷點(diǎn);調(diào)試出現(xiàn)錯(cuò)誤時(shí),學(xué)會(huì)查看Workplace,分析變量取值是否科學(xué)合理。page57page58page59信息接口文件接口應(yīng)用程序接口獨(dú)立程序與MS-Word接口page60文件接口文件可分為兩類:文本文件由字符和與字符的顯示格式有關(guān)的控制符構(gòu)成常見(jiàn)擴(kuò)展名:“TXT”、“BAT”、“HTM”二進(jìn)制文件二進(jìn)制文件為非文本文件常見(jiàn)擴(kuò)展名:“COM”、“EXE”、“BMP”、“WAV”Note:簡(jiǎn)單來(lái)說(shuō),文本文件是基于字符編碼的文件,常見(jiàn)的編碼有ASCII編碼,其它則可認(rèn)為是二進(jìn)制文件。page61文件的打開(kāi)與關(guān)閉fopen函數(shù)fid=fopen(filename,permission)[fid,message]=fopen(filename,permssion)[filename,permission,machineformat]=fopen(fid)fid
=fopen('all')fclose函數(shù)status=fclose(fid)status=fclose('all')例:打開(kāi)一個(gè)名為my.txt的數(shù)據(jù)文件并進(jìn)行讀操作,命令為:fid=fopen('my.txt','r')格式化數(shù)據(jù)的讀寫(xiě)fscanf函數(shù)[A,
count]=fscanf(fid,
format,
size)fprintf函數(shù)count=fprintf(fid,format
,
A
...)page62計(jì)算當(dāng)x=[0
1]時(shí)f(x)=ex的值,并將結(jié)果寫(xiě)入到文件my.txt中。x=0:0.1:1;y=[x;exp(x)];
%y有兩行數(shù)據(jù)fid=fopen('my.txt','w');fprintf(fid,'%6.2f
%
12.8f\n',y);fclose(fid);實(shí)例14:文件接口簡(jiǎn)例page63文件的定位和狀態(tài)feof函數(shù):檢測(cè)文件是否已經(jīng)結(jié)束status=feof(fid)ferror函數(shù):用于查詢文件的輸入、輸出錯(cuò)誤信息msg=ferror(fid)frewind函數(shù):使位置指針重新返回文件的開(kāi)頭frewind(fid)fseek函數(shù):設(shè)置文件的位置指針status=fseek(fid,
offset,
origin)f l函數(shù):用于查詢當(dāng)前文件指針的位置position=f
l(fid)。page64實(shí)例15:輸出文件的大小和位置>>fid=fopen('my.txt','r');fseek(fid,0,'eof');x=f
l(fid);fprintf(1,'File
Size=%d\n',x);frewind(fid);x=f
l(fid);fprintf(1,'File
Position
=%d\n',x);fclose(fid);輸出結(jié)果:File
Size=231File
Position=0page65按行
數(shù)據(jù)數(shù)據(jù),但不
換行符。行、保留換行符并把行作為fgetl函數(shù):按行從文件中l(wèi)ine=fgetl(fid)fgets函數(shù):用于從文件中字符串返回。(1)line=fgets(fid)–
(2)line=fgets(fid,nchar)page66page67二進(jìn)制文件數(shù)據(jù)的讀寫(xiě)fwrite函數(shù):用于向一個(gè)文件寫(xiě)入二進(jìn)制數(shù)據(jù)count=fwrite(fid,A,precision)。fread函數(shù):用于從文件中讀二進(jìn)制數(shù)據(jù)[A,count]=fread(fid,
size,
precision)Note:使用函數(shù)fread()和fwrite()讀寫(xiě)文件時(shí),必須以二進(jìn)制方式打開(kāi)文件。實(shí)例16:魔方矩陣的二進(jìn)制讀寫(xiě)將5行5列“魔方陣”存入二進(jìn)制文件中:fid=fopen('my.dat','w');a=magic(5);fwrite(fid,a,'long');fclose(fid);注意二進(jìn)制文件和文本文件讀寫(xiě)數(shù)據(jù)的不同!從二進(jìn)制文件中“魔方陣”:fid=fopen('my.dat','r');[A,count]=fread(fid,
[5,
inf],
'long');fclose(fid);AA
=17
24
1
8
1523
5
7
14
16page68page69圖像聲音文件的讀寫(xiě)imread函數(shù):從文件中讀入圖像A
=
imread(filename,fmt)[A,
map]
=
imread(filename,fmt)image函數(shù):顯示圖像image(A)imwrite函數(shù):將圖像寫(xiě)入文件imwrite(A,
filename,
fmt)imwrite(A,
map,
filename,
fmt)imfinfo函數(shù):查詢圖像文件信息innfo
=
imflnfo(filename)wavread函數(shù):用于
擴(kuò)展名為“.wav”
文件y=wavread(file)[y,
fs,
nbits]=wavread(file)wavwrite函數(shù):用于將數(shù)據(jù)寫(xiě)入到擴(kuò)展名為“wav”文件中wavwrite(y,
fs,
nbits,
wavefile)wavplay函數(shù):利用windows音頻輸出設(shè)備
聲音wavplay(y,fs)圖像聲音文件的讀寫(xiě)-續(xù)page70應(yīng)用程序接口調(diào)用其他語(yǔ)言編寫(xiě)的程序(MEX文件);調(diào)用計(jì)算引擎;MAT文件接口。page71MEX文件
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度智能車(chē)庫(kù)門(mén)系統(tǒng)智能化改造合同4篇
- 花崗巖擋車(chē)石施工方案
- 2025年度個(gè)人房產(chǎn)抵押權(quán)質(zhì)權(quán)合同示范2篇
- 2025年度智能門(mén)窗系統(tǒng)安裝與智能家居集成合同4篇
- 2025年度職業(yè)技能培訓(xùn)學(xué)校招生代理合作協(xié)議3篇
- 2025年玻璃制品展示設(shè)計(jì)與制作合同3篇
- 2025年度倉(cāng)儲(chǔ)物流信息化系統(tǒng)租賃服務(wù)合同2篇
- 基于2025年度標(biāo)準(zhǔn)的知識(shí)產(chǎn)權(quán)許可使用合同3篇
- 2025年能源行業(yè)學(xué)徒培養(yǎng)與勞動(dòng)合同3篇
- 民用住宅消防安全管理
- 2024年人教版小學(xué)三年級(jí)信息技術(shù)(下冊(cè))期末試卷附答案
- 中國(guó)子宮內(nèi)膜增生管理指南(2022)解讀
- 應(yīng)征公民政治考核表(含各種附表)
- 2024年第九屆“鵬程杯”五年級(jí)語(yǔ)文邀請(qǐng)賽試卷
- 名師成長(zhǎng)論名師成長(zhǎng)的模式、機(jī)制和規(guī)律研究
- FSSC22000V6.0變化點(diǎn)和文件修改建議
- 2024年高一年級(jí)上冊(cè)語(yǔ)文期末復(fù)習(xí):語(yǔ)言文字運(yùn)用Ⅰ刷題練習(xí)題(含答案)
- 新蘇教版三年級(jí)下冊(cè)科學(xué)全冊(cè)知識(shí)點(diǎn)(背誦用)
- 鄉(xiāng)鎮(zhèn)風(fēng)控維穩(wěn)應(yīng)急預(yù)案演練
- 腦梗死合并癲癇病人的護(hù)理查房
- 成都銀行貸款合同
評(píng)論
0/150
提交評(píng)論