今回の解答は、以下の通りです。
今回の「主役」が、「コンパイルエラーにならないコンパイルエラー」という以下のバグです。
1.「scanf("%d",time);」の&が抜けている
scanf関数は、「&」の付け忘れが頻発することで有名な関数です。本問題でも、&の付け忘れによって、プログラムがハングアップしてしまいました。scanf関数は、実際の開発で使うことはほとんどないでしょうが、サンプルプログラムをコピーする際は、注意してください。なお、文字列として入力する場合、&は使いません。そんなこともあり、エラーメッセージは現れず、意図した通りの動作をしません。
2.「if (zone = 0) {」が「==」となっていない
scanfのバグを修正しても正しく動きません。if文の条件式が、「if (zone == 0)」となっていないため、通常勤務を入力しても、else以下を実行します。「if (zone = 0)」では、zone=0に代入した後、式を評価します。if文は、条件式が0の場合は偽、0以外は真となります。結果として、通常勤務を入力しても偽となりelse以下を実行します。今回のように、通常勤務と深夜勤務の判定に使う場合は、「==」としましょう。
「主役的バグ」ではありませんが、処理内容に違和感のある箇所があります。問題文で、「なお、本問題では、リスト2の入力パターン以外は考慮しないこと」と書いてありますので、バグと断定するには微妙ですが。
1.通常勤務と深夜勤務が何時からか指定がない
通常時間帯から深夜時間帯へ連続して勤務する場合、このプログラムでは2回に分けて入力し、手計算で両方を足さないと、正しい給与は計算できません。
2.勤務時間帯として「2」を入力してもエラーにならない
プログラムのif文では、勤務時間帯が通常勤務(0)以外は、深夜勤務にしています。「2」を入力した場合、本来は、エラーメッセージを表示して、再入力させるべきですね。
今回の自己採点シートを以下に示します。
問題 | 内容 | 配点(点) |
---|---|---|
給与計算プログラム | 問題文を一通り読んだ | 10 |
ソースコードを一通り読んだ | 20 | |
デバッグをした | 20 | |
「scanf("%d",time);」の&が抜けているバグを見つけた | 20 | |
「if (zone = 0) {」が「==」となっていないバグを見つけた | 20 | |
処理系のバグも見つけた | 10 | |
リスト4 自己採点シート |
今回は、コンパイルエラーにならないけど、意図しない動作をする問題を出題しました。一見、正しくコンパイルできてしまうので、タチの悪いバグです。皆さんも、長い経験の中で、今回のような記述ミスによるバグに手間取った経験をお持ちかと思います。このようなバグは、開発のデバッグ工程で見つかることが多く、大事にはならないでしょうが、注意深い記述を心掛けましょう。
東海大学 大学院 組込み技術研究科 非常勤講師(工学博士)
Copyright © ITmedia, Inc. All Rights Reserved.