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

10. 構造体:用例

構造体:用例
用例 10.1

 時間間隔を表す、時間と分に、分を加え表示するプログラムです

#include <stdio.h>

/////////////////////////////////////////////////////////
// 時間間隔を表す構造体
//    hour:時間
//    minute:分
/////////////////////////////////////////////////////////
struct TIMESPAN
{
    int     hour;      // 時間
    int     minute;    // 分
};

/////////////////////////////////////////////////////////
// 時間間隔に分を加える関数
//    ts:TIMESPAN構造体
//    mnt:加える分
//    戻り値:分を加算したTIMESPAN構造体
/////////////////////////////////////////////////////////
struct TIMESPAN append( struct TIMESPAN ts, int mnt )
{
    ts.minute += mnt;

    ts.hour += ( ts.minute / 60 );
    ts.minute = ( ts.minute % 60 );

    return ts;
}

/////////////////////////////////////////////////////////
// main関数
/////////////////////////////////////////////////////////
void main( void )
{
    struct TIMESPAN    ts;
    int     minute;

    printf( "時間\n" );
    scanf( "%d", &ts.hour );
    printf( "分\n" );
    scanf( "%d", &ts.minute );
    printf( "加算する分\n" );
    scanf( "%d", &minute );

    ts = append( ts, minute );

    printf( "%d時間 %d分\n", ts.hour, ts.minute );
}
  • 関数 append は、時間間隔に分を加算します
  • 元になる時間と分、加算する分を入力し、計算結果を表示しています
用例 10.2

 10人分の名前と試験の得点を入力し、60点以上の者を表示するプログラムです

#include <stdio.h>

/////////////////////////////////////////////////////////
// 名前と得点による構造体
//    name:名前
//    score:得点
/////////////////////////////////////////////////////////
struct EXAMSCORE
{
    char    name[50];     // 名前
    int     score;        // 得点
};

/////////////////////////////////////////////////////////
// main関数
/////////////////////////////////////////////////////////
void main( void )
{
    struct EXAMSCORE    aScore[10];
    int     i;

    for( i = 0 ; i < 10 ; i++ ){
        printf( "名前\n" );
        scanf( "%s", aScore[i].name );
        printf( "得点\n" );
        scanf( "%d", &aScore[i].score );
    }

    printf( "\n合格者\n" );

    for( i = 0 ; i < 10 ; i++ ){
        if( aScore[i].score >= 60 )
            printf( "%s : %d\n", aScore[i].name, aScore[i].score );
    }
}
  • 構造体の配列に、10人分の名前と得点を入力します
  • aScore[i].name は、( aScore + i )->name と記述することも出来ます
用例 10.3

 10人分の名前と試験の得点を入力し、各科目の得点順に表示するプログラムです

 数学、化学、物理の得点を入力し、それぞれの得点順に並べ替えた構造体のポインタ配列を作成します

#include <stdio.h>

/////////////////////////////////////////////////////////
// 名前と得点による構造体
//    name:名前
//    score:得点の配列 0:数学 1:化学 2:物理
/////////////////////////////////////////////////////////
struct EXAMSCORE
{
    char    name[50];    // 名前
    int     score[3];    // 得点
};

/////////////////////////////////////////////////////////
// 指定された科目の得点順に並べ替える
//    aps:EXAMSCOREのポインタの配列
//    cnt:配列の要素数
//    sj:並べ替えの基準にする科目を表す添え字
/////////////////////////////////////////////////////////
void SortByScore( struct EXAMSCORE** aps, int cnt, int sj )
{
    int i, j;

    for( i = 0 ; i < cnt ; i++ ){
        for( j = i + 1 ; j < cnt ; j++ ){
            if( aps[i]->score[sj] < aps[j]->score[sj] ){
                struct EXAMSCORE* pt = aps[i];
                aps[i] = aps[j];
                aps[j] = pt;
            }
        }
    }
}

/////////////////////////////////////////////////////////
// 名前と得点を表示する
//    aps:EXAMSCOREのポインタの配列
//    cnt:配列の要素数
/////////////////////////////////////////////////////////
void PrintScore( struct EXAMSCORE** aps, int cnt )
{
    int    i;

    for( i = 0 ; i < cnt ; i++ ){
        printf( "%s : 数学 %d, 化学 %d, 物理 %d\n",
                aps[i]->name, aps[i]->score[0],
                aps[i]->score[1], aps[i]->score[2] );
    }
}

/////////////////////////////////////////////////////////
// main関数
/////////////////////////////////////////////////////////
void main( void )
{
    struct EXAMSCORE     aScore[10];
    struct EXAMSCORE*    aMathematics[10];
    struct EXAMSCORE*    aChemistry[10];
    struct EXAMSCORE*    aPhysics[10];
    int     i;

    // 名前と得点を入力します
    for( i = 0 ; i < 10 ; i++ ){
        printf( "名前\n" );
        scanf( "%s", aScore[i].name );
        printf( "数学の得点\n" );
        scanf( "%d", &aScore[i].score[0] );
        printf( "化学の得点\n" );
        scanf( "%d", &aScore[i].score[1] );
        printf( "物理の得点\n" );
        scanf( "%d", &aScore[i].score[2] );
    }

    // ポインタ配列にアドレスを設定します
    for( i = 0 ; i < 10 ; i++ ){
        aMathematics[i] = aScore + i;
        aChemistry[i] = aScore + i;
        aPhysics[i] = aScore + i;
    }

    // 各科目の得点順に並べ替えます
    SortByScore( aMathematics, 10, 0 );
    SortByScore( aChemistry, 10, 1 );
    SortByScore( aPhysics, 10, 2 );

    // 各科目の得点順に表示します
    printf( "\n数学の得点順\n" );
    PrintScore( aMathematics, 10 );
    printf( "\n化学の得点順\n" );
    PrintScore( aChemistry, 10 );
    printf( "\n物理の得点順\n" );
    PrintScore( aPhysics, 10 );
}
  • 構造体の配列に、10人分の名前、数学の得点、化学の得点、物理の得点を入力します
  • 構造体のメンバー score は、0番目の要素が数学、1番目の要素が化学、2番目の要素が物理の得点を保持します
  • 構造体の配列の要素を並べ替えるのではなく、構造体のポインタ配列を科目ごとに作成し、その配列の要素であるポインタを並べ替えます
  • 関数 SortByScore は、ポインタの配列を引数とし、指定された科目によって、配列の要素であるポインタを並べ替えます
PAPER BOWL
NEZEN