簡易データベース     情報システム応用I   

簡易データベースのソース -- 完成版

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;
}

 

 

 TOP