辞書の検索機能でできないところがあります。

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

辞書の検索機能でできないところがあります。

#1

投稿記事 by 黄瀬涼太 » 13年前

今、辞書の検索機能を作っているんですが
その検索の際に例えば
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日以内には解決したいです。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: 辞書の検索機能でできないところがあります。

#2

投稿記事 by h2so5 » 13年前

疑問点があります。

1. mallocしている理由は何でしょうか?
2. k を入力した時に koria は出力されないのでしょうか?

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

Re: 辞書の検索機能でできないところがあります。

#3

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

codeタグを直しておきました。プレビューで必ず確認してからお使い下さい。
それと締め切り(できれば2日以内には解決したいです)があるということは課題でしょうか?

気になること。
・比較する文字数は可変ですか?
・出力するとありますが何処へですか?
・出力する部分も含めて書かれていないので関数の入出力も考える必要があるということですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

黄瀬涼太

Re: 辞書の検索機能でできないところがあります。

#4

投稿記事 by 黄瀬涼太 » 13年前

出力とは書いてないです。

比較する文字は可変です。
追加機能があるのでそれで追加してその追加した中から
検索できるようにします。


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

Re: 辞書の検索機能でできないところがあります。

#6

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

失礼、出力ではなく表示ですね。
では、表示とはprintfなどの事でしょうか?
もしprintfだとして、printfは検索する関数に中に書くのですか?
それとも別の関数から検索させて、呼び出し元の関数に見つけた単語を返した上で呼び出し元の関数がprintfするのでしょうか?
黄瀬涼太さんが決めることなのでお願いします。
黄瀬涼太 さんが書きました:追加機能があるのでそれで追加してその追加した中から
検索できるようにします。
それは今回の質問と関係ない気がしますが、追加も含めてなのか追加だけなのかが気になる内容です。

【補足】
フォーラムルールを読んでいただくと分かると思いますが当掲示板では課題の丸投げは禁止させて頂いています。
http://dixq.net/board/board.html
こちらではお手伝いさせていただく形になりますので、方向性を決定してコードを書くのは黄瀬涼太さんの作業となります。

【追記】
h2so5さんの質問にもお応え下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

nil
記事: 428
登録日時: 14年前

Re: 辞書の検索機能でできないところがあります。

#7

投稿記事 by nil » 13年前

一見してWord構造体は
文字列を要素に持つ双方向リストの要素のようですが、
ソートは別の関数で行なっているのですね?
あと、現状のコードでは無限ループにハマっているような気がします。

質問とは関係ないですが、
黄瀬涼太はマンガのキャラ名という固有名詞なので、ここのような掲示板でHNとして使われるのは避けたほうが良いかと思います。

黄瀬涼太

Re: 辞書の検索機能でできないところがあります。

#8

投稿記事 by 黄瀬涼太 » 13年前

printfのことです。
それを検索する関数の中に書こうと思ってます。

現状のプログラムでは入力した単語と完全に一致した
場合は表示できます。

丸投げがダメなのはわかってるのでアドバイスを頂けたらと思ってます。

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

Re: 辞書の検索機能でできないところがあります。

#9

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

私のだけに答えず他の人の回答に答えて下さい。h2so5さんや 涼雅さんのとか放置しておくと完成しませんよ。
ヒントとしては、指定文字数の先頭からの一致なら文字列長を指定できるstrncmpが使えます。文字列長はstrlenで分かりますよね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

黄瀬涼太

Re: 辞書の検索機能でできないところがあります。

#10

投稿記事 by 黄瀬涼太 » 13年前

例で出した表示のところはkoriaも表示します。
単純にうち忘れました。
mallocはよくわからないですが課題に指定されてたので使ってます。
構造体の作成に必要みたいです。

はい、ソートは他の関数でやってます。
一応ちゃんと実行できたので無限ループにははまってないと思います。

ゆうたろう

Re: 辞書の検索機能でできないところがあります。

#11

投稿記事 by ゆうたろう » 13年前

こんなかんじですかね
コンパイルしてないし適当ですが

#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;
}

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

Re: 辞書の検索機能でできないところがあります。

#12

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

ゆうたろう さんが書きました:こんなかんじですかね
コンパイルしてないし適当ですが

コード:

#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
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

nil
記事: 428
登録日時: 14年前

Re: 辞書の検索機能でできないところがあります。

#13

投稿記事 by nil » 13年前

mallocは双方向リストへの要素の追加程度しか使う場面はないように思われます。

kと入力すると…………
と書いてありますが、
これは一文字限定なのでしょうか?
それとも複数文字の場合もあるのでしょうか。

複数文字もある、として話を進めさせていただくと、
指定文字数が一致しているかどうかの判定はsoftyaさんの仰っている通りstrncmpとstrcmpを使えばいいわけです。

入力された文字列をinput,
判定される側の文字列をstrとすると、

コード:

if( strncmp( input, str, strlen( input ) ) == 0 ){~~~}
こうすればinputとstrの先頭が一致しているかを知ることができます。
あとはこれを辞書に登録されている文字列たちに対して調べればいいわけです。
とくに、今回はソートされているとのことなので、判定の回数は(N)よりも少なくすることも工夫次第で可能です。

黄瀬涼太

Re: 辞書の検索機能でできないところがあります。

#14

投稿記事 by 黄瀬涼太 » 13年前

まだ実行してないですけどだいたい分かってきました。

涼雅さんのでまたやってみます。
それでできなかったたらまたアドバイス貰いにきます。


ありがとうございました。

黄瀬涼太

Re: 辞書の検索機能でできないところがあります。

#15

投稿記事 by 黄瀬涼太 » 13年前

解決しました。
ありがとうございました。

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

Re: 辞書の検索機能でできないところがあります。

#16

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

黄瀬涼太 さんが書きました:解決しました。
ありがとうございました。
フォーラムルールにありますが、解決したコードを投稿して頂くようにお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ゆうたろう

Re: 辞書の検索機能でできないところがあります。

#17

投稿記事 by ゆうたろう » 13年前

>直接的な答えを書くのは原則的にはフォーラムルール違反に当たりますので
そんなことフォームルールには書いてませんけど^^;
適当なこと言わないでくださいね

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

Re: 辞書の検索機能でできないところがあります。

#18

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

ゆうたろう さんが書きました:>直接的な答えを書くのは原則的にはフォーラムルール違反に当たりますので
そんなことフォームルールには書いてませんけど^^;
適当なこと言わないでくださいね
ご理解いただけていないようですので引用します。
http://dixq.net/board/board.html
課題の丸投げ(問題文だけ書く事)は禁止です。
ただし上のように記載してもらえればこれは当てはまりません。
自分でどこまでやったのか、今どこが解らないのかを明確にして下さい。
さっぱり解らず、手も足も出ない時は、その事を明記の上、
勉強方法からアドバイスを受けましょう。
どうしても提出期限の関係で答えが欲しい時はその事をしっかり明記の上、
回答者さん達の理解を求めるようにしましょう。
この様にフォームルールには「どうしても提出期限の関係で答えが欲しい時はその事をしっかり明記の上、回答者さん達の理解を求めるようにしましょう。」とあります。
つまり、原則として勉強方法のアドバイスをする前提に立っているわけです。
また、丸投げ禁止と言うルールである理由は理解してプログラムを書いて欲しいという趣旨がありますので、そのまま写して終わりという回答はふさわしくなと思うのですが如何でしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

閉鎖

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