12-07-2022 01:29 AM
こんにちは、csti22042です。みなさんお忙しいところ恐縮ですが、どうしてもわからないところをご質問させていただきたく、ご連絡しました。
現在以下の問題を解いています。
「並列ケースストラクチャを使って、次の誕生日まであと何日か(うるう年の2/29は計算に入れない)を計算するVIを作る。VIの入力は、今日の月(1から12まで)、今日の日(1から31まで)、あなたの誕生日の月と日である。VIの出力は次の誕生日までの年齢である。」
パターンが多すぎてうまくいかないです。
まず今の月と自分の誕生月の大小関係を比較して、それぞれで計算の仕方が異なるのは理解できます。しかし、そこから今の日付と誕生日の比較まで入ると訳が分からなくなってしまいます。さらに、毎月31日間あるわけではありませんから、さらにそこでパターンが加わると、もう数十通りのケースストラクチャを描くことになりますよね。。。?
何かいい方法をご教授頂きたいです、何卒宜しくお願い致します。
解決済! 解決策の投稿を見る。
12-07-2022 10:48 AM
これはLabVIEW以前の設計段階ですね。
まず基本的な方法を考えて、その方法で起こりそうな例外を考えましょう。
並列ケースストラクチャってことは、タイムスタンプ使ってズルしたらダメということなので、
基本を「今月の残り日数」+「次月~誕生前月の日数」+「誕生月の日数」として:
例外が起こりそうなのは今月が誕生月の場合で、さらに今日が誕生日前(あと数日)または誕生日後(1年近く後)かな。
Whileループを使って月の日数を足していき、例外をケースで処理するとしたときのヒントは:
・今月から1つずつ増加しながら日数を足していくにはシフトレジスタが使えます。
・ケースが必要なのは、月の日数(3パターン),12月の次は1月に戻る,誕生月になったらループを抜けそのとき月の日数は足さない・・・
こんなとこでしょうか。
12-12-2022 01:04 AM
ご回答いただきありがとうございます。ご返信が遅くなり申し訳ありません。
教えていただいたパターンを参考にD5-7_re2.VIのように一通り作ることができました。
あとは3パターンある一月毎の日数を選択できるようにしようと、それぞれのケースストラクチャの中に、更に3パターン数値型のケースストラクチャを作りました。しかし、月が13以上が入力された時のデフォルトを作ったら、D5-7_re3.VIのようにエラーが出てしまいます。
そちらについてもご教授いただけないでしょうか。
何卒よろしくお願いいたします。
12-12-2022 04:11 AM
エラーの原因は2つです。
まず、「デフォルト」はダブルクォーテーションで囲ってはいけません。囲うと文字列として認識されます。今回ケースセレクタのデータタイプは整数なのでエラーとなり赤文字で表示されます。
通常はケースセレクタ上で右クリックして「このケースをデフォルトにする」を選びます。
また、ケースストラクチャの出力トンネルには全てのケース内から値が接続されている必要があります。そうしないとエラーとなりトンネルが白抜きになります。トンネル上で右クリックして「配線されていない場合デフォルトを使用」にしても良いです。デフォルトはデータタイプごとに異なり、数値の場合0です。
おまけ:
ケースセレクタに定義されていない値が入るとデフォルトケースが実行されるので、「13以上」を書かなくても大丈夫です。あるいは「0以下」と「13以上」ケースを用意するならデフォルトケースがなくてもエラーを起こしません(整数で取り得る値が全て網羅されるので)。
12-13-2022 01:35 AM
ご返信、及び御丁寧な解説を誠にありがとうございます。
確認しました、今後も引き続き取り組んでみます。
私自身まだLABVIEWを初めて半年も経っていないので、色々とご迷惑をおかけしますが、今後ともよろしくお願いいたします。
12-15-2022 06:57 AM
いろいろな条件を考えてコーディングされた跡が伺えます。設計>>コーディング>>テストを繰り返し練習して慣れてください。(LabVIEW好きになってくれたらうれしい)
プログラムは動けばいいのでどんなコードも間違いではありません。答え合わせをすると同じ目的なのに人によって全く違うコードだったりしてびっくりします。
たとえば私が最初のアドバイスで想定していたVIを添付します。まだバグがあるかもしれませんが、ループとシフトレジスタはLabVIEWの強力な機能なのでご参考までに。