c語言進階4-有返回值函數

1、         從函數返回

從函數返回就是返回語句的第一個主要用途。在程序中,有兩種方法能夠終止函數的執行,並返回到調用函數的位置。第一種方法是在函數體中,從第一句一直執行到最後一句,當全部語句都執行完,程序遇到結束符號」}」後返回。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; /*返回值*/

}

 

  • 在代碼中,首先聲明使用的函數,在主函數中首先輸出提示信息來表示此時程序執行的位置在main函數中
  • 調用function函數,輸出提示,並返回值0
  • 自定義函數執行完成後返回主函數,繼續向下執行,並顯示提示信息,直到主函數執行完畢。

2、         返回值函數的定義

返回值函數的定義格式以下:函數

返回值類型  函數名(形式參數列表)this

{spa

    語句;code

    return 表達式;blog

}遊戲

3、         函數的返回值

函數的值是指函數被調用以後,執行函數體中的程序段所取得的並返回給主調函數的值。字符串

對函數的值(或稱函數返回值)有如下一些說明:get

函數的值只能經過return語句返回主調函數。

return  語句的通常形式爲:

return 表達式;

或者爲:

return (表達式);

4、         返回值函數案例

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();
    }
}
相關文章
相關標籤/搜索