こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

C言語:計算問題を解く時間が計測できません

C言語を学び始めて1週間程度のものです。

現在柴田望洋著の明解C言語中級編という本でC言語を学んでいます。
その中のプログラミング例を真似してプログラミングしているのですが、
うまく動作しません。詳細は以下の通りです。

著書のList2-6のプログラミングです。

問題:計算問題を解く時間を計測が0.0秒になってしまう。

ここよりプログラミングです。

#include <time.h>
#include <stdio.h>
#include <stdlib.h>

int main (void)
{
int a, b, c;
int x;
clock_t start, end;
double req_time;

srand(time(NULL));

a = 10 + rand() % 90;
b = 10 + rand() % 90;
c = 10 + rand() % 90;

printf("%d + %d + %dは何ですか:", a, b, c);

start = clock();

while (1)
{
scanf("%d", &x);
if (x == a + b +c)
break;
printf("\a違いますよ!!\n再入力してください:");
}

end = clock();

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

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

if (req_time > 30.0)
printf("時間がかかりすぎです。\n");
else if (req_time > 17.0)
printf("まあまあですね。\n");
else
printf("素早いですね\n");

return (0);
}

このプログラムを実行して計算を解いて正解の答えを入力しても
0.0秒かかりました。
素早いですね。

としかでてきません。どうすればきちんと時間を計測するプログラミングができるでしょうか。

パソコンはMacbookairを使っています。
コンパイラ(?)はXcodeというものを使っていると思います(ここらへんは勉強不足でよくわかりません。)

もしよければご回答お願いします。

投稿日時 - 2013-04-20 10:49:19

QNo.8051257

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

ANo.1

そりゃ、そのコードが悪いですね。

clock関数のマニュアルにはこう書いてあります。

http://developer.apple.com/library/ios/#documentation/System/Conceptual/ManPages_iPhoneOS/man3/clock.3.html
| The clock() function determines the amount of processor time used since
| the invocation of the calling process, measured in CLOCKS_PER_SECs of a
| second.

つまり、Mac OS XのようなマルチタスクOSではひとつのプログラムが実行している間ずっとCPUを占有することはありえないので、使ったプロセッサーの時間となるとほとんど0なのではないでしょうか。

ミリ秒まで計測したいとしたら、gettimeofdayやclock_gettimeを使い、そうでないならtimeを使って時間を測ることをおすすめします。
http://developer.apple.com/library/ios/#documentation/System/Conceptual/ManPages_iPhoneOS/man2/gettimeofday.2.html
http://developer.apple.com/library/ios/#documentation/System/Conceptual/ManPages_iPhoneOS/man3/time.3.html

例えば、gettimeofdayだとこんな感じです。
#include <sys/time.h>

#include <stdio.h>
#include <stdlib.h>

int main (void)
{
int a, b, c;
int x;
struct timeval start, end;
double req_time;

srand(time(NULL));

a = 10 + rand() % 90;
b = 10 + rand() % 90;
c = 10 + rand() % 90;

printf("%d + %d + %dは何ですか:", a, b, c);

gettimeofday(&start, NULL);

while (1)
{
scanf("%d", &x);
if (x == a + b +c)
break;
printf("\a違いますよ!!\n再入力してください:");
}

gettimeofday(&end, NULL);

req_time = (double)(end.tv_sec - start.tv_sec) +
(double)(end.tv_usec - start.tv_usec) / 1000 / 1000;

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

if (req_time > 30.0)
printf("時間がかかりすぎです。\n");
else if (req_time > 17.0)
printf("まあまあですね。\n");
else
printf("素早いですね\n");

return (0);
}

投稿日時 - 2013-04-20 11:34:55

あなたにオススメの質問