2016年7月8日金曜日

C言語:簡易住所録(簡単なインメモリーDB)

問題1
下記の条件で構造体を用いた簡易住所録を作成。
・レコード内容:ID(2ケタ)、氏名、住所(簡単なもの)
・参照・追加・更新・削除が可能
・最初から5件分のメモリ領域を確保しておき、
6件以上登録する場合は随時動的にメモリを確保する(制限無し)
・[Ctrl+c]を押すことで現在の情報をディスク上へファイルとして生成

問題1のプログラム
#define DEFALUT_NUM 5

/* Global Variable*/
typedef struct {
    int id;
    char name[15];
    char address[200];
    int delflag;
} card_t;

card_t *info,*tmp_info;
int current_id=1;

/*Function*/

void genCSV() {
    int i=1;
    FILE *fp;
    fp = fopen("test.dat","w");
    if( fp==NULL ){
        fprintf(stderr,"test.dat can not be opened!\n");
    }
    while ( i < current_id ) {
        if ( info[i].delflag == 0 ) {
            fprintf(fp,"%d,%s,%s\n",info[i].id,info[i].name,info[i].address);
        }
        i++;
    }
    fclose(fp);
}


/* FLG */

/*Signal Handle*/
void endfunc()
{
    genCSV();
    free(info);
    exit(0);
}

typedef void (*handler_t) (int);
static int sigHandlerSet(int sig, handler_t handler)
{

    struct sigaction new_action;
    struct sigaction old_action;
    memset( &new_action, 0, sizeof( struct sigaction ) );
    new_action.sa_handler = handler;
    /* Temporarily block all other signals during handler execution */
    sigfillset ( &new_action.sa_mask );
    /* Auto restart syscalls after handler return */
    new_action.sa_flags = SA_RESTART;

    if ( sigaction( sig, NULL, &old_action ) != 0 )
    {
        return -1;
    }

    /* Honor inherited SIG_IGN that's set by some shell's */
    if ( old_action.sa_handler != SIG_IGN )
    {
        if ( sigaction( sig, &new_action, NULL ) != 0 )
        {
            return -1;
        }
    }
    return 0;
}

int HandleSignals( void )
{
    if (sigHandlerSet(SIGINT,  endfunc) != 0)
        return -1;
    return 0;
}

void selectAll() {
    int i=1;
    int flag = 0;
    while( i < current_id ) {
        if ( info[i].delflag == 0 ) {
            fprintf(stdout,"id=%d,name=%s,address=%s\n",info[i].id,info[i].name,info[i].address);
            flag = 1;
        }
        i++;
    }
    if ( flag == 0 ) {
        fprintf(stdout,"not found!\n");
    }
}

int selectId(int pid) {
    int i=1;
    int flag=0;
    while( i < current_id ) {
        if ( info[i].id == pid && info[i].delflag == 0 ) {
            fprintf(stdout,"id=%d,name=%s,address=%s\n",info[i].id,info[i].name,info[i].address);
            flag = 1;
            break;
        }
        i++;
    }
    return flag;
}

void insert(char *name,char *address) {
    if ( current_id > DEFALUT_NUM ) {
        tmp_info = (card_t*)realloc(info,(current_id + 1) * sizeof(card_t));
        info = tmp_info;
    }
    info[current_id].delflag = 0;
    info[current_id].id = current_id;
    sprintf(info[current_id].name,"%s",name);
    sprintf(info[current_id].address,"%s",address);
    fprintf(stdout,"stored with id=%d\n",info[current_id].id);
    current_id++;
}

void delete(int pid) {
    info[pid].delflag = 1;
}

void update(int pid,char *name,char *address) {
    sprintf(info[pid].name,"%s",name);
    sprintf(info[pid].address,"%s",address);
}

void printMenu() {
    fprintf(stdout,"Please choose a number from following!\n");
    fprintf(stdout,"1 -> select\n");
    fprintf(stdout,"2 -> insert\n");
    fprintf(stdout,"3 -> update\n");
    fprintf(stdout,"4 -> delete\n\n");
    fprintf(stdout,"menu num[1-4] = ");
}

