• 締切済み

偶数/奇数の判定

任意の整数の偶数/奇数を判定するモジュールを開発しています。 納期は連休明けです。 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行ずつ眼でチェックしていますが、紙を大量に消費しますし、時間もばかになりません。 効率よくバグを検出する方法を教えてください。 連日の深夜残業でかなり参っています。(><)

みんなの回答

  • BellBell
  • ベストアンサー率54% (327/598)
回答No.10

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

noname#22222
noname#22222
回答No.9

答えは出尽くしていますが... 私なら、関数名も重視します。 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

noname#118114
noname#118114
回答No.8

以下のPGで可能です。 If b Mod 2 = 1 Then a = True Else a = False End If 尚、Modは商の余りを計算する演算子です。

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.7

No.6 の訂正 a = b And 1 でも、偶数・奇数の判定ができます。 a = 1 :奇数 a = 0 :偶数 または a = (b And 1) = 1 でも、偶数・奇数の判定ができます。 a = True :奇数 a = False:偶数

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.6

ちなみに a = b And 1 でも、偶数・奇数の判定ができます。 a = True :奇数 a = False:偶数 No.4 の応用

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.5

これは「モジュールを開発」というレベルですかね。 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/vb_p03.htm ¥という演算子もあります。 http://www008.upp.so-net.ne.jp/ikaia/VB.htm プログラムは,ステートメント、関数の活用や、繰り返しロジックに持ち込む技術といえます。私はもし5回程度以上列挙するコードになったら、別に良い方法がないか考えてます。 本当の質問者のレベルが見えませんので、失礼になるかもしれませんが、質問が事実で、他に特別な理由がないなら、奮起してさらに勉強が必要です。 #3でもおっしゃっていることのほかに、周りにプログラムのわかる助言者でもおられれば、しばらくは見てもらって、知識を吸収し方が良いですよ。また関数やロジックやアルゴリズムに関心を持ってください。

回答No.4

偶数奇数の判定モジュール。 2で割ってあまりを見る方法以外にも。 if (b and 1) = 0 then a=true else a=false end if これは2進数で表示した時、1ビット目が1の場合は奇数である。1ビット目が0の場合偶数である。 これを利用したものです。 たしか、割り算をするよりもビット演算の方が実行速度が速かった気がします。(VBでも速いのかよくわからないですが。)

  • don_go
  • ベストアンサー率31% (336/1059)
回答No.3

解答自体は、No.1 No.2で良いのですが、回りに質問できる 同僚・先輩・上司等はおられないのでしょうか? 他にも同様な事をしていて、その結果が連日の深夜残業に なっている様な気がします。 他にも困っている問題が残っているのであれば、納期遅れ になる前に上司に報告して判断を仰ぎましょう。

  • toshi_2000
  • ベストアンサー率30% (306/1002)
回答No.2

以下の通り if (b mod 2)=0 then a=false else a=true end if

  • shiojiri
  • ベストアンサー率43% (84/192)
回答No.1

If ((b / 2) - Int(b / 2)) Then a = True Else a = False 2で割って小数点以下を削除した物と比べています。

