【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.19317

以前、関数についての質問を出しましたが・・
投稿者---チャイ(2005/01/19 01:21:08)


その後、先生から回答を貰いました。
解決版のソースを載せてみては?
と、言われたので、先生のをそのまま載せます。
著作権に脅えつつ・・。
このプログラムはみなさんはどう思われますか??
ーーーーーーーーーーーーー
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct tr {
  char * name;
  int hindo;
  struct tr *left, *right;
} TREE;
typedef enum { sentou, eisuuzi, kuuhaku, end} KANSU;
int isyoyakugo(char *str){
  char *yoyakugo[]={"if","while","switch","for",NULL};
  char **p=yoyakugo;
  for(p=yoyakugo;*p!=NULL;p++){
    if(strcmp(str,*p)==0){
      break;
    }
  }
  return *p!=NULL;
}
char* getfunc(){
  char buffer[256];
  int index=0;
  char c;
  KANSU status;
  status = sentou;
  while((status!=end)&&((c=getchar())!=EOF)){
    if(index>=256){
      fprintf(stderr,"名前が長過ぎます\n");
      exit(1);
    }
    switch(status){
    case sentou:
      if(isalpha(c)){
  index=0;
  buffer[index++]=c;
  status=eisuuzi;
      }
      break;
    case eisuuzi:
      if(c=='('){
  buffer[index]='\0';
  status=end;
      }else if(isalnum(c)){
  buffer[index++]=c;
      }else if(isspace(c)){
  status=kuuhaku;
      }else{
  status=sentou;
      }
      break;
    case kuuhaku:
      if(c=='('){
  buffer[index]='\0';
  status=end;
      }else if(isalpha(c)){
  index=0;
  buffer[index++]=c;
  status=eisuuzi;
      }else if(!isspace(c)){
  status=sentou;
      }
      break;
    }
  }
  if(c==EOF){
    return NULL;
  }
  return(strdup(buffer));
}
add(TREE ** tree, char * str){
  int res;
  if(*tree==NULL){
    *tree=(TREE*)malloc(sizeof(TREE));
    (*tree)->name=str;
    (*tree)->hindo=1;
    (*tree)->left=NULL;
    (*tree)->right=NULL;
  }else{
    res=strcmp(str,(*tree)->name);
    if(res==0){
      (*tree)->hindo++;
    }else if(res<0){
      add(&((*tree)->left),str);
    }else{
      add(&((*tree)->right),str);
    }
  }
}
addbyhindo(TREE **t, TREE *s){
  if(*t==NULL){
    *t=s;
    (*t)->left=NULL;
    (*t)->right=NULL;
  }else if(s->hindo > (*t)->hindo){
    addbyhindo(&((*t)->left),s);
  }else if(s->hindo == (*t)->hindo){
    if(strcmp(s->name,(*t)->name)<0){
      addbyhindo(&((*t)->left),s);
    }else{
      addbyhindo(&((*t)->right),s);
    }
  }else{
    addbyhindo(&((*t)->right),s);
  }
}
sortbyhindo(TREE * s, TREE **t){
  if(s!=NULL){
    sortbyhindo(s->left,t);
    sortbyhindo(s->right,t);
    addbyhindo(t,s);
  }
}
show(TREE *t){
  if(t!=NULL){
    show(t->left);
    printf("%s: %d\n",t->name,t->hindo);
    show(t->right);
  }
}
main(){
  TREE *t1=NULL, *t2=NULL;
  char *func;
  while((func=getfunc())!=NULL){
    if(!isyoyakugo(func)){
      add(&t1,func);
    }
  }
  sortbyhindo(t1,&t2);
  show(t2);
}


ーーーーーーーーーーーーーー


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:以前、関数についての質問を出しましたが・・ 19323 あかま 2005/01/19 03:46:59
<子記事> Re:以前、関数についての質問を出しましたが・・ 19333 monkey 2005/01/19 11:18:19
<子記事> Re:以前、関数についての質問を出しましたが・・ 19336 monkey 2005/01/19 14:23:00


No.19323

Re:以前、関数についての質問を出しましたが・・
投稿者---あかま(2005/01/19 03:46:59)


>その後、先生から回答を貰いました。
>解決版のソースを載せてみては?
>と、言われたので、先生のをそのまま載せます。
>著作権に脅えつつ・・。
>このプログラムはみなさんはどう思われますか??
>ーーーーーーーーーーーーー
ログの記事No.19018のやつですね。待ってました。
まぁ、想像通りというかなんというか、'('が来る直前の文字列を関数名とみなしてるわけですね。
これだと関数名にアンダーバーが使えないとつっこんでみる。
2分木で2分探索しているところにこだわりが見えます。

