- ベストアンサー
C言語で秒単位の数値をコンソールタイプから入力して、その値を時分秒に変換して画面に表示したいのですが、、、
こんばんは、大学1年生です。 授業で、C言語を勉強しているのですが原理などもよく分からず困ってます。 質問なのですが、C秒単位の数値をコンソールタイプから入力して、その値を時分秒に変換して画面に表示したいのですが参考書などを見てもサッパリです。ソースを教えていただくと助かります。ちなみに、与えられた値を時分秒に変換する部分は関数でお願いします。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
No.2です。 一応手順を示しておきます。 秒数 = C とするとき、 C / 3600 = h時間を求められます。 (3600秒は1時間) C / 3600 の余りが残りの秒数です。 C - (C / 3600) * 3600 差を求めることで余りを出します。 あとは、この秒数を分と秒に分けます。 s = C - (C / 3600) * 3600 とすると s / 60 = m分が求められます。 (1分は60秒) s / 60 の余りが変換後の秒数部分なので、差を求めて余りを得ます。 s - (s / 60) * 60 = 秒数部分の、s秒です。 入力数値 C が、3725(秒)だったとします。 ※データが整数型なので割り算はすべて切捨て整数になります。 3725 / 3600 = 1時間 余りが秒なので 3725 - (3725 / 3600) * 3600 = 3725 - 1 * 3600 = 125 つまり、1時間125秒です。 さらに、125秒を分・秒にするので 125 / 60 = 2分 余りが最終的な秒なので 125 - (125 / 60) * 60 = 125 - 2 * 60 = 5 1時間2分5秒となります。 尚、A ÷ B の余りを説明上わかりやすく、 A - (A / B) * B としていますが C言語ではご存知、A % B でも求められます。
その他の回答 (5)
<訂正> 【フローチャートその1】 STRAT(左右が弧である長方形図内に書く) int n(長方形図内に左の4つを書く) int h int m int s n 入力(平行四辺形図内に書く) jiRimbyo(n,[h],[m],[s])(左右二重線の長方形図に書く) n 出力(長方形図内に左の4つを書く) h 出力 m 出力 s 出力 END(左右が弧である長方形図内に書く) 【フローチャートその2】 jiRimbyo(左右が弧である長方形図内に書く) n / 3600 → [h](平行四辺形図内に左3つを書く) (n MOD 3600) / 60 → [m] (n MOD 3600) MOD 60 → [s] return(左右が弧である長方形図内に書く) ※[?]は値のアドレスを示します。
お礼
私のために時間を割いていただき、感謝です。 専門の方ではないのですか?
No.4です。 リストとフローチャートを以下に載せますので 参考になさって下さい。 void jiRimbyo(int n,int* h,int* m,int* s) { *h = n / 3600; *m = (n % 3600) / 60; *s = (n % 3600) % 60; return; } int main(void) { int n,h,m,s; printf("秒数?"); scanf("%d",&C); jiRimbyo(n); printf("\n%d=%d時間%d分%d秒\n",n,h,m,s); return 0; } 【フローチャートその1】 STRAT(左右が弧である長方形図内に書く) int n(長方形図内に左の4つを書く) int h int m int s 0→C(平行四辺形図内に書く) jiRimbyo(n,[h],[m],[s])(左右二重線の長方形図に書く) n 出力(長方形図内に左の4つを書く) h 出力 m 出力 s 出力 END(左右が弧である長方形図内に書く) 【フローチャートその2】 jiRimbyo(左右が弧である長方形図内に書く) n / 3600 → [h](平行四辺形図内に左3つを書く) (n % 3600) / 60 → [m] (n % 3600) % 60 → [s] return(左右が弧である長方形図内に書く) ※[?]は値のアドレスを示します。
お礼
参考にさせていただきます。 ありがとうございました。
- hidebun
- ベストアンサー率50% (92/181)
>ちなみに、与えられた値を時分秒に変換する部分は関数でお願いします 課題のにおいがプンプンしますね。 本当に大学1年生? 秒を時分秒に直す、なんてのは小学生でもできる問題だと思うのですが。 もっとブレイクダウンして質問しようよ。 ・秒を時分秒に変換するアルゴリズムがわからない(小学生の問題だけど) ・数値(秒)を入力してプログラムで受け取る方法がわからない ・計算はできるけれども、表示の方法がわからない 「参考書など」とは、具体的に何を参考にされているのでしょうか? #1さんの問いかけに対して、 >恥ずかしながら全く分かりません。 と答えるあたり、自分で少しでもなんとかしようという意気込みが全く伝わってこんのですが。 >学校があと少しで春休みになるので、基礎から勉強してみます。 勉強してから質問しましょう。失礼ながら、門前払いレベルです。
お礼
ご回答ありがとうございます。 計算は分かりますが、どのように入力していいかが分かりません。 参考書は、学校で買ったC言語ビギナー偏というものと、図書館でかりている本です。 勉強します。
▽まずソースから。 #include <stdio.h> int main(void) { int C,h,m,s; ・・・ 1 printf("秒数?"); ・・・ 2 scanf("%d",&C); ・・・ 3 if (C <= 0){ ・・・ 4 printf("有効な値ではありません\n"); return 0; } s - = (m = (s = (C - (h = C / 3600) * 3600)) / 60) * 60; ・・・ 5 printf("\n%d秒=%d時間%d分%d秒\n",C,h,m,s); ・・・ 6 return 0; ・・・ 7 } ▽【説明】 (1) C = 入力秒数 / h = 時間 / m = 分 / s = 秒 (2,3,4) 秒数 C を入力して、(C > 0秒)文字列や負数はエラーとする (5) s - = (m = (s = (C - (h = C / 3600) * 3600)) / 60) * 60 は以下に展開します。 h = C/3600 ・・・ 時間 s = (C - (h = C / 3600) * 3600) ・・・ 分も秒とした時の総秒数 m = (s = (C - (h = C / 3600) * 3600)) / 60 ・・・ 秒から分を抽出 s - = (m = (s = (C - (h = C / 3600) * 3600)) / 60) * 60 ・・・ 先程の秒数の差を求めることで残りの秒数桁を算出 こういうことでよろしいのでしょうか…?
お礼
ご回答ありがとうございます。せっかく回答していただいたのですが、 C秒単位の数値をコンソールタイプから入力して、その値を時分秒に変換して画面に表示ではなく、秒単位の数値をコンソールタイプから入力して、その値を時分秒に変換して画面に表示の間違いでした。申し訳ありません。大変、お手数お掛けしますがもう一度ご返事いただけますか? ちなみにフローチャートも提出しないといけないのですが、例だと START→秒を入力n→関数jiRimbyo(n)→n,時,分,秒の表示→stop です。この場合のソースを教えていただいたほがありがたいです。 何度も申し訳ありません。
- DIooggooID
- ベストアンサー率27% (1730/6405)
ご確認させていただきたいのですが、C言語のソースでは表現することはできないとしても、どのような処理手順にすれば良いかを、普通の言葉で表現することはできますか?
お礼
ご回答ありがとうございます。恥ずかしながら全く分かりません。 学校があと少しで春休みになるので、基礎から勉強してみます。
お礼
丁寧に解説していただいてありがとうございます。 とても分かりやすいです。 ありがとうございました。