グッドデザイン賞を受賞したウォーターサーバー >>

任意の整数の偶数/奇数を判定するモジュールを開発しています。
納期は連休明けです。

Public Function a(b)
  Select Case b
    Case 1
      a = True
    Case 2
      a = False
    Case 3
      a = True
    Case 4
      a = False
     :
    (中略)
     :
    Case 10000
      a = False
  End Select
End Function

上記のようなプログラムを途中まで書いたところなのですが、コードの行数が長く、どうも効率が悪いような気がしています。
このままでは納期に間に合うか不安です。
効率のよいアルゴリズムをご存知の方、教えてください。

また、現在は、ソースコードをプリントアウトして1行ずつ眼でチェックしていますが、紙を大量に消費しますし、時間もばかになりません。
効率よくバグを検出する方法を教えてください。

連日の深夜残業でかなり参っています。(><)

このQ&Aに関連する最新のQ&A

A 回答 (10件)

失礼を承知で一言。


もし小生のプロジェクトにこのようなプログラムを記述している人物がいるとしたら、『現時点のプログラム能力も、将来性も無い』ということで抜けて頂く以外ありません。
四則演算+剰余算、ビット演算は、プログラム言語に依存しない、基礎中の基礎だからです。
あまりにも基礎過ぎて、ポカッと抜けて難しく考えてしまう、ということがゼロであるとは言いませんし、それだけで上記のような判断は厳しすぎる、とは小生も感じます。
上記のような判断は、ポカッと抜けるにしても『オイオイしっかりしてくれよ』というレベルである、ということもありますが、他の人に相談できないというコミュニケーション能力の無さにあります。
モジュールレベル開発である、と貴殿がおっしゃっているゆえに、そのモジュールの仕様(引数、返り値等)を指示する人物がいるはずですが、その人に相談できないわけが無いからそう判断します。
これは他の回答者様も感じているのではないか、と思いますが、偶数か奇数か判定する関数、など普通はわざわざモジュール化せずとも、関数一個(Mod でも And でも)で済むものですので、なぜそんなことをするのだろう?という疑問があります。
現プロジェクト責任者の方(もしくは貴殿にモジュール内容を指示する人)も、小生と同様に感じているにもかかわらず、何らかのしがらみで不要の判断を下せずに(その責任を取ることがイヤで?)、毒にも薬にもならないことを貴殿に指示している、というのはそれほど的外れの推察ではない気がします。
ごく短期的に考えると、プログラマーの能力は『現時点でのプログラム能力』の事でしょうが、ある程度長期的に考えると、プログラマーの能力とは『他人とのコミュニケーション能力』です。
わからないことを自分ひとりで抱え込まずに、上司、同僚に相談できる能力。
雑談レベルでもかまわないので、『こう実装しよう思うのだけど、もっと効率的な方法があるような気がして仕方が無い』、と相談できる能力。
『自分には難しすぎで無理です』と、自分の力量、仕事の難しさを判断して相談できる能力。
『このように指示されたのですが、この条件の場合に矛盾が生じますが、その場合はどうすればよいのですか』と確認できる能力。
等々
ここで質問するのは、解決は教えてもらえるでしょうが、職場内でのコミュニケーション能力の向上には役立ちません。

小生はコミュニケーション能力の高い人物には、大きな将来性を感じます。

質問には関係のない事で、しかも推論を重ねた上での、さらに質問者様への厳しい意見ですが、質問者様の仕事に対していくらかプラスになればと思い、僭越ながら書かせていただきました。
    • good
    • 17

答えは出尽くしていますが...


私なら、関数名も重視します。

Public Function IsOdd(ByVal N As Integer) As Boolean
  IsOdd = N Mod 2
End Function

Private Sub Command1_Click()
  Debug.Print IsOdd(0)
  Debug.Print IsOdd(1)
  Debug.Print IsOdd(2)
End Sub

<実行結果>

False
True
False
    • good
    • 3

以下のPGで可能です。


If b Mod 2 = 1 Then
a = True
Else
a = False
End If

尚、Modは商の余りを計算する演算子です。
    • good
    • 0

No.6 の訂正



a = b And 1

でも、偶数・奇数の判定ができます。
a = 1 :奇数
a = 0 :偶数


または

a = (b And 1) = 1

でも、偶数・奇数の判定ができます。
a = True :奇数
a = False:偶数
    • good
    • 1

ちなみに



a = b And 1

でも、偶数・奇数の判定ができます。
a = True :奇数
a = False:偶数

No.4 の応用
    • good
    • 0

これは「モジュールを開発」というレベルですかね。