関連するQ&A

  • 偶数、奇数の判定について

    こんばんは 以下のマクロにて、最初はx=1なので「奇数」、次はx=x+1で2になっているので「偶数」と表示されるように作ったつもりなのですが、何故か全部「奇数」の表示になってしまいます。 どこがおかしいのか分からないので、教えて頂きたいです。 Sub macro() Dim x, y As Integer x = 1 Do y = x Mod 2 Select Case y Case y = 0 MsgBox "偶数" Case y = 1 MsgBox "奇数" End Select x = x + 1 Loop Until x = 10 End Sub

  • 奇数・偶数の判断 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列の値が奇数だったらB列に○、偶数だったらB列に×を入れたいのです。 A列に入力したら、B列に○×を自動的にだすということを 関数を使ってできますか? わかる方教えて下さい。

  • アクションスクリプト2.0 奇数と偶数の判別

    ボタンアクションでaとbに数字を入力して、 aとbに入力された数字が奇数か偶数を判別して cとdに出力したいのですがうまくいきません。 FLASH CS5.5を使っています。 わかる方コードを教えてくださると助かります。

    • ベストアンサー
    • Flash
  • excel・VBAで奇数・偶数の分岐がうまくいかない。

    一覧が入っているシートから宛名用のシール印刷をするために、VBAを使用しています。 ラベル印刷は ┏━━━━┓┏━━━━┓ ┃ 奇数 ┃┃ 偶数 ┃ ┗━━━━┛┗━━━━┛ みたいな感じです。 奇数:一覧シートの奇数行 偶数:一覧シートの偶数行 ですが、奇数の方はうまく出るのですが、偶数の方が1つおきになってしまいます。 これのどこが間違っているのでしょうか? Worksheets("Sheet1").Select Last = Cells(1).CurrentRegion.Rows.Count For i = 2 To Last Worksheets("Sheet1").Select Yuubin = Cells(i, 1) Name = Cells(i, 6) Dim AllCount As Integer Worksheets("TEST").Select Kotae = i / 2 Amari = i Mod 2 AllCount = i / 12 If Amari = 0 Then Ichi = (((Kotae - 1) * 9) + 1) - AllCount Cells(Ichi, 2) = "〒" & Left(Yuubin, 3) & "-" & Right(Yuubin, 4) Cells(Ichi + 7, 4) = Name & " 様" ElseIf Amari = 1 Then Ichi = (((Kotae - 1) * 9) + 1) - AllCount Cells(Ichi, 17) = "〒" & Left(Yuubin, 3) & "-" & Right(Yuubin, 4) Cells(Ichi + 7, 19) = Name & " 様" & i End If '奇数偶数分岐 Next ' 全件分終るまで よろしくお願いします。

  • 奇数・偶数の数をカウントする方法

    どなたかご存じでしたらご教授願います。 【質問】 下記の様に、A1~E1に数字を入力したら、 その2行下に、入力した数字を表示して 奇数、偶数をカウントして右側に結果を表示するにはどうすればよいですか? A B C D E 3 4 5 10 31 ---------------------- 奇数 偶数 3 4 5 10 31  → 2  3 〇注意事項  ・入力する数字は1~99迄で、重複数字は入力しません。  ・使用するエクセルは2010です。 以上、よろしくお願いします。

  • エクセル:偶数セルと奇数セルそれぞれの合計

    エクセルで作成した表で 「A2+A4+A6」 や 「B3+B5+B7」のようにそれぞれ偶数セル、奇数セルの数値の合計を表示させたいのですが、よい計算方法はありますか?それとも何十個というセルを地道に足していくしかないのでしょうか? 少ないセル数ならいいのですが、多くのセルの合計を出したいので困っています。どなたか分かりやすく教えていただけないでしょうか?お願いします。

  • エクセルVBAのDeleteキーによるエラー

    VBA初心者です。エクセル(2003)のVBAについて質問です。 セルに何か値が入力されたら、隣のセルに「TRUE」と入力し、 入力が消去されたら、隣のセルに「FALSE]と入力されるマクロを作成しています。 下記のコードをシートモジュールに入力し、 標準モジュールにはそれぞれ呼び出し用のマクロを入力しています。 A列とB列は結合されていて、その結合されたA・B列のセルに値が入力されたり消去されたりすると 隣のC列に結果が入力されるようにしたいのですが、 A・B列の値をDeleteキーで消去するとエラーになってしまいます。 BSキーで値を消去するとエラーは出ません。 Deleteキーでもエラーが出ない様にする方法はありますでしょうか。 どなたかご教授お願いします。 ----------------------------------------------------- Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("A1:B1,A3:B3,A5:B5")) Is Nothing Then If Target.Value <> "" Then Select Case Target.Address(0, 0) Case "A1" Call マクロ1_TRUE Case "A3" Call マクロ3_TRUE Case "A5" Call マクロ5_TRUE End Select ElseIf Target.Value = "" Then Select Case Target.Address(0, 0) Case "A1" Call マクロ1_FALSE Case "A3" Call マクロ3_FALSE Case "A5" Call マクロ5_FALSE End Select End If End If End Sub

  • 奇数・偶数ページごとに差し込み印刷を設定する方法

    ワードの差し込み印刷を使って、奇数ページ・偶数ページの それぞれのページに別の内容を差し込みたいのですが上手くいかないので教えてください フィールドの内容がA,B,C,D・・・だったとして 一ページ目にA、二ページ目にB、三ページ目にC、四ページ目にD・・・という風にしたいのですが 奇数ページ、NextRecord、偶数ページで差し込もうとすると 一ページ目にA、二ページ目にB、三ページ目にB、四ページ目にC・・・となってしまいます

  • ファンクションキーの使用制御について

    こんばんわ。 VB6にて、2つのボタンに対してファンクションキー(F5とF7)を割り当てているのですが、 1回押したらプログラムが1サイクル終了するまで使用禁止にしたいのですが、わかりません。 ボタンの方は、EnableをTrue/Falseでできましたが、ファンクションキーはできません。 ちなみに今のファンクションキー割り当てのコードです。 Select Case KeyCode Case vbKeyF5 Call Command1_Click Case vbKeyF7 Call Command2_Click Case Else End Select です。 どなたかよろしくお願いいたします!

専門家に質問してみよう