從函數返回就是返回語句的第一個主要用途。在程序中,有兩種方法能夠終止函數的執行,並返回到調用函數的位置。第一種方法是在函數體中,從第一句一直執行到最後一句,當全部語句都執行完,程序遇到結束符號」}」後返回。c++
例:從函數返回windows
#include "stdio.h" int fun(); /*聲明函數*/ void main() { int a; printf("this step is before the function\n");/*輸出提示信息*/ a=fun(); printf("a=%d\n",a); printf("this step is end of the function\n");/*輸出提示信息*/ } int fun() { printf("this step is in the function\n");/*輸出提示信息*/ return 0; /*返回值*/ }
返回值函數的定義格式以下:函數
返回值類型 函數名(形式參數列表)this
{spa
語句;code
return 表達式;blog
}遊戲
函數的值是指函數被調用以後,執行函數體中的程序段所取得的並返回給主調函數的值。字符串
對函數的值(或稱函數返回值)有如下一些說明:get
函數的值只能經過return語句返回主調函數。
return 語句的通常形式爲:
return 表達式;
或者爲:
return (表達式);
ACM例題:輸入一個數,傳遞給子函數判斷,奇數返回1,偶數返回0,主函數根據返回的值判斷輸出奇數或偶數。
#include "stdio.h" int fun(int n); void main()//傳參調用 { //定義變量 int n; //傳參調用 printf("請輸入一個數"); scanf("%d",&n); //傳參調用返回 if( fun(n)==1) { printf("偶數"); } else { printf("奇數"); } } int fun(int n) //判斷奇偶 { if(n%2==0) return 1; else return 0 }
ACM試輸入5個數,利用兩個數比較返回最大值的返回值函數,解決問題,參考函數以下
int fun(int a,int b)
{
if(a>b) return a;
else return b;
}
#include "stdio.h" #include "stdlib.h" #include "conio.h" #include "string.h" #include "windows.h" //控制dos界面 #define MAXIMUS 15 //定義棋盤大小 int p[MAXIMUS][MAXIMUS];//存儲對局信息 char buff[MAXIMUS * 2 + 1][MAXIMUS * 4 + 3]; //輸出緩衝器 int Cx, Cy; //當前光標位置 int Now;//當前走子的玩家,1表明黑,2表明白 int wl, wp; //當前寫入緩衝器的列數和行數位置 char* showText;//在棋盤中央顯示的文字信息 int count;//回合數 char* Copy ( char* strDest, const char* strSrc ) //修改過的字符串複製函數,會忽略末端的\0 { char* strDestCopy = strDest; while ( *strSrc != '\0' ) { *strDest++ = *strSrc++; } return strDestCopy; } void Initialize() //初始化一個對局函數 { int i, j; //循環變量 showText = ""; //重置顯示信息 count = 0; //回合數歸零 for ( i = 0; i < MAXIMUS; i++ ) //重置對局數據 { for ( j = 0; j < MAXIMUS; j++ ) { p[i][j] = 0; } } Cx = Cy = MAXIMUS / 2; //重置光標到中央 Now = 1; //重置當前爲黑方 } char* getStyle ( int i, int j ) //得到棋盤中指定座標交點位置的字符,經過製表符拼成棋盤 { if ( p[i][j] == 1 ) //1爲黑子 return "●"; else if ( p[i][j] == 2 ) //2爲白子 return "○"; else if ( i == 0 && j == 0 ) //如下爲邊緣棋盤樣式 return "┏"; else if ( i == MAXIMUS - 1 && j == 0 ) return "┓"; else if ( i == MAXIMUS - 1 && j == MAXIMUS - 1 ) return "┛"; else if ( i == 0 && j == MAXIMUS - 1 ) return "┗"; else if ( i == 0 ) return "┠"; else if ( i == MAXIMUS - 1 ) return "┨"; else if ( j == 0 ) return "┯"; else if ( j == MAXIMUS - 1 ) return "┷"; return "┼";//中間的空位 } char* getCurse ( int i, int j ) //得到指定座標交點位置左上格的樣式,經過製表符來模擬光標的顯示 { if ( i == Cx ) { if ( j == Cy ) return "┏"; else if ( j == Cy + 1 ) return "┗"; } else if ( i == Cx + 1 ) { if ( j == Cy ) return "┓"; else if ( j == Cy + 1 ) return "┛"; } return " ";//若是不在光標附近則爲空 } void write ( char* c ) //向緩衝器寫入字符串 { Copy ( buff[wl] + wp, c ); wp += strlen ( c ); } void ln() //緩衝器寫入位置提行 { wl += 1; wp = 0; } void Display() //將緩衝器內容輸出到屏幕 { int i, l = strlen ( showText ); //循環變量,中間文字信息的長度 int Offset = MAXIMUS * 2 + 2 - l / 2; //算出中間文字信息居中顯示所在的橫座標位置 if ( Offset % 2 == 1 ) //若是位置爲奇數,則移動到偶數,避免混亂 { Offset--; } Copy ( buff[MAXIMUS] + Offset, showText ); //講中間文字信息複製到緩衝器 if ( l % 2 == 1 ) //若是中間文字長度爲半角奇數,則補上空格,避免混亂 { * ( buff[MAXIMUS] + Offset + l ) = 0x20; } system ( "cls" ); //清理屏幕,準備寫入 for ( i = 0; i < MAXIMUS * 2 + 1; i++ ) //循環寫入每一行 { printf ( "%s", buff[i] ); if ( i < MAXIMUS * 2 ) //寫入完每一行須要換行 printf ( "\n" ); } } void Print() //將整個棋盤算出並儲存到緩衝器,而後調用Display函數顯示出來 { int i, j; //循環變量 wl = 0; wp = 0; for ( j = 0; j <= MAXIMUS; j++ ) //寫入出交點左上角的字符,由於須要打印棋盤右下角,因此很以橫縱各多一次循環 { for ( i = 0; i <= MAXIMUS; i++ ) { write ( getCurse ( i, j ) ); //寫入左上角字符 if ( j == 0 || j == MAXIMUS ) //若是是棋上下盤邊緣則沒有鏈接的豎線,用空格填充位置 { if ( i != MAXIMUS ) write ( " " ); } else//若是在棋盤中間則用豎線承接上下 { if ( i == 0 || i == MAXIMUS - 1 ) //左右邊緣的豎線更粗 write ( "┃" ); else if ( i != MAXIMUS ) //中間的豎線 write ( "│" ); } } if ( j == MAXIMUS ) //若是是最後一次循環,則只須要處理邊側字符,交點要少一排 { break; } ln();//提行開始打印交點內容 write ( " " ); //用空位補齊位置 for ( i = 0; i < MAXIMUS; i++ ) //按橫座標循環正常的次數 { write ( getStyle ( i, j ) ); //寫入交點字符 if ( i != MAXIMUS - 1 ) //若是不在最右側則補充一個橫線承接左右 { if ( j == 0 || j == MAXIMUS) { write ( "━" ); //上下邊緣的橫線更粗 } else { write ( "—" ); //中間的橫線 } } } ln();//寫完一行後提行 } Display();//將緩衝器內容輸出到屏幕 } int Put() //在當前光標位置走子,若是非空,則返回0表示失敗 { if ( p[Cx][Cy] == 0 ) { p[Cx][Cy] = Now; //改變該位置數據 return 1;//返回1表示成功 } else { return 0; } } int Check() //勝負檢查,即判斷當前走子位置有沒有形成五連珠的狀況 { int w = 1, x = 1, y = 1, z = 1, i; //累計橫豎正斜反邪四個方向的連續相同棋子數目 for ( i = 1; i < 5; i++ ) if ( Cy + i < MAXIMUS && p[Cx][Cy + i] == Now ) w++; else break;//向下檢查 for ( i = 1; i < 5; i++ ) if ( Cy - i > 0 && p[Cx][Cy - i] == Now ) w++; else break;//向上檢查 if ( w >= 5 ) return Now; //若果達到5個則判斷當前走子玩家爲贏家 for ( i = 1; i < 5; i++ ) if ( Cx + i < MAXIMUS && p[Cx + i][Cy] == Now ) x++; else break;//向右檢查 for ( i = 1; i < 5; i++ ) if ( Cx - i > 0 && p[Cx - i][Cy] == Now ) x++; else break;//向左檢查 if ( x >= 5 ) return Now; //若果達到5個則判斷當前走子玩家爲贏家 for ( i = 1; i < 5; i++ ) if ( Cx + i < MAXIMUS && Cy + i < MAXIMUS && p[Cx + i][Cy + i] == Now ) y++; else break;//向右下檢查 for ( i = 1; i < 5; i++ ) if ( Cx - i > 0 && Cy - i > 0 && p[Cx - i][Cy - i] == Now ) y++; else break;//向左上檢查 if ( y >= 5 ) return Now; //若果達到5個則判斷當前走子玩家爲贏家 for ( i = 1; i < 5; i++ ) if ( Cx + i < MAXIMUS && Cy - i > 0 && p[Cx + i][Cy - i] == Now ) z++; else break;//向右上檢查 for ( i = 1; i < 5; i++ ) if ( Cx - i > 0 && Cy + i < MAXIMUS && p[Cx - i][Cy + i] == Now ) z++; else break;//向左下檢查 if ( z >= 5 ) return Now; //若果達到5個則判斷當前走子玩家爲贏家 return 0;//若沒有檢查到五連珠,則返回0表示尚未玩家達成勝利 } int RunGame() //進行整個對局,返回贏家信息(雖然有用上) { int input;//輸入變量 int victor;//贏家信息 Initialize();//初始化對局 while ( 1 ) //開始無限回合的死循環,直到出現勝利跳出 { Print();//打印棋盤 input = getch(); //等待鍵盤按下一個字符 if ( input == 27 ) //若是是ESC則退出程序 { exit ( 0 ); } else if ( input == 0x20 ) //若是是空格則開始走子 { if ( Put() ) //若是走子成功則判斷勝負 { victor = Check(); Now = 3 - Now; //輪換當前走子玩家 count++; if ( victor == 1 ) //若是黑方達到勝利,顯示提示文字並等待一次按鍵,返回勝利信息 { showText = "黑方得到了勝利!"; Print(); if ( getch() == 0xE0 ) { getch(); } return Now; } else if ( victor == 2 ) //若是白方達到勝利,顯示提示文字並等待一次按鍵,返回勝利信息 { showText = "白方得到了勝利!"; Display(); if ( getch() == 0xE0 ) { getch(); } return Now; } else if ( count == MAXIMUS * MAXIMUS ) //若是回合數達到了棋盤總量,即棋盤充滿,即爲平局 { showText = "平局!"; Display(); if ( getch() == 0xE0 ) { getch(); } return 0; } } } else if ( input == 0xE0 ) //若是按下的是方向鍵,會填充兩次輸入,第一次爲0xE0表示按下的是控制鍵 { input = getch(); //得到第二次輸入信息 switch ( input ) //判斷方向鍵方向並移動光標位置 { case 0x4B:// Cx--; break; case 0x48: Cy--; break; case 0x4D: Cx++; break; case 0x50: Cy++; break; } if ( Cx < 0 ) Cx = MAXIMUS - 1; //若是光標位置越界則移動到對側 if ( Cy < 0 ) Cy = MAXIMUS - 1; if ( Cx > MAXIMUS - 1 ) Cx = 0; if ( Cy > MAXIMUS - 1 ) Cy = 0; } } } int main() //主函數 { system ( "title 簡易五子棋 ——Etsnarl製做" ); //設置標題 system ( "mode con cols=63 lines=32" ); //設置窗口大小 system ( "color E0" ); //設置顏色 while ( 1 ) //循環執行遊戲 { RunGame(); } }