VBであれば、非常に効率がわるいdすよ。機械語で組んでいても、シフト演算などでもう少しましなものができますよ。
ちなみにエクセルでは偶数・奇数判定に、ISEVEN、ISODD関数があるが、VBでは使えないので、
2で割った余りが0か1かで判定するより他ないでしょう。
余りが0の場合が偶数、1の場合が奇数です。余りはMOD関数が使えて、aをbで割るあまりは a Mod b と中間に置く演算子です。
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd …
¥という演算子もあります。
http://www008.upp.so-net.ne.jp/ikaia/VB.htm
プログラムは,ステートメント、関数の活用や、繰り返しロジックに持ち込む技術といえます。私はもし5回程度以上列挙するコードになったら、別に良い方法がないか考えてます。
本当の質問者のレベルが見えませんので、失礼になるかもしれませんが、質問が事実で、他に特別な理由がないなら、奮起してさらに勉強が必要です。
#3でもおっしゃっていることのほかに、周りにプログラムのわかる助言者でもおられれば、しばらくは見てもらって、知識を吸収し方が良いですよ。また関数やロジックやアルゴリズムに関心を持ってください。
    • good
    • 0

偶数奇数の判定モジュール。


2で割ってあまりを見る方法以外にも。

if (b and 1) = 0 then
a=true
else
a=false
end if

これは2進数で表示した時、1ビット目が1の場合は奇数である。1ビット目が0の場合偶数である。
これを利用したものです。

たしか、割り算をするよりもビット演算の方が実行速度が速かった気がします。(VBでも速いのかよくわからないですが。)
    • good
    • 1

解答自体は、No.1 No.2で良いのですが、回りに質問できる


同僚・先輩・上司等はおられないのでしょうか?
他にも同様な事をしていて、その結果が連日の深夜残業に
なっている様な気がします。

他にも困っている問題が残っているのであれば、納期遅れ
になる前に上司に報告して判断を仰ぎましょう。
    • good
    • 3

以下の通り


if (b mod 2)=0 then a=false
else
a=true
end if
    • good
    • 3

If ((b / 2) - Int(b / 2)) Then a = True Else a = False




2で割って小数点以下を削除した物と比べています。
    • good
    • 1

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q奇数・偶数の判断 VBA

Sub Macro1()
Dim i As Long
i = 1
For i = 1 To 10

If i = ? Then '偶数ならと言うコード
MsgBox "偶数です"
Else
MsgBox "奇数です"
End If

Next
End Sub

ここまでは自分で作れたのですが、iが奇数か偶数かを判断するコードがわかりません。
ご教授よろしくお願いします。

Aベストアンサー

やりようは幾らでもありますが、たとえば

sub macro1()
 dim i
 for i=1 to 10
 if i mod 2 = 0 then
  msgbox i & " is even"
 else
  msgbox i & " is odd"
 end if
 next i
end sub


他にも、WorksheetfunctionのOddとかEvenとか使ってみたり、単純に2で割り算した答えがどうかとか。

QVB6.0-整数と余りを求める

表題の通り、整数と余りを求める関数を教えてほしいです:例:100/60=1余り40
整数:1
余り:40
よろしくお願いいたします。

Aベストアンサー

Dim A,B,C,D as integer
A=100
B=60
C=Int(A/B) <---答は1
D=A mod B

●IntはAをBで割った時の整数部分を求める関数ですが、答が負の場合は
注意が必要です。 例 Int(-100/40)=-2
これを回避する場合 Fixがいいです

●mod は A を B で割った時の余りを求める関数

Q文字列の後ろから必要分だけ削除したい。

例1 Dim str As String = "あいうえお1234"

文字列の中の1234だけ削除したい場合は、
str = str.Remove(5,4)
という風に、5文字目の後から4文字削除にすればよいのですが、

例の"あいうえお"の部分の長さが毎回処理する度に異なる場合は、
文字列の頭から何文字目という指定ができないので、”後ろから4文字を削除したい”となります。その場合は、どのようなプロパティを使えばいいのでしょうか。

.NET環境です。

Aベストアンサー

Length(str)で文字数を取得できますので、後ろから4文字目は先頭から何文字目かは計算できると思いますが、どうでしょうか?

QEXCEL VBAで計算値を四捨五入、切り上げ、切捨てする方法

ネットで探してみたのですが、計算結果を四捨五入して特定のセルを
返すにはどうしたらいいのでしょうか?

Sub hokangosa()

Dim ZPS As Double
Dim ZPOS As Double
Dim DMN As Double
MsgBox (" >>> 補間誤差自動計算 <<< ")
MsgBox (" >>> 初期値入力します <<< ")
ZPS = InputBox(">>> ステップを入力してください<<<")
ZPOS = Sheet1.Cells(22, 4).Value
DMN = ZPOS / ZPS
Sheet1.Cells(23, 6).Value = DMN
End Sub

