質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

3回答

5216閲覧

【C言語の質問です】キーボードから秒数を入力し「日」「時」「分」「秒」に直す問題について

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/02/24 00:44

C言語を勉強している初心者のものです。

今課題をいただき、その作成をしております。
先日提出(全18問)したのですが、大部分が間違っているので、
再度問題を見なおした上で提出してくれと言われてしまいました。

今回は課題なので、間違っている点を教えていただけませんでした。
個人的には、どの辺りが間違っているのかわからないため、
客観的な視点が欲しく、今回ご相談させていただきました。

18問の中の1つですが、
ソースが問題文との趣旨と外れているようでしたら
ご指摘いただけますと幸いです。

【問題】
キーボードから秒数を入力し、「日」「時」「分」「秒」に直して表示せよ。
(秒数はlong型とする)

【回答】

#include <stdio.h> int main (void){ int day,hour, minute, second; long int i,second2; printf("好きな秒数を入力してください\n"); scanf("%d", &second2); i = 1; day = 0; hour = 0; minute = 0; second = 0; while ( i <= second2 ) { second += 1; if(second==60){ minute +=1; second = 0; } if(minute==60){ hour += 1; minute = 0; } if(hour==24){ day += 1; hour = 0; } i++; } printf("その秒数を時刻に直すと%d日%d時間%d分%d秒です\n",day,hour,minute,second); return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

こんにちは。

プログラムの簡単さと性能的には既に回答されている方々の通りです。
間違いが若干あります。

①long int型に対応するscanf()の書式指定子はldです。
int型とlong int型のサイズが同じ時は問題なく動作しますが、この2つの型のサイズが異なるコンパイラの場合、このままでは困ったことになりますので、long int型変数に対してscanf()で%dを使うのは誤りです。

実は、この辺printfとscanfで統一が取れていませんのでご用心。
ところで、ここは英語なのですが、規格のリファレンスとして便利です。ついでにprintfと見比べてみるとためになると思いますよ。

②「その秒数を時刻に直すと」は誤りのように感じます
「いつからの経過秒数を入力する」の指定がありませんので、絶対時間ではなく相対時間を要求されていると思います。
「時刻」は一般に絶対的な時間のことを示すと思います。「16時間経過した」と言いたい時に「時刻は16:00」と表現すると可笑しいですよね?

③不適切なインデントと{ }はソースを読む側にとってかなり辛いです
バッとみてプログラムの構成が読み取れないので、なかなか辛いのですよ。
なので、私は初心者でも許したくないです。

初心者の方には、下記インデントと{ }の付け方をお薦めしています。私は20年間程下記インデントを使ってました。最近やっと、間延びする時に限り、文の右で{を付けるインデントも使うようになりましたが、使いドコロは難しいです。下手に使うとまじで見にくいので、元に戻した方が良いかもと思案中です。

C

1while ( i <= second2 ) 2{ 3 second += 1; 4 if(second==60) 5 { 6 minute +=1; 7 second = 0; 8 } 9 if(minute==60) 10 { 11 hour += 1; 12 minute = 0; 13 } 14 if(hour==24) 15 { 16 day += 1; 17 hour = 0; 18 } 19 20 i++; 21}

ループの範囲、ifのthen節の範囲が一目瞭然でしょ?そして、ルールが単純なのであまり悩まないで済みます。

投稿2016/02/24 02:35

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/02/24 09:08

ご回答ありがとうございます。 細かなところまでご指摘いただき、本当にありがとうございました!! リファレンスもご教示いただきありがとうございます。 英語苦手ですが、読解しながら読んでみたいと思います。 ②に関して、確かにおっしゃるとおりです。 改めて考えてみたのですが、今回入力した秒数は、 日、時などで表すとどのくらいに相当するのかという意味だと私は解釈しました。 私自身では、「入力した秒数は、%d日%d時間%d分%d秒に相当します。」 という表現に直してみようと思うのですが、いかがでしょうか。
Chironian

2016/02/25 00:01

その表現にて妥当と思いますよ。 回答、遅くなってすいません。teratailからの通知が今朝来たのですよ。通知遅すぎ。
退会済みユーザー

退会済みユーザー

2016/02/25 00:36

ご回答いただき、ありがとうございます! 大丈夫です。 親身にご回答いただけてとてもうれしいです。
guest

0

long でやれってとこがポイントなのでは?
long をパラメータで取り、1970/1/1からの日付に変換する関数を使えってことなんでしょうけど、
貴方がやってることでもそんなに間違ったことをしてるようにはみえません。
先生、模範解答から逸脱する回答はすゔぇて却下してるんでしょうか。

入力は秒数なので、60で割った余りが秒数、3600で割った余りを60で割ったのが分数、24*3600 で割った余りを 3600 で割ったのが時数です。ループしなくても四則演算で結果が出ます。

先生意見が聞きたいです。このスレッドを先生に見てもらうの駄目なんですか。

投稿2016/02/24 01:04

ipadcaron

総合スコア1693

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/02/24 01:20

ご回答ありがとうございます。 先ほど、sateyeさんにご回答いただき、ループ使わなくてもできる点に気づきました! ご指摘ありがとうございます。 今回課題ということで、どこが間違っているのかなど先生の意見はまだもらえない状況です。 まだ提出日まで時間がありますので、皆さんにご指摘をいただきながら頑張ってみようと思います!
guest

0

while()はいりません。
秒を60で割ったあまり→秒
秒/60→分
分を60で割ったあまり→分
分/60→時
時を24で割ったあまり→時
時/24→日
・・・上記を式にしてみて下さい。

投稿2016/02/24 00:53

編集2016/02/24 00:57
cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/02/24 00:59

ご回答ありがとうございます! 助かります。早速やってみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問