投稿
nobu divine-creator
時間を計算する式は、どのようにすると良いでしょうか? 24時間表示で計算して、結果を表示させたいのですが、どのように入力すべきか分かりません…。
4そうだね
プレイ済み
返信[1]
親投稿
いろいろなやり方があると思いますが、 TMREADで時、分、秒を取り出す。 時間の計算をする。 FORMAT$で整形する。 というのは、どうでしょうか。
0そうだね
プレイ済み
返信[2]
親投稿
計算式は、ある日時を0とした時間を計算したいのでしょうか。それとも、時間T0と時間T1の加減算が出来ればいいということでしょうか。 もし、後者で良いなら、分秒は60進数で、時間は24進数になるので、オーバーフロー、アンダーフローしたときに、60や24を引いたり足したりすれば良いと思います。
0そうだね
プレイ済み
返信[3]
親投稿
済みません。言い忘れました。オーバーフローしたときは、上位の値に1加算し、アンダーフローしたときは上位の値から1減算します。 秒、分、時の順番で処理すればいいと思います。
0そうだね
プレイ済み
返信[4]
親投稿
また、時分秒を秒に変換し、計算した後、剰余と整数除算を使って,時分秒に変換する方法もあります。ただし、負の数の剰余は機械や言語が違うと、結果が異なる場合があるので、注意が必要です。
0そうだね
プレイ済み
返信[5]
親投稿
nobu divine-creator
そう言われてみると、時間の計算は予想以上に複雑になるのですね…Σ(゚Д゚)! それほど正確な時間ではなく、おおよその時間が分かるようになれば良いのですが…。 なので、秒は使わず23時59分という感じの表示までですね。最初は、分も使わず時のみにしようかと思ったのですが、流石に1時間単位では大雑把過ぎると思い、分も必要かなと考えました! 計算の仕方は、操作する人が任意の時間を入力すると、設定した計算が行われ、結果として時間差が表示されるというものです! 時間の計算は、初心者が扱うにはかなり大変なようですね…。
0そうだね
プレイ済み
返信[6]
親投稿
用語は難しいかもしれませんが、やっていることはたいしたことありません。時分だけで良いなら、仕組みは、2桁の筆算と一緒です。10進数の場合、引き算したとき、足りなければ、上の桁から一つ借りてきて、10足してから引きますよね。60進数も同様に、上の桁から借りてきたとき、60を足してから引けば良いのです。24進数は不足して負の値になれば、24足すだけです。仕組みがわかれば、難しくないと思いますが、いかがでしょうか。
0そうだね
プレイ済み
返信[7]
親投稿
一番簡単な入力方法は、INPUTで文字列として、HH:MMの形式で入力する方法です。ボタンだけで入力する場合は、ゲーム内で数字を増減しているものがあると思います。それを参考にしてはいかがでしょうか。
0そうだね
プレイ済み
返信[8]
親投稿
Godot orz_127
ひとつの方法として 時分をHHMMの形式で文字列で入力を受けます。 12時30分なら"1230" これをVALコマンドで数値にします。 1230という数値が得られます。 これをDIV 100した値を求めると時の値が得られます。 MOD 100すると分の値が得られます。 一旦値を分単位に直します。 DIVで求めた値×60+MODで求めた値 同様にもうひとつの時分を分単位にして計算します。 結果をDIV 60して得られた値が時で、MOD 60して得られた値が分です。 後は好きな方法で結果を表示すれば良いかと。
0そうだね
プレイ済み
返信[9]
親投稿
参考になるかわかりませんが、私の公開しているタイマーのTMR0中のINPUT_TIME関数でも似たようなことをやっています。
0そうだね
プレイ済み
返信[10]
親投稿
 時間計算のない電卓で時間計算するとき、上のような方法と、時間未満は、十進数の小数点で計算していました。 (例)1時間30分=1.5時間。