ここでDMNの値を四捨五入したいです。

またこれとは別に切上げ、切捨ても教えていただけるとありがたいです。

Aベストアンサー

DMN = Application.WorksheetFunction.Round(ZPOS / ZPS, 0)
で、四捨五入
DMN = Application.RoundDown(ZPOS / ZPS, 0)
で切り捨て
DMN = Application.RoundUp(ZPOS / ZPS, 0)
で切り上げです。

引数で、対象桁を変更できます。

QDataGridViewで指定したセルの値を取得

こんにちは。

VB2008のDataGridViewで指定したセルの値を取得をする方法がわかりません。
どなたか教えてください。

Aベストアンサー

こんばんは.

 Dim Data As String
 Data = Me.DataGridView(0, 2).Value
 MsgBox(Data)

みたいな感じで取れないですかね???

QVB.NETのコンボボックスについて

VB6からVB.NETでプログラミングを始めました。
コンボボックスのクリアの仕方や設定の仕方、また
取り出し方等を教えて下さい。

色々とヘルプも見てみたのですが、よく解りません。
宜しくお願い致します。

Aベストアンサー

クリアだけだと思ってました。
追記します。

Itemを操作します


'登録
For i = 1 To 10
  Me.ComboBox1.Items.Add(i.ToString)
Next

'取得
For i = 0 To Me.ComboBox1.Items.Count - 1
  MsgBox(Me.ComboBox1.Items(i).ToString)
Next

'完全クリア
Me.ComboBox1.Items.Clear()

部分クリア
Me.ComboBox1.Items.RemoveAt(Index値)

QConsole.WriteLine で表示されない

VB2008でプログラムミングしておりますが、プログラミング試験の為によく使われる、「Console.WriteLine」ですが、表示されないのです。
何処に表示されるのでしょうか。
デバックを行っても何処にも表示されません。

Console.WriteLine("Hello World")
でも表示が何処にも有りません。

初歩的な質問ですが、私には大事な一歩なので宜しく御願い致します。

Aベストアンサー

質問者さんはもう見ていないかもしれませんが、一つ。
質問者さんはプロジェクトのタイプをFormにしているので、コンソールに表示されないのです。
プロジェクトのタイプをコンソールアプリケーションにすれば良く見られるDOS窓に表示されます。
Formアプリケーションタイプでも、確かプロジェクトのプロパティをいじればできたはずです。

QCloseとDisposeの違い

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、タイマーコントロールのイベントに記述していますと、それは実行され続けます。

これを防ぐために、Me.Dispose() を使います。すると、きれいにプロセスは終了し、イベントは発生しない模様です。

そこで、「フォームを閉じる」意味のMe.Close() をすべてMe.Dispose() に変えてしまいました。確実にプロセスを破棄出来ると思ったからです。Webで調べると、違いは「再利用できる、できないの違い」という答えがありましたが、それはきっと、ファイルやオブジェクトのことで、フォームの場合は、再びShowまたはShowDialogで表示させることは可能でしたので、特に問題は感じていませんでした。

ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。Me.Close() に変えるとうまくいきました。

わけわからなくなってきました。。。

ちなみに、その残ったフォームは、スタートアップフォームであり、別のフォームからShowまたはShowDialogメソッドで呼び出したものではありません。

ここで4つの仮説を立ててみました。

1. ShowDialogで呼び出したフォームは、Me.Dispose()、Showで呼び出した、あるいは、スタートアップフォームは、Me.Close() すれば破棄できる

2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

3. 呼び出し方ではなく、別の要因が存在する

4. 併記する必要がある場合がある

Me.Close()
Me.Dispose()

または、

Me.Dispose()
Me.Close()



どれが正しいのでしょうか?どなたがご存じの方がいらっしゃいましたら、ご教授いただけませんでしょうか? どうぞよろしくお願い申し上げます。ありがとうございました。

みなさまこんばんわです。よろしくお願い申し上げます。

VB.NET 2008でコーディングしています。
CloseとDisposeの違いについて教えていただきたいのです。

これらのメソッドは、開いたファイルを閉じるときなどにも使いますが、今回お尋ねするのは、フォームを閉じるとき、しかも、自ら呼び出すとき(Me.Close() と、Me.Dispose() )のみに限ったこととしてお話しさせていただきます。

たとえば、ShowDialog() で呼び出したフォームは、そのフォーム内でMe.Close() しても、プロセスは残り、たとえば、...続きを読む

Aベストアンサー

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリケーション設定で、「最後のフォームを閉じるとき」にアプリケーションがシャットダウンする設定になってるのに、シャットダウンしてくれないことが起こりました。調べてみると、Me.Dispose() が原因。
Me.Close() に変えるとうまくいきました。

