新しく発言する EXIT インデックスへ
こうゆう事はできるのでしょうか?

  こうゆう事はできるのでしょうか? けん 2004/09/04 21:05:34 
  結論から言えば出来ます。 青木太一 2004/09/05 05:38:47 
   ├選択する文字数を「3」と限定していいので... 青木太一 2004/09/05 05:53:13 
   │└前の投稿で抜けがありました。先頭に 青木太一 2004/09/05 05:55:20 
   └青木太一さん返信ありがとうございます。 けん 2004/09/05 16:23:51 
    └またしても質問でございます、 けん 2004/09/06 04:26:34 
     └不要なプログラムはあるのでしょうか? 青木太一 2004/09/07 01:11:09 

  こうゆう事はできるのでしょうか? けん 2004/09/04 21:05:34  ツリーへ

こうゆう事はできるのでしょうか? 返事を書く
けん 2004/09/04 21:05:34
INFORMATIONから3文字選んで出来る文字列をすべて1度ずつ出力し、その個数を出力するプログラムを作りたいのですが出来るのでしょうか?始めたばかりの初心者で何をどうすればいいのかわかりません。何方か教えてもらえると助かります。

  結論から言えば出来ます。 青木太一 2004/09/05 05:38:47  ツリーへ

Re: こうゆう事はできるのでしょうか? 返事を書く
青木太一 2004/09/05 05:38:47
結論から言えば出来ます。

けんさんはどの程度の初心者なのかわからないのでなんとも説明しづらいのですが...

考え方としては、"information"は11文字なので11個の要素から3つを選ぶ「順列」を列挙する問題ですね。
ただし、"information"には"i","n","o"など複数個出てくる文字があるので、単純に11個の要素から3つを選ぶ順列を列挙すると同じ文字列がいくつも出現してしまうので、その重複を取り除く処理が必要になりますが。

というわけで、
・"information"から3文字選ぶ「順列」を(重複を考えず単純に)列挙する
・列挙された文字列達から重複を取り除く
という二つの処理を作ればいいと思います。

できそうですか?参考になるかわかりませんが、順列ではなくその一歩手前である組み合わせを表示するプログラムを書きました。

!ここから
LET str$="information"
LET n=len(str$)
LET r=3

!全部の組み合わせを表示
!Javaですが、http://www.merriampark.com/comb.htm
!を参考にしました。

!文字のどの場所を選んでいるかを示す配列p
dim p(1 to r)
for i=1 to r
LET p(i)=i
next i

!生成する回数はnCrなのでcomb関数で求められる
for k=1 to comb(n,r)

if k>1 then !一回目はpを更新しなくてよい
!配列pを更新する部分---------ここから-------------------
!右端に詰まっていないpの中で一番右に来ているものを、一歩右に
LET i=r
do while(p(i)=n-r+i)
LET i=i-1
loop
LET p(i)=p(i)+1

!その一歩右に行ったやつが、右端に詰まったやつらを全部自分の右に引き寄せ整列させる
for j=i+1 to r
LET p(j)=p(i)+(j-i)
next j
!配列pを更新する部分---------ここまで-------------------
end if

!得られた配列pで選択された文字を表示
print k;":";
for i=1 to r
print str$(p(i):p(i));
next i
print

!わかりやすいように、文字のどこが選択されたのかを表示する。
LET place$=""
LET p_di=0
for i=1 to r
LET place$=place$&REPEAT$(" ",p(i)-p_di-1)&"^"
LET p_di=p(i)
next i
print str$
print place$

next k

END

!ここまで

とりあえずこれを元にして見てはいかがでしょう。
もっといい方法もあるのかもしれませんが...

   ├選択する文字数を「3」と限定していいので... 青木太一 2004/09/05 05:53:13  ツリーへ

Re: 結論から言えば出来ます。 返事を書く
青木太一 2004/09/05 05:53:13
選択する文字数を「3」と限定していいのであれば

LET number_of_permutation=perm(n,3)
dim list$(1 to number_of_permutation)

LET counter=0

sub add(a,b,c)
LET counter=counter+1
LET list$(counter)=s$(a:a) & s$(b:b) & s$(c:c)
end sub

