複数の数字を比較

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: 複数の数字を比較

by konisi » 2007年3月20日(火) 17:48

① 11に一番近い数字を見つけたら、それを表示する
② その数字を消すように、シフトする。あるいはその数字の値を&H7FFFFFFFとかに変更・代入する。
③ ①に戻る

てな感じでどうでしょうか?
簡単そうなので敢えて書きませんが。

失礼します

by Str$(old) » 2007年3月20日(火) 14:27

失礼します、Str$(old) です。

少し前の話(カウントの仕方の前の話)で、最も11に近い数字を求めていましたが、
11に近い数字を3つ、順番に出せるのでしょうか。
教えてください。

by ゲスト » 2007年3月19日(月) 12:41

バッファの確保が十分でtokが自然数の場合であればあってます
tokが負数のときはバッファ外を参照してますのでエラー吐きませんがNGです

by skyer » 2007年3月19日(月) 12:23

カウント処理以外のは、わかってます。
カウント処理の仕方がわからないので、教えてください。

Dim C As *Long

while   ※ゲストさんのを引用
If~
C[tok]=C[tok]+1
End If
~

こんな感じですか

by ゲスト » 2007年3月19日(月) 11:56

こんな感じ

コード: 全て選択


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の所に数字をカウントする処理を書けば可能なはず
そこは御自分でお願いします

わかる人用のおまけ

by skyer » 2007年3月19日(月) 05:01

>別の配列変数
では、
root="21,54,2,654,-24,0,1,1,4"
の中から一番多くある数字をkonisiさんのを使って求められるのですか

可能ならば、コードを教えてください。

by yoko » 2007年3月19日(月) 01:47

少し訂正

>何か別の変数 ×
>別の配列変数 ○

by yoko » 2007年3月19日(月) 01:46

a、b、cの状態で探すのは無理です
何か別の変数にa、b、cのポインタを入れてkonisi氏の方法を使って下さい

ところでなんですが

by skyer » 2007年3月18日(日) 23:55


Dim a As Long,b As Long,c As Long
a=2
b=7
c=2

これらの中(a~c)で一番多く代入された数字を見つけたいのですが、どうすればよいのでしょうか、教えてください。

ありがとうございます

by skyer » 2007年3月18日(日) 20:39

いろいろ(Instrの所などetc)改良してうまくできました。

by konisi » 2007年3月18日(日) 14:33

コード: 全て選択

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系の命令を使っているので、処理の最後に

コード: 全て選択

free(nums)
と入れるのを忘れないでください。

つまり、上のコードがきちんと動く事を仮定した場合の全ソースは次のようになります。

コード: 全て選択

#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)

by 匿名 » 2007年3月18日(日) 10:55

Do~LoopでInStr使ってコンマの数を数える

Loopの回数を指定しないようには

by Skyer » 2007年3月18日(日) 07:25

konisiさん、ありがとうございます。

Dim root As String
root="32,543,10,-21・・・"
となっていて、Loopの回数を自動で調節したいのですが、

この場合はどのようにすればよいのですか、教えてください。

by konisi » 2007年3月17日(土) 23:54

コード: 全て選択

#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)

こんなかんじでどうでしょうか?

複数の数字を比較

by Skyer » 2007年3月17日(土) 23:20

2,4,10,13、-4 など適当の数字の中で、11に最も近い数字をプログラムで見つける事はできるのでしょうか?
ゴードを教えてください。お願いします

ページトップ