++增加運算子1加算,變數a為0時,a++的答案變成1。
--減少運算子1減算,變數a為1時,a--的答案變成0。
1.3:
程式控制文法和命令
主要是為了比較演算的結果,以下為命令的說明及使用例。
最後則為範例程式的執行結果。
1.3.1:
讓整個程式分道執行「if-else」文
此文法為將程式控制的內容分成2個的命令。
判定是否滿足if後面()中所寫的條件。
滿足時
,執行()之後用{}總括的程式。
範例1
0|main(){
1|inta;
2|intb;
3|
4|a=buggage();
5|if(a==FAIL){
6|do{
7|b=seek(ERG);
8|}while(b==CONT);
9|get();
10|}
11|else{
12|do{
13|b=seek(WALL);
14|}while(b==CONT);
15|put();
16|}
17|}
此程式第4行的函數buggage()的傳回值,歸在所謂的a變數中。
因此,第5行
變數a若為常數FAIL的話,會執行自第7行至第10行的函數get()。
此外
「ifelse文」為即使else{}的部份不寫,也不會產生格式錯誤。
範例2
0|main(){
1|inta;
2|
3|a=move();
4|if(a==FAIL){
5|round(RIGHT);
6|}
7|}
此程式第4行的函數move()的傳回值,如果常數FAIL的話,會執行round()。
不是常數
FAIL時,不會做任何動作。
1.3.2:
反覆執行相同的程式1「while文」
此文法為如果滿足while後面()中所寫的條件,即執行其後{開始}為止中間的程式。
範例3
0|main(){
1|inta;
2|
3|a=SUCCESS;
4|while(a==SUCCESS){
5|a=move();
6|}
7|snooze();
8|}
此程式當變數a為常數SUCCESS時,連續執行函數move()。
跳離重覆,函數move()的傳回值
變為1時即結束。
另,while文中將()中的評價進行最初化,函數a的值在第3行定義為常數
SUCCESS,將之初期化。
若在while之後的()中寫入1,將不斷地反覆執行;相反地,寫入0
反覆的命令一次也不會執行,沒有任何意義。
範例4不斷地執行反覆命令
0|main(){
1|inta;
2|
3|a=1;
4|while
(1){
5|a=move();
6|}
7|}
範例5反覆的命令一次也不會執行
0|main(){
1|inta;
2|
3|a=1;
4|while(0){
5|a=move();
6|}
7|}
1.3.3:
反覆執行相同的程式2「do-while文」
此文法為和while如同兄弟般的東西,while文在最初會進行條件的判斷,但do-while
則在最後判斷條件。
亦即無條件執行一次do之後所寫{開始while之前}程式為止。
試著將範例3用do-while改寫看看。
範例6
0|main(){
1|inta;
2|
3|do{
4|a=move();
5|}while(a==SUCCESS);
6|snooze();
7|}
此程式和範例3相同,變數a連續執行常數SUCCESS之反覆函數MOVE()。
另亦和WHILE
文一樣,於}WHILE之後的()中寫入1,將不斷的反覆執行,相反地,寫入0,只執行一
次反覆命令,即結束反覆命令。
1.3.4:
反覆執行相同的程式3「FOR文」
以上說明WHILE文和DO-WHILE文()中指定的條件不成立時,即結束反覆,此文法執行
反覆命令的次數可事先指定。
FOR之後寫3個式子。
第1為給予初值的式子,第2為條件
判斷,第3為演算式子。
FOR文為第2的條件判斷成立時,執行{}中的程式。
範例7
0|main(){
1|inta;
2|
3|for(a=1;a<10;a++){
4|move();
5|}
6|
7|}
此程式為先將變數a給予1的初值。
再進行第2的條件判斷。
若條件成立時即執行
FOR之後{}中的程式。
在第2次以後的反覆中不再給予初值。
第2次以後先進行第3
的演算式子,再進行第2的條件判斷。
如果成立,即執行反覆的程式。
,執行式此程式,變數a即從1開始,執行比10小{}中
的程式,因此函數MOVE()合計為執行9次。
1.3.5:
自反覆的命令中跳離1「BREAK」
此為命令反覆的命令結束之指令。
即使反覆命令的條件成立,反覆中也可從中跳離。
能
跳離反覆命令的只有1。
範例8
0|main(){
1|inta;
2|intb;
3|for(a=0;a<20;a++){
4|do{
5|b=move();
6|if(b==FAIL){
7|round(RIGHT);
8|break;
9|}
10|}while
(1);
11|}
12|
13|}
此程式為當函數MOVE()的傳回值為常數FAIL時,執行ROUND()、跳離DO-WHILE文
的反覆命令。
但是FOR文的反覆,必須當變數A的值變成20時才能跳離。
1.3.6:
自反覆的命令中跳離2「CONTINUE」
此命令為中斷反覆命令{}中的程式,直接跳至反覆命令的}之處。
範例9
0|main(){
1|inta;
2|intb;
3|do{
4|a=move();
5|if(a==FAIL){
6|round(RIGHT);
7|}
8|b=check(FRONT);
9|if(b!
=ERG){
10|continue;
11|}
12|break;
13|}while
(1);
14|snooze();
15|}
此程式為函數FIND()的傳回值為常數FAIL時,因第10行的CONTINUE命令變有效
,不執行第12行的BREAK命令,而進行}WHILE嵾?
)的條件判斷。
將反覆停止
,函數CHECK()傳回值必須為常數ERG的值。
1.3.7:
跳離函數「RETURN」
此命令若在函數內,在任何地方函數自動結束之前,可強制將函數結束的命令
。
RETURN只有值為1時,才可將函數結束。
範例10
0|main(){
1|inta;
2|
3|do{
4|a=seek(ERG);
5|}while(a==CONT);
6|return(a);
7|}
此程式為當函數SEEK()的傳回值介於常數CONT時,執行DO-WHILE的反覆命令。
-1以外的傳回值,用RETURN命令將函數SEEK()的傳回值反還。
1.3.8:
範例程式說明
以上說明所寫的範圍程式,若在HR2EDITOR中編寫,將如以下說明動作。
初學
寫程式的人試著寫寫看如何。
範例1
機器人持有ERG時,找到作成牆壁的命令,移動至該場所,放置ERG。
未持有ERG
時,不易取得ERG。
範例2
讓機器人前進。
因障礙物等,機器人前進失敗時,讓機器人轉換至右方。
範例3
反覆所謂「讓機器人前進1次」的動作,以障礙物讓機器人變得不能前進為止。
變得不移動時,機器人即睡覺。
範例4
讓所謂「讓機器人前進1次」的動作,無論怎麼樣皆會反覆。
範例5
在該地不動,不執行反覆命令。
範例6
和範例3相同
範例7
將所謂「讓機器人前進1次」的動作反覆9次。
範例8
反覆20次「讓機器人在因障礙物而不能前進之前,使其前進。
不能前進時,讓其轉向
右方」的動作。
範例9
a:
讓機器人前進1次,前進失敗即向右方轉。
機器人不能發現眼前喜歡顏色的ERG時,
即反覆a:
的動作。
若能發現即跳離反覆命令,睡覺。
範例10
機器人在抵達有ERG地點之前,持續呼叫函數seek(),未能發現erg或沒有能抵達的道路,
即在該地不動。
以return回到變數a的值(函數seek()的傳回值)。
1.4:
程式後面的;時有時無
程式1行之後的;時有時無;密切注意載於前項的範例程式的話,或許有人已經察覺到{或}
的後面不加上;。
變數的宣告或函數的呼叫之後加上;,使用if或while{}的命令不加;
do-while之後的while部份加上;可說是例外。
此乃因為do-while的while部份完全在}
被關閉,不得不加上;,最後do-while的;或許不太容易理解,但只要知道有此東西即可
。
********************************************************************
**
*2:
Mini-CPROGRAMMERSREFERENCE*
**
********************************************************************
此REFERENCE以C語言和M的不同為中心,解說Mini-C的功能。
對初學C語言的人而言,
有一些難的用語,請參考用語解說。
2.1:
程式的構成要素
2.1.1:
電腦識別的文字
compiler及editor識別的文字,雖以ASCII碼為準據,但也有不少沒有對應的東西。
對以
文字標示或escape「\」沒有對應。
只能使用以下的文字
0x00NULL0x2d'-'
0x09TAB0x2f'/'
0x0aLineFeed0x30-0x39'0'-'9'
0x0dCarrigeReturn0x3a':
'
0x1aEOF0x3b';'
0x20''0x3c'<'
0x21'!
'0x3d'='
0x23'#'0x3e'>'
0x25'%'0x41-0x5a'A'-'Z'
0x26'&'0x5f'_'
0x28'('0x61-0x7a'a'-'z'
0x29')'0x7b'{'
0x2a'*'0x7c'|'
0x2b'+'0x7d'}'
0x2c','
上述以外的文字雖為錯誤的文字,但也有例外,在命令行內無論寫什麼皆可識別。
2.1.2:
註解行
對C語言中所用的/**/註解,Mini-C沒有對應。
註解以'//'標示,該行'//'的右側即為註解(C++型)。
註解最多為48文字,因註解行被視為一空白文字,其中無論為何種文字列,電腦皆忽視。
2.1.3:
Mini-C中support的keyword
因Mini-C不support一部分的命令、資料型;因此,keyword的數目和標準C語言相較比
較少。
Mini-C中support的keyword如下:
breakcontinuedoelseforintreturnwhile
但是,int被視為定義的變數使用,不具有指定型態的意思。
以其和C語言之不同為中心
做解說。
2.1.3.1:
int
Mini-C中,變數的資料型態加上符號只有16bit。
因此,能表達的數自為-32768~32767。
Mini-C中,一個INT只能定義一個變數。
Xintaaa,bbb;//在C語言中雖會被識別,但在
//Mini-C中是錯誤的。
intaaa;
intbbb;
此外,也不可在定義變數時給予初值,初值設定為宣告文,請用別的命令執行。
Xintaaa=0;//在C語言中雖會被識別,但在
//Mini-C中是錯誤的。
intaaa;
aaa=0;
2.1.3.2:
return
用於指定函數的傳回值,在Mini-C中,因函數皆會變成int的型態,可當傳回值使用
的為-32768~32767。
Xreturn(40000);因比32767大,所以不正確。
return(100);
return之指定,也會使用計算式。
reutrn(aaa+bbb*2);
沒寫return時,傳回值為不定值。
2.1.3.3:
其它support的keyword
以下的keyword之使用方法完全和C語言一樣。
break,continue,do,for,while
2.1.4:
Mini-C中不support的keyword
以下所列的keyword在Mini-C中不support
autocharcaseconstdefaultdoubleenum
externfloatgotolongregister
shortsignedsizeofstaticstructswitch
typedefunionunsignedvoidvolatile
以下為詳細的說明
2.1.4.1:
因資料型的限制而刪除
變數加上符號只有16bit,因此,無以下的keyword。
double,long,float,short,unsigned,signed,void
若使用上面的keyword即會產生錯誤。
2.1.4.2:
因scope的限制而刪除
變數只在檔案中存在scope的static型或函數內具有scope的lo