for i=1 to n-2
for j=i+1 to n-1
for k=j+1 to n

call add(i,j,k)
call add(i,k,j)
call add(j,i,k)
call add(j,k,i)
call add(k,i,j)
call add(k,j,i)

next k
next j
next i

for i=1 to number_of_permutation
print list$(i)
next i
END

ですべての順列を列挙できますね。
あとは重複を取り除くだけです。

   │└前の投稿で抜けがありました。先頭に 青木太一 2004/09/05 05:55:20  ツリーへ

Re: 選択する文字数を「3」と限定していいので... 返事を書く
青木太一 2004/09/05 05:55:20
前の投稿で抜けがありました。先頭に

LET s$="information"
LET n=len(s$)

の二行を追加してください。コピペミスりました。

   └青木太一さん返信ありがとうございます。 けん 2004/09/05 16:23:51  ツリーへ

Re: 結論から言えば出来ます。 返事を書く
けん 2004/09/05 16:23:51
青木太一さん返信ありがとうございます。
私は初めて3日程のかなりの初心者です。
実は課題でこのような問題が出されており、自分では何をすればいいのかわからず質問させていただきました。
少しわからない所もありますが自分で何とか解読してみます。
どうもありがとうございましたm(_ _)m

    └またしても質問でございます、 けん 2004/09/06 04:26:34  ツリーへ

Re: 青木太一さん返信ありがとうございます。 返事を書く
けん 2004/09/06 04:26:34
またしても質問でございます、
LET str$="information"
LET n=len(str$)
LET r=3
dim p(1 to r)
for i=1 to r
LET p(i)=i
next i
for k=1 to comb(n,r)
if k>1 then
LET i=r
do while(p(i)=n-r+i)
LET i=i-1
loop
LET p(i)=p(i)+1
for j=i+1 to r
LET p(j)=p(i)+(j-i)
next j
end if
print k;":";
for i=1 to r
print str$(p(i):p(i));
next i
print
next k
END

↑の場合だと不要なプログラムはあるでしょうか?
あとprint k;":";これが何のためにあるのかわからず悩んでおります。教えてもらえると助かりますm(_ _)m

     └不要なプログラムはあるのでしょうか? 青木太一 2004/09/07 01:11:09  ツリーへ

Re: またしても質問でございます、 返事を書く
青木太一 2004/09/07 01:11:09
>不要なプログラムはあるのでしょうか?
ごめんなさい。意味がわかりません。
「『文字列"information"から3つの文字を選択する組み合わせの重複を含む列挙を出力するプログラム』として、不要な部分はあるか?」
という質問でしょうか?
だとしたらprint k;":";はまあ、不要といえば不要ですね。
わかりやすさのため何番目かというのを表示しているだけですから。

>あとprint k;":";これが何のためにあるのかわからず悩んでおります。教えてもらえると助かりますm(_ _)m

えーと、
実行すると
---ここから
1 :inf
2 :ino
3 :inr
4 :inm
中略
164 :ton
165 :ion
---ここまで

こんな感じの出力が得られると思いますが、
その行頭の番号部分
---ここから
1 :
2 :
3 :
4 :
中略
164 :
165 :
---ここまで
を表示する処理です。
それはわかっていて、なんでそんな表示をするんだということでしたら、
前述の通り、わかりやすいと思ったからです。混乱させたようでごめんなさい。

単純なprint文は変数の内容を変えたり、プログラムの制御構造を変えたりすることはないので、プログラムの本質というか、アルゴリズムに影響を与えることはありませんので、
勝手に削除したりコメントアウト(行頭に「!」をつけてその行の後の部分を無効にする)したり、逆に付け加えても問題ありませんよ。

(上で単純なprint文がプログラムの本質に影響を与えないと書きましたが、
print文の引数で関数や手続きを呼び出したりしている単純でない場合は、
その呼び出された関数や手続きがプログラムの本質に影響を与えることもあります。

たとえば、

function f
LET cnt=cnt+1
LET f=cnt
end function

print f
print f
print f
END

というプログラムはprint fするたびにcntがひとつづつ大きくなるので
1
2
3
と出力されます。
)


インデックスへ EXIT
新規発言を反映させるにはブラウザの更新ボタンを押してください。