int main(void) {
    char c[2];
    int i;
    int input=0;
    int id=-1;
    int rc=0;
    char name[15];
    char address[200];

    info = (card_t*) malloc ( sizeof(card_t) * (DEFALUT_NUM + 1) );
    for( i = 0; i < DEFALUT_NUM; i++ ) {
        info[i].id = 0;
        info[i].delflag = 0;
    }

    if ( ( rc = HandleSignals()) != 0 )
        exit(-1);

    while ( 1 ) {
        printMenu();
        scanf("%d",&input);
        switch(input) {
        case 1:
            fprintf(stdout,"id(-1:ALL, or id > 0)-> ");
            scanf("%d",&id);
            if ( id < 0 ) {
                selectAll();
            } else {
                if ( ! selectId(id) ) {
                    fprintf(stdout,"not found!\n");
                };
            }
            break;
        case 2:
            fprintf(stdout,"name-> ");
            scanf("%s",name);
            fprintf(stdout,"address-> ");
            scanf("%s",address);
            insert(name,address);
            break;
        case 3:
            fprintf(stdout,"id-> ");
            scanf("%d",&id);
            if ( id > 0 ) {
                if( selectId(id) ) {
                    fprintf(stdout,"name-> ");
                    scanf("%s",name);
                    fprintf(stdout,"address-> ");
                    scanf("%s",address);
                    update(id,name,address);
                } else {
                    fprintf(stdout,"not found id = %d!\n",id);
                }
            } else {
                fprintf(stderr,"Please set correct id!\n");
            }
            break;
        case 4:
            fprintf(stdout,"id-> ");
            scanf("%d",&id);
            if ( id > 0 ) {
                if( selectId(id) ) {
                    delete(id);
                } else {
                    fprintf(stdout,"not found id = %d!\n",id);
                }
            } else {
                fprintf(stderr,"Please set correct id!\n");
            }
            break;
        default:
            break;
        }

        fprintf(stdout,"do you exit this program?[y|n] ");
        scanf("%s",c);
        if ( c[0] == 'y' ) {
            endfunc();
        }
        fprintf(stdout,"\n\n");


    };

    free(info);

    return 0;
}

忙しさにかまけて、ちゃんと理解できないところがあるので復習しなきゃ。。。
次はpythonへ...





2016年6月12日日曜日

ヒトには時間でしか癒せない痛みがある


先日28歳になりました。この世に生を受けて10000日ちょっと。


昔想像してた28歳よりも、幼く、未熟だけど、
健康で大きな悩みもなく、生活できていると思います。

こういう節目だと、いつもどう生きていこうかな、とか考えてしまうけど、
シンプルに、これからも自分の納得のために生きていきたいと思う。

こだわりこそが人生の彩りだとも思う。


ああ、人生で一度はオーロラを観たいなあ。

Boards of Canada - Macquarie Ridge (Aurora Borealis, Northern Lights) HD...







2016年5月14日土曜日

Marble Mountain, a themed marble machine

[tips]Google Chromeを常にシークレットモードで起動する

Google Chromeを常にシークレットモードで起動する

Windows8
  1. デスクトップのショートカットやスタートメニュー>すべてのプログラムにあるChromeアイコンを右クリック。
  2. 右クリックメニューからプロパティを選択。
  3. Google Chromeのプロパティ起動後、ショートカットタブのリンク先の項目の語尾に--incognitoオプションを追加。こんな感じ→"~\chrome.exe" --incognito
  4. 適用、OKをクリック。
  5. これでChromeアイコンからChromeを起動するとシークレットモードで起動する。

2016年4月27日水曜日

The circle of life.


20代までは、若さと外見の小奇麗さがあれば、押し切れる時代。
30代からは、人生のテーマとどんな風に時間を過ごしているかが外見に出てくる時代。