通常はどちらでもうまくいきます。

>2. ShowDialogで呼び出したフォームは、Me.Dispose()、スタートアップフォームは、Me.Close()、Showで呼び出したフォームは、どちらでも、破棄できる

ShowDialogの場合は、メソッド内部で、ハンドルが破棄されているため、Close()メソッドの際にDispose()メソッドが呼び出されます。

>3. 呼び出し方ではなく、別の要因が存在する

そう思います。

>4. 併記する必要がある場合がある

インスタンスを明示的に破棄したほうがよい場合は多く存在します。
Disposeが使えるメンバはIDisposableをインターフェースとして持っているメンバです。
これらのメンバは、外部とのやり取りを行うものが多くあります。
たとえばSQLClientに含まれるようなメンバです。

外部とのコネクションを確実に破棄を保障してほしいなどという場合がありますよね、このようなときに使用します。

Using構文を使用するのとまったく同じ理由になります。
正確にはUsing構文を使用できるメンバには条件があります、IDisposableをインターフェースとして持っているメンバに限るというものです。

ほかにもガーベージコレクタによるファイナライズを伴うかどうかという違いがあります。
Disposeの場合はファイナライズが同時に行われるため、使用していたメモリ空間を開放することができます。

上記のような理由により、
Me.Close()
Me.Dispose()
は両方書いたほうがよいと思います。

蛇足ですが、
Me.Dispose()
Me.Close()
はエラーになります。
Me.Dispose()により、Me本体(インスタンス)は削除されてしまいます。
存在しないMeに対してCloseメソッドを要求することはできないためです。

Me.Close()
Me.Dispose()
は根本的に違うものです。

formについて、Close()メソッドはフォームの表示を終了させるメソッドです。

ほかのクラスも同様。すべてのDispose()メソッドについて、これはインスタンスの破棄を明示的に行うものです。

>再利用できる、できないの違い

Dispose()はインスタンスが破棄されるため、再びコンストラクタを用いて、インスタンスを生成しないいけません。

一方Close()はインスタンスが残っているので、それを利用することができます。

>1. ところが、アプリ...続きを読む

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

QVBAに詳しい方、「Mod」を解説していただけませんか?

四捨五入したり、繰り上げたり、なんだかさっぱり分かりません。
詳しく教えてください。

Sub 答え()
 Dim kotae As Double
 keisan = 6.6 Mod 2
 Range("A1").Value = keisan
End Sub
この場合、A1は1と入るのですが、なぜ1なのですか。
VBAの試験があるので、なんとか覚えたいのです。
さっぱりわからず、困っています。教えてください。

お助けください。

Aベストアンサー

> ようするに、切捨てや繰上げなどあるみたいなのですが、よく分からず困っているのです。

Mod演算子のヘルプに、
「このとき浮動小数点数は整数に丸められます」 と書かれています。
では、どのように丸められるか実験してみましょう。

15 を 1.5 で割った余りを考えます。
手で計算すると 割算の答えは 10 で余りは 0 ですね。
では、イミディエイトウィンドウで計算すると
? 15 mod 1.5
1
結果は 1 です。
あ、これは先に丸めて 15 Mod 2 を計算しているんだな、
ということが分かりますね。
他にも計算してみましょう。
? 15 Mod 1.4
0         (15 Mod 1) に一致
? 15 Mod 1.6
1         (15 Mod 2) に一致

ここで、四捨五入されたと考えるのはまだ早い。

次に 15 Mod 2.5 を計算してみましょう。
? 15 Mod 2.5
1
あれれ?
四捨五入なら 15 Mod 3 で 0 になるはずですね。
どうなっているの???

答えは、ここで行われているのは四捨五入ではなく
銀行型丸めといわれているもので
小数部が .5 の場合に、偶数に丸めるというものです。
1.5 の場合には、1 と 2 のうち、偶数である 2 の方に丸められ
2.5 の場合には、2 と 3 のうち、偶数である 2 の方に丸められるのです。

VBA のRound 関数も同様の丸めが行われます。
四捨五入が必要なら、自作関数などの工夫が必要になります。

お分かりいただけたでしょうか。

> ようするに、切捨てや繰上げなどあるみたいなのですが、よく分からず困っているのです。

Mod演算子のヘルプに、
「このとき浮動小数点数は整数に丸められます」 と書かれています。
では、どのように丸められるか実験してみましょう。

15 を 1.5 で割った余りを考えます。
手で計算すると 割算の答えは 10 で余りは 0 ですね。
では、イミディエイトウィンドウで計算すると
? 15 mod 1.5
1
結果は 1 です。
あ、これは先に丸めて 15 Mod 2 を計算しているんだな、
ということが分かりますね。
...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング