10.
構造体:用例
構造体:用例
時間間隔を表す、時間と分に、分を加え表示するプログラムです。
#include <stdio.h>
struct TIMESPAN
{
int hour;
int minute;
};
struct TIMESPAN append( struct TIMESPAN ts, int mnt )
{
ts.minute += mnt;
ts.hour += ( ts.minute / 60 );
ts.minute = ( ts.minute % 60 );
return ts;
}
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人分の名前と試験の得点を入力し、60点以上の者を表示するプログラムです。
#include <stdio.h>
struct EXAMSCORE
{
char name[50];
int score;
};
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人分の名前と試験の得点を入力し、各科目の得点順に表示するプログラムです。
数学、化学、物理の得点を入力し、それぞれの得点順に並べ替えた構造体のポインタ配列を作成します。
#include <stdio.h>
struct EXAMSCORE
{
char name[50];
int score[3];
};
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;
}
}
}
}
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] );
}
}
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 は、ポインタの配列を引数とし、指定された科目によって、配列の要素であるポインタを並べ替えます。