條件語句和循環(huán)語句是計(jì)算機(jī)編程中常用的兩種控制結(jié)構(gòu)
條件語句是一種根據(jù)某個(gè)條件來執(zhí)行不同操作的程序結(jié)構(gòu)。當(dāng)滿足特定條件時(shí),程序會執(zhí)行一個(gè)或多個(gè)指定的操作;否則,程序?qū)⑻^這些操作并繼續(xù)執(zhí)行下一條語句。在大多數(shù)編程語言中,條件語句通常使用if-else語句實(shí)現(xiàn),也可以使用switch-case語句等其他形式。
循環(huán)語句是一種重復(fù)執(zhí)行相同或類似操作的程序結(jié)構(gòu)。它允許程序按照預(yù)定義的次數(shù)或者直到某個(gè)條件被滿足為止重復(fù)執(zhí)行一組語句。在大多數(shù)編程語言中,循環(huán)語句通常使用for、while、do-while等關(guān)鍵字實(shí)現(xiàn)。
通過使用條件語句和循環(huán)語句,程序員可以更加靈活地控制程序的流程和行為,從而實(shí)現(xiàn)各種復(fù)雜的功能和應(yīng)用
文本通過python,Stateflow,Simulink 以及 MATLAB Function四種方法實(shí)現(xiàn)If-else、Switch -case、For循環(huán)、While循環(huán)、Do-while循環(huán)
If-Else
if else循環(huán)的本質(zhì)是根據(jù)給定條件判斷程序執(zhí)行哪個(gè)分支。具體來說,if語句會先判斷括號中的條件是否為真,如果為真,則執(zhí)行花括號內(nèi)的代碼塊;否則,跳過該代碼塊,繼續(xù)執(zhí)行下一個(gè)語句。
x = 10
if x > 5:
print("x大于5")
else:
print("x小于等于5")
在這個(gè)示例中,我們定義了變量x,并使用if else語句對其進(jìn)行判斷。首先,if語句會判斷x是否大于5,由于x的值為10,因此條件成立,程序?qū)⑤敵觥皒大于5”。如果x的值為3,則條件不成立,程序?qū)⑻^if語句塊,執(zhí)行else語句塊,輸出“x小于等于5”。
總之,if else循環(huán)可以幫助我們根據(jù)不同的情況采取不同的行動,從而實(shí)現(xiàn)更加靈活和智能的編程。
舉例說明1
對于自動空調(diào)控制系統(tǒng),以夏季空調(diào)制冷為例,當(dāng)主副駕設(shè)定不同需要求溫度時(shí)(temp_set_driver,temp_set_passenger),整車TD負(fù)荷值按空調(diào)設(shè)定溫度最低的一側(cè)取值進(jìn)行計(jì)算
Python實(shí)現(xiàn)
temp_set_driver = int(input("請輸入主駕溫度:"))
temp_set_passenger = int(input("請輸入副駕溫度:"))
if temp_set_driver <= temp_set_passenger:
output = temp_set_driver
else:
output = temp_set_passenger
print("自動空調(diào)設(shè)定溫度為:", output)
"""
我們使用了input()函數(shù)來獲取用戶輸入,并將其轉(zhuǎn)換成整數(shù)類型。然后,我們使用if else語句來判斷兩個(gè)變量的大小關(guān)系,并將最小值賦給output變量。
最后輸出自動空調(diào)設(shè)定溫度即可。例如,在上述示例中,當(dāng)用戶輸入主駕溫度為20,副駕溫度為22時(shí),程序會輸出“自動空調(diào)設(shè)定溫度為:20”,因?yàn)榇藭r(shí)主駕溫度小于等于副駕溫度。而當(dāng)用戶輸入主駕溫度為28,副駕溫度為24時(shí),程序會輸出“自動空調(diào)設(shè)定溫度為:24”,因?yàn)榇藭r(shí)主駕溫度大于副駕溫度。
"""
matlab function實(shí)現(xiàn)
function output = auto_temp_control(temp_set_driver, temp_set_passenger)
% 自動空調(diào)設(shè)定溫度取主駕和副駕溫度的最小值
if temp_set_driver <= temp_set_passenger
output = temp_set_driver;
else
output = temp_set_passenger;
end
fprintf("自動空調(diào)設(shè)定溫度為:%dn", output);
%{
我們定義了一個(gè)名為auto_temp_control的MATLAB函數(shù),并接受兩個(gè)輸入參數(shù):temp_set_driver和temp_set_passenger。然后,我們使用if else語句來判斷兩個(gè)變量的大小關(guān)系,并將最小值賦給output變量。
最后,我們使用fprintf()函數(shù)輸出自動空調(diào)設(shè)定溫度即可。例如,在上述示例中,當(dāng)用戶輸入主駕溫度為20,副駕溫度為22時(shí),程序會輸出“自動空調(diào)設(shè)定溫度為:20”,因?yàn)榇藭r(shí)主駕溫度小于等于副駕溫度。而當(dāng)用戶輸入主駕溫度為28,副駕溫度為24時(shí),程序會輸出“自動空調(diào)設(shè)定溫度為:24”,因?yàn)榇藭r(shí)主駕溫度大于副駕溫度。
%}
simulink實(shí)現(xiàn)
當(dāng)然,simulink實(shí)現(xiàn)方法是為了體現(xiàn)If-Else條件語句的邏輯,采用了Switch模塊,單看此部分的實(shí)例,選用min模塊會更加方便
Stateflow實(shí)現(xiàn)
If-Else If-Else
If-Else If-Else通常用于處理多種情況的判斷,例如根據(jù)不同的條件執(zhí)行不同的操作。以下是一個(gè)簡單的示例代碼(Python):
score = 85
if score >= 90:
grade = 'A'
elif score >= 80:
grade = 'B'
elif score >= 70:
grade = 'C'
elif score >= 60:
grade = 'D'
else:
grade = 'F'
print("成績?yōu)椋?, grade)
舉例說明2
**當(dāng)車內(nèi)環(huán)境溫度(temp_incar)低于10℃時(shí),空調(diào)開啟加熱模式(AC_state==heater),當(dāng)車內(nèi)環(huán)境溫度處于10℃到30℃時(shí)開啟空調(diào)自然風(fēng)模式(AC_state==natural_wind),當(dāng)車內(nèi)環(huán)境溫度大于30℃時(shí)開啟制冷模式(AC_state==cooling)**
Python實(shí)現(xiàn)
temp_incar = float(input("請輸入車內(nèi)環(huán)境溫度:"))
if temp_incar < 10:
AC_state = 'heater'
elif temp_incar >= 10 and temp_incar <= 30:
AC_state = 'natural_wind'
else:
AC_state = 'cooling'
print("空調(diào)狀態(tài)為:", AC_state)
matlab function實(shí)現(xiàn)
function AC_state = calculate_AC_state()
% 計(jì)算空調(diào)狀態(tài)
temp_incar = input("請輸入車內(nèi)環(huán)境溫度:");
if temp_incar < 10
AC_state = 'heater';
elseif temp_incar >= 10 && temp_incar <= 30
AC_state = 'natural_wind';
else
AC_state = 'cooling';
end
fprintf('空調(diào)狀態(tài)為:%sn', AC_state);
end
%{
在這個(gè)示例中,我們首先定義了一個(gè)名為calculate_AC_state()的MATLAB函數(shù),并使用input()函數(shù)提示用戶輸入車內(nèi)環(huán)境溫度。然后,我們使用If-Else If-Else深層次邏輯來根據(jù)車內(nèi)環(huán)境溫度計(jì)算出對應(yīng)的空調(diào)狀態(tài),與之前的Python代碼相同。最后,我們使用fprintf()函數(shù)輸出計(jì)算出的空調(diào)狀態(tài)。
當(dāng)你調(diào)用該函數(shù)時(shí),程序會等待用戶輸入車內(nèi)環(huán)境溫度,并根據(jù)輸入的值計(jì)算出對應(yīng)的空調(diào)狀態(tài)。
%}
simulink實(shí)現(xiàn)
如果執(zhí)行語句只是簡單的賦值,使用 switch 模塊即可,如果涉及到更復(fù)雜的計(jì)算,應(yīng)避免頻繁使用開關(guān)塊進(jìn)行條件分岔,可考慮使用 If 以及 If Action Subsystem 模塊,但是這個(gè)"復(fù)雜"也很難定義。對于 Switch來說,通常會約束一個(gè)層疊的上限,比如三層,如果 switch 模塊層層疊疊層級非常多也可以考慮用子系統(tǒng)分別“包裹”起來,如果沒有狀態(tài)量的話,最好就不要用 If Action Subsystem模塊,理論上 Stateflow,Simulink 以及 MATLAB Function 幾乎都可以完成相同的模型,只是要根據(jù)應(yīng)用場合和使用習(xí)慣加以取舍。
使用 If 以及 If Action Subsystem 模塊對上面的switch模塊進(jìn)行改造,如下:
在Simulink中,If
模塊和If Action Subsystem
模塊組合可以用于實(shí)現(xiàn)多個(gè)條件分支邏輯。
- If Action Subsystem 模塊是經(jīng)過預(yù)先配置的 Subsystem模塊,可以作為一個(gè)起點(diǎn),用來創(chuàng)建由 If模塊控制執(zhí)行的子系統(tǒng)。If 模塊計(jì)算邏輯表達(dá)式,然后根據(jù)計(jì)算結(jié)果輸出動作信號。子系統(tǒng)的執(zhí)行由放置在子系統(tǒng)內(nèi)部的 Action Port模塊控制;
- If 模塊以及包含 Action Port 模塊的 If Action Subsystem 模塊實(shí)現(xiàn) if-else 邏輯來控制子系統(tǒng)的執(zhí)行。有關(guān)使用 If 模塊的示例,請參閱 If 執(zhí)行子系統(tǒng);
- If 模塊從一組子系統(tǒng)中選擇 If Action Subsystem 模塊的執(zhí)行。無論 If 模塊選擇哪個(gè)子系統(tǒng),您都可以使用 Merge模塊創(chuàng)建單個(gè)信號;
- If Action Subsystem 模塊中的所有模塊必須以與驅(qū)動 If 模塊相同的速率執(zhí)行。您可以通過將每個(gè)模塊的采樣時(shí)間參數(shù)設(shè)置為繼承
-1
或與 If 模塊采樣時(shí)間相同的值來滿足此要求;
Stateflow實(shí)現(xiàn)
Switch - Case
在Python中,switch-case
結(jié)構(gòu)并不是一種原生的語言結(jié)構(gòu)。但我們可以使用其他方式來實(shí)現(xiàn)類似的功能。
一種常見的方法是使用字典(dictionary)和函數(shù)映射來模擬switch-case
結(jié)構(gòu)。具體步驟如下:
- 創(chuàng)建一個(gè)字典,將每個(gè)條件對應(yīng)的操作函數(shù)作為值存儲在其中。
- 根據(jù)輸入信號選擇相應(yīng)的操作函數(shù),并執(zhí)行它。
以下是一個(gè)使用字典和函數(shù)映射實(shí)現(xiàn)switch-case
結(jié)構(gòu)的示例代碼:
def case_1():
print("Case 1")
def case_2():
print("Case 2")
def case_3():
print("Case 3")
# 創(chuàng)建字典
cases = {
1: case_1,
2: case_2,
3: case_3
}
# 輸入信號
u = 2
# 根據(jù)輸入信號選擇相應(yīng)的操作函數(shù),并執(zhí)行它
if u in cases:
cases[u]()
else:
print("Invalid input")
在上述代碼中,我們首先定義了三個(gè)操作函數(shù)case_1()
、case_2()
和case_3()
,分別對應(yīng)三種情況。然后,我們創(chuàng)建了一個(gè)字典cases
,將每個(gè)條件對應(yīng)的操作函數(shù)作為值存儲在其中。最后,根據(jù)輸入信號選擇相應(yīng)的操作函數(shù),并執(zhí)行它。
既然python尚不支持Switch-Case,那我們先用一個(gè)C代碼示例展示Switch-Case語法結(jié)構(gòu)吧
#include < stdio.h >
int main() {
int choice;
printf("Please select an option:n");
printf("1. Option 1n");
printf("2. Option 2n");
printf("3. Option 3n");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("You selected Option 1.n");
break;
case 2:
printf("You selected Option 2.n");
break;
case 3:
printf("You selected Option 3.n");
break;
default:
printf("Invalid input.n");
break;
}
return 0;
}
/*
在上述代碼中,我們首先輸出一個(gè)菜單,讓用戶選擇一個(gè)選項(xiàng)。然后,我們使用switch-case結(jié)構(gòu)來根據(jù)用戶的選擇執(zhí)行相應(yīng)的操作。如果用戶輸入了無效的選項(xiàng),則會輸出“Invalid input.”。
這個(gè)示例代碼可以用于各種需要用戶交互的場景,例如命令行工具、控制臺程序等。
*/
閑話休提,我們接著舉例說明Switch-Case語句如何用simulink實(shí)現(xiàn)
舉例說明3
**空調(diào)吹風(fēng)模式具有多種狀態(tài),AC控制器需要把不同吹風(fēng)模式反饋給大屏控制器用于狀態(tài)顯示,AC_flow_state=0x0時(shí),AC_state=’face’;AC_flow_state=0x1時(shí),AC_state=’foot’;AC_flow_state=0x2時(shí),AC_state=’defrost’**
C代碼實(shí)現(xiàn)
#include < stdio.h >
int main() {
int AC_flow_state = 1;
char AC_state[10];
switch (AC_flow_state) {
case 0:
sprintf(AC_state, "face");
break;
case 1:
sprintf(AC_state, "foot");
break;
case 2:
sprintf(AC_state, "defrost");
break;
default:
printf("Invalid input.n");
return -1;
}
printf("The AC state is %s.n", AC_state);
return 0;
}
/*
在上述代碼中,我們首先定義了一個(gè)整型變量AC_flow_state表示空調(diào)吹風(fēng)模式狀態(tài)。然后,我們使用switch-case結(jié)構(gòu)根據(jù)不同的狀態(tài)值來設(shè)置字符串類型的變量AC_state。最后,我們輸出AC_state的值。
需要注意的是,在default分支中,我們輸出了“Invalid input.”并返回-1,這是為了防止程序出現(xiàn)未知錯(cuò)誤。
char AC_state[10]是一個(gè)字符數(shù)組,用于存儲空調(diào)吹風(fēng)模式的狀態(tài)。在這個(gè)例子中,我們將其定義為長度為10的數(shù)組,因?yàn)樽铋L的狀態(tài)字符串"defrost"有7個(gè)字符,再加上結(jié)尾符?,所以需要分配至少8個(gè)字節(jié)的空間。
*/
matlab function代碼實(shí)現(xiàn)
function AC_state = get_AC_state(AC_flow_state)
% This function returns the corresponding AC state based on the input flow state.
switch AC_flow_state
case 0
AC_state = 'face';
case 1
AC_state = 'foot';
case 2
AC_state = 'defrost';
otherwise
error('Invalid input.');
end
fprintf('The AC state is %s.n', AC_state);
end
%{
在上述代碼中,我們首先定義了一個(gè)MATLAB函數(shù)get_AC_state(),它接受一個(gè)整型參數(shù)AC_flow_state表示空調(diào)吹風(fēng)模式狀態(tài)。然后,我們使用switch-case結(jié)構(gòu)根據(jù)不同的狀態(tài)值來設(shè)置字符串類型的變量AC_state
}%
simulink實(shí)現(xiàn)
Stateflow實(shí)現(xiàn)
而對于 Stateflow 來說,不管是if-else還是switch-case,其實(shí)都是流程圖。所以就算你按照switch-case的邏輯畫了出來,生成的代碼依舊是if-else形式的。
所以需要我們稍微配置一下:模型設(shè)置→代碼生成→代碼風(fēng)格→勾選convert if-elseif-else patterns to switch case
-
驅(qū)動器
+關(guān)注
關(guān)注
52文章
8237瀏覽量
146381 -
控制器
+關(guān)注
關(guān)注
112文章
16367瀏覽量
178108 -
自動控制系統(tǒng)
+關(guān)注
關(guān)注
1文章
191瀏覽量
19401 -
python
+關(guān)注
關(guān)注
56文章
4797瀏覽量
84694 -
simulink仿真
+關(guān)注
關(guān)注
0文章
75瀏覽量
8578
發(fā)布評論請先 登錄
相關(guān)推薦
評論