- 締切済み
偶数/奇数の判定
任意の整数の偶数/奇数を判定するモジュールを開発しています。 納期は連休明けです。 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行ずつ眼でチェックしていますが、紙を大量に消費しますし、時間もばかになりません。 効率よくバグを検出する方法を教えてください。 連日の深夜残業でかなり参っています。(><)
- みんなの回答 (10)
- 専門家の回答
みんなの回答
- BellBell
- ベストアンサー率54% (327/598)
失礼を承知で一言。 もし小生のプロジェクトにこのようなプログラムを記述している人物がいるとしたら、『現時点のプログラム能力も、将来性も無い』ということで抜けて頂く以外ありません。 四則演算+剰余算、ビット演算は、プログラム言語に依存しない、基礎中の基礎だからです。 あまりにも基礎過ぎて、ポカッと抜けて難しく考えてしまう、ということがゼロであるとは言いませんし、それだけで上記のような判断は厳しすぎる、とは小生も感じます。 上記のような判断は、ポカッと抜けるにしても『オイオイしっかりしてくれよ』というレベルである、ということもありますが、他の人に相談できないというコミュニケーション能力の無さにあります。 モジュールレベル開発である、と貴殿がおっしゃっているゆえに、そのモジュールの仕様(引数、返り値等)を指示する人物がいるはずですが、その人に相談できないわけが無いからそう判断します。 これは他の回答者様も感じているのではないか、と思いますが、偶数か奇数か判定する関数、など普通はわざわざモジュール化せずとも、関数一個(Mod でも And でも)で済むものですので、なぜそんなことをするのだろう?という疑問があります。 現プロジェクト責任者の方(もしくは貴殿にモジュール内容を指示する人)も、小生と同様に感じているにもかかわらず、何らかのしがらみで不要の判断を下せずに(その責任を取ることがイヤで?)、毒にも薬にもならないことを貴殿に指示している、というのはそれほど的外れの推察ではない気がします。 ごく短期的に考えると、プログラマーの能力は『現時点でのプログラム能力』の事でしょうが、ある程度長期的に考えると、プログラマーの能力とは『他人とのコミュニケーション能力』です。 わからないことを自分ひとりで抱え込まずに、上司、同僚に相談できる能力。 雑談レベルでもかまわないので、『こう実装しよう思うのだけど、もっと効率的な方法があるような気がして仕方が無い』、と相談できる能力。 『自分には難しすぎで無理です』と、自分の力量、仕事の難しさを判断して相談できる能力。 『このように指示されたのですが、この条件の場合に矛盾が生じますが、その場合はどうすればよいのですか』と確認できる能力。 等々 ここで質問するのは、解決は教えてもらえるでしょうが、職場内でのコミュニケーション能力の向上には役立ちません。 小生はコミュニケーション能力の高い人物には、大きな将来性を感じます。 質問には関係のない事で、しかも推論を重ねた上での、さらに質問者様への厳しい意見ですが、質問者様の仕事に対していくらかプラスになればと思い、僭越ながら書かせていただきました。
答えは出尽くしていますが... 私なら、関数名も重視します。 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
以下のPGで可能です。 If b Mod 2 = 1 Then a = True Else a = False End If 尚、Modは商の余りを計算する演算子です。
- don_go
- ベストアンサー率31% (336/1059)
No.6 の訂正 a = b And 1 でも、偶数・奇数の判定ができます。 a = 1 :奇数 a = 0 :偶数 または a = (b And 1) = 1 でも、偶数・奇数の判定ができます。 a = True :奇数 a = False:偶数
- don_go
- ベストアンサー率31% (336/1059)
ちなみに a = b And 1 でも、偶数・奇数の判定ができます。 a = True :奇数 a = False:偶数 No.4 の応用
- imogasi
- ベストアンサー率27% (4737/17069)
これは「モジュールを開発」というレベルですかね。 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でもおっしゃっていることのほかに、周りにプログラムのわかる助言者でもおられれば、しばらくは見てもらって、知識を吸収し方が良いですよ。また関数やロジックやアルゴリズムに関心を持ってください。
- silverbear
- ベストアンサー率25% (163/639)
偶数奇数の判定モジュール。 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.1 No.2で良いのですが、回りに質問できる 同僚・先輩・上司等はおられないのでしょうか? 他にも同様な事をしていて、その結果が連日の深夜残業に なっている様な気がします。 他にも困っている問題が残っているのであれば、納期遅れ になる前に上司に報告して判断を仰ぎましょう。
- toshi_2000
- ベストアンサー率30% (306/1002)
以下の通り if (b mod 2)=0 then a=false else a=true end if
- shiojiri
- ベストアンサー率43% (84/192)
If ((b / 2) - Int(b / 2)) Then a = True Else a = False 2で割って小数点以下を削除した物と比べています。