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

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

 詳しくはこちら



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

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


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

No.18980

Re:関数について
投稿者---とおり(2005/01/03 15:46:49)


>英単語だけなら出現頻度順に並べなおすことは出来るのですが、ソースの中から関数を見分ける方法がどうしても分かりません。

英単語の場合は、どこからどこまでをどのように1つの「英単語」だと認識したのでしょうか?
同じように関数もどこからどこまでが1つの「関数」なのかを認識しなくてはなりません。
正確に行うためには、C言語での「関数定義の仕様」を調べる必要があるでしょうが、
とりあえずは、自分が関数を書く(これから自分でプログラムを書くのだから、関数は書けますよね?)
際に、どういう風に書くと関数が書けるかを考えてみれば簡単では?
まず日本語でどうすべきか考えられなければ、プログラムには出来ません。

# というか、あなたの質問の仕方は丸投げと取られてしまいますよ?
# 少しは自分の考えを示さないと。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:関数について 18982 あかま 2005/01/03 17:15:39


No.18982

Re:関数について
投稿者---あかま(2005/01/03 17:15:39)


cソースファイルから関数を見つけるってのはかなり難しいですね。
まともに作るとパーサもどきができちゃう気がします。

とおりさんの言うとおり、
>同じように関数もどこからどこまでが1つの「関数」なのかを認識しなくてはなりません。
というのを決定するところからはじめる必要があります。
なので、この課題がどこまで妥協していい問題かが重要です(笑)

適当に、'単語+()'を関数として表示するプログラムを作ってみました。

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

char *getfunc(char *line){
    char *st,*end,*buf,c;
    
    //'('と')'を探す
    st = strchr(line,'(');
    if(st == NULL) return NULL;
    buf = getfunc(st+1);
    
    if(buf == NULL) end = strchr(st+1,')');
    else end = strchr(buf,')');
    if(end == NULL) return NULL;
    
    //'()'が見つかったならその直前の単語を関数名とみなす
    for(st--;st > line && isspace(*st);st--)//空白飛ばし
        ;
    for(st--;st >= line && isgraph(*st);st--)//単語探し
        ;
    
    //出力
    st++;
    end++;
    c = *end;
    *end = '\0';
    printf("%s\n",st);
    *end = c;
    return end;
}
int main(){
    char line[256];
    while(fgets(line,256,stdin) != NULL){
        getfunc(line);
    }
    return 0;
}

実行結果:
このソースファイルをプログラムにかけると

*getfunc(char *line)
//'('と')
line,'(')
if(st == NULL)
getfunc(st+1)
strchr(st+1,')
if(buf == NULL) end = strchr(st+1,')')
strchr(buf,')
if(end == NULL)
//'()
isspace(*st)
for(st--;st > line && isspace(*st);st--)
isgraph(*st)
for(st--;st >= line && isgraph(*st);st--)
printf("%s\n",st)
main()
fgets(line,256,stdin)
while(fgets(line,256,stdin) != NULL)
getfunc(line)

と出力されます。
明らかに間違ってるやつ+ifやforなども出力されてますが、先に書いた妥協の結果ですw

とか書いてるうちに親記事消された。。。
問題自体はすごくいいものなんだけどな。



この投稿にコメントする

削除パスワード

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