今日はテスト前で、構造体の全体的な説明も終わり、演習の時間。 以下のようなオブジェクト指向の考え方を取り入れた、 構造体ポインタ渡しのスタンダードなプログラムを示す。
#include <stdio.h> #define SIZE 10 struct Person { char name[ 20 ] ; int age ; } ; int read_Person( struct Person* p ) { return scanf( "%s%d" , p->name , &(p->age) ) == 2 ; } void print_Person( struct Person* p ) { printf( "%s %d\n" , p->name , p->age ) ; } int main() { int i , size ; struct Person table[ SIZE ] ; // データの入力処理 for( i = 0 ; i < SIZE ; i++ ) { if ( !read_Person( &( table[i] ) ) ) break ; } size = i ; // データの出力処理 for( i = 0 ; i < size ; i++ ) print_Person( &( table[i] ) ) ; return 0 ; }
ファイル入出力にも慣れてもらおう
#include <stdio.h> #define SIZE 10 struct Person { char name[ 20 ] ; int age ; } ; int read_Person( struct Person* p , FILE* fp ) { return fscanf( fp , "%s%d" , p->name , &( p->age ) ) == 2 ; } void print_Person( struct Person* p , FILE* fp ) { fprintf( "%s %d\n" , p->name , p->age ) ; } int main() { int i , size ; struct Person table[ SIZE ] ; FILE* fp_in ; if ( (fp_in = fopen( "data.txt" , "rt" )) != NULL ) { for( i = 0 ; i < SIZE ; i++ ) if ( ! read_Person( &( table[i] ) , fp_in ) ) { size = i ; break ; } for( i = 0 ; i < size ; i++ ) print_Person( &( table[i] ) , stdout ) ; } return 0 ; }
オブジェクト指向っぽく
#include <stdio.h> #define SIZE 10 class Person { private: char name[ 20 ] ; int age ; public: int read() { return scanf( "%s%d" , name , &age ) == 2 ; } void print() { printf( "%s %d\n" , name , age ) ; } } ; int main() { int size ; Person table[ SIZE ] ; for( int i = 0 ; i < SIZE ; i++ ) if ( !table[i].read() ) { size = i ; break ; } for( int i = 0 ; i < size ; i++ ) table[i].print() ; return 0 ; }