複数の数字を比較

ActiveBasicでのプログラミングでわからないこと、困ったことなどがあったら、ここで質問してみましょう(質問を行う場合は、過去ログやWeb上であらかじめ問題を整理するようにしましょう☆)。
返信する
メッセージ
作成者
Skyer

複数の数字を比較

#1 投稿記事 by Skyer »

2,4,10,13、-4 など適当の数字の中で、11に最も近い数字をプログラムで見つける事はできるのでしょうか?
ゴードを教えてください。お願いします
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

#2 投稿記事 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)

こんなかんじでどうでしょうか?
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
Skyer

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

#3 投稿記事 by Skyer »

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

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

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

#4 投稿記事 by 匿名 »

Do~LoopでInStr使ってコンマの数を数える
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

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

コード: 全て選択

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)
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
skyer

ありがとうございます

#6 投稿記事 by skyer »

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

ところでなんですが

#7 投稿記事 by skyer »


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

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

#8 投稿記事 by yoko »

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

#9 投稿記事 by yoko »

少し訂正

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

#10 投稿記事 by skyer »

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

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

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

わかる人用のおまけ
skyer

#12 投稿記事 by skyer »

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

Dim C As *Long

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

こんな感じですか
ゲスト

#13 投稿記事 by ゲスト »

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

失礼します

#14 投稿記事 by Str$(old) »

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

少し前の話(カウントの仕方の前の話)で、最も11に近い数字を求めていましたが、
11に近い数字を3つ、順番に出せるのでしょうか。
教えてください。
konisi
記事: 893
登録日時: 2005年7月25日(月) 13:27
お住まい: 埼玉県東松山市
連絡する:

#15 投稿記事 by konisi »

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

てな感じでどうでしょうか?
簡単そうなので敢えて書きませんが。
Website→http://web1.nazca.co.jp/himajinn13sei/top.html
ここ以外の場所では「暇人13世」というHNを主として使用。

に署名を書き換えて欲しいと言われたので暇だしやってみるテスト。
返信する