ページ 1 / 1
複数の数字を比較
Posted: 2007年3月17日(土) 23:20
by Skyer
2,4,10,13、-4 など適当の数字の中で、11に最も近い数字をプログラムで見つける事はできるのでしょうか?
ゴードを教えてください。お願いします
Posted: 2007年3月17日(土) 23:54
by konisi
コード: 全て選択
#console
Const cmp=11
Dim i As Long,j As Long,k As Long
Dim nums[4]=[2,4,10,13,-4] As Long
k=&H7FFFFFFF
For i=0 To 4
If k>Abs(nums-cmp) then'差の絶対値でどれだけ近いか調べる
k=Abs(nums-cmp)
j=i
End If
Next i
Print nums[j]
Sleep(-1)
こんなかんじでどうでしょうか?
Loopの回数を指定しないようには
Posted: 2007年3月18日(日) 07:25
by Skyer
konisiさん、ありがとうございます。
Dim root As String
root="32,543,10,-21・・・"
となっていて、Loopの回数を自動で調節したいのですが、
この場合はどのようにすればよいのですか、教えてください。
Posted: 2007年3月18日(日) 10:55
by 匿名
Do~LoopでInStr使ってコンマの数を数える
Posted: 2007年3月18日(日) 14:33
by konisi
コード: 全て選択
Dim nums[4]=[2,4,10,13,-4] As Long
を
コード: 全て選択
Dim root As String,nums As *Long,t1 As Long,t2 As Long
t1=1
t2=0
root=""'適当な値に初期化しておくこと。
Do
t1=InStr(root,",",t1)
If t1<>0 then
t2=t2+1
Else
Exit Do
End If
Loop
nums=calloc(t2*4)
t1=1
t2=0
Do
nums(t2)=Val(Mid$(root,t1,InStr(root,",",t1))) As Long
t1=InStr(root,",",t1)+1
If InStr(root,",",t1)=0 then Exit Do
t2=t2+1
Loop
という風に書き換えればいいと思います。
今ここで思いつくままに書いたのできちんと動くかどうかはやってみないと分かりませんが。
そうそう、alloc系の命令を使っているので、処理の最後に
と入れるのを忘れないでください。
つまり、上のコードがきちんと動く事を仮定した場合の全ソースは次のようになります。
コード: 全て選択
#console
Const cmp=11
Dim i As Long,j As Long,k As Long
Dim root As String,nums As *Long,t1 As Long,t2 As Long
t1=1
t2=0
root=""
Do
t1=InStr(root,",",t1)
If t1<>0 then
t2=t2+1
Else
Exit Do
End If
Loop
nums=calloc(t2*4)
t1=1
t2=0
Do
nums(t2)=Val(Mid$(root,t1,InStr(root,",",t1))) As Long
t1=InStr(root,",",t1)+1
If InStr(root,",",t1)=0 then Exit Do
t2=t2+1
Loop
k=&H7FFFFFFF
For i=0 To t2
If k>Abs(nums-cmp) then
k=Abs(nums-cmp)
j=i
End If
Next i
Print nums[j]
free(nums)
Sleep(-1)
ありがとうございます
Posted: 2007年3月18日(日) 20:39
by skyer
いろいろ(Instrの所などetc)改良してうまくできました。
ところでなんですが
Posted: 2007年3月18日(日) 23:55
by skyer
例
Dim a As Long,b As Long,c As Long
a=2
b=7
c=2
これらの中(a~c)で一番多く代入された数字を見つけたいのですが、どうすればよいのでしょうか、教えてください。
Posted: 2007年3月19日(月) 01:46
by yoko
a、b、cの状態で探すのは無理です
何か別の変数にa、b、cのポインタを入れてkonisi氏の方法を使って下さい
Posted: 2007年3月19日(月) 01:47
by yoko
少し訂正
>何か別の変数 ×
>別の配列変数 ○
Posted: 2007年3月19日(月) 05:01
by skyer
>別の配列変数
では、
root="21,54,2,654,-24,0,1,1,4"
の中から一番多くある数字をkonisiさんのを使って求められるのですか
可能ならば、コードを教えてください。
Posted: 2007年3月19日(月) 11:56
by ゲスト
こんな感じ
コード: 全て選択
Dim str As BytePtr
str = "3,7,5,9,8,7,5,1"
Dim tok As Long
Dim i As Long,j As Long
i = 1
j = InStr(i,str,",")
While j<>0
If j>i Then
tok = Val(Mid$(str,i,j-i))
'tokに数字が入ってるのでカウント処理を書く
Print tok
End If
i = j+1
j = InStr(i,str,",")
Wend
j = lstrlen(str)+1
If j>i Then
tok = Val(Mid$(str,i,j-i))
'ここでもtokに数字が入ってるのでカウント処理を書く
Print tok
End If
あとはPrint tokの所に数字をカウントする処理を書けば可能なはず
そこは御自分でお願いします
わかる人用のおまけ
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]
/*
EnumToken
文字列からトークンを取り出してコールバック関数を呼ぶ
エラー処理してませんので使うならして下さい
引数
str = トークン列挙する文字列
del = デリミタ
cbfunc = コールバックアドレス(ENUMTOKEN_CALLBACK)
param = コールバック関数へ渡す値
戻り値
トークンの数
*/
Function EnumToken(str As BytePtr,del As BytePtr,cbfunc As ENUMTOKEN_CALLBACK,param As DWord) As Long
Dim i As Long
Dim j As Long
i = 1
j = InStr(i,str,del)
While j<>0
If j>i Then
EnumToken = EnumToken+1
'//ここにトークンに対する処理を書く
If cbfunc(str+i-1,j-i,EnumToken,param)<>TRUE Then Exit Function
'//ここまで
End If
i = j+lstrlen(del)
j = InStr(i,str,del)
Wend
j = lstrlen(str)+1
If j>i Then
EnumToken = EnumToken+1
'//ここにもトークンに対する処理を書く
cbfunc(str+i-1,j-i,EnumToken,param)
'//ここまで
End If
End Function
TypeDef ENUMTOKEN_CALLBACK = *Function(start As BytePtr,size As Long,count As Long,param As DWord) As Long
/*
ENUMTOKEN_CALLBACK
EnumTakenからコールされる関数
引数
start = トークンの開始アドレス
size = トークンのサイズ
count = 先頭を1として何番目のトークンか
param = EnumTokenの第四引数
戻り値
列挙を続ける場合はTRUE
'プロトタイプ
Function et_cb(start As BytePtr,size As Long,count As Long,param As DWord) As Long
et_cb = TRUE
End Function
*/
Posted: 2007年3月19日(月) 12:23
by skyer
カウント処理以外のは、わかってます。
カウント処理の仕方がわからないので、教えてください。
Dim C As *Long
while ※ゲストさんのを引用
If~
C[tok]=C[tok]+1
End If
~
こんな感じですか
Posted: 2007年3月19日(月) 12:41
by ゲスト
バッファの確保が十分でtokが自然数の場合であればあってます
tokが負数のときはバッファ外を参照してますのでエラー吐きませんがNGです
失礼します
Posted: 2007年3月20日(火) 14:27
by Str$(old)
失礼します、Str$(old) です。
少し前の話(カウントの仕方の前の話)で、最も11に近い数字を求めていましたが、
11に近い数字を3つ、順番に出せるのでしょうか。
教えてください。
Posted: 2007年3月20日(火) 17:48
by konisi
① 11に一番近い数字を見つけたら、それを表示する
② その数字を消すように、シフトする。あるいはその数字の値を&H7FFFFFFFとかに変更・代入する。
③ ①に戻る
てな感じでどうでしょうか?
簡単そうなので敢えて書きませんが。