ページ 11

ポインタを使った比較プログラム

Posted: 2009年5月30日(土) 12:23
by arex
ゲームに関係ないプログラムでもOKですかね?
ダメなら消します
今ポインタを使ったプログラムを勉強中です
解かなければならない問題があるのですがよく分からないので教えてください
問題は「キーボードより文字列aと文字列bを入力し、比較する(どちらが辞書並びで先かを表示する)
プログラムを作れ。但し、strcmp関数を用いてはならない」というものです
自分でも考えたのですがどうも分からないので助けてくださいお願いします

Re:ポインタを使った比較プログラム

Posted: 2009年5月30日(土) 12:37
by non
>ゲームに関係ないプログラムでもOKですかね?
もちろん、OKですよ。

ただし、丸投げ禁止ですので、わからないなりに作ってみて、そのうまく動かない
プログラムを添付するようにした方が、みなさんのレスがいいです。
回答例を示すのは簡単ですが、それでは勉強になりませんので。

例えば、strlenと同じ動作をするプログラムは作れますか?

Re:ポインタを使った比較プログラム

Posted: 2009年5月30日(土) 12:43
by arex
なるほど分かりました!
とりあえず一度作ってみますので少々お時間を・・・

え~とstrlenは確か文字数を数えるやつでしたっけ?
いまひとつうろ覚えなので・・・strlenを使わないやつは以前作ったことがあるような気がします
たぶん作ったと思いますが1年くらい前のことなのではっきりしないです
きっとあるはずなので探してみます

Re:ポインタを使った比較プログラム

Posted: 2009年5月30日(土) 13:24
by たかぎ
この問題は、簡単なようで結構難しいですよ。

ひとつめの難関は、いつも書くことですが、キーボードから直接入力するための標準的な方法がないことです。
環境を明確にすれば、ハードウェアを直接制御できるかもしれません。
あるいは、キーボードからの入力というのは、実は標準入力のことではないでしょうか?

もうひとつは、「辞書並び」でという部分です。
strcmpを使ってはならないという記述が大きなヒントになっています。
strcmpは、文字列を単純比較する関数であって、辞書順に比較するものではありません。
辞書順の比較にはstrcollを使用します。しかし、strcollを使うためには、ロケールを適切に設定しなければなりません。ロケールについて詳しく調べてみてください。また、どんなロケールに設定すべきかも指定されていませんが、どうするつもりでしょうか?

Re:ポインタを使った比較プログラム

Posted: 2009年5月30日(土) 14:35
by バグ
あとは、半角文字オンリーなのか、マルチバイト文字も込みなのかで変わってきそうに思いますね。

Re:ポインタを使った比較プログラム

Posted: 2009年5月30日(土) 15:23
by non
そりゃ、皆様方、深読み過ぎっだって。
標準入力の、半角オンリー、アスキー順だと私は、決め打ちです。

Re:ポインタを使った比較プログラム

Posted: 2009年5月30日(土) 15:38
by arex
皆様申し訳ございません説明不足でした
まず使用ツールはVisual Studio2008です
入力は普通に行える方法でよく半角のみとなります

Re:ポインタを使った比較プログラム

Posted: 2009年5月30日(土) 16:41
by たかぎ
> 入力は普通に行える方法でよく

それはDirectInputを使うという意味でしょうか?

> 半角のみとなります

半角に限定した場合でも、'a' と 'B' を辞書順に比較すれば、当然 'a' の方が先ですよね?
'à' や 'ä' はどうでしょうか?

Re:ポインタを使った比較プログラム

Posted: 2009年5月30日(土) 16:58
by arex
入力は単純にscanfなどで問題ないと思います
ここまでの勉強であまり複雑なことはしていないので多分単純に考えても大丈夫かと思います

辞書並びなので大文字小文字は関係ないと思います
なので'a''B'なら'a'が先だと認識されるはずです
特殊な表示のやつに関しては考慮しなくてよいと思われます

Re:ポインタを使った比較プログラム

Posted: 2009年5月30日(土) 17:12
by たかぎ
> 入力は単純にscanfなどで問題ないと思います

では、キーボードから入力するのではなく、標準入力を使うわけですね?

> 辞書並びなので大文字小文字は関係ないと思います
> なので'a''B'なら'a'が先だと認識されるはずです

では、'a' と 'A' ではどちらが先でしょうか? あるいは全く区別しなくてもよいのでしょうか?
また、空白文字、句読点等の記号、制御文字の順序はどうなりますか?

> 特殊な表示のやつに関しては考慮しなくてよいと思われます

何をもって「特殊」とするのでしょうか?
基本実行文字集合以外という意味であれば、'@' や '$' や '`' も特殊になりますが、そういうことでしょうか?
当然半角カナは「特殊」扱いですよね?

Re:ポインタを使った比較プログラム

Posted: 2009年5月30日(土) 17:34
by non
>辞書並びなので大文字小文字は関係ないと思います
>なので'a''B'なら'a'が先だと認識されるはずです

あちゃ~(^^;)

Re:ポインタを使った比較プログラム

Posted: 2009年5月30日(土) 17:48
by box
> そりゃ、皆様方、深読み過ぎっだって。

それはそうだとは思いましたが、

> 標準入力の、半角オンリー、アスキー順だと私は、決め打ちです。

辞書順という大前提のもとでアスキー順と決めうちしたのは
少しまずかったのかもしれません。

Re:ポインタを使った比較プログラム

Posted: 2009年5月30日(土) 18:01
by たかぎ
> > そりゃ、皆様方、深読み過ぎっだって。
> それはそうだとは思いましたが、

そうなのですが、決めつけは危険です。
「キーボードから」と書かれているのに「標準入力」だと考えるのは飛躍し過ぎですし、「辞書順」と書かれているのに「アスキー順」というのも飛躍し過ぎです。

結果的に、標準入力、多バイト文字非考慮、単純比較だったとしても、質問者さん自身がそう明示しない限りは未確定事項として扱うべきです。

Re:ポインタを使った比較プログラム

Posted: 2009年5月31日(日) 01:12
by arex
説明不足なために皆様長々と考えさせてしまい申し訳ございません

入力はあくまで「キーボードから」となっているので
プログラム実行させてから入力することになってます

辞書並びなので'a'と'A'の場合は2番目の文字に依存することになります
例えば'at'と'AB'なら'AB'が先にくるようになります

申し訳ありません特殊というのは言い方が悪かったですね
空白や句読点、'@'や'$'などは考慮する必要はないみたいです
あくまで文字列というか単語の比較なので基本の半角英字のみを考えればよいようです
なので'hello'と'thanks'と入力した場合、出力は「1番目はhello、2番目はthanks」
というようになれば良いみたいです

Re:ポインタを使った比較プログラム

Posted: 2009年5月31日(日) 01:38
by たかぎ
> 入力はあくまで「キーボードから」となっているので

だとすると、scanfでは役不足です。

> 辞書並びなので'a'と'A'の場合は2番目の文字に依存することになります
> 例えば'at'と'AB'なら'AB'が先にくるようになります

要するに、'a' と 'A' は同じと見なせばよい訳ですね。
"Abc" と "aBC" は同じ順序と考えてよいのですね。

> 空白や句読点、'@'や'$'などは考慮する必要はないみたいです

「考慮する必要はない」とは?
それらの文字が決して入力されることがない専用キーボードを使うということでしょうか?

Re:ポインタを使った比較プログラム

Posted: 2009年5月31日(日) 03:06
by arex
'Abc'は'aBC'順序的には同じと考えてしまって構いません
空白などを考慮する必要がないと言ったのは普通の文字列(単語)には使用されないと考えたからです
作ってはいけないわけではないのでそれらがあったほうが楽に作れるならそれでもいいと思います

Re:ポインタを使った比較プログラム

Posted: 2009年5月31日(日) 12:21
by non
学校の課題でしょ?
まだ、ポインタを習ったばっかりぐらいで・・・

先生はキーボードから読み込みと説明したかもしれませんが、標準入力と
いっても学生がわからないから、キーボードと説明しただけではないのですか?
標準入力について説明を受けたことはありますか?

辞書順は、まあ、それでもいいけど、これもアスキーコード順というのを説明するのに
わかりやくつい間違って言ったってことはないのですかね。
こっちの方は、A-Zの範囲だけでいいというのなら、全部大文字に変換して比較すれば
いいので、それはそれでいいのですが。

Re:ポインタを使った比較プログラム

Posted: 2009年5月31日(日) 13:43
by arex
おっしゃるとおり学校の課題です
ポインタを習ったばかりなので分かりやすく言っただけかもしれません
本来こういった場で質問すべきではないのでしょうが分からなかったもので・・・
提出が木曜日なのでそれまでになんとかしなければならないし・・・
つい他の皆様を頼ってしまいましたすいません
ここが課題等の質問禁止なら即刻消しますのでご了承ください

Re:ポインタを使った比較プログラム

Posted: 2009年5月31日(日) 15:29
by non
>ここが課題等の質問禁止なら即刻消しますのでご了承ください

課題の質問は禁止されておりません。丸投げが禁止されているだけです。
したがって、arexさんができるところまで作ってプログラムを載せるのを皆さん
待っているところです。その間に、問題を正確に把握しようと皆さんはしているわけです。
arexさん自体が問題の内容を正確に把握できていないのなら、課題を仕上げることは
できませんよ。
入力は、scanfで行うということで、まず間違いはないと思いますが、
本当に辞書順で間違いないのかは先生に確認した方が(または課題のペーパーが
あるならその原文を確認)したほうが無駄がないと思います。

Re:ポインタを使った比較プログラム

Posted: 2009年5月31日(日) 17:06
by arex
プログラムは現在作っている最中です
質問しているのに長々とお待たせしてしまい本当に申し訳ありません

課題の紙は手元にありますが一番最初に書き込んだ問題文しか書いてありません
なので辞書順か本当はアスキーコード順なのかは判然としてない状況です

Re:ポインタを使った比較プログラム

Posted: 2009年5月31日(日) 18:24
by たかぎ
> なので辞書順か本当はアスキーコード順なのかは判然としてない状況です

分からない点があるのに、なぜ先生に質問しないのかがまったくの謎です。
最初から掲示板で尋ねれば誰かが答えてくれると、高をくくっていたのではないですか?

Re:ポインタを使った比較プログラム

Posted: 2009年5月31日(日) 20:41
by lbfuvab
課題の感じからすると、strcmp関数を自分で組ませたい様に感じますね。

まぁ、あくまで<u>感じ</u>ですが・・・

Re:ポインタを使った比較プログラム

Posted: 2009年6月01日(月) 15:23
by arex
え~と今のところ出来てるのはこんな感じです

#include <stdio.h>

int main(void){
char *A[100],*B[100];

printf("文字列A:");scanf("%s",A);
printf("文字列B:");scanf("%s",B);

if(*A<*B)printf("1番目=%s,2番目=%s\n",A,B);
if(*A>*B)printf("1番目=%s,2番目=%s\n",B,A);

return 0;
}
関数を使ってないし、これでは正常に動作しません
3文字以上の文字を打ち込むと順番にならなくなります

Re:ポインタを使った比較プログラム

Posted: 2009年6月01日(月) 15:51
by non
かなり、問題があるようです。

1 char *A[100]
文字列を格納するための配列を用意するのなら、
char A[100] です。
ポインタで解かなくてはいけないので、ポインタを別に用意します。
例えば
char *a;
a=&A[0];

2 先頭の1文字だけを比較しても全体を比較したことになりません。
 1文字目が等しいなら2文字目を比較、2文字目が等しいなら3文字目と比較していきます。
 等しくなくなるか、文字列の最後'\0'になるまでwhileで繰り返します。

3 whileから抜けた後、(抜ける条件は、等しくなくなったか、'\0'になった)
 抜けた原因により、どちらが大きいかまたは等しいか出力します。
 関数にするなら、仕様を決めて例えば-1,0,1をreturnするようにします。

4 課題には関数にしなさいとは書かれていません。

5 アスキー順ならこれでいいのですが、辞書順なら、最低でも小文字を大文字に変換するなどの
処理を付け加える必要があります。

Re:ポインタを使った比較プログラム

Posted: 2009年6月01日(月) 16:02
by non
このままでは木曜までに終わらせるのは困難だと思いましたので、ポインタを使わないで
作ってみました。これを元に、ポインタに書き直してみてはいかがでしょうか?
ただし、アスキー順です。
#include <stdio.h>

int main(void)
{
	char A[100],B[100];
	int i;
	printf("文字列A:");scanf("%s",A); 
	printf("文字列B:");scanf("%s",B);
	i=0;
	while(A==B && A!='\0')
		i++;
	if(A<B)
		printf("1番目=%s,2番目=%s\n",A,B);
	else if(A>B)
		printf("1番目=%s,2番目=%s\n",B,A); 
	else
		printf("等しい\n");
	return 0;
}

Re:ポインタを使った比較プログラム

Posted: 2009年6月01日(月) 20:29
by arex
non様ありがとうございます!!
これなら何とかなりそうです!あとは何とか頑張ってみます
他の皆様も私程度のために長々とお付き合いくださり本当に感謝しています!
本当に助かりました!ありがとうございました!!