HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2012
0112
taro配列の中で同じ値をカウント5解決


taro

リンク

2012/1/12(Thu) 09:08:21|NO.44248

おはようございます。

題名の通りなのですが、たとえば


dim a,10 a(0)=1 a(1)=2 a(2)=2 a(3)=5 a(4)=3 a(5)=2 a(6)=5 a(7)=1 a(8)=5 a(9)=4

このような配列の中で2が3つ、5が3つ、1が2つ、3と4が1つという結果を出したいのですが、どのようなやり方が一番効率的でしょうか?



この記事に返信する


杉村祐介

リンク

2012/1/12(Thu) 14:13:29|NO.44253


dim a,10 a(0)=1 a(1)=2 a(2)=2 a(3)=5 a(4)=3 a(5)=2 a(6)=5 a(7)=1 a(8)=5 a(9)=4 dim b,10; カウント用の配列変数 repeat 10 b(a(cnt))+1 loop repeat 10 if b(cnt)!0:mes ""+cnt+"は"+b(cnt)+"個あります。":else:mes ""+cnt+"はありません。" loop

自分はこの程度しか思いつきませんでした。



HK2

リンク

2012/1/12(Thu) 17:08:08|NO.44255

杉村祐介さんの方法はaの値の範囲を限定しないと大変なことになるので、
必ずaの範囲を0以上極端に大きくない値以下にしてください。
値の範囲が1増えるごとに、メモリーの使用量は4Byteずつ増えていきます。



てれてれ

リンク

2012/1/12(Thu) 18:02:12|NO.44256


a=1,2,2,5,3,2,5,1,5,4 dim Ck,length(a) : Ckcn = 0 ; 重複チェック用の配列を確保 repeat length(a) ;配列変数[a]の配列の数だけループ cn = cnt : Count = 0 : CkF = 0 repeat Ckcn ;同じ数を何度もチェックするのを防ぐため重複チェック if Ck(cnt) = a(cn) : Ckcn++ : CkF = 1 : break ;前にチェックしていたら[CkF]に[1]を代入 loop if CkF = 1 : continue ;[CkF]が[1]だったらチェックせずにループ repeat length(a) ;配列変数[a]の中で同じ数を数える if a(cn) == a(cnt) : Count++ loop Ck(Ckcn) = a(cnt) : Ckcn++ ;重複チェック用 mes "["+a(cnt)+"]は["+Count+"]個あります" loop
こんな方法もありますね。



M

リンク

2012/1/12(Thu) 21:10:34|NO.44257

「どの数字が」「いくつあるか」を集計するようにしてみた。

N=10 ;配列の数 dim a,N ;まず、a()の中に0〜9までの適当な数字を入れる(べつに9までじゃなくても構わない) randomize repeat N a(cnt)=rnd(10) loop dim b,2,N ;カウント用の配列を用意する(二次元配列を作るところがポイント) repeat N b(0,cnt)=-1 ;どの数字が?を記憶する部分。-1..絶対出でこない値..で初期化しておく b(1,cnt)=0 ;いくつあるかを記憶する部分。0でクリアしておく loop idx=0 ;b()のインデックスを0にしておく repeat N i=cnt flg=0 ;「その数字は集計したよ」フラグを0にする ;過去にaの数字が集計されていたら、そこへ更新する repeat idx+1 ;b()に登録されているデータの分だけ繰り返す if a(i)=b(0,cnt){ ;もし、aの数字が過去に集計されていたら、 b(1,cnt)++ ;「いくつあるか」を記憶する部分を+1。 flg=1 ;「その数字は集計したよ」ということにして、 break ;ループを終える } loop ;過去にaの数字が集計されていなかったら、新規登録する。 if flg=0{ ;aの数字が集計されていなかったら b(0,idx)=a(i) ;「どの数字が?」を記憶する部分にaを入れ、 b(1,idx)++ ;「いくつあるか?」を+1して idx++ ;b()のインデックスを一つ増やす } loop ;結果表示 mes "a()の内容" repeat N mes str(a(cnt)) loop mes "集計結果" repeat idx ;repeat Nにしても構わないが、とりあえず、b()に登録さている分だけ報告する mes "["+str(b(0,cnt))+"]は"+str(b(1,cnt))+"個あります" loop
学校の課題じゃなければ良いけど
TABの字数を4文字で。



taro

リンク

2012/1/13(Fri) 08:02:53|NO.44258

みなさんありがとうございます。
そういった命令が存在するのかと思ったんですが、特にないんですね(^^;)

いろいろな手法があって、相当勉強になりました。
ありがとうございました。



ONION software Copyright 1997-2023(c) All rights reserved.