したがって、年老いても美しいひとは昔から容姿が整っていたのではなく、
長い年月、充実した時間を過ごしてきた証明。

2016年4月4日月曜日

C言語:ファイルの入出力

問題1
下記の条件で、5人分キーボードから入力し、
それをディスク上にファイルとして生成するプログラムを作成。
・受験番号(4ケタ)
・性別(男:M、女:F)
・氏名(20ケタ以内、姓と名の間を"-"でつなぐ)

問題2
問題1で生成したファイルを読み込み、まず性別で分け、
その中を氏名順でソートするプログラムを作成。

問題1のプログラム
struct exam{
  int no;
  char sex;
  char first[10];
  char last[10];
};

int main(void){
  FILE *fp;
  int i;
  struct exam member[10];
  for(i=0;i<5 i="" p="">    printf("%d番目の受験番号を入力してください:",i+1);
    scanf("%d", &member[i].no );
    printf("%d番目の性別を入力してください M/F:",i+1);
    scanf(" %[MF]", &member[i].sex );
    printf("%d番目のファーストネームを入力してください:",i+1);
    scanf("%s", member[i].first );
    printf("%d番目のラストネームを入力してください:",i+1);
    scanf("%s", member[i].last );
  }
   fp = fopen("test.txt","a");
   for(i =0;i<5 i="" p="">        printf("受験番号:%d\n性別:%c\n氏名:%s-%s\n",member[i].no, member[i].sex, member[i].first,member[i].last);
        fprintf(fp,"%d %c %s-%s\n",member[i].no, member[i].sex, member[i].first,member[i].last);
    }
   fclose(fp);
   printf("test.txtに出力完了\n");

  return 0;
}


問題2のプログラム
typedef struct {
  int no;
  char sex[5];
  char name[20];
} exam;
int main(void){
  FILE *fp;
  int  i,j,s=0,t=0;
  exam member[10];
  exam male[10],female[10],x[1],y[1];
  fp = fopen("test.txt","r");
  // ファイルの終端まで文字列を読み取り表示
  for(i=0;i<5 div="" i="">
      if(fscanf(fp,"%d %s %s\n" ,&member[i].no,member[i].sex, member[i].name ) != 3 ) break;
  }
  fclose(fp);
  //性別ごとに分類
  printf( "女性だけ表示\n");
  for (i=0;i<5 div="" i="">
    if(strcmp(member[i].sex,"M")){
     female[t].no = member[i].no;
     strcpy(female[t].sex,member[i].sex);
     strcpy(female[t].name,member[i].name);
     printf( "%d %s %s\n", female[t].no, female[t].sex, female[t].name);
     t++;
    }
  }
  printf( "男性だけ表示\n");
  for (i=0;i<5 div="" i="">
    if(strcmp(member[i].sex,"F")){
     male[s].no = member[i].no;
     strcpy(male[s].sex,member[i].sex);
     strcpy(male[s].name,member[i].name);
     printf( "%d %s %s\n", male[s].no, male[s].sex, male[s].name);
     s++;
   }
  }
  //女性の並べ替え
  for(i=0;i
    for(j=0;j
      if (strcmp(female[j].name,female[j+1].name) > 0) {
         y[1] = female[j];
         female[j] = female[j+1];
         female[j+1] = y[1];
      }
    }
  }
  printf( "女性を氏名順に並び替え\n");
  for(i=0;i
     printf( "%d %s %s\n",  female[i].no, female[i].sex, female[i].name);
  //男性の並べ替え
  for(i=0;i
    for(j=0;j
      if (strcmp(male[j].name,male[j+1].name) > 0) {
         x[1] = male[j];
         male[j] = male[j+1];
         male[j+1] = x[1];
      }
    }
  }
  printf( "男性を氏名順に並び替え\n");
  for(i=0;i
     printf( "%d %s %s\n",  male[i].no, male[i].sex, male[i].name);
  return 0;
  }