Top >C言語入門 とりあえずのC言語

9. 関数を作る:用例

関数を作る:用例
用例 9.1

 指定された数の階乗を計算する関数の例です

#include <stdio.h>

/////////////////////////////////////////////////////////
// 階乗を計算する関数
//    int n:nの階乗を計算する
//    戻り値:nの階乗
/////////////////////////////////////////////////////////
int factorial( int n )
{
    int     f = 1;

    while( n > 1 )    // 階乗を計算します
        f *= n--;

    return f;    // 計算結果を戻り値とします
}

/////////////////////////////////////////////////////////
// main関数
/////////////////////////////////////////////////////////
main( )
{
    int     x;

    scanf( "%d", &x );

    printf( "%d の階乗は %d です\n", x, factorial( x ) );
}
  • 関数factorialが階乗を計算する関数です
  • 階乗を計算する数を引数、計算結果を戻り値としています

 

 以下は、関数を再帰的に使用した例です

/////////////////////////////////////////////////////////
// 階乗を計算する関数(再帰を使用)
//    int n:nの階乗を計算する
//    戻り値:nの階乗
/////////////////////////////////////////////////////////
int factorial( int n )
{
    if( n > 0 )
        return factorial( n - 1 ) * n;    // 自分自身を呼び出します
    else
        return 1;    
}
  • 引数nが1より大きい場合には、n-1の階乗にnを掛けた結果を返します
  • nが1以下の場合には1を返します
用例 9.2

 指定された幅と高さの四角形を表示します

#include <stdio.h>

/////////////////////////////////////////////////////////
// 四角形を表示する関数
//    int width:幅
//    int height:高さ
/////////////////////////////////////////////////////////
void PrintRect( int width, int height )
{
    int     i, j;

    for( i = 0 ; i < height ; i++ ){      // 高さの繰り返し
        for( j = 0 ; j < width ; j++ )    // 幅の繰り返し
            printf( "*" );

        printf( "\n" );
    }
}

/////////////////////////////////////////////////////////
// main関数
/////////////////////////////////////////////////////////
main( )
{
    int     w, h;

    printf( "幅は?\n" );
    scanf( "%d", &w );

    printf( "高さは?\n" );
    scanf( "%d", &h );

    PrintRect( w, h );
}
  • *によって、指定された幅と高さの四角形を表示します
  • PrintRect関数は、幅と高さを引数としています戻り値はありません

 

 以下は、関数を再帰的に使用した例です

/////////////////////////////////////////////////////////
// 四角形を表示する関数(再帰を使用)
//    int width:幅
//    int height:高さ
/////////////////////////////////////////////////////////
void PrintRect( int width, int height )
{
    int     i;

    if( height < 1 )    // 高さが1未満の場合
        return;

    PrintRect( width, height - 1 );    // 高さが1小さい四角を描く

    for( i = 0 ; i < width ; i++ )     // 1行(高さ1の分)描く
        printf( "*" );

    printf( "\n" );
}
  • 高さが1小さい四角形を描いて、それに1行加えます
用例 9.3

 2つの数値を小さい順に並べ替える関数です

#include <stdio.h>

/////////////////////////////////////////////////////////
// 2つの数値を小さい順に並べ替えます
//    int* pNum1:数値1へのポインタ
//    int* pNum2:数値2へのポインタ
/////////////////////////////////////////////////////////
void sort2( int* pNum1, int* pNum2 )
{
    if( *pNum1 > *pNum2 ){
        int     t = *pNum1;

        *pNum1 = *pNum2;
        *pNum2 = t;
    }
}

/////////////////////////////////////////////////////////
// main関数
/////////////////////////////////////////////////////////
void main( void )
{
    int     n1, n2;

    scanf( "%d", &n1 );
    scanf( "%d", &n2 );

    sort2( &n1, &n2 );

    printf( "%d, %d\n", n1, n2 );
}
用例 9.4

 2つの文字列を連結した、新しい文字列を作成する関数です

#include <stdio.h>

/////////////////////////////////////////////////////////
// 文字列を連結する関数
//    char* pDest:連結した文字列を格納する配列
//    int nSize:pDestの要素数
//    char* pSrc1:連結する文字列(前)
//    char* pSrc2:連結する文字列(後)
//    戻り値:連結した文字列の文字数
/////////////////////////////////////////////////////////
int ConnectString( char* pDest, int nSize, char* pSrc1, char* pSrc2 )
{
    int     n = 0;

    if( nSize > 0 ){
        while( *pSrc1 && n < ( nSize - 1 ) )
            pDest[n++] = *pSrc1++;

        while( *pSrc2 && n < ( nSize - 1 ) )
            pDest[n++] = *pSrc2++;

        pDest[n] = 0;
    }

    return n;
}

/////////////////////////////////////////////////////////
// main関数
/////////////////////////////////////////////////////////
void main( void )
{
    char    szDest[100];
    char    szSrc1[100];
    char    szSrc2[100];

    scanf( "%s", szSrc1 );
    scanf( "%s", szSrc2 );

    ConnectString( szDest, 100, szSrc1, szSrc2 );

    printf( "%s\n", szDest );
}
  • pDest の要素数である nSize を引数にすることによって、連結した文字列の要素数が、pDest の要素数を超える場合に対応しています
  • ConnectString 関数は、連結した文字列の文字数を戻り値としていますが、呼び出し側では使用していません
用例 9.5

 文字列が数字だけであるかどうかを調べる関数です

#include <stdio.h>

/////////////////////////////////////////////////////////
// 文字列が数字だけであるかどうか
//    char pText[]:対象となる文字列
//    戻り値:数字だけの場合 0 以外、そうでなければ 0
/////////////////////////////////////////////////////////
int IsNumber( char pText[] )
{
    int     i;

    for( i = 0 ; pText[i] ; i++ ){
        if( pText[i] < '0' || '9' < pText[i] )
            return 0;    // 数字以外の文字であれば 0 を返します
    }

    return i;    // 数字以外の文字が無かった場合
}

/////////////////////////////////////////////////////////
// main関数
/////////////////////////////////////////////////////////
void main( void )
{
    char    str[200];

    scanf( "%s", str );

    if( IsNumber( str ) )
        printf( "数字です\n");
    else
        printf( "数字ではありません\n");
}
  • 文字列を先頭から調べて、数字以外の文字が見つかったら 0 を返します
  • 調べる文字列が空(文字数 0)であった場合にも 0 を返します文字列が 1 文字以上の数字である場合に 0 以外を返します
  • 引数のchar pText[] char* pTextとしてもかまいません
PAPER BOWL
NEZEN