
任意の整数の偶数/奇数を判定するモジュールを開発しています。
納期は連休明けです。
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行ずつ眼でチェックしていますが、紙を大量に消費しますし、時間もばかになりません。
効率よくバグを検出する方法を教えてください。
連日の深夜残業でかなり参っています。(><)
A 回答 (10件)
- 最新から表示
- 回答順に表示
No.10
- 回答日時:
失礼を承知で一言。
もし小生のプロジェクトにこのようなプログラムを記述している人物がいるとしたら、『現時点のプログラム能力も、将来性も無い』ということで抜けて頂く以外ありません。
四則演算+剰余算、ビット演算は、プログラム言語に依存しない、基礎中の基礎だからです。
あまりにも基礎過ぎて、ポカッと抜けて難しく考えてしまう、ということがゼロであるとは言いませんし、それだけで上記のような判断は厳しすぎる、とは小生も感じます。
上記のような判断は、ポカッと抜けるにしても『オイオイしっかりしてくれよ』というレベルである、ということもありますが、他の人に相談できないというコミュニケーション能力の無さにあります。
モジュールレベル開発である、と貴殿がおっしゃっているゆえに、そのモジュールの仕様(引数、返り値等)を指示する人物がいるはずですが、その人に相談できないわけが無いからそう判断します。
これは他の回答者様も感じているのではないか、と思いますが、偶数か奇数か判定する関数、など普通はわざわざモジュール化せずとも、関数一個(Mod でも And でも)で済むものですので、なぜそんなことをするのだろう?という疑問があります。
現プロジェクト責任者の方(もしくは貴殿にモジュール内容を指示する人)も、小生と同様に感じているにもかかわらず、何らかのしがらみで不要の判断を下せずに(その責任を取ることがイヤで?)、毒にも薬にもならないことを貴殿に指示している、というのはそれほど的外れの推察ではない気がします。
ごく短期的に考えると、プログラマーの能力は『現時点でのプログラム能力』の事でしょうが、ある程度長期的に考えると、プログラマーの能力とは『他人とのコミュニケーション能力』です。
わからないことを自分ひとりで抱え込まずに、上司、同僚に相談できる能力。
雑談レベルでもかまわないので、『こう実装しよう思うのだけど、もっと効率的な方法があるような気がして仕方が無い』、と相談できる能力。
『自分には難しすぎで無理です』と、自分の力量、仕事の難しさを判断して相談できる能力。
『このように指示されたのですが、この条件の場合に矛盾が生じますが、その場合はどうすればよいのですか』と確認できる能力。
等々
ここで質問するのは、解決は教えてもらえるでしょうが、職場内でのコミュニケーション能力の向上には役立ちません。
小生はコミュニケーション能力の高い人物には、大きな将来性を感じます。
質問には関係のない事で、しかも推論を重ねた上での、さらに質問者様への厳しい意見ですが、質問者様の仕事に対していくらかプラスになればと思い、僭越ながら書かせていただきました。
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
No.8
- 回答日時:
以下のPGで可能です。
If b Mod 2 = 1 Then
a = True
Else
a = False
End If
尚、Modは商の余りを計算する演算子です。
No.7
- 回答日時:
No.6 の訂正
a = b And 1
でも、偶数・奇数の判定ができます。
a = 1 :奇数
a = 0 :偶数
または
a = (b And 1) = 1
でも、偶数・奇数の判定ができます。
a = True :奇数
a = False:偶数
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 …
¥という演算子もあります。
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でも速いのかよくわからないですが。)
No.3
- 回答日時:
解答自体は、No.1 No.2で良いのですが、回りに質問できる
同僚・先輩・上司等はおられないのでしょうか?
他にも同様な事をしていて、その結果が連日の深夜残業に
なっている様な気がします。
他にも困っている問題が残っているのであれば、納期遅れ
になる前に上司に報告して判断を仰ぎましょう。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vba userFormのSubを標準モジュ...
-
acwzlibとは?
-
VBAで別モジュールへの変数の受...
-
大量の標準モジュールを解放す...
-
モジュールの最大数はいくつな...
-
Excel VBA 定義されたプロージ...
-
Excel VBAで、ユーザーフォーム...
-
【vba】フォームに書いてあ...
-
ユーザー定義関数に#NAME?が返...
-
Excel VBAでリンク切れをチェッ...
-
標準モジュールを削除したい。(...
-
ユーザー定義関数をEXCELに常駐...
-
Excel VBA 『Call』で呼び出す...
-
VBでグローバル変数を宣言するには
-
VBA モジュールで共通に使う変...
-
エクセルVBAでシートモジュール...
-
モジュールとクラスの違いって...
-
'Range'メソッドは失敗しました
-
Friend は標準モジュールじゃ宣...
-
VBA起動時のコンボボックスにつ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel VBAでリンク切れをチェッ...
-
Excel VBAで、ユーザーフォーム...
-
ユーザー定義関数に#NAME?が返...
-
vba userFormのSubを標準モジュ...
-
Excel VBA 定義されたプロージ...
-
モジュールとクラスの違いって...
-
モジュールの最大数はいくつな...
-
VBAで別モジュールへの変数の受...
-
Excel VBA 『Call』で呼び出す...
-
エクセルVBAでシートモジュール...
-
VBでグローバル変数を宣言するには
-
【vba】フォームに書いてあ...
-
SendKeysの使い方について
-
モジュールからフォームのボタ...
-
VBAで旧字体を異字体に一括で変...
-
モジュールとは何ですか
-
ExcelでTelnetを動かしたい
-
標準モジュールを削除したい。(...
-
VBA This Workbookモジュール...
-
Access VBA標準モジュールにつ...
おすすめ情報