tdss.c |
#include "para.h" //--------------------------------------------------------------------------- static char *SetName( char *name) { char *setname; setname = malloc( sizeof( char) * ( strlen( name) + 1 ) ); strcpy( setname, name); return setname; } //--------------------------------------------------------------------------- static Person *GenerateNew( char *name, int age, double h, double w) { Person *new; new = malloc( sizeof( Person) ); new->name = SetName( name); new->age = age; new->height = h; new->weight = w; return new; } //--------------------------------------------------------------------------- static Person *ReadFile( char *file) { char d_name[20]; double d_height, d_weight; int d_age; FILE *fp; Person *top, *work; fp = fopen( file, "r"); if ( fp == NULL ) { fprintf( stderr, "\n\n%s は存在しません.\n\n", file ); exit(3); } printf("\n%s から登録データを読み込みました.", file ); if ( !feof(fp) ) { fscanf( fp, "%s\t%d\t%lf\t%lf\n", d_name, &d_age, &d_height, &d_weight ); top = work = GenerateNew( d_name, d_age, d_height, d_weight); } while ( !feof(fp) ) { fscanf( fp, "%s\t%d\t%lf\t%lf\n", d_name, &d_age, &d_height, &d_weight ); work->next = GenerateNew( d_name, d_age, d_height, d_weight); work = work->next; } work->next = NULL; work = NULL; fclose( fp); return top; } //--------------------------------------------------------------------------- void ShowPerson( Person *p) { Person *work; printf("\n登録データ: "); for ( work = p ; work != NULL ; work = work->next ) { printf("\n%s\t%d\t%.1lf\t%.1lf", work->name, work->age, work->height, work->weight ); } } //--------------------------------------------------------------------------- int SelectNumber( void) { int num; char buf[100]; do { printf("\n\n--- 情報システム応用I 簡易データベース ---"); printf("\n 1) データの一覧表示"); printf("\n 2) 新規データを追加する"); printf("\n 3) データを削除する"); printf("\n 4) ファイルに書き込む"); printf("\n 5) 終了"); printf("\n>"); fgets( buf, sizeof( buf), stdin); sscanf( buf, "%d", &num); } while ( num < 1 || num > 5 ); return num; } //--------------------------------------------------------------------------- Person *NewPerson( Person *p) { Person *new, *here, *prev; char d_name[20], buf[100]; double d_height, d_weight; int d_age; printf("\n名前を入力: "); fgets( buf, sizeof( buf), stdin); sscanf( buf, "%s", d_name); do { printf("年齢を入力: "); fgets( buf, sizeof( buf), stdin); sscanf( buf, "%d", &d_age); } while( d_age <= 0 ); printf("身長を入力: "); fgets( buf, sizeof( buf), stdin); sscanf( buf, "%lf", &d_height); printf("体重を入力: "); fgets( buf, sizeof( buf), stdin); sscanf( buf, "%lf", &d_weight); for ( here = p ; here != NULL ; here = here->next ) { if ( here->age >= d_age ) break; else prev = here; } new = GenerateNew( d_name, d_age, d_height, d_weight); if ( here == p ) { new->next = p; return new; } else { new->next = prev->next; prev->next = new; return p; } } //--------------------------------------------------------------------------- Person *DeletePerson( Person *p) { Person *here, *prev; char d_name[20], buf[100]; int d_age, find = 0; printf("\n名前を入力: "); fgets( buf, sizeof( buf), stdin); sscanf( buf, "%s", d_name); printf("年齢を入力: "); fgets( buf, sizeof( buf), stdin); sscanf( buf, "%d", &d_age); for ( here = p ; here != NULL ; here = here->next ) { if ( strcmp( d_name, here->name) == 0 & d_age == here->age ) { find = 1; break; } else prev = here; } if ( find != 1 ) printf("\n%s(%d歳)は存在しません.\n", d_name, d_age); else { if ( here == p ) p = p->next; else prev->next = here->next; free( here->name); free( here); } return p; } //--------------------------------------------------------------------------- void FinalizePerson( Person *p) { Person *work; while( p != NULL ) { work = p; p = p->next; free( work->name); free( work); } } //--------------------------------------------------------------------------- void WritePerson( char *file, Person *p) { FILE *fp; Person *work; fp = fopen( file, "w+"); if ( fp == NULL ) { fprintf( stderr, "\n\n%s をオープンできません.\n\n", file ); exit(3); } printf("\n%s に書き込みます.\n", file ); for ( work = p ; work != NULL ; work = work->next ) fprintf( fp, "%s\t%d\t%lf\t%lf\n", work->name, work->age, work->height, work->weight ); fclose( fp); } //--------------------------------------------------------------------------- void ExitPerson( char *file, Person *p) { int flag, ans; char buf[3]; flag = 0; do { printf("\n保存して終了\t--> 1"); printf("\n保存せずに終了\t--> 2\n"); fgets( buf, sizeof(buf), stdin); sscanf( buf, "%d", &ans); switch( ans ) { case 1: WritePerson( file, p); break; case 2: break; default: flag = 1; } } while( flag != 0 ); } //--------------------------------------------------------------------------- int main( int argc, char **argv ) { int status; Person *psn; if ( argc < 2 ) { fprintf( stderr, "\n usage: tdss [file]\n\n" ); exit(1); } psn = ReadFile( argv[1] ); do { status = 0; switch( SelectNumber() ){ case 1: ShowPerson(psn); break; case 2: psn = NewPerson(psn); break; case 3: psn = DeletePerson(psn); break; case 4: WritePerson(argv[1], psn); break; case 5: ExitPerson( argv[1], psn); status = 1; break; } } while( status != 1 ); FinalizePerson( psn); return 0; } |