ちょっとインデントがずれてるので直したのはっときます。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct tr {
  char * name;
  int hindo;
  struct tr *left, *right;
} TREE;

typedef enum { sentou, eisuuzi, kuuhaku, end} KANSU;
int isyoyakugo(char *str){
  char *yoyakugo[]={"if","while","switch","for",NULL};
  char **p=yoyakugo;
  for(p=yoyakugo;*p!=NULL;p++){
    if(strcmp(str,*p)==0){
      break;
    }
  }
  return *p!=NULL;
}
char* getfunc(){
  char buffer[256];
  int index=0;
  char c;
  KANSU status;
  status = sentou;
  while((status!=end)&&((c=getchar())!=EOF)){
    if(index>=256){
      fprintf(stderr,"名前が長過ぎます\n");
      exit(1);
    }
    switch(status){
      case sentou:
        if(isalpha(c)){
          index=0;
          buffer[index++]=c;
          status=eisuuzi;
        }
        break;
      case eisuuzi:
        if(c=='('){
          buffer[index]='\0';
          status=end;
        }else if(isalnum(c)){
          buffer[index++]=c;
        }else if(isspace(c)){
          status=kuuhaku;
        }else{
          status=sentou;
        }
        break;
      case kuuhaku:
        if(c=='('){
          buffer[index]='\0';
          status=end;
        }else if(isalpha(c)){
          index=0;
          buffer[index++]=c;
          status=eisuuzi;
        }else if(!isspace(c)){
          status=sentou;
        }
        break;
    }
  }
  if(c==EOF){
    return NULL;
  }
  return(strdup(buffer));
}
add(TREE ** tree, char * str){
  int res;
  if(*tree==NULL){
    *tree=(TREE*)malloc(sizeof(TREE));
    (*tree)->name=str;
    (*tree)->hindo=1;
    (*tree)->left=NULL;
    (*tree)->right=NULL;
  }else{
    res=strcmp(str,(*tree)->name);
    if(res==0){
      (*tree)->hindo++;
    }else if(res<0){
      add(&((*tree)->left),str);
    }else{
      add(&((*tree)->right),str);
    }
  }
}
addbyhindo(TREE **t, TREE *s){
  if(*t==NULL){
    *t=s;
    (*t)->left=NULL;
    (*t)->right=NULL;
  }else if(s->hindo > (*t)->hindo){
    addbyhindo(&((*t)->left),s);
  }else if(s->hindo == (*t)->hindo){
    if(strcmp(s->name,(*t)->name)<0){
      addbyhindo(&((*t)->left),s);
    }else{
      addbyhindo(&((*t)->right),s);
    }
  }else{
    addbyhindo(&((*t)->right),s);
  }
}
sortbyhindo(TREE * s, TREE **t){
  if(s!=NULL){
    sortbyhindo(s->left,t);
    sortbyhindo(s->right,t);
    addbyhindo(t,s);
  }
}
show(TREE *t){
  if(t!=NULL){
    show(t->left);
    printf("%s: %d\n",t->name,t->hindo);
    show(t->right);
  }
}
main(){
  TREE *t1=NULL, *t2=NULL;
  char *func;
  while((func=getfunc())!=NULL){
    if(!isyoyakugo(func)){
      add(&t1,func);
    }
  }
  sortbyhindo(t1,&t2);
  show(t2);
}




この投稿にコメントする

削除パスワード

No.19333

Re:以前、関数についての質問を出しましたが・・
投稿者---monkey(2005/01/19 11:18:19)


プログラム中、"malloc"で確保したメモリが解放されていないように見えるのは気のせいでしょうか。

>著作権に脅えつつ・・。

"引用"に該当すると思われますので、著作権侵害にはならないと思います。


この投稿にコメントする

削除パスワード

No.19334

Re:以前、関数についての質問を出しましたが・・
投稿者---シャノン(2005/01/19 13:22:19)


>プログラム中、"malloc"で確保したメモリが解放されていないように見えるのは気のせいでしょうか。

strdup(in getfunc)も解放して無いのは気のせいですよね、先生。


この投稿にコメントする

削除パスワード

No.19336

Re:以前、関数についての質問を出しましたが・・
投稿者---monkey(2005/01/19 14:23:00)


> 先生のをそのまま載せます。

さきほどはついコメントしてしまいましたが、先生ご自身が意見を求めているわけではないので、さきほどのコードについてはこれ以上は何も申し上げません。
あなたの先生なのですから、あなたから先生に意見を述べるなり質問するなりしてください。

肝心なのは、あなたがどのように解決したかです。
あなたが書いたコードについて、あなた自身が意見を求めるのであれば、また考えます。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