
任意の整数の偶数/奇数を判定するモジュールを開発しています。
納期は連休明けです。
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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) ワークシートチェンジで曜日を表示する方法 1 2023/03/04 21:51
- Visual Basic(VBA) vbaでセルに入力したときに,その横にあるセルを保護し入力不可にするマクロを作りたいです。 2 2022/04/24 20:59
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) 先ほど、回答者様によって教えていただいたのですがどうしたらいいか分かりません。 ユーザーフォーム上に 2 2023/02/21 22:25
- Visual Basic(VBA) いつもお世話になります 下記のコード実行すると エラーになります わかるかた教えてくれませんでしょう 6 2022/12/17 15:01
- Visual Basic(VBA) Vbaで数式をポーランド記法に変換するコードを作って実行しようとするとフリーズします。 1 2022/05/24 17:53
- Visual Basic(VBA) select caseの入れ子 3 2023/03/08 18:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vba userFormのSubを標準モジュ...
-
ユーザー定義関数に#NAME?が返...
-
エクセルVBAでシートモジュール...
-
Excel VBA 定義されたプロージ...
-
VBでグローバル変数を宣言するには
-
Excel VBAでリンク切れをチェッ...
-
Form間の値の渡し方
-
Excel VBAで、ユーザーフォーム...
-
標準モジュールを削除したい。(...
-
VBAで旧字体を異字体に一括で変...
-
VBAで「メモリが不足しています」
-
ExcelVBA:パブリック オブジェ...
-
エクセルVBA クラスモジュール...
-
【ExcelVBA】commandButtonをク...
-
偶数/奇数の判定
-
VBAを使用してWordからExcelの...
-
モジュールの最大数はいくつな...
-
ExcelでTelnetを動かしたい
-
vba 標準モジュールインポート...
-
Excel VBA 『Call』で呼び出す...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAで別モジュールへの変数の受...
-
ユーザー定義関数に#NAME?が返...
-
エクセルVBAでシートモジュール...
-
Excel VBAでリンク切れをチェッ...
-
Excel VBAで、ユーザーフォーム...
-
Excel VBA 定義されたプロージ...
-
VBでグローバル変数を宣言するには
-
vba userFormのSubを標準モジュ...
-
モジュールの最大数はいくつな...
-
【vba】フォームに書いてあ...
-
Excel VBA 『Call』で呼び出す...
-
VBAで旧字体を異字体に一括で変...
-
モジュールとクラスの違いって...
-
モジュールからフォームのボタ...
-
大量の標準モジュールを解放す...
-
acwzlibとは?
-
SendKeysの使い方について
-
標準モジュールを削除したい。(...
-
VBA This Workbookモジュール...
-
VBA モジュールで共通に使う変...
おすすめ情報