ページ 1 / 1
辞書の検索機能でできないところがあります。
Posted: 2012年12月05日(水) 17:31
by 黄瀬涼太
今、辞書の検索機能を作っているんですが
その検索の際に例えば
keep
apple
basketball
mix
kill
koria
という単語が登録されている場合
kと入力すると
keep
kill
と表示されるようにしたいのですがどのようにすればできますか?
コード:
Word *search(char key[], Word *head){
Word *p;
p=(Word*)malloc(sizeof(Word));
p=head;
while(p!=NULL){
if(strcmp(p->id, key)==0){
return p;
}
else if(strcmp(p->id, key)>0){
p=p->left;
}
else{
p=p->right;
}
}
return NULL;
}
できれば2日以内には解決したいです。
Re: 辞書の検索機能でできないところがあります。
Posted: 2012年12月05日(水) 17:44
by h2so5
疑問点があります。
1. mallocしている理由は何でしょうか?
2. k を入力した時に koria は出力されないのでしょうか?
Re: 辞書の検索機能でできないところがあります。
Posted: 2012年12月05日(水) 17:51
by softya(ソフト屋)
codeタグを直しておきました。プレビューで必ず確認してからお使い下さい。
それと締め切り(できれば2日以内には解決したいです)があるということは課題でしょうか?
気になること。
・比較する文字数は可変ですか?
・出力するとありますが何処へですか?
・出力する部分も含めて書かれていないので関数の入出力も考える必要があるということですか?
Re: 辞書の検索機能でできないところがあります。
Posted: 2012年12月05日(水) 17:55
by 黄瀬涼太
出力とは書いてないです。
比較する文字は可変です。
追加機能があるのでそれで追加してその追加した中から
検索できるようにします。
Re: 辞書の検索機能でできないところがあります。
Posted: 2012年12月05日(水) 17:57
by 黄瀬涼太
課題です。
Re: 辞書の検索機能でできないところがあります。
Posted: 2012年12月05日(水) 18:01
by softya(ソフト屋)
失礼、出力ではなく表示ですね。
では、表示とはprintfなどの事でしょうか?
もしprintfだとして、printfは検索する関数に中に書くのですか?
それとも別の関数から検索させて、呼び出し元の関数に見つけた単語を返した上で呼び出し元の関数がprintfするのでしょうか?
黄瀬涼太さんが決めることなのでお願いします。
黄瀬涼太 さんが書きました:追加機能があるのでそれで追加してその追加した中から
検索できるようにします。
それは今回の質問と関係ない気がしますが、追加も含めてなのか追加だけなのかが気になる内容です。
【補足】
フォーラムルールを読んでいただくと分かると思いますが当掲示板では課題の丸投げは禁止させて頂いています。
http://dixq.net/board/board.html
こちらではお手伝いさせていただく形になりますので、方向性を決定してコードを書くのは黄瀬涼太さんの作業となります。
【追記】
h2so5さんの質問にもお応え下さい。
Re: 辞書の検索機能でできないところがあります。
Posted: 2012年12月05日(水) 18:30
by nil
一見してWord構造体は
文字列を要素に持つ双方向リストの要素のようですが、
ソートは別の関数で行なっているのですね?
あと、現状のコードでは無限ループにハマっているような気がします。
質問とは関係ないですが、
黄瀬涼太はマンガのキャラ名という固有名詞なので、ここのような掲示板でHNとして使われるのは避けたほうが良いかと思います。
Re: 辞書の検索機能でできないところがあります。
Posted: 2012年12月05日(水) 21:29
by 黄瀬涼太
printfのことです。
それを検索する関数の中に書こうと思ってます。
現状のプログラムでは入力した単語と完全に一致した
場合は表示できます。
丸投げがダメなのはわかってるのでアドバイスを頂けたらと思ってます。
Re: 辞書の検索機能でできないところがあります。
Posted: 2012年12月05日(水) 21:44
by softya(ソフト屋)
私のだけに答えず他の人の回答に答えて下さい。h2so5さんや 涼雅さんのとか放置しておくと完成しませんよ。
ヒントとしては、指定文字数の先頭からの一致なら文字列長を指定できるstrncmpが使えます。文字列長はstrlenで分かりますよね。
Re: 辞書の検索機能でできないところがあります。
Posted: 2012年12月05日(水) 21:52
by 黄瀬涼太
例で出した表示のところはkoriaも表示します。
単純にうち忘れました。
mallocはよくわからないですが課題に指定されてたので使ってます。
構造体の作成に必要みたいです。
はい、ソートは他の関数でやってます。
一応ちゃんと実行できたので無限ループにははまってないと思います。
Re: 辞書の検索機能でできないところがあります。
Posted: 2012年12月05日(水) 22:36
by ゆうたろう
こんなかんじですかね
コンパイルしてないし適当ですが
#include <string.h>
#include <stdio.h>
int main(void)
{
char str[6][7] = {
"keep", "apple", "basketball", "mix", "kill", "koria"
};
int c;
printf("検索文字を入力してください。");
c = getchar();
for (i = 0; i < 6; i++) {
p = strchr(str, c);
if (p != NULL) {
printf("%cは文字列の%d番目にあります。\n", c, p-str);
printf("以降の文字列は%sです。\n", p);
}
else{
printf("%cは見つかりませんでした\n", c);}}
return 0;
}
Re: 辞書の検索機能でできないところがあります。
Posted: 2012年12月05日(水) 22:42
by softya(ソフト屋)
ゆうたろう さんが書きました:こんなかんじですかね
コンパイルしてないし適当ですが
コード:
#include <string.h>
#include <stdio.h>
int main(void)
{
char str[6][7] = {
"keep", "apple", "basketball", "mix", "kill", "koria"
};
int c;
printf("検索文字を入力してください。");
c = getchar();
for (i = 0; i < 6; i++) {
p = strchr(str, c);
if (p != NULL) {
printf("%cは文字列の%d番目にあります。\n", c, p-str);
printf("以降の文字列は%sです。\n", p);
}
else{
printf("%cは見つかりませんでした\n", c);}}
return 0;
}
codeタグを↑反映しました。
ゆうたろうさん、書くのは多分3か4度めだと思いますがcodeタグをお使い下さい。
それとちゃんと質問の内容を読んで頂きたい(回答例が的はずれです)のと直接的な答えを書くのは原則的にはフォーラムルール違反に当たりますので、フォーラムルールをお読みいただきたいと思います。
http://dixq.net/board/board.html
Re: 辞書の検索機能でできないところがあります。
Posted: 2012年12月05日(水) 22:57
by nil
mallocは双方向リストへの要素の追加程度しか使う場面はないように思われます。
kと入力すると…………
と書いてありますが、
これは一文字限定なのでしょうか?
それとも複数文字の場合もあるのでしょうか。
複数文字もある、として話を進めさせていただくと、
指定文字数が一致しているかどうかの判定はsoftyaさんの仰っている通りstrncmpとstrcmpを使えばいいわけです。
入力された文字列をinput,
判定される側の文字列をstrとすると、
コード:
if( strncmp( input, str, strlen( input ) ) == 0 ){~~~}
こうすればinputとstrの先頭が一致しているかを知ることができます。
あとはこれを辞書に登録されている文字列たちに対して調べればいいわけです。
とくに、今回はソートされているとのことなので、判定の回数は(N)よりも少なくすることも工夫次第で可能です。
Re: 辞書の検索機能でできないところがあります。
Posted: 2012年12月06日(木) 09:34
by 黄瀬涼太
まだ実行してないですけどだいたい分かってきました。
涼雅さんのでまたやってみます。
それでできなかったたらまたアドバイス貰いにきます。
ありがとうございました。
Re: 辞書の検索機能でできないところがあります。
Posted: 2012年12月08日(土) 23:30
by 黄瀬涼太
解決しました。
ありがとうございました。
Re: 辞書の検索機能でできないところがあります。
Posted: 2012年12月08日(土) 23:38
by softya(ソフト屋)
黄瀬涼太 さんが書きました:解決しました。
ありがとうございました。
フォーラムルールにありますが、解決したコードを投稿して頂くようにお願いします。
Re: 辞書の検索機能でできないところがあります。
Posted: 2012年12月11日(火) 15:22
by ゆうたろう
>直接的な答えを書くのは原則的にはフォーラムルール違反に当たりますので
そんなことフォームルールには書いてませんけど^^;
適当なこと言わないでくださいね
Re: 辞書の検索機能でできないところがあります。
Posted: 2012年12月11日(火) 15:36
by softya(ソフト屋)
ゆうたろう さんが書きました:>直接的な答えを書くのは原則的にはフォーラムルール違反に当たりますので
そんなことフォームルールには書いてませんけど^^;
適当なこと言わないでくださいね
ご理解いただけていないようですので引用します。
http://dixq.net/board/board.html
課題の丸投げ(問題文だけ書く事)は禁止です。
ただし上のように記載してもらえればこれは当てはまりません。
自分でどこまでやったのか、今どこが解らないのかを明確にして下さい。
さっぱり解らず、手も足も出ない時は、その事を明記の上、
勉強方法からアドバイスを受けましょう。
どうしても提出期限の関係で答えが欲しい時はその事をしっかり明記の上、
回答者さん達の理解を求めるようにしましょう。
この様にフォームルールには「どうしても提出期限の関係で答えが欲しい時はその事をしっかり明記の上、回答者さん達の理解を求めるようにしましょう。」とあります。
つまり、原則として勉強方法のアドバイスをする前提に立っているわけです。
また、丸投げ禁止と言うルールである理由は理解してプログラムを書いて欲しいという趣旨がありますので、そのまま写して終わりという回答はふさわしくなと思うのですが如何でしょうか?