こんにちは､ そしてようこそ｡ 今回のデモでは､ 最後の課題に対する解決策を提示したいと思います｡
そこで､
分数を取って､ その表現が何日で､ 何年であるかに変換している私たちのcプログラムにソリューションを提供したいと思います｡
必ずしも実用的なプログラムではありませんが､
主に算術演算子やキーボードからの入力を使って､
皆さんが学ぶことのできるいくつかの重要な概念を示しています｡
キャスト演算子を使う必要があるのは､ 課題では触れなかったかもしれませんが､
皆さんが理解してくれればいいのですが......キャスト演算子を使う必要がない場合､ 最初はモジュラス演算子が必要なソリューションだと思っていました｡
でも､
モジュラスをすれば､ 2intsで済むと思うんです｡
というわけで､ とにかく､ はじめましょう｡ コールドブロックを起動し､ プロジェクトを作成しましょう｡
この時点では､ 基本的な事柄はかなり得意になっています｡
だから､ 細かくは説明しないので､ 見ているだけでいいんです｡
でも､ 新しいプロジェクトを作ろうと思います｡
コンソールプロジェクトで､
間違いなくcになります｡
分変換と言うことです｡
つまり､ 分単位の変換アプリのようなものですね｡
そして､ 今度はメインを改造するんだ｡ c ファイルを作成します｡
だから､ これを解消しよう｡ そして､ include文はそのままにします｡
そして､ いつものように､ コメントを追加してください｡ 私がやらないからといって､
あなたがやってはいけないということではありませんよ｡
それが標準的なやり方です｡ 効率と時間を考えて､ 省いているんです｡
私がプログラムの一番上で行いたいのは､
使うべき変数をクリアにしてから初期化することです｡
では､ そのようにスタートしましょう｡ ユーザーが入力する分数を表す整数型の変数を作成するつもりです｡
そして､ それを入力された分ということにしています｡ 0に初期化します｡
年分のダブルを作成するつもりです｡ これは､ 計算する量にもよりますが､
実際にはかなり大きな小数点以下の数字になるので､ 長くなることもあります｡
だから､ 長い方がいいのかもしれない｡ でも､ 今はdoubleを使って､
0に初期化することにします｡ 0とその0に等しい日数｡
0.
そして今度は､ ユーザーからの入力を得たいと思います｡
ユーザーから入力を得るためには､ まず､ ユーザーに入力を指示する必要があります｡
そこで､ 分数を入力してくださいという出力を表示することにしました｡
そして､ そこにコロンとスペースを入れ､ セミコロンで終了させるのです｡
次は､ 実際にインプットしてみることです｡
ここで､ ユーザーからコメントとして入力をもらうと言うことでしょう｡
ユーザーからの意見をどのように取り入れるか？ scanf関数を使用します｡
だから､ ちょっと前のことを思い出して､ printfと似たようなscanfと言えばいい｡
そして､ 引数とはいえ最初のパラメータは､
変換するために読み込むデータの種類です｡
すべて文字列またはテキストとして読み込まれることを忘れないでください｡
だから､ それをどう保存するかに変換する必要があるんです｡
つまり､ printfと同じようにダブルクォートで囲むわけです｡ フォーマット指定子を使用する｡
これです｡ 10進数で保存したいと言うだけです｡
だから､ dは10進数の整数ではなく､ 整数と言うことにしています､
すみません｡
そして､ 次の引数は､ どの変数に格納するかです｡
入力された分単位で保存することにしています｡
スキャンfは､ 文字列を除くすべてのデータ型に対してアンパサンドを指定する必要があることを思い出してください｡
アドレスサブオペレータです｡
だから､ それを提供しなければならないのです｡ 数字を読み込んでいるので､ アンパサンドをやらなければならないのです｡
講義で習ったことを思い出してください｡ そして､ これをセミコロンで追加したいと思います｡
この際､ テストもした方がいいでしょうしね｡
ユーザーからの意見を取り入れることができるようにする｡ そして､ 入力したものを表示するためのprintfを用意しているだけでしょう｡
でも､ これが正しいということがわかったので､ 次に進みたいと思います｡
15行目の計算が必要です｡
主に､ 分単位を年単位で保存したい｡
そこで､ 忘れていた別の変数を作り､ 年単位で分を保存することにします｡
だって､ これで楽になるんだもん｡ だからここでは､ 分と年ということにしています｡
ここで､ 変数の命名規則としてキャメルケースを使用していることにお気づきでしょう｡
最初の区を小文字にして､ それ以降の単語はすべて最初の文字を大文字にするところです｡
先ほどは説明しなかったので､ 触れておこうと思いました｡
そこで､ 最初の計算では､ これで年を計算することになるので､
分と年を設定したいと思います｡
ですから､
分と年は実際には同じになります -- 私は整理するために括弧を使うのが好きなのですが､ そうすればすべてが明確になります｡ より読みやすくなります｡
60は1時間の中の分数だから､
60になる｡ そして､ それに1日の時間数である24時間を掛けます｡
それに1年の日数である365日をかけてみる｡
で､ この計算で､ 1年間に何分なのかがわかるわけです｡
そして､ これを利用して年数を計算することができるようになったのです｡
次の行では､ years equal -- つまり､ ここでは代入演算子､ equals
を使っています｡
そして､ 16行目の括弧の中でやっていることは､ アスタリスクを使って掛け算をしていることです｡
だから､ かなりキレイ｡
年というのは､ ちょうど......もう一度括弧を使いたいのですが｡
ユーザーによって行われた入力分を､ 1年間の分数で割ったものです｡
つまり､ 5000分と入力し､ 1年が20000分ある場合､ 5000÷20000で何年あるかということになり､
0点何ということになります｡
日数を計算するために､
ここでは入力された分を60と60で割ったものを言うことにします｡
0
1時間に60分あるものがあるからです｡
そして､ 時間が決まれば､ それを日数で割ることができます（24日）｡
0.
そして､ これを別の計算に入れようと思えばできたのです｡
しかし､ もう一度言いますが､ 正しい順序で行うようにしたいのです｡
そこでまず､ 分エンターを60で割ってみることにする｡
というのも､ ここでは割り算をしているので､
連想は左から右へとなり､ 実はこの括弧は必要ないのです｡
しかし､ 私はいつも括弧をつけるのが好きなんですよ､ 読みやすくなるから｡
では､ 最後の1枚を追加しましょう｡
それはちょっと冗長ですね｡ ここでは必要ないくらいです｡ だから､ 最初のものだけ､
残しておこう｡ そして､ これが私たちの日々を表示するはずです｡
さて､ 計算が終わったので､ いくつかの演算子を使う｡
データを出力するだけのprintfを行いたい｡
ここでは､ まず分をプリントアウトすることにします｡
パーセントd分は､
およそパーセントf年､ パーセントf日です｡
そして､ 改行を入れる｡
つまり､ printfを使って変数の出力を表示し､ パーセント記号をマークアップ指定子として記憶させているのです｡
最初にプリントアウトしたいのは分数なので､ 入力されたら最初のカンマの後に分数を入れなければなりません｡
2つ目は年なので､ 年数と言いたいところですが､ これはパーセントf年です｡
そして3つ目は､ そんな日々です｡
これからコンパイルして実行すれば､ 私のために変換をしてくれるはずです｡
では､ さっそく構築してみましょう｡ モーニングもエラーも出なかった｡
走ってみよう､ 1年が何分なのかもわからない｡
ということで､
どうやってテストしたらいいのかわかりませんが､ とりあえず5000分を入れてみましょう｡
プログラムを実行すると､ 分数を入力するように言われるので､ 5000と入れておきます｡
また､ 数値を入れなかった場合､ scanf関数で数値に変換しているため､
クラッシュする可能性があります｡
リターンを押すと､ これには5000分が約0と書いてある｡
009513年､
3． 47222日､ これは理にかなっているようです｡
1時間60分のものを24倍すると､ 1日でだいたい2400くらいになるので､ 2400と2400､ 60倍はないですね｡
60×24で大体1200くらいになりそうで申し訳ないです｡
1200が5000に入るわけですが､ 1日に何回入るかというと､
おそらく3回くらいです｡ 4その辺りです｡
というわけで､ おおよそこれで間違いなさそうです｡
ですから､ これを何度も実行し､ 大きな数字を入れれば､ 気がつくことがあります｡
ここでは2倍しか保存していないんです｡ ですから､ あまり大きな数字､
たとえば6,000億とか入れようとすると､
不正確な数字が出るかもしれません｡
つまり､ これはデータ型の問題を示しているわけです｡
だからintで保存しているんです｡ Intは8バイトしかない｡ この巨大な数字を入力しました｡
それは収納できない｡ だから､ 印刷しようとしたら､
184298154というまったく別の番号で印刷されているんだ｡
それは､ 入力するものがintより大きいからです｡
ですから､ このプログラムをさらに精密なものにしたい場合､ より大きな数値を入力したい場合は､
データ型をいくつか変更し､ intsをdoubleに､ あるいはdoubleをlongに変更することを検討するとよいでしょう｡
つまり､ これは350年と127000日とか言っているわけです｡
このアプリは､ データ型と演算子について理解できるようにするためのものです｡
いろいろな変換アプリを用意することができました｡ あなたがより多くの練習のために書きたいもう一つの素敵なアプリは､
華氏から摂氏へのアプリでしょう｡
華氏を入力し､ それを摂氏に変換できるアプリを書く｡
つまり､ いろいろなシナリオを思いつくんですね｡ しかし､ これでは演算子を使わざるを得なくなります｡
また､ やろうと思えば､ ここでキャスティングをすることも可能です｡
もし､
日数が正確すぎるのが嫌で､ doubleをintに変えたいのかもしれません｡
そして､ もう少し精度を落としたものにしたいのです｡ 実際にこれをitにキャストするには､
括弧を付けてintとすればよいのです｡
そして､ これは実際に何日もその数字を取ることになるのです｡
そして､ 10進数の3であれば 549とかだと3に変換されちゃうんだよね｡
そのほうがユーザーにとっていいのかもしれない､ それはあなた次第です｡
でも､ 今はダブルにしておきましょう｡
でも､ そうやって学んでいくんです｡ プログラムを使って､ さまざまなシナリオを試し､
さまざまな入力を試し､ すべてが正しいことを確認します｡ ありがとうございます｡