簡易データベース     情報システム応用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] cannot open!\n\n", file );
    exit(3);
  }
  
  printf("\nReading [%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;   /** 変更しました(04.05.17) **/

  fclose( fp);

  return top;
}

void ShowPerson( Person *p)
{
  Person *work;

  printf("\nAll member:");
  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---  Tiny Database ---");
    printf("\n 1) show all");
    printf("\n 2) create a new member");
    printf("\n 3) delete a member");
    printf("\n 4) write to file");
    printf("\n 5) exit");    printf("\n>");
    fgets( buf, sizeof( buf), stdin);
    sscanf( buf, "%d", &num);
  } while ( num < 1 || num > 5 );
  
  return num;
}

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: printf("\n select 2"); break;
      case 3: printf("\n select 3"); break;
      case 4: printf("\n select 4"); break;
      case 5: printf("\n select 5\n\n"); 
              status = 1; break;
    }
  } while( status != 1 );
  
  return 0;
}

▼ 新規データの追加まで

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] cannot open!\n\n", file );
    exit(3);
  }
  
  printf("\nReading [%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("\nAll member:");
  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---  Tiny Database ---");
    printf("\n 1) show all");
    printf("\n 2) create a new member");
    printf("\n 3) delete a member");
    printf("\n 4) write to file");
    printf("\n 5) exit");    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("\nName? "); 
  fgets( buf, sizeof( buf), stdin);    
  sscanf( buf, "%s", d_name);

  do {
    printf("His/Her age? "); 
    fgets( buf, sizeof( buf), stdin);    
	sscanf( buf, "%d", &d_age);
  } while( d_age <= 0 );

  printf("His/Her height? "); 
  fgets( buf, sizeof( buf), stdin);    
  sscanf( buf, "%lf", &d_height);

  printf("His/Her weight? "); 
  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;
  }
}


//---------------------------------------------------------------------------
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: printf("\n select 3"); break;
      case 4: printf("\n select 4"); break;
      case 5: printf("\n select 5\n\n"); 
              status = 1; break;
    }
  } while( status != 1 );
  
  return 0;
}

 

 

 TOP