名簿管理プログラム 

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tatsuki

名簿管理プログラム 

#1

投稿記事 by tatsuki » 14年前

この名簿管理プログラムに cmdDelete 削除のコマンドをつけたいのですが
どのようなアルゴリズムにすれば良いでしょうか?
イメージとしては,%d [ id number ] のように id を打ち込めばその構造体を削除としたいと思っています.
教えてください.

コード:

#include<stdio.h>    
#include<stdlib.h>
#include<string.h>

struct date{//生年月日の構造体を宣言
  int y;
  int m;
  int d;
};

struct profile {//名簿のデータの構造体を宣言
  int id;//int型でIDを読み込む 
  char name[70];//名前を70バイト分読み込む
  struct date birthday;//L.5で宣言した構造体を読み込む
  char adress[70];//住所を70バイト分読み込む
  char memo[512];//備考を512バイト分読み込む
}data[10000];//上記の構造体を10000確保する

int nprofile =0;//nprofileをグローバル変数とする


void subst(char *str){//subst関数を宣言
  while(*str != '\0'){
    if(*str == '\n'){
      *str = '\0';
    }
    str++;
  }
}
//文字列内の改行(\n)をナル文字に変える


void split(char *line,char *point[],int n,char c){//split関数を宣言
  int i;
  point[0]=line;//str[0]の先頭アドレスを格納
  for(i=1;i<n;i++){
    while(*line != c)line++;
    *line='\0';//「,」のときナル文字に変換
    line++;
    point[i]=line;//「,」の次の文字を読み込む
  }
}

void csv(char *str){
  char *ret[5],*ret2[3];
  int i;
  subst(str);
  split(str,ret,5,',');//文字列用split
  
  data[nprofile].id=atoi(ret[0]);
  strcpy(data[nprofile].name   ,ret[1]);
  strcpy(data[nprofile].adress ,ret[3]);
  strcpy(data[nprofile].memo   ,ret[4]);
  
  split(ret[2],ret2,3,'-');//生年月日用split
 
  data[nprofile].birthday.y=atoi(ret2[0]);
  data[nprofile].birthday.m=atoi(ret2[1]);
  data[nprofile].birthday.d=atoi(ret2[2]);
  
  nprofile++;//次の構造体に移動  
}

void cmdQ(){
  printf("コマンドQを実行\n");
  printf("---------------------\n");
  printf("プログラム終了\n");
  exit(0);
}

void cmdC(){
  printf("コマンドCを実行\n");
  printf("---------------------\n");
  printf("データ数 %d\n",nprofile);//グローバル変数の数を読み込み
  printf("プログラム終了\n");  
}

void cmdP(char *str){
  int i;
  if (atoi(str+3) ==0){//n=0の場合
    for(i=0;i<nprofile;i++){
      printf("id     :%d\n",data[i].id);
      printf("name   :%s\n",data[i].name);
      printf("date   :%d/%d/%d\n",data[i].birthday.y,data[i].birthday.m,data[i].birthday.d);
      printf("adress :%s\n",data[i].adress);
      printf("memo   :%s\n",data[i].memo);
      printf("\n");
    }
  }else if(atoi(str+3) < 0){//nが負の場合
    for(i=nprofile+atoi(str+3);i<nprofile;i++){
      printf("id     :%d\n",data[i].id);
      printf("name   :%s\n",data[i].name);
      printf("date   :%d/%d/%d\n",data[i].birthday.y,data[i].birthday.m,data[i].birthday.d);
      printf("adress :%s\n",data[i].adress);
      printf("memo   :%s\n",data[i].memo);
      printf("\n");
    }
  }else if(atoi(str+3) > 0){//nが正の場合
    for(i=0;i<atoi(str+3);i++){
      printf("id     :%d\n",data[i].id);
      printf("name   :%s\n",data[i].name);
      printf("date   :%d/%d/%d\n",data[i].birthday.y,data[i].birthday.m,data[i].birthday.d);
      printf("adress :%s\n",data[i].adress);
      printf("memo   :%s\n",data[i].memo);
      printf("\n"); 
    } 
  }
}

void cmdR(char *str){
  FILE *fp;//ファイルポインタの宣言
  char line[1024];//メモリの確保

  str=str+3;//読み込むポインタを指定

  if((fp = fopen(str,"r")) == NULL){//
    printf("読み込み失敗\n");
    return;
  }
  while(fgets(line,1024,fp) != NULL){
    csv(line);//csv関数処理
  }
  fclose(fp);
  printf("読み込み完了\n");
}

void cmdW(char *str){
  FILE *fp;//ファイルポインタの宣言
  int i;
  str=str+3;//書き込むポインタを指定

  if((fp = fopen(str,"w")) == NULL){
    printf("読み込み失敗\n");
    return;
  }
  for(i=0;i<nprofile;i++){
    fprintf(fp,"%d,%s,%d-%d-%d,%s,%s\n",data[i].id,
	                                data[i].name,
	                                data[i].birthday.y,
	                                data[i].birthday.m,
	                                data[i].birthday.d,
	                                data[i].adress,
	                                data[i].memo);
  }
      
  fclose(fp);

}

void cmdF(char *str){

  int i;
  int n=0;

  str=str+3;

  for(i=0;i<nprofile;i++){
    if(data[i].id == atoi(str) ||
       strstr(data[i].name,str) != NULL ||
       strstr(data[i].adress,str) != NULL ||
       data[i].birthday.y == atoi(str) ){
      printf("id     :%d\n",data[i].id);
      printf("name   :%s\n",data[i].name);
      printf("date   :%d/%d/%d\n",data[i].birthday.y,data[i].birthday.m,data[i].birthday.d);
      printf("adress :%s\n",data[i].adress);
      printf("memo   :%s\n",data[i].memo);   
      printf("\n");
      n=1;
    }
  }
  if(n == 0){
    printf("一致するものがありません\n");
  }
}

int cmp_id(struct profile *p1,struct profile *p2){
  return p1->id - p2->id;
}

int cmp_name(struct profile *p1,struct profile *p2){
 return strcmp(p1->name,p2->name);
}

int cmp_birthday(struct profile *p1,struct profile *p2){

  int t1 = p1->birthday.y*10000+p1->birthday.m*100+p1->birthday.d;
  int t2 = p2->birthday.y*10000+p2->birthday.m*100+p2->birthday.d;

  return t1 - t2;
}

int cmp_adress(struct profile *p1,struct profile *p2){
  return strcmp(p1->adress,p2->adress);
}

void cmdS(int n){

  int i,j;

  struct profile temp;

  int (*cmp)(struct profile *p1,struct profile *p2);

  if(n==1){
    cmp=cmp_id;
  }else if(n==2){
    cmp=cmp_name;
  }else if(n==3){
    cmp=cmp_birthday;
  }else if(n==4){
    cmp=cmp_adress;
  }

  for(i=0;i<nprofile-1;i++){
    for(j=nprofile-1;j>i;j--){
      if((*cmp)(&data[j-1],&data[j])  > 0){
	temp=data[j];
	data[j]=data[j-1];
	data[j-1]=temp;
      }
    }
  }
  printf("sort ok\n");
}

void cmd(char *str){
  if(*(str+1) =='Q' || *(str+1)=='q'){//コマンドQ
    cmdQ();      
  }else if(*(str+1) =='C' || *(str+1)=='c'){//コマンドC
    cmdC();
  }else if(*(str+1) =='P' || *(str+1)=='p'){//コマンドP
    cmdP(str);
  }else if(*(str+1) =='R' || *(str+1)=='r'){//コマンドR
    subst(str);
    cmdR(str);
  }else if(*(str+1) =='W' || *(str+1)=='w'){//コマンドW
    subst(str);
    cmdW(str);
  }else if(*(str+1) =='F' || *(str+1)=='f'){//コマンドF
    subst(str);
    cmdF(str);
  }else if(*(str+1) =='S' || *(str+1)=='s'){//コマンドS
    subst(str);
    cmdS(atoi(str+3));
  }
}
  main(){
  char str[256];

  while(1){//繰り返し文を使いコマンドを繰り返す
    
    printf("コマンド,もしくはデータを入力してください\n");
    
    fgets(str,sizeof(str),stdin);//fgetsで文字列を読み込む
    if(*str != '%'){
      csv(str);
    }
    cmd(str);
  } 
}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: 名簿管理プログラム 

#2

投稿記事 by softya(ソフト屋) » 14年前

ご自分で作られたプログラムですよね?
%dを追加することは出来ますか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

non
記事: 1097
登録日時: 15年前

Re: 名簿管理プログラム 

#3

投稿記事 by non » 14年前

>id を打ち込めばその構造体を削除としたいと思っています

削除は,どのようにしたいのでしょうか?配列をつめますか?
仕様がわかりません。
できれば,各コマンドの使い方を示して欲しいです。
プログラムを読むのも面倒なので。
non

閉鎖

“C言語何でも質問掲示板” へ戻る