こんにちは､ そしてようこそ｡
週給の計算についての課題を解決する方法を提供したいと思います｡
そこで､ ここでは素敵なデモンストレーションをお見せします｡ コードブロックを表示させ､
現在開いているプロジェクトを閉じて､ このアプリケーションのための新しいプロジェクトを開いて作成しましょう｡
ということで､ コンソールアプリケーションを作るので､ c.I.D.になります｡
そして､ これを週給計算と名付けることにする｡
だから､ 私はメインを持つことにしました｡ c ファイルを作成することで､
良いスタート地点に立つことができます｡
でも､ このソリューションでは､ ちょっと違うかもしれないことがいくつかあるんだ｡
しかし､ それはあなたにいくつかのコンセプトを紹介することになるでしょう｡
それらについては後述しますが､ このプログラムでは主に給与率や税率に定数を多用する予定です｡
そこで､ まだ見ぬ定義と呼ばれるものを使ってみます｡
定数を作成するためのプリプロセッサー指示文です｡
プリプロセッサ・ディレクティブであることを示すには､ ポンド記号を使用します｡
だから､ パウンドディファインと言うんです｡ これは､ 定数を作るための方法です｡
このプログラムでは､ すべてのデータに対して5つの定数を作成するつもりです｡
12となるペイレートを設定しています｡ 00.
つまり､ defineの仕組みは､ 定義されたキーワードの後にポンドを使い､
通常はすべて大文字で名前を指定します｡
それが標準的な慣例で､ 次にスペース､ そして値です｡
ここではイコールの割り当てがない｡ そして､ これは本質的に定数変数を作っているのです｡
そこで､ 給与率､ 税率300のものを作成します｡
実際には150の税率とか300以下の税率とか言って､ 税率は0になるんですけどね｡
15.
代入するデータは､ 浮動小数点数の整数でも､ 文字列でも良いことにお気づきでしょう｡
ここではデータの種類は関係ない｡
150の税率は0にすることができます｡
20. で､ 通常､ ファイルの先頭のメインの外側にあるdefineを行います｡
また､ ソースコードの上部や全体にコメントをつけることも忘れずに｡
そして､ 最後に残りの税率を0にします｡
25.
最後に､ 残業の定数を作成し､ 残業を呼び出して40と言うことにします｡
これは､
40より大きいかどうかをチェックする場合だけを表します｡
変数の中にマジックナンバーを入れるのは､
決して良いアイデアではありません｡
の右側で､ 私のプログラムも全く同じように動作します｡
もしこの定数がなく､ 比較や変数にマジックナンバーを使っていたら､
40を使うところではどこでも変更しなければなりません｡
だから､ 定数を使う習慣をつけて､ マジックナンバーと呼ばれるものを使わないようにしましょう｡
また､ 変数の宣言はメインの冒頭で行うのが好きです｡
これらは､ メイン関数のローカル変数です｡
そこで､ 変数を宣言するコメントを入れたいと思います｡
ローカルに必要な変数として､ 時間を表す整数を作成し､ それを0に初期化することにします｡
時間はユーザーによって入力され､ 次に出力として表示されるいくつかの倍数を作成するつもりです｡
ダブルだから0｡
それから税金､ 0も初期化します｡ セミコロンで終わる0､
セミコロンを忘れずに､ そして純支給額｡
なぜなら､ これが私の求める3つのアウトプットだからです｡
そこで､ 入力時間と一緒に､ 3つの出力をトップに作成することにします｡
最初にやりたいことは､ 入力を得たいので､ ユーザーに何かを入力するように指示することです｡
今週働いた時間数を入力してくださいと言うつもりで､
コロン､ 小さなスペース､ セミコロンを入れてください｡
次に､ scanf関数で入力を取得します｡
スキャンフってことで｡ 整数を読み込みたい｡ だから､ パーセントdとする｡
カンマを入れて､ hoursとやって､ 文字列や文字ではないので､
前にアンパサンドを入れて､ セミコロンで終わらせています｡
それが読み込まれるんです｡ そして､ この時点で私がすべきことは､
テストすること､ 小さな塊で作業すること､ そして常にテストすることです｡
コンパイルしようと思ってコードを書き続けていると､ どこででも問題が発生する可能性があるので､
小さな領域で作業しています｡
でも､ これが有効なのは知っています｡ というわけで､ その方法の実演に移ります｡
まず最初にグロスペイを計算すると言ったように｡
ここのロジックでは､ if文が必要になります｡
基本的に40時間を超える場合は､ 時間外割増が欲しいところです｡
つまり､ 労働時間が40時間以下であれば､
賃率に労働時間をかけただけの計算で済むので､
非常に簡単です｡
24行目にifキーワードを設定し､
時間を設定しました｡
比較をしているところです｡ 関係演算子であるless than equalsを使っています｡ 4以下の場合は､ 1つのステートメントを使用しなければならないので､
ブラケットを使用するつもりはありません｡
総支給額と言うことで｡ 変数を設定します......時間数×定数､
賃金率に等しくします｡
さて､ 40以上であれば､ 別のことをしたいと思います｡
そこで､
この条件がfalseと評価された場合､ elseを用意することになります｡ elseはブロックの中に複数の行を持つことになるので､
括弧を使って､ 27行目から開始括弧29で終了括弧とします｡
括弧の不一致や括弧がないことは､ コンパイラが発見する可能性のある一般的なエラーです｡
だから､ そのブラケットをしっかり合わせてください｡ IDEはそれを強調してくれるので､ とても助かります｡
複数のブラケットを持っていれば､ いつでも別のブラケットに行くことができます｡
下のブラケットに移動すると､ スタート地点のブラケットがハイライト表示されます｡
このテープでは､ 40時間以上の場合､
まず､ 最初の40時間は時給が12ドルになるので､
総支給額を40倍に設定します｡
そして､ それ以降はすべて､ もっと増えていくのです｡
そこで､ 残業代というローカル変数を作り､
時間から40を引いたものを設定することにします｡
だから､ 40と入力してもここでは5になってしまうんです｡
そして､ その時間を時給に換算すると12ドルですが､
これに1を足します｡
5､
つまり1時間18ドルになります｡
そして､ セミコロンで終わります｡
このままでは私の残業代は5×18､ ユーザーとして45と入力したら90円になりそうです｡
で､ 最初の40時間は､ 570と言うのは40×12になるだけです｡
40回×12回で480回になります｡
さて､ 最後にしなければならないのは､ 総支給額と時間外手当を足すことです｡
だから､ まだ猶予給がないので､ 総支給額よりももっといい名前を使えたかもしれません｡
でも､ ちょっといい演算子を使ってみましょう｡
代入演算子プラスイコールで､ 残業代を計算することができるんです｡
これは､ 総支給額＝総支給額＋残業代と言うことです｡
が､ 省略記法でやっています｡
これでグロスペイは終了ですね｡
そこで､ 先にテストをして､ 総支給額をプリントアウトして､ それが正しいかどうかを確認します｡
が､ これで動くことがわかったので､ 次のステップに進みます｡
次に､ 税金の計算です｡
だから､ 税金の計算をするために､ 覚えておいてほしいのは､ 稼いだ金額によって､ あることをしなければならないということです｡
だから､ 総支給額を見ることになるんです｡
それで､ もし総支給額が300以下なら､ 何かするつもりです｡
給料グロス300と450なら何とか
で､ 450より大きい場合は､ 別のことをすることになります｡
ここで少しコードの重複が発生します｡
というのは､ 今はif文のデモをしているだけなので､ 大丈夫です｡
もう少しきれいに書けるかもしれません｡
しかし､ 私がやろうとすることは､ まず､ 最初の条件をチェックすることです｡
で､
その場合､ 税金の計算がとても簡単になります｡
税金は総支給額×300の税率になるだけです｡
300の税率は､ 300以上のものには15％だったかな､
税金がかかるんです｡
だから､ 300以下ならそれでいいんです｡
ここでも､ もうひとつ注目していただきたいのは､ インデントです｡
コードのブロックがあるときはいつでも､ たとえ1つのステートメントしかなくても､ そこにブラケットを付けようとします｡
と､ ブロックを示すと､ 読みやすくなります｡ 改行時のインデントも忘れずに｡
一般的には､ タブではなくスペースが必要ですが､ それはまた別の話です｡
また､ 他のものである可能性もあります｡
そこで34行目で「総支給額が300以下なら､
36行目で何かしてください」と質問しています｡
if キーワードを使用する場合は､ 条件のブール式を括弧で囲みます｡
が､ 300以下だったらどうしよう､ それなら別のことをしたい｡
具体的には､
総支給額が300を超える場合､ ここでは論理演算子アンパサンドampersandを使って､
本質的に2つの質問をしているのです｡
総支給額が300より大きく､
総支給額が450と同額以下なら､ 別のことをしたい｡
つまり､ 私の総支給額が300から450の間であれば､ これは何を言っているのでしょう｡
今､ 300から450の間だったら､
まず､ 前と同じように税金を計算したいんだ｡
の場合､ 300の税率をかけたい｡
なぜなら､ 最初の300人はその税率で課税されるからです｡
もう一方の金額については､ 税率を150で行いたいので､
ポイント20％となります｡
そこでまず､ 300以上の儲けを調べなければならないのですが､
実はこれは一行でできるんです｡
税金プラスイコールでやるから､
これは税金イコールで､ もう税率300倍､ 税金プラス何かと言ってるわけです｡
そして､
40行目で計算された最初の税金に追加したいのは､
総支給額から300を引いた金額で､
450を超えないことはすでに確定しています｡
総支給額から300倍の税率を引いて150になるわけです｡
そこで､ 私が何をしたかを見てください｡
38行目の300から450の間のどこかの金額を稼いだとしたら､
最初の300の税金は税率300倍で､ 総支給額がその税率300倍を越えて150でいくらだったかを足したいのですが､ どうでしょうか？
これで2つの条件を満たしたので､ 最後の条件は450以上稼いだかどうかです｡
だから､ 基本的には総支給額が450を超えたらelseとか､ 本当にelseだけでいいんです｡
が､ わかりやすくするために､ else if を入れて､ else
gross pay is greater than 450 とします｡
ifがなくてもelseがあればいいので､ 本当は必要ないのですが､ elseのifを実証してみたいと思います｡
この場合､ 最初の300人分の税金を計算したいので､ ここにコードをコピーします｡
150の分の税金も計算したいので､ 次の150の分はプラスイコールで300から450になりますね｡
つまり､
これは税率150倍となる｡
そして最後に､ 残りに一定の税率をかけたいと思います｡
だからここでは､ 税金プラスイコール､ またプラスイコールは税金プラスと言うことにしています｡
で､ ここでは総支給額から450を引いた額としていますが､
これは給与全体に税金を適用するのではなく､
450を超えた部分だけに税金を適用したいからです｡
そして､ 税率イコール残り､ つまり上で定義した定数変数を掛けたいのです｡
で終わりです｡ 税金の計算が終わった｡
そしてまた､ 各ステップの後にこれをテストし､ 正しくコンパイルとテストが行われていることを確認するのです｡
が､ インデントされているのがわかると思います｡ これは読みやすいですね｡ コメント､ 全部やってます｡
最後にネットペイを計算する｡
これは､ 純支給額が総支給額から税金を差し引いたものになるので､
非常にシンプルになります｡
で､ 出力したものを表示させたい｡
と､ 総支給額､ 税額､ 純支給額を表示することが条件だったのを覚えています｡
そこで､ ここでprintfを使うことができる｡
と､ 時間を取らせないように､ 効率の良いようにコピー＆ペーストでご紹介します｡
コピー＆ペーストをすると､ プログラミングでコピー＆ペーストをするのはおかしいと､
学生に怒られることがあるんです｡ まあ､ ある程度はそうなんですけどね｡
コピー＆ペーストで､ そのコードを完全に理解していれば､ より効率的です｡
コピー＆ペーストの問題は､ 多くの開発者がコピー＆ペーストをすることで､ そのコードがどのように機能するのかがわからなくなり､
それがうまくいくことをただただ願うようになることです｡
が､ 今回はprintout文がどのように機能するか知っているので､ ここで何が起こっているかを示したいだけなのです｡
だから､ キーボードを打つのに無駄な時間を待つ必要がないんです｡
そこで､ 54行目にグロスペイを表示させます｡
フロートです｡ 変数の値を表示する方法を知っています｡
で､ 唯一特殊なのは､ 出力を小数点以下2桁にフォーマットしているので､ %に気がつくはずです｡
2f
の後､ バックスラッシュ n はエスケープシーケンスのラインフィードです｡
だから､ お金を表示するときはセントで､ パーセントのセントはないので､
すべて小数点以下2桁でフォーマットしています｡
で､ 税金を同じフォーマットで表示し､ 純支給額も表示しています｡
だから､ そこはかなりいい｡
で､ やはりこのプログラムで注目していただきたいのは､ インデントです｡
とても読みやすいですね｡ トップで定数変数を使っています｡
変数を初期化しています｡ なぜ宣言したのか？
すべてにおいて､ すっきりしています｡ コメントを提供しています｡ if else文の束を書いている｡
うまくいけば､ これですべて解決です｡ ロジックはそれほど難しくはないのですが､ ソースコードをダウンロードすることができますので､
お持ちになると､ より解析しやすくなります｡
しかし､
何も問題がないことを確認するように､ ビルドしてコンパイルするとどうなるかを見てみましょう｡
ビルドすると､ 未使用の警告があると表示される｡
ここに似ていますね｡
私は何かが不足している期待されている意味をなさない括弧の前にセミコロン｡
がないのは､ 意味不明な括弧の前にセミコロンがあることを想定しています｡
だから､
ここに足りないのは､ まあ､ 他にはないかなあと｡ でないと意味がない､
ifを忘れてしまった｡ So else if.
その下に "else "と "if "がありますが､ これはどうなっているのでしょうか？
というのは意味がない｡ は､ elseとelse ifを持つことができません｡
では次に､ ここで何が起こるか見てみましょう｡
現在では､ 0個のエラーと0個の警告が表示されます｡
これとウィルススキャナーを動かしてみましょう｡
これを実行すると､ まず最初に､ 今週の労働時間数を入力してください､ と表示されます｡
45より高いものを入れるから､ 残業が実証されるんです｡
40より45､ 4高いということにしておく｡ 45で､ 570ドル稼いだと書いてある､
から正しい｡ 40ドルまでのものは､ 1時間12ドルで､
400ドルと80ドルになるように計算しました｡
で､ 5時間は1時間18ドルだから､ 90＋480で570｡
今週の税金は105ドル､ 手取りは465ドルでした｡
ナイスイーブンナンバーズ その計算が正しいかどうかを確認することができます｡
これを何度も何度も実行して､ いろいろなデータの出力を見てみるとよいでしょう｡
40以下のもので動かしてみよう｡
今週は30時間としよう､
残業代は出ないよ｡ 30×12で360になります｡
最初の300円は､ 税率15％で課税されるんだ｡
そして60ドルには20％の税金がかかり､
12ドルになります｡
つまり､ 45＋12で57が正しいようです｡
で､ 今週の純支給額は303､ 360から57を引いた額です｡
というわけで､ なかなかいい感じで動いているようです｡
450以上の収益がある場合は､ もっと検証してみたい｡
もうひとつ､ テストにおいて重要なことは､ すべての境界線をテストすることです｡
1つのテストだけを提供したいわけではないのです｡ はすべて動作します｡
良い事例と悪い事例を提供したい｡
この例では､ このプログラムにはさまざまなケースがありますが､
40時間以上稼ぐケースもありますね｡
だから､ 残業代が出るんですね｡ 収入が300以下の場合､
300〜450の場合､ 450を超える場合があります｡
このプログラムでは､ 少なくとも4つのテストケースか5つのテストケースを実行する必要があります｡
おそらく300円以下､
残業代以下だから4件でも大丈夫だろう｡
しかし､ 本当にテストしたいのは､ 残業時間､ それから3つの税率なのです｡
参考になったでしょうか｡ 私が示したことを十分に理解してほしい｡
ifステートメントや､ 私がどのようにコードを読みやすくし､ 意味のある名前を使用しているか､
すべて理解していただけたでしょうか？ ありがとうございます｡