0そうだね
プレイ済み
返信[11]
親投稿
nobu divine-creator
コータさんが最初のコメントに記されたTMREADというのは、時刻文字列から数値を得る命令だったのですね! そして、TIME$で現在時刻を取り込めるとは吃驚しました! ただ、今回の目的は現在時刻ではなく、任意に入力した時刻から増減した時刻を出すというプログラムなので、現在時刻は取り込みません…。 操作をする人が何時何分と入力して、ENTERキーかAボタンを押すと、設定した増減値(+何時間または-何時間)を計算して、何時何分と表示されるというプログラムにしたいのですが、どのように入力すべきなのか分かりません…。 できれば、上記の内容を表したプログラムの見本を書き込んでいただけると助かります! 残念ながら、数学が大の苦手で、説明文のみでは殆ど理解できておりません…(>_<)。
0そうだね
プレイ済み
返信[12]
親投稿
自分だけが使うのであれば、入力値の確認をさぼります。 INPUT"じこく(HH:MM)=";T$ INPUT"じさ=";TD H=VAL(LEFT$(T$,2)) M=VAL(RIGHT$(T$,2)) H=H+TD IF H>=24 THEN H=H-24 ? FORMAT$("%02D:%02D",H,M) こんな感じでどうでしょうか。タイプミスなどあればすみません。
0そうだね
プレイ済み
返信[13]
親投稿
考慮漏れがありました。「IF H>=24」の行の後に IF 0<H THEN H=H+24 を追加してください。
0そうだね
プレイ済み
返信[14]
親投稿
nobu divine-creator
入力値の確認って、本来は必要なのですか?(手間が増えるため、無いほうが操作しやすいのかと思っておりました…。) 上記のプログラムの場合、操作する人が時差を入力するようになっていますね?!(時差はこちらで設定しておく仕様なので、それを消してTDの値を自分で書き込んでおけば良いということになりますか?) 一度に複数の時刻を表示させるには、このプログラムの何処にどのような命令を加えれば良いのでしょうか? 表示例は、 Aは何時何分です。(-14時間)※()内は表示されません! Bは何時何分です。(-8時間) Cは何時何分です。(+8時間) という感じです!
0そうだね
プレイ済み
返信[15]
親投稿
入力値の確認とはユーザに対する確認では無く、入力された値が、プログラム作成者の期待した値かどうかの確認のことを言っています。 時差については仕様の確認が出来なかったので、仮に入力するようにしました。削除して、自分の設計通りにすれば良いと思います。 複数回の計算が必要になるので、Hを変更してはいけません。 したがって、「H=H+TD」は、「H1=H+TD」のようにして、次の行以降も「H」を「H1」に変える必要があります。そして、この行から最後までをTDの値を変えながら登録TD数分繰り返せばいいです。
1そうだね
プレイ済み
返信[16]
親投稿
?(PRINT)命令は、自分の表示したいように変更してください。
1そうだね
プレイ済み
返信[17]
親投稿
地名データと時差のデータは、どのように管理するようになっているでしょうか。
0そうだね
プレイ済み
返信[18]
親投稿
数学がわからなくても、必要な公式などを集めてきたり、他の人が提供してくれるライブラリ(みんなが共通に使えるサブルーチンや関数を集めたもの)を使えば、プログラムを書くことは出来ます。しかし、数学的な考え方や数学の知識は、プログラム作成にとても役に立ちます。暇なとき、気が向いたら、昔の教科書を開いておさらいしてみては、いかがでしょうか。
1そうだね
プレイ済み
返信[19]
親投稿
nobu divine-creator
流石に、どのようなプログラムにしようとしているのかお分かりですよね…? 操作をする人が複雑だと思うプログラムにはしたくないというのが私の基本的な考え方ですので、なるべく少ない操作で結果が出せるというものを目指しております! とはいえ、たくさんの地域を表示させようとすれば、画面全体を使用しても、入りきらなくなります…。 そこで、ある程度の地域のみに絞ったものにしようかと考えております。 なので、地名と時差をセットで並べるだけの簡単なものにしようかと思っております! もう少しプログラミングの知識があれば、より良いものができるのは存じておりますが、それは今後のバージョンアップでするのでも良いかと考えております…。 簡素なものであれば、近いうちにも完成できそうな感じになれました♪ まだ完全には時間計算プログラムを理解できておりませんが、少しでも理解し前に進むことができました!ご助力感謝致します♪
0そうだね
プレイ済み
返信[20]
親投稿
返事が遅くなって、申し訳ありません。 がんばってください。 何かあれば、ご連絡ください。 なお、データのセットをDATA文に記述し、READ命令で読みながら、計算と表示をデータセット数分繰り返すのが簡単そうな気がします。
1そうだね
プレイ済み
返信[21]
親投稿
nobu divine-creator
コータさんのアドバイスを基に、「HM1=H-1」「HM2=H-2」「HP1=H+1」のように一部を変更して動かしてみましたら、何故か-8時となったり26時となったりしてしまいました…。どこか変更した箇所が間違えてしまっているのでしょうか? エラーにはならないので、プログラム的には正常に動いていると判断されているようです…。 あと、IF 0<Hの部分はIF 0>Hだと思うのですが、前者でよろしいのでしょうか? ちなみに、この記号を変更しても、計算結果に影響は出ておりません…。
0そうだね
プレイ済み
返信[22]
親投稿
nobuさんのご指摘の通り、0>Hが正解です。 わかりにくい説明で申し訳ありません。 H1=H+TD だけでなく H1=H+TD IF H1>=24 THEN H1=H1+24 IF 0>H1 THEN H1=H1-24 ? FORMAT$("%2D:%2D",H1,M) のように、その行以降のHを変更することをイメージしていました。
0そうだね
プレイ済み
返信[23]
親投稿
nobu divine-creator
いえ、ケアレスミスは誰にでもあることなので構いませんよ♪ 私が自分で気付けるような内容で良かったです!(私が気付けないような難しい内容であったならば、困ってしまうところでしたが…。) お陰様で、無事に修正できました♪ ところで、その教えていただいたプログラムの中の「%2D:%2D」が、何故「何時何分」を表すために使われるのかが、理解できておりません…。 時間を表す数字そのものはH1とMであり、%2DはPRINT命令で表示させる文字のはずですが、H1とMを代入して表示するために%2Dを使用しているわけですよね?!(でも、何故そのような記号や英数字になるのでしょうか?しかも、時と分が同じ書き方になるのでしょう?)
0そうだね
プレイ済み
返信[24]
親投稿
書式整形に使うFORMAT$関数の第一引数で、”%2D”とすると、第2引数の数値変数の内容を文字列に変換して置き換えてくれるとても便利な機能です。ぜひHELPをみて使い方をしらべていろいろためして見てください。文字列変数を置き換えたり、数値の表現形式も複数用意されています。第1引数内の「%」で始まる書式文字列と,第2引数以降の変数との順番が一致している必要があります。
1そうだね
プレイ済み