OKWAVEのAI「あい」が美容・健康の悩みに最適な回答をご提案!
-PR-
解決
済み

辞書検索プログラムの続きです。

  • すぐに回答を!
  • 質問No.109206
  • 閲覧数87
  • ありがとう数1
  • 気になる数0
  • 回答数5
  • コメント数0

お礼率 16% (1/6)

void read_dic()
{
char eng2[20], jp2[40];
FILE *fp;
int i=0;

if((fp=fopen("dic.txt", "r"))==NULL) {
printf("\n ファイルがありません\n");
exit(1);
} else {
printf("読み込み中...\n");
while (!feof(fp)) {
fscanf(fp, "%s %s", eng2, jp2);
strcpy(table[i].eng, eng2);
strcpy(table[i].jp, jp2);
i++;
if(i>=100){
printf("辞書のテーブルがいっぱいです\n");
fclose(fp);
exit(1);
}
}
fclose(fp);
printf("読み込み終了\n");
n = i;
}
}



int hash(char *tango)
{
int h=0,p=256;
while (*tango!='\0')
{
h = h*p + *tango;
h = h%BUCKET_SIZE;
tango++;
}
return(h);
}

struct cell *find(char *tango)
{
int a;
struct cell *q;
a=hash(tango);
if(bucket[a].chain==NULL)
return NULL;
else{
q=bucket[a].chain;
while ((strcmp(q->eng,tango))!=0){
if(q->next==NULL)
return NULL;
else
q=q->next;
}
return q;
}
}

以前の投稿は
http://oshiete1.goo.ne.jp/kotaeru.php3?qid=109202
通報する
  • 回答数5
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

質問者が選んだベストアンサー

  • 回答No.5
レベル5

ベストアンサー率 80% (4/5)

まだ抜けていました。

ハッシュテーブルを検索するときに table[x]->next が NULL なのかどうなのかを
チェックしますので、テーブルを作成するときまたは初期化するときに、この next
を NULL にしておかなければうまく動かない可能性があります。
実行環境によっては明示的に初期化しなくても NULL になっている場合もあります
が、他人任せにしておくのはよくありません。

read_dic()関数内の読み込みのところで

  strcpy(table[i].eng, eng2);
  strcpy(table[i].jp, jp2);

とやっているところがあるので、この直後に次の行を追加して下さい。

  table[i].next = NULL;

ついでに補足すると、init_table()が呼び出されていませんので、read_dic() を呼び
出す前ぐらいに init_table() も呼び出してあげましょう。
-PR-
-PR-

その他の回答 (全4件)

  • 回答No.1
レベル13

ベストアンサー率 24% (357/1463)

全体を見たわけではないので自信なしとしておきますが、 struct cell *find(char *tango); と宣言されているのに、その戻り値 p= find(tango) を table[p].jp と配列の引数にしているのは変ですね。 p->jp のおつもりなのでは。
全体を見たわけではないので自信なしとしておきますが、
struct cell *find(char *tango);
と宣言されているのに、その戻り値
p= find(tango)

table[p].jp
と配列の引数にしているのは変ですね。
p->jp
のおつもりなのでは。


  • 回答No.2
レベル9

ベストアンサー率 46% (30/65)

まず「実行できません。」では具体的にどういう症状なのか全くわかりません。 command not found なのですか?たぶん違いますよね。詳しく書きましょう。 またmain()で使用しているread_dic()関数とfind()関数が記載されていないので、その信憑性も不明です。(「まだ続きます。。。」に続くのかな?) 失礼ですが学生さんでしょうか?まず有効な回答が期待できそうな質問の仕方を精進し ...続きを読む
まず「実行できません。」では具体的にどういう症状なのか全くわかりません。
command not found なのですか?たぶん違いますよね。詳しく書きましょう。
またmain()で使用しているread_dic()関数とfind()関数が記載されていないので、その信憑性も不明です。(「まだ続きます。。。」に続くのかな?)
失礼ですが学生さんでしょうか?まず有効な回答が期待できそうな質問の仕方を精進して下さい。そうすることで自分の頭の中が整理できて自己解決できることも多いです。プログラミングってやつは。
それから人にソースを見てもらうならインデント付けくらいは何とかしましょう。
以上、苦言を並べてしまいましたが、あなたの成長を願ってあえて辛辣に書かせて頂きましたのでご理解ください。
お礼コメント
ya-co

お礼率 16% (1/6)

アドバイスありがとうございました。初めて質問したので質問の仕方がわからなくてお粗末な質問内容になってしまいました。それについてのアドバイスもありがとうございました。明日早速学校でプログラムを修正してみようと思います。
投稿日時 - 2001-07-27 19:18:01
  • 回答No.3
レベル9

ベストアンサー率 46% (30/65)

自己フォロー。 >またmain()で使用しているread_dic()関数とfind()関数が記載されていないの >で、その信憑性も不明です。(「まだ続きます。。。」に続くのかな?) この部分については次の質問に書かれていましたね。失礼しました。m(_ _)m
自己フォロー。
>またmain()で使用しているread_dic()関数とfind()関数が記載されていないの
>で、その信憑性も不明です。(「まだ続きます。。。」に続くのかな?)
この部分については次の質問に書かれていましたね。失礼しました。m(_ _)m
  • 回答No.4
レベル5

ベストアンサー率 80% (4/5)

ranxさんがすでに指摘されている点は、少なくとも修正が必要です。 それに加えて、ハッシュテーブル bucket[] を作成する処理が全く抜けています ので今のままでは「白紙の辞書」を見て検索しているに過ぎません。 ハッシュテーブル作成処理   例えば、こんな感じの関数を作って read_dic() の後で hash_table() を   呼び出します。   void hash_tabl ...続きを読む
ranxさんがすでに指摘されている点は、少なくとも修正が必要です。
それに加えて、ハッシュテーブル bucket[] を作成する処理が全く抜けています
ので今のままでは「白紙の辞書」を見て検索しているに過ぎません。

ハッシュテーブル作成処理
  例えば、こんな感じの関数を作って read_dic() の後で hash_table() を
  呼び出します。
  void hash_table()
  {
    int i, h;
    struct cell **p
    
    for( i=0; i<BUCKET_SIZE; i++ )
      bucket[i].cell = NULL;
    
    for( i=0; i<n; i++ ){
      h = hash( table[i].eng );
      p = &(bucket[h].cell);
      while( *p != NULL )
        p = &(*p->next);
      *p = &(table[i]);
    }
  }

(上記のソースには全角の空白文字が使われています。全角を半角に変換して
 使って下さい)
このQ&Aで解決しましたか?
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


いま みんなが気になるQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