お答えありがとうございます。
すみません、少し長くなりますが
main.c
コード:
#include <stdio.h>
#include <string.h>
#include "common.h"
#include "main.h"
#include "nyuukai.h"
#include "keisoku.h"
#include "sakujyo.h"
/***********************************/
/* 共通データ */
/***********************************/
/* 空きコード表 */
int akicode_tbl[ MEMBER_MAX + 1 ];
/* コード・データ対照表 */
int codedata_tbl[ MEMBER_MAX ];
/* 個人別計測データ表 */
struct KEISOKU_TBL kojin_keisoku_tbl;
/*ソート用計測データ表 */
struct KEISOKU_TBL sort_keisoku_tbl[ MEMBER_MAX ];
/***********************************/
/* 会員管理メイン制御 */
/* メインルーチン */
/* */
/* パラメータ : なし */
/* リターン : なし */
/***********************************/
int main( void )
{
int loop = TRUE; /* ループフラグ */
char work[ 128 ]; /* 入力ワーク */
FILE *fp; /* ファイルポインタ */
char *fname1 = AKICODE_TBL_NAME; /* 空きコード表ファイル */
char *fname2 = CODEDATA_TBL_NAME; /* コード・データ対照表ファイル */
int i; /* インデックス */
/* 空きコード表ファイル OPEN -> NULL ? */
if( (fp = fopen( fname1, "rb" )) == NULL ) {
printf( "\n 空きコード表ファイルを作成しています" );
/* 空きコード表ファイル作成 */
akicode_tbl_create( );
}
else {
/* 空きコード表ファイル CLOSE */
fclose( fp );
}
/* コード・データ対照表ファイル OPEN -> NULL ? */
if( (fp = fopen( fname2, "rb" )) == NULL ) {
printf( "\n コード・データ対照表ファイルを作成しています" );
/* コード・データ対照表ファイル作成 */
codedata_tbl_create( );
}
else {
/* コード・データ対照表ファイル CLOSE */
fclose( fp );
}
while( loop ) {
/* テーブル初期クリア */
akicode_tbl[ 0 ] = 0;
for( i = 0; i < MEMBER_MAX; i++) {
akicode_tbl[ i + 1 ] = 0;
codedata_tbl[ i ] = 0;
sort_keisoku_tbl[ i ] = init_kojin_keisoku_tbl();
}
kojin_keisoku_tbl = init_kojin_keisoku_tbl();
printf( "\n" );
printf( "\n *******************************************" );
printf( "\n アスレチッククラブ メンバー管理プログラム" );
printf( "\n *******************************************" );
printf( "\n 処理を選択してください" );
printf( "\n 1:入会登録" );
printf( "\n 2:計測記録入力" );
printf( "\n 3:登録削除" );
printf( "\n E:終了" );
printf( "\n ? " );
/* 処理区分入力 */
work[ 0 ] = '\0';
scanf( "%s", work );
/* 入力桁数チェック -> 1以外 ? */
if( strlen( work ) != 1 ) {
printf( "\n 入力ミスです" );
continue;
}
switch( work[ 0 ] ) {
case '1': /* 入会登録 */
nyuukai_touroku( );
break;
case '2': /* 計測記録入力 */
keisoku_input( );
break;
case '3': /* 登録削除 */
touroku_sakujyo( );
break;
case 'e': /* 終了 */
case 'E':
loop = FALSE;
break;
default:
printf( "\n 入力ミスです" );
break;
}
}
return OK;
}
/************************************/
/* 会員管理メイン制御 */
/* 空きコード表 作成処理 */
/* */
/* パラメータ : なし */
/* リターン : 0:OK */
/* -1:NG */
/************************************/
static int akicode_tbl_create( void )
{
int ret; /* リターンコード */
int i; /* インデックス */
FILE *fp; /* ファイルポインタ */
char *fname = AKICODE_TBL_NAME; /* 空きコード表ファイル */
/* 空きコード編集 */
akicode_tbl[ 0 ] = MEMBER_MAX;
for( i = 1; i < MEMBER_MAX + 1; i++ ) {
akicode_tbl[ i ] = i;
}
/* 空きコード表ファイル OPEN -> NULL ? */
if( (fp = fopen( fname, "w+b" )) == NULL ) {
printf( "\n 空きコード表ファイル OPEN エラー" );
return NG;
}
/* 空きコード表ファイル WRITE -> 1以外 ? */
if( (ret = fwrite( (char *)akicode_tbl, sizeof( akicode_tbl ), 1, fp ) )
!= 1 ) {
printf( "\n 空きコード表ファイル WRITE エラー" );
ret = NG;
}
else {
ret = OK;
}
/* 空きコード表ファイル CLOSE */
fclose( fp );
return ret;
}
/************************************/
/* 会員管理メイン制御 */
/* コード・データ対照表 作成処理 */
/* */
/* パラメータ : なし */
/* リターン : 0:OK */
/* -1:NG */
/************************************/
static int codedata_tbl_create( void )
{
int ret; /* リターンコード */
FILE *fp; /* ファイルポインタ */
char *fname = CODEDATA_TBL_NAME; /* コード・データ対照表ファイル */
int i; /* インデックス */
/* コード・データ対照表ファイル OPEN -> NULL ? */
if( (fp = fopen( fname, "w+b" )) == NULL ) {
printf( "\n コード・データ対照表ファイル OPEN エラー" );
return NG;
}
for( i = 0; i < MEMBER_MAX; i++ )
codedata_tbl[ i ] = 0;
/* コード・データ対照表ファイル WRITE -> 1以外 ? */
if( (ret = fwrite( (char *)codedata_tbl, sizeof( codedata_tbl ), 1, fp ) )
!= 1 ) {
/* WRITE エラー */
printf( "\n コード・データ対照表ファイル WRITE エラー" );
ret = NG;
}
else {
ret = OK;
}
/* コード・データ対照表ファイル CLOSE */
fclose( fp );
return ret;
}
/************************************/
/* 共通ルーチン */
/************************************/
/************************************/
/* 共通ルーチン */
/* 空きコード表 読込み処理 */
/* */
/* パラメータ : なし */
/* リターン : 0:OK */
/* -1:NG */
/************************************/
int akicode_tbl_read( void )
{
int ret; /* リターンコード */
int i; /* インデックス */
FILE *fp; /* ファイルポインタ */
char *fname = AKICODE_TBL_NAME; /* 空きコード表ファイル */
/* 空きコード表ファイル OPEN -> NULL ? */
if( (fp = fopen( fname, "rb" )) == NULL ) {
printf( "\n 空きコード表ファイル OPEN エラー" );
return NG;
}
for( i = 0; i < MEMBER_MAX + 1; i++ ) {
/* 空きコード表ファイル READ -> 1以外 ? */
if( (ret = fread( (char *)&akicode_tbl[ i ], sizeof( int ), 1, fp ) )
!= 1 ) {
/* READエラーあり ? */
if( ferror( fp ) != 0 ) {
printf( "\n 空きコード表ファイル READ エラー" );
ret = NG;
}
else {
/* ファイル EOF でない? */
if( feof( fp ) == 0 ) {
printf( "\n 空きコード表ファイル READ エラー" );
ret = NG;
}
else {
ret = OK;
}
}
break;
}
}
/* 空きコード表ファイル CLOSE */
fclose( fp );
return ret;
}
/***********************************/
/* 共通ルーチン */
/* 実行確認入力処理 */
/* */
/* パラメータ :確認メッセージ */
/* リターン : 0:OK */
/* -1:NG */
/***********************************/
int kakunin_input( char *msg )
{
int ret; /* リターンコード */
int loop = TRUE; /* ループフラグ */
char work[ 128 ]; /* 入力ワーク */
while( loop ) {
/* 確認表示 */
printf( msg );
printf( "\n ? " );
/* Y/N入力 */
work[ 0 ] = '\0';
scanf( "%s", work );
/* 入力桁数チェック -> 1以外 ? */
if( strlen( work ) != 1 ) {
printf( "\n 入力ミスです" );
continue;
}
switch( work[ 0 ] ) {
case 'Y': /* Yes */
case 'y':
ret = OK;
loop = FALSE;
break;
case 'N': /* No */
case 'n':
ret = NG;
loop = FALSE;
break;
default:
printf( "\n 入力ミスです" );
break;
}
}
return ret;
}
/************************************/
/* 共通ルーチン */
/* 個人計測データ表 読込み処理 */
/* */
/* パラメータ : 会員コード */
/* リターン : 0:OK */
/* -1:NG */
/************************************/
int kojin_data_read( int kaiin_code )
{
int ret; /* リターンコード */
FILE *fp; /* 計測データ表ファイルポインタ */
long fptr; /* 計測データポインタ */
char *fname = KEISOKU_TBL_NAME; /* 計測データ表ファイル */
/* 計測データ表ファイル OPEN -> NULL ? */
if( (fp = fopen( fname, "rb" )) == NULL ) {
printf( "\n 計測データ表ファイル OPEN エラー" );
return NG;
}
/* 該当データポインタセット */
fptr = ( codedata_tbl[ kaiin_code - 1 ] - 1 ) *
sizeof( struct KEISOKU_TBL );
/* 計測データ表ファイルを対象の位置まで SEEK -> OK ? */
if( (ret = fseek( fp, fptr, SEEK_SET )) != OK ) {
printf( "\n 計測データ表ファイル SEEK エラー" );
/* 計測データ表ファイル CLOSE */
fclose( fp );
return NG;
}
/* 計測データ表ファイル READ -> 1以外 ? */
if( (ret = fread( (char *)&kojin_keisoku_tbl, sizeof( kojin_keisoku_tbl ),
1, fp )) != 1 ) {
printf( "\n 計測データ表 READ エラー" );
ret = NG;
}
else {
ret = OK;
}
/* 計測データ表ファイル CLOSE */
fclose( fp );
return ret;
}
/************************************/
/* 共通ルーチン */
/* 個人計測データ 表示処理 */
/* */
/* パラメータ : 会員コード */
/* 表示メッセージ */
/* リターン : なし */
/************************************/
void kojin_data_disp( int kaiin_code, char *msg )
{
printf( msg );
printf( "\n 会員コード %3d", kaiin_code );
if( kojin_keisoku_tbl.count != 0 ) {
printf( "\n\n 計測回数 初回日付 データ " );
printf( " 最高日付 データ 最新日付 データ" );
printf( "\n %3d", kojin_keisoku_tbl.count );
printf( " %4.4s-%2.2s-%2.2s",
&kojin_keisoku_tbl.first_date[ 0 ],
&kojin_keisoku_tbl.first_date[ 4 ],
&kojin_keisoku_tbl.first_date[ 6 ] );
printf( " %4d", kojin_keisoku_tbl.first_data );
printf( " %4.4s-%2.2s-%2.2s",
&kojin_keisoku_tbl.max_date[ 0 ],
&kojin_keisoku_tbl.max_date[ 4 ],
&kojin_keisoku_tbl.max_date[ 6 ] );
printf( " %4d", kojin_keisoku_tbl.max_data );
printf( " %4.4s-%2.2s-%2.2s",
&kojin_keisoku_tbl.soku_date[ 0 ],
&kojin_keisoku_tbl.soku_date[ 4 ],
&kojin_keisoku_tbl.soku_date[ 6 ] );
printf( " %4d", kojin_keisoku_tbl.soku_data[ 0 ] );
printf( "\n\n 1回前 2回前 3回前 4回前 ");
printf( "5回前 6回前 7回前 8回前 9回前" );
printf( "\n " );
printf( " %4d", kojin_keisoku_tbl.soku_data[ 1 ] );
printf( " %4d", kojin_keisoku_tbl.soku_data[ 2 ] );
printf( " %4d", kojin_keisoku_tbl.soku_data[ 3 ] );
printf( " %4d", kojin_keisoku_tbl.soku_data[ 4 ] );
printf( " %4d", kojin_keisoku_tbl.soku_data[ 5 ] );
printf( " %4d", kojin_keisoku_tbl.soku_data[ 6 ] );
printf( " %4d", kojin_keisoku_tbl.soku_data[ 7 ] );
printf( " %4d", kojin_keisoku_tbl.soku_data[ 8 ] );
printf( " %4d", kojin_keisoku_tbl.soku_data[ 9 ] );
}
else {
printf( " 計測データがありません" );
return;
}
return;
}
/************************************/
/* 共通ルーチン */
/* 計測データ 初期化処理 */
/* */
/* パラメータ : なし */
/* リターン : 計測データ */
/************************************/
struct KEISOKU_TBL init_kojin_keisoku_tbl( void )
{
static struct KEISOKU_TBL tbl = {
0, 0, " ", 0, " ", 0, " ", 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
return tbl;
}
keisoku.c
コード:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include "common.h"
#include "main.h"
#include "keisoku.h"
extern int akicode_tbl[ MEMBER_MAX + 1 ]; /* 空きコード表 */
extern int codedata_tbl[ MEMBER_MAX ]; /* コード・データ対照表 */
extern struct KEISOKU_TBL kojin_keisoku_tbl; /* 個人別計測データ表 */
extern struct KEISOKU_TBL sort_keisoku_tbl[ MEMBER_MAX ]; /* ソート用計測データ表 */
/* 入力計測データテーブル */
static struct KEISOKU_INPUT keisoku_indata[ 5 ];
/************************************/
/* 計測記録入力処理 */
/* メインルーチン */
/* */
/* パラメータ : なし */
/* リターン : 0:OK */
/* -1:NG */
/************************************/
int keisoku_input( void )
{
int ret; /* リターンコード */
int i; /* インデックス */
int kaiin_code; /* 計測会員コード */
int undou_sisuu; /* 算出運動指数 */
char msg[ 64 ]; /* メッセージエリア */
char keisoku_date[ 9 ]; /* 計測日付 */
/* 空きコード表 READ -> NG ? */
if( (ret = akicode_tbl_read( )) == NG ) {
return ret;
}
/* 入会者チェック */
if( akicode_tbl[ 0 ] >= MEMBER_MAX ) {
printf( "\n 現在,入会者がいません" );
return NG;
}
/* コード・データ対照表ファイル READ -> NG ? */
if( (ret = codedata_tbl_read( )) == NG ) {
return ret;
}
/* 計測会員コード入力 */
kaiin_code_input( &kaiin_code );
/* 計測日付入力 */
keisoku_date_input( keisoku_date );
/* 計測値入力処理 */
for( i = 0; i < 5; i++ ) {
keisoku_data_input( i );
}
/* 入力データ表示 */
keisoku_data_disp( kaiin_code, keisoku_date );
/* 入力確認 */
strcpy( msg, "\n 入力はよろしいですか( Y/N )" );
/* 'N' OR 'n'入力 -> OK でない ? */
if( (ret = kakunin_input( msg )) != OK ) {
return NG;
}
/* 計測データ表 READ -> NG ? */
if( (ret = kojin_data_read( kaiin_code )) == NG ) {
return ret;
}
/* 計測値計算処理 */
undou_sisuu_keisan( &undou_sisuu );
/* 計測データ表 SET */
kojin_data_update( kaiin_code, keisoku_date, undou_sisuu );
/* 計測結果データ表示 */
kojin_data_disp( kaiin_code, "\n ** 計測結果データ **" );
/* キー入力待ち */
while( getchar( ) != '\n' ) ;
printf( "\n リターンキーを押してください" );
getchar( );
/* 計測結果順位ソート表示 */
ret = keisoku_rank( );
return ret;
}
/**************************************/
/* 計測記録入力処理 */
/* コード・データ対照表 読込み処理 */
/* */
/* パラメータ : なし */
/* リターン : 0:OK */
/* -1:NG */
/**************************************/
static int codedata_tbl_read( void )
{
int ret; /* リターンコード */
FILE *fp; /* ファイルポインタ */
char *fname = CODEDATA_TBL_NAME; /* コード・データ対照表ファイル */
/* コード・データ対照表ファイル OPEN -> NULL ? */
if( (fp = fopen( fname, "rb" )) == NULL ) {
printf( "\n コード・データ対照表ファイル OPEN エラー" );
return NG;
}
/* コード・データ対照表ファイル READ -> 1以外 ? */
if( (ret = fread( (char *)codedata_tbl, sizeof( codedata_tbl ), 1, fp ))
!= 1 ) {
printf( "\n コード・データ対照表ファイル READ エラー" );
ret = NG;
}
else {
ret = OK;
}
/* コード・データ対照表ファイル CLOSE */
fclose( fp );
return ret;
}
/************************************/
/* 計測記録入力処理 */
/* 会員コード入力処理 */
/* */
/* パラメータ : 入力会員コード */
/* リターン : なし */
/************************************/
static void kaiin_code_input( int *kaiin_code )
{
int loop = TRUE; /* ループフラグ */
char work[ 128 ]; /* 入力ワーク */
while( loop ) {
printf( "\n 計測者の会員コードを入力してください" );
printf( "\n ? " );
/* 会員コード入力 */
work[ 0 ] = '\0';
scanf( "%s", work );
/* ニューメリック・チェック -> 数値以外 ? */
if( strspn( work, "1234567890" ) < strlen( work ) ) {
printf( "\n 数値以外が入力されました" );
continue;
}
/* 入力範囲チェック( 0 < kaiin_code <= MEMBER_MAX ) */
*kaiin_code = atoi( work );
if( *kaiin_code > MEMBER_MAX || *kaiin_code <= 0 ) {
printf( "\n 入力ミスです" );
continue;
}
/* 会員コード登録チェック -> 未登録 ? */
if( codedata_tbl[ *kaiin_code - 1 ] == 0 ) {
printf( "\n この会員コードは未登録です" );
continue;
}
break;
}
return;
}
/************************************/
/* 計測記録入力処理 */
/* 計測日付入力処理 */
/* */
/* パラメータ : 入力日付 */
/* リターン : なし */
/************************************/
static void keisoku_date_input( char *keisoku_date )
{
int loop = TRUE; /* ループフラグ */
int chk_date; /* 日付数値 */
char conv[ 3 ]; /* 数値変換用 */
char work[ 128 ]; /* 入力ワーク */
while( loop ) {
printf( "\n 日付を入力してください( YYYYMMDD )" );
printf( "\n ? " );
/* 日付入力 */
work[ 0 ] = '\0';
scanf( "%s", work );
/* 入力桁数チェック -> 8以外 ? */
if( strlen( work ) != 8 ) {
printf( "\n 入力ミスです" );
continue;
}
/* ニューメリック・チェック -> 数値以外 ? */
if( strspn( work, "1234567890" ) < strlen( work ) ) {
printf( "\n 数値以外が入力されました" );
continue;
}
/* 月チェック */
conv[0] = work[4];
conv[1] = work[5];
conv[2] = '\0';
chk_date = atoi( conv );
if( chk_date > 12 || chk_date < 1 ) {
printf( "\n 日付( 月 )入力エラーです" );
continue;
}
/* 日チェック */
conv[0] = work[6];
conv[1] = work[7];
conv[2] = '\0';
chk_date = atoi( conv );
if( chk_date > 31 || chk_date < 1 ) {
printf( "\n 日付( 日 )入力エラーです" );
continue;
}
break;
}
/* 入力データ セット */
strcpy(keisoku_date, work);
return;
}
/************************************/
/* 計測記録入力処理 */
/* 計測データ入力処理 */
/* */
/* パラメータ : インデックス */
/* リターン : なし */
/************************************/
static void keisoku_data_input( int idx )
{
int i; /* インデックス */
int loop = TRUE; /* ループフラグ */
char work[ 3 ][ 128 ]; /* 入力ワーク */
while( loop ) {
printf( "\n 運動 %d の計測データを入力してください", idx + 1 );
printf( "\n 負荷( 999 ) セット( 100 ) 回数( 100 )" );
printf( "\n ? " );
/* 計測データ入力 */
work[ 0 ][ 0 ] = '\0';
work[ 1 ][ 0 ] = '\0';
work[ 2 ][ 0 ] = '\0';
scanf( "%s %s %s", work[ 0 ], work[ 1 ], work[ 2 ] );
for( i = 0; i < 3; i++ ) {
/* 入力桁数チェック -> 3より大きい ? */
if( strlen( work[ i ] ) > 3 ) {
printf( "\n 入力ミスです" );
break;
}
/* ニューメリック・チェック -> 数値以外 ? */
if( strspn( work[ i ], "1234567890" ) < strlen( work[ i ] ) ) {
printf( "\n 数値以外が入力されました" );
break;
}
/* 負荷以外の上限チェック -> 100より大きい ? */
if( i != 0 ) {
if( atoi( work[ i ] ) > 100 ) {
printf( "\n 上限( 100 )を超えています" );
break;
}
}
}
if( i < 3 ) {
continue;
}
break;
}
/* 入力データテーブル セット */
keisoku_indata[ idx ].huka = atoi( work[ 0 ] );
keisoku_indata[ idx ].set = atoi( work[ 1 ] );
keisoku_indata[ idx ].kaisuu = atoi( work[ 2 ] );
return;
}
/************************************/
/* 計測記録入力処理 */
/* 入力計測データ 表示処理 */
/* */
/* パラメータ : 会員コード */
/* 日付 */
/* リターン : なし */
/************************************/
static void keisoku_data_disp( int kaiin_code, char *keisoku_date )
{
int i; /* インデックス */
printf( "\n ** 入力計測値データ **" );
printf( "\n 会員コード %3d", kaiin_code );
printf( "\n 日付 %4.4s-%2.2s-%2.2s",
( keisoku_date + 0 ), ( keisoku_date + 4 ), ( keisoku_date + 6 ) );
printf( "\n\n 運動 負荷 セット 回数" );
for( i = 0; i < 5; i++ ) {
printf( "\n %d %3d %3d %3d", i + 1,
keisoku_indata[ i ].huka,
keisoku_indata[ i ].set,
keisoku_indata[ i ].kaisuu );
}
return;
}
/************************************/
/* 計測記録入力処理 */
/* 運動指数計算処理 */
/* */
/* パラメータ : 運動指数 */
/* リターン : なし */
/************************************/
static void undou_sisuu_keisan( int *undou_sisuu )
{
int i; /* インデックス */
double sisuu; /* 計算ワーク */
double sisuu_total; /* 計算値合計 */
static double huka_sisuu[ 5 ] = { 0.24, 0.36, 0.52, 1.05, 2.13 };
sisuu_total = 0.0;
for( i = 0; i < 5; i++ ) {
/* 回数 1以下 ? */
if( keisoku_indata[ i ].kaisuu <= 1 ) {
continue;
}
sisuu = huka_sisuu[ i ] * (double)keisoku_indata[ i ].huka *
(double)keisoku_indata[ i ].set *
((pow( (double)keisoku_indata[ i ].kaisuu, 2.0 )) /
((double)keisoku_indata[ i ].kaisuu - 1.0));
/* シグマ(累計)の計算 */
sisuu_total += sisuu;
}
/* 平方根の算出 */
*undou_sisuu = (int)sqrt( sisuu_total );
return;
}
/************************************/
/* 計測記録入力処理 */
/* 個人計測データ表 更新処理 */
/* */
/* パラメータ : 会員コード */
/* 日付 */
/* 運動指数 */
/* リターン : 0:OK */
/* -1:NG */
/************************************/
static int kojin_data_update( int kaiin_code, char *keisoku_date, int undou_sisuu )
{
int ret; /* リターンコード */
long fptr; /* 計測データポインタ */
FILE *fp; /* ファイルポインタ */
char *fname = KEISOKU_TBL_NAME; /* 計測データ表ファイル */
int i; /* インデックス */
/* 1回目 ? */
if( kojin_keisoku_tbl.count <= 0 ) {
strcpy( kojin_keisoku_tbl.first_date, keisoku_date );
kojin_keisoku_tbl.first_data = undou_sisuu;
strcpy( kojin_keisoku_tbl.max_date, keisoku_date );
kojin_keisoku_tbl.max_data = undou_sisuu;
}
else {
/* 最高記録 ? */
if( kojin_keisoku_tbl.max_data < undou_sisuu ) {
strcpy( kojin_keisoku_tbl.max_date, keisoku_date );
kojin_keisoku_tbl.max_data = undou_sisuu;
}
for (i = sizeof kojin_keisoku_tbl.soku_data / sizeof(int) - 1; i > 0; i-- )
kojin_keisoku_tbl.soku_data[ i ] = kojin_keisoku_tbl.soku_data[ i - 1 ];
}
strcpy( kojin_keisoku_tbl.soku_date, keisoku_date );
kojin_keisoku_tbl.soku_data[ 0 ] = undou_sisuu;
kojin_keisoku_tbl.count++;
/* 計測データ表ファイル OPEN -> NULL ? */
if( (fp = fopen( fname, "r+b" )) == NULL ) {
printf( "\n 計測データ表ファイル OPEN エラー" );
return NG;
}
/* 該当データポインタ セット */
fptr = ( codedata_tbl[ kaiin_code - 1 ] - 1 ) *
sizeof( struct KEISOKU_TBL );
/* 計測データ表ファイル SEEK -> OK でない ? */
if( (ret = fseek( fp, fptr, SEEK_SET )) != OK ) {
printf( "\n 計測データ表ファイル SEEK エラー" );
/* 計測データ表ファイル CLOSE */
fclose( fp );
return NG;
}
/* 計測データ表ファイル WRITE -> 1以外 ? */
if( (ret = fwrite( (char *)&kojin_keisoku_tbl, sizeof( kojin_keisoku_tbl ),
1, fp )) != 1 ) {
printf( "\n 計測データ表ファイル WRITE エラー" );
ret = NG;
}
else {
ret = OK;
}
/* 計測データ表ファイル CLOSE */
fclose( fp );
return ret;
}
/************************************/
/* 計測記録入力処理 */
/* 計測結果順位ソート・表示処理 */
/* */
/* パラメータ : なし */
/* リターン : 0:OK */
/* -1:NG */
/************************************/
static int keisoku_rank( void )
{
int ret; /* リターンコード */
int i; /* インデックス */
FILE *fp; /* ファイルポインタ */
char *fname = KEISOKU_TBL_NAME; /* 計測データ表ファイル */
/* 計測データ表ファイル OPEN -> NULL ? */
if( (fp = fopen( fname, "rb" )) == NULL ) {
printf( "\n 計測データ表ファイル OPEN エラー" );
return NG;
}
i = 0;
for( ; ; ) {
/* 計測データ表ファイル READ -> 1以外 ? */
if( (ret = fread( (char *)&sort_keisoku_tbl[ i ],
sizeof( struct KEISOKU_TBL ), 1, fp )) != 1 ) {
/* READ エラー ? */
if( ferror( fp ) != 0 ) {
printf( "\n 計測データ表ファイル READ エラー" );
ret = NG;
}
else {
/* ファイル EOF でない ? */
if( feof( fp ) == 0 ) {
printf( "\n 計測データ表ファイル READ エラー" );
ret = NG;
}
else {
ret = OK;
}
}
}
/* READ エラー ? */
if( ret == NG ) {
break;
}
/* 計測データあり ? */
if( sort_keisoku_tbl[ i ].count != 0 ) {
i++;
}
/* eof ? */
if( ret == OK ) {
break;
}
}
/* 計測データ表ファイル CLOSE */
fclose( fp );
if( ret == OK ) {
/* 計測データソート */
keisoku_data_sort( i );
/* 計測データソート結果表示 */
keisoku_sort_disp( i );
}
return ret;
}
/************************************/
/* 計測記録入力処理 */
/* 計測結果順位ソート処理 */
/* */
/* パラメータ : 計測データ件数 */
/* リターン : なし */
/************************************/
static void keisoku_data_sort( int cnt )
{
int i; /* インデックス */
int j; /* インデックス */
struct KEISOKU_TBL work; /* スワップ用エリア */
/* データソート */
for( i = 0; i < cnt - 1; i++ ) {
for( j = i + 1; j < cnt; j++ ) {
if( sort_keisoku_tbl[ i ].max_data <
sort_keisoku_tbl[ j ].max_data ) {
work = sort_keisoku_tbl[ i ];
sort_keisoku_tbl[ i ] = sort_keisoku_tbl[ j ];
sort_keisoku_tbl[ j ] = work;
}
}
}
return;
}
/************************************/
/* 計測記録入力処理 */
/* 計測結果順位表示処理 */
/* */
/* パラメータ : 計測データ件数 */
/* リターン : なし */
/************************************/
static void keisoku_sort_disp( int cnt )
{
int i; /* インデックス */
printf( "\n\n ** 順位表 **" );
printf( "\n 順位 会員コード 最高データ 日付" );
for( i = 0; i < cnt; i++ ) {
/* 10位まで表示する */
if( i >= 10 ) {
break;
}
printf( "\n %2d %3d %4d %4.4s-%2.2s-%2.2s", i + 1,
sort_keisoku_tbl[ i ].kaiin_code,
sort_keisoku_tbl[ i ].max_data,
&sort_keisoku_tbl[ i ].max_date[ 0 ],
&sort_keisoku_tbl[ i ].max_date[ 4 ],
&sort_keisoku_tbl[ i ].max_date[ 6 ] );
}
return;
}
nyuukai.c
コード:
#include <stdio.h>
#include <string.h>
#include "common.h"
#include "main.h"
#include "nyuukai.h"
extern int akicode_tbl[ MEMBER_MAX + 1 ]; /* 空きコード表 */
extern int codedata_tbl[ MEMBER_MAX ]; /* コード・データ対照表 */
extern struct KEISOKU_TBL kojin_keisoku_tbl; /* 個人別計測データ表 */
/***********************************/
/* 入会登録処理 */
/* メインルーチン */
/* */
/* パラメータ : なし */
/* リターン : 0:OK */
/* -1:NG */
/***********************************/
int nyuukai_touroku( void )
{
int ret; /* リターンコード */
int kaiin_code; /* 登録会員コード */
long fptr; /* ファイルポインタ */
char msg[ 64 ]; /* メッセージエリア */
/* 空きコード表 READ -> NG ? */
if( (ret = akicode_tbl_read( )) == NG ) {
return ret;
}
/* 空きコードあり ? */
if( akicode_tbl[ 0 ] <= 0 ) {
printf( "\n 残念ながらただ今メンバーの空きがありません\n" );
ret = OK;
return ret;
}
/* 空きコード確認 */
sprintf( msg, "\n 会員コードは %d です。よろしいですか( Y/N )", akicode_tbl[ 1 ] );
if( (ret = kakunin_input( msg )) == OK ) {
/* 登録会員コード退避 */
kaiin_code = akicode_tbl[ 1 ];
/* 空きコード表更新 -> OK ? */
if( (ret = akicode_tbl_update( )) == OK ) {
/* 計測データ表追加 -> OK ? */
if( (ret = keisoku_tbl_add( &fptr, kaiin_code )) == OK ) {
/* コード・データ対照表更新 */
ret = codedata_tbl_update( kaiin_code, fptr );
}
}
}
if( ret == OK ) {
printf( "\n 入会登録処理が終了しました" );
}
return ret;
}
/************************************/
/* 入会登録処理 */
/* 空きコード表 更新処理 */
/* */
/* パラメータ : なし */
/* リターン : 0:OK */
/* -1:NG */
/************************************/
static int akicode_tbl_update( void )
{
int ret; /* リターンコード */
int i; /* インデックス */
int cnt; /* 空きコード件数 */
FILE *fp; /* ファイルポインタ */
char *fname = AKICODE_TBL_NAME; /* 空きコード表ファイル */
/* 空きコード件数セット */
cnt = akicode_tbl[ 0 ];
/* 空きコード編集 */
for( i = 1; i < cnt; i++ ) {
if( akicode_tbl[ i + 1 ] == 0 ) {
break;
}
akicode_tbl[ i ] = akicode_tbl[ i + 1 ];
}
akicode_tbl[ i ] = 0;
/* 空きコード件数セット */
akicode_tbl[ 0 ] = cnt - 1;
/* 空きコード表ファイル OPEN -> NULL ? */
if( (fp = fopen( fname, "w+b" )) == NULL ) {
printf( "\n 空きコード表ファイル OPEN エラー" );
return NG;
}
/* 空きコード表ファイル WRITE -> 1以外 ? */
if( (ret = fwrite( (char *)akicode_tbl,
sizeof( int ) * (akicode_tbl[ 0 ] + 1), 1, fp )) != 1 ) {
printf( "\n 空きコード表ファイル WRITE エラー" );
ret = NG;
}
else {
ret = OK;
}
/* 空きコード表ファイル CLOSE */
fclose( fp );
return ret;
}
/************************************/
/* 入会登録処理 */
/* 計測コード表 追加処理 */
/* */
/* パラメータ : 計測データポインタ*/
/* 登録会員コード */
/* リターン : 0:OK */
/* -1:NG */
/************************************/
static int keisoku_tbl_add( long *fptr, int kaiin_code )
{
int ret; /* リターンコード */
FILE *fp; /* ファイルポインタ */
char *fname = KEISOKU_TBL_NAME; /* 計測データ表ファイル */
/* 計測データ表ファイル OPEN -> NULL ? */
if( (fp = fopen( fname, "a+b" )) == NULL ) {
printf( "\n 計測データ表ファイル OPEN エラー" );
return NG;
}
/* 計測データ表ファイル SEEK -> OK でない ? */
if( (ret = fseek( fp, 0L, SEEK_END )) != OK ) {
printf( "\n 計測データ表ファイル SEEK エラー" );
/* 計測データ表ファイル CLOSE */
fclose( fp );
return NG;
}
/* ファイルポインタ取得 */
*fptr = ftell( fp );
/* 計測データ表クリア */
kojin_keisoku_tbl = init_kojin_keisoku_tbl();
/* 会員コードセット */
kojin_keisoku_tbl.kaiin_code = kaiin_code;
/* 計測データ表ファイル WRITE -> 1以外 ? */
if( (ret = fwrite( (char *)&kojin_keisoku_tbl, sizeof( kojin_keisoku_tbl ),
1, fp )) != 1 ) {
printf( "\n 計測データ表ファイル WRITE エラー" );
ret = NG;
}
else {
ret = OK;
}
/* 計測データ表ファイル CLOSE */
fclose( fp );
return ret;
}
/*****************************************/
/* 入会登録処理 */
/* コード・データ対照表 更新処理 */
/* */
/* パラメータ : 登録会員コード */
/* 計測データポインタ */
/* リターン : 0:OK */
/* -1:NG */
/*****************************************/
static int codedata_tbl_update( int kaiin_code, long fptr )
{
int ret; /* リターンコード */
FILE *fp; /* ファイルポインタ */
char *fname = CODEDATA_TBL_NAME; /* コード・データ対照表ファイル */
/* コード・データ対照表ファイル OPEN -> NULL ? */
if( (fp = fopen( fname, "r+b" )) == NULL ) {
printf( "\n コード・データ対照表ファイル OPEN エラー" );
return NG;
}
/* コード・データ対照表ファイル READ -> 1以外 ? */
if( (ret = fread( (char *)codedata_tbl, sizeof( codedata_tbl ), 1, fp ) )
!= 1 ) {
printf( "\n コード・データ対照表ファイル READ エラー" );
ret = NG;
}
else {
/* 該当データポインタセット */
codedata_tbl[ kaiin_code - 1 ] =
(int)( (fptr / sizeof( struct KEISOKU_TBL )) + 1 );
/* ファイルポインタを先頭に SEEK -> OK でない ? */
if( (ret = fseek( fp, 0L, SEEK_SET )) != OK ) {
printf( "\n コード・データ対照表ファイル SEEK エラー" );
/* コード・データ対照表ファイル CLOSE */
fclose( fp );
return NG;
}
/* コード・データ対照表ファイル WRITE -> 1以外 ? */
if( (ret = fwrite( (char *)codedata_tbl, sizeof( codedata_tbl ), 1,
fp )) != 1 ) {
printf( "\n コード・データ対照表ファイル WRITE エラー" );
ret = NG;
}
else {
ret = OK;
}
}
/* コード・データ対照表ファイル CLOSE */
fclose( fp );
return ret;
}
sakujyo.c
コード:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "common.h"
#include "main.h"
#include "sakujyo.h"
extern int akicode_tbl[ MEMBER_MAX + 1 ]; /* 空きコード表 */
extern int codedata_tbl[ MEMBER_MAX ]; /* コード・データ対照表 */
extern struct KEISOKU_TBL kojin_keisoku_tbl; /* 個人別計測データ表 */
/************************************/
/* 登録削除処理 */
/* メインルーチン */
/* */
/* パラメータ : なし */
/* リターン : 0:OK */
/* -1:NG */
/************************************/
int touroku_sakujyo( void )
{
int ret; /* リターンコード */
int loop = TRUE; /* ループフラグ */
int kaiin_code; /* 削除会員コード */
char work[ 128 ]; /* 入力ワーク */
while( loop ) {
printf( "\n 退会者の会員コードを入力してください" );
printf( "\n ? " );
/* 会員コード入力 */
work[ 0 ] = '\0';
scanf( "%s", work );
/* ニューメリック・チェック -> 数値以外 ? */
if( strspn( work, "1234567890" ) < strlen( work ) ) {
printf( "\n 数値以外が入力されました" );
continue;
}
/* 入力範囲チェック -> ( 0 < kaiin_code <= MEMBER_MAX ) ? */
kaiin_code = atoi( work );
if( kaiin_code > MEMBER_MAX || kaiin_code <= 0 ) {
printf( "\n 入力ミスです" );
continue;
}
/* コード・データ対照表削除 -> OK ? */
if( (ret = codedata_tbl_delete( kaiin_code )) == OK ) {
/* 空きコード表追加 -> OK ? */
if( (ret = akicode_tbl_add( kaiin_code )) == OK ) {
/* メインに戻る */
loop = FALSE;
}
}
else {
/* メインに戻る */
loop = FALSE;
}
}
if( ret == OK ) {
printf( "\n 入会登録削除処理が終了しました" );
}
return ret;
}
/************************************/
/* 登録削除処理 */
/* コード・データ対照表 削除処理 */
/* */
/* パラメータ : 削除会員コード */
/* リターン : 0:OK */
/* 1:CANCEL */
/* -1:NG */
/************************************/
static int codedata_tbl_delete( int kaiin_code )
{
int ret; /* リターンコード */
int i; /* インデックス */
char msg[ 64 ]; /* メッセージエリア */
FILE *fp; /* ファイルポインタ */
char *fname = CODEDATA_TBL_NAME; /* コード・データ対照表ファイル */
/* コード・データ対照表ファイル OPEN -> NULL ? */
if( (fp = fopen( fname, "r+b" )) == NULL ) {
printf( "\n コード・データ対照表ファイル OPEN エラー" );
return NG;
}
/* コード・データ対照表ファイル READ -> 1以外 ? */
if( (ret = fread( (char *)codedata_tbl, sizeof( codedata_tbl ), 1, fp ) )
!= 1 ) {
/* READ エラー */
printf( "\n コード・データ対照表ファイル READ エラー" );
/* コード・データ対照表ファイル CLOSE */
fclose( fp );
return NG;
}
/* 会員登録チェック -> 未登録 ? */
if( codedata_tbl[ kaiin_code - 1 ] == 0 ) {
printf( "\n この会員コードは未登録です" );
/* コード・データ対照表ファイル CLOSE */
fclose( fp );
return CANCEL;
}
/* 計測データ表 READ -> NG ? */
if( (ret = kojin_data_read( kaiin_code )) == NG ) {
/* コード・データ対照表ファイル CLOSE */
fclose( fp );
return ret;
}
/* 計測データ表示 */
kojin_data_disp( kaiin_code, "\n ** 削除データ **" );
/* 計測データ表削除確認 */
sprintf( msg, "\n\n 上のデータを削除します。よろしいですか( Y/N )" );
if( (ret = kakunin_input( msg )) == OK ) {
/* 計測データ表削除 -> OK ? */
if( (ret = kojin_data_delete( kaiin_code )) == OK ) {
/* 計測データポインタ更新 */
for( i = 0; i < MEMBER_MAX; i++ ) {
if( codedata_tbl[ i ] > codedata_tbl[ kaiin_code - 1 ] ) {
codedata_tbl[ i ]--;
}
}
/* 計測データポインタクリア */
codedata_tbl[ kaiin_code - 1 ] = 0;
/* コード・データ対照表ファイルの先頭位置に SEEK -> OK ? */
if( (ret = fseek( fp, 0L, SEEK_SET )) == OK ) {
/* コード・データ対照表ファイル WRITE -> 1以外 ? */
if( (ret = fwrite( (char *)codedata_tbl,
sizeof( codedata_tbl ),1, fp )) != 1 ) {
printf( "\n コード・データ対照表ファイル WRITE エラー" );
ret = NG;
}
else {
ret = OK;
}
}
else {
printf( "\n コード・データ対照表ファイル SEEK エラー" );
ret = NG;
}
}
}
else {
/* 処理中止 */
ret = CANCEL;
}
/* コード・データ対照表ファイル CLOSE */
fclose( fp );
return ret;
}
/************************************/
/* 登録削除処理 */
/* 個人計測データ表 削除処理 */
/* */
/* パラメータ : 削除会員コード */
/* リターン : 0:OK */
/* -1:NG */
/************************************/
static int kojin_data_delete( int kaiin_code )
{
int ret; /* リターンコード */
int i; /* インデックス */
FILE *fp; /* 計測データ表ファイルポインタ */
FILE *tmp; /* テンポラリファイルポインタ */
char *fname = KEISOKU_TBL_NAME; /* 計測データ表ファイル */
char *tmpfl = "keisoku.tmp"; /* テンポラリファイル */
/* 計測データ表ファイル OPEN -> NULL ? */
if( (fp = fopen( fname, "rb" )) == NULL ) {
printf( "\n 計測データ表ファイル OPEN エラー" );
return NG;
}
/* テンポラリファイル OPEN -> NULL ? */
if( (tmp = fopen( tmpfl, "w+b" )) == NULL ) {
printf( "\n テンポラリファイル OPEN エラー" );
fclose( fp );
return NG;
}
i = 0;
for( ; ; ) {
/* 計測データ表ファイル READ -> 1以外 ? */
if( (ret = fread( (char *)&kojin_keisoku_tbl,
sizeof( kojin_keisoku_tbl ), 1, fp )) != 1 ) {
/* READ エラー ? */
if( ferror( fp ) != 0 ) {
printf( "\n 計測データ表ファイル READ エラー" );
ret = NG;
}
else {
/* ファイル EOF でない ? */
if( feof( fp ) == 0 ) {
printf( "\n 計測データ表ファイル READ エラー" );
ret = NG;
}
else {
ret = OK;
}
}
break;
}
/* 削除データ ? */
if( kaiin_code == kojin_keisoku_tbl.kaiin_code ) {
continue;
}
/* テンポラリファイル WRITE -> 1以外 ? */
if( (ret = fwrite( (char *)&kojin_keisoku_tbl,
sizeof( kojin_keisoku_tbl ), 1, tmp )) != 1 ) {
printf( "\n 計測データ表ファイル WRITE エラー" );
ret = NG;
break;
}
i++;
}
/* テンポラリファイル CLOSE */
fclose( tmp );
/* 計測データ表ファイル CLOSE */
fclose( fp );
/* 正常終了 ? */
if( ret == OK ) {
/* 計測データ表ファイル DELETE -> 0以外 ? */
if( (ret = remove( fname )) != 0 ) {
printf( "\n 計測データ表ファイル削除エラー" );
ret = NG;
}
else {
/* 書込みデータあり ? */
if( i > 0 ) {
/* テンポラリファイルを計測データ表ファイルにリネームする -> 0以外 ? */
if( (ret = rename( tmpfl, fname )) != 0 ) {
printf( "\n 計測データ表ファイルリネームエラー" );
ret = NG;
}
}
else {
/* テンポラリファイル削除 */
remove( tmpfl );
}
}
}
else {
/* テンポラリファイル削除 */
remove( tmpfl );
}
return ret;
}
/************************************/
/* 登録削除処理 */
/* 空きコード表 追加処理 */
/* */
/* パラメータ : 削除会員コード */
/* リターン : 0:OK */
/* -1:NG */
/************************************/
static int akicode_tbl_add( int kaiin_code )
{
int ret; /* リターンコード */
int cnt; /* 空きコード件数 */
FILE *fp; /* ファイルポインタ */
char *fname = AKICODE_TBL_NAME; /* 空きコード表ファイル */
/* 空きコード表 READ -> NG ? */
if( (ret = akicode_tbl_read( )) == NG ) {
return ret;
}
/* 空きコード件数セット */
cnt = akicode_tbl[ 0 ];
/* 空きコードテーブルセット */
akicode_tbl[ cnt + 1 ] = kaiin_code;
/* 空きコード件数セット */
akicode_tbl[ 0 ] = cnt + 1;
/* 空きコード表ファイル OPEN -> NULL ? */
if( (fp = fopen( fname, "w+b" )) == NULL ) {
printf( "\n 空きコード表ファイル OPEN エラー" );
return NG;
}
/* 空きコード表ファイル WRITE -> 1以外 ? */
if( (ret = fwrite( (char *)akicode_tbl,
sizeof( int ) * ( akicode_tbl[ 0 ] + 1 ), 1, fp )) != 1 ) {
printf( "\n 空きコード表ファイル WRITE エラー" );
ret = NG;
}
else {
ret = OK;
}
/* 空きコード表ファイル CLOSE */
fclose( fp );
return ret;
}
ヘッダファイル
main.h
コード:
static int codedata_tbl_create( void );
static int akicode_tbl_create( void );
int akicode_tbl_read( void );
int kakunin_input( char *msg );
int kojin_data_read( int kaiin_code );
void kojin_data_disp( int kaiin_code, char *msg );
struct KEISOKU_TBL init_kojin_keisoku_tbl( void );
keisoku.h
コード:
int keisoku_input( void );
static int codedata_tbl_read( void );
static void kaiin_code_input( int *kaiin_code );
static void keisoku_date_input( char *keisoku_date );
static void keisoku_data_input( int idx );
static void keisoku_data_disp( int kaiin_code, char *keisoku_date );
static void undou_sisuu_keisan( int *undou_sisuu );
static int kojin_data_update( int kaiin_code, char *keisoku_date, int undou_sisuu );
static int keisoku_rank( void );
static void keisoku_data_sort( int cnt );
static void keisoku_sort_disp( int cnt );
nyuukai.h
コード:
int nyuukai_touroku( void );
static int akicode_tbl_update( void );
static int keisoku_tbl_add( long *fptr, int kaiin_code );
static int codedata_tbl_update( int kaiin_code, long fptr );
sakujyo.h
コード:
int touroku_sakujyo( void );
static int codedata_tbl_delete( int kaiin_code );
static int kojin_data_delete( int kaiin_code );
static int akicode_tbl_add( int kaiin_code );
commom.h
コード:
#define MEMBER_MAX 200 /* メンバー数 MAX */
#define AKICODE_TBL_NAME "akicode.tbl" /* 空きコード表ファイル名 */
#define CODEDATA_TBL_NAME "codedata.tbl" /* コード・データ対照表ファイル名 */
#define KEISOKU_TBL_NAME "keisoku.tbl" /* 計測データ表ファイル名 */
#define TRUE 1 /* 真 */
#define FALSE 0 /* 偽 */
#define OK 0 /* 正常 */
#define CANCEL 1 /* 処理中止 */
#define NG -1 /* 異常 */
/* 計測データテーブル */
struct KEISOKU_TBL {
int kaiin_code; /* 会員コード */
int count; /* 計測回数 */
char first_date[ 9 ]; /* 初回日付 */
int first_data; /* 初回データ */
char max_date[ 9 ]; /* 最高記録日付 */
int max_data; /* 最高記録データ */
char soku_date[ 9 ]; /* 最新計測日付 */
int soku_data[ 10 ]; /* 計測データ */
};
/* 入力計測データ */
struct KEISOKU_INPUT {
int huka; /* 負荷 */
int set; /* セット */
int kaisuu; /* 回数 */
};
長文すみません
よろしくお願いします。