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

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

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

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

Q&A

解決済

2回答

729閲覧

C言語でのdouble型の出力について

keikeikei

総合スコア17

C

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

0グッド

1クリップ

投稿2019/01/26 10:20

前提・実現したいこと

『新・明解C言語 中級編』を解いています。
サンプルコードと見比べてみたのですがミスが見つかりませんでした…。
質問させてください!

ランダムに生成した3桁の数字3つの和を入力して、正解するまでにかかった時間によって表示内容を変えるプログラムを作っています。
clock関数を使ってクロック数を計算した後、それをdouble型に変換してprintf関数で表示させたいのですが、表示がうまくいきません。

発生している問題・エラーメッセージ

1秒以上かかっているにも関わらず、「0.0秒」と表示されてしまう。

該当のソースコード

C

1# include <time.h> 2# include <stdio.h> 3# include <stdlib.h> 4 5int main(void) { 6 7 int a, b, c;/* 加算する数値 */ 8 int x; /* 読み込んだ値 */ 9 clock_t start, end;/* 開始時間と完了時間 */ 10 double req_time; /* かかった時間 */ 11 12 srand(time(NULL));/* 乱数の種をセット */ 13 14 a = 100 + rand() % 900; // 100~999 15 b = 100 + rand() % 900; // 100~999 16 c = 100 + rand() % 900; // 100~999 17 18 printf("%d + %d + %dは何ですか:", a, b, c); 19 20 start = clock();// 計測開始 21 while(1) { 22 scanf("%d", &x); 23 if (x == a + b + c) { 24 break; 25 } 26 printf("\a違いますよ!\n再入力してください:"); 27 } 28 end = clock();//計測終了 29 30 req_time = (double)(end - start) / CLOCKS_PER_SEC; 31 printf("%.1f秒かかりました。\n", req_time); // なぜか0.0秒で表示されてしまう 32 if (req_time > 30.0) { 33 printf("時間がかかりすぎです。\n"); 34 } else if (req_time > 17.0) { 35 printf("ほう。\n"); 36 } else { 37 printf("素早いな。\n"); 38 } 39 return 0; 40}

下から10行目が、0.0秒と表示されてしまいます。

試したこと

C

1req_time = (double)(end - start) / CLOCKS_PER_SEC;

に()を追加してみる。↓

C

1req_time = (double)((end - start) / CLOCKS_PER_SEC);

C

1 printf("%.1f秒かかりました。\n", req_time); // なぜか0.0秒で表示されてしまう

を「%.1lf」に変えてみる。↓

C

1 printf("%.1f秒かかりました。\n", req_time); // なぜか0.0秒で表示されてしまう

どなたか、回答をお願いいたしますm(._.)m

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

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

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

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

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

guest

回答2

0

printf("%lf秒かかりました。\n", req_time);

としてみよう

#えるえふねw

投稿2019/01/26 10:36

編集2019/01/26 10:37
y_waiwai

総合スコア87719

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

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

pepperleaf

2019/01/26 13:57

> req_time = (double)((end - start) / CLOCKS_PER_SEC); だったら、やっぱりゼロ...ですね。
keikeikei

2019/01/27 08:25

y_waiwaiさん 回答ありがとうございます! double型のときは「lf」で統一するようにします。
guest

0

ベストアンサー

こんにちは。

clock関数はリアル時間を計測するのではなく、CPUが当該プログラムを実行したクロック数を返却します。
提示されたプログラムは、scanf("%d", &x);の入力待ちがほとんどです。入力待ち中、当該プログラムの実行は一時停止し、他のプログラムが実行されているため、clock関数が返却する結果は0秒にかなり近いものになります。
リアル時間を計測するならtime関数を使えますが標準では1秒精度となります。それ以上の精度で計測したい場合は適切なプラットフォーム依存関数を使えば可能です。

投稿2019/01/26 11:09

Chironian

総合スコア23272

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

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

Chironian

2019/01/26 14:38

yohhoyさん なるほど。まじでハマりそう。
catsforepaw

2019/01/26 14:44

Cの規格書では処理系定義の「プロセッサー時間(processor time)」と書かれていますが、それが具体的に何であるのかは書かれていませんね。 リファレンスを読む限りではマイクロソフトの実装の方(実際にかかった時間)と理解する方が自然な気がしますが。あの文面から「CPU使用時間」と読める人はまずいないと思います。
Chironian

2019/01/26 16:20

catsforepawさん 標準規格があいまいとは頭痛いですね。↓のNoteに少し記載されていました。 http://man7.org/linux/man-pages/man3/clock.3.html Linuxはwait()等の時間を含まないが、それを含む処理系もあるそうです。どうも標準規格は統一するのを諦めたということっぽいですね。 keikeikeiさんが使っているOSがLinuxならscanf()の待ち時間を含まないことが原因でしょう。Windowsの場合は、また別の問題があるのかも知れませんね。(ソースからは見当がつきませんでした。)
keikeikei

2019/01/27 08:24

Chironianさん 回答ありがとうございます! 他のプログラムの実行もclock()でカウントされるのは知りませんでした。 ベストアンサーにさせていただきました。 >keikeikeiさんが使っているOSがLinuxならscanf()の待ち時間を含まないことが原因でしょう。 Macを使っています。 OSによって処理が変わるとは…。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問