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

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

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

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

Q&A

解決済

2回答

3029閲覧

Cでの時間取得

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2016/08/30 07:41

###前提・実現したいこと
Cで計算問題を解くのに掛かった時間を求めるプログラムを作りたいのですが, 計測時間が必ず0になります。簡単化した関数を作ってみたりしたのですが, 原因が分かりません。ご教授よろしくお願いします。

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

Calculate!! 2 + 9 - 5 = -2 Wrong! Retry! 2 + 9 - 5 = 6 8 + 2 + 5 = 15 6 + 8 + 4 = 18 0: 0.0 sec 1: 0.0 sec 2: 0.0 sec Sum: 0.0 sec Average: 0.0 sec

###該当のソースコード

#include<stdio.h> #include<stdlib.h> #include<time.h> #include<string.h> #define MAX 3 double plusplus() { clock_t start, end; int a, b, c; int x; a = 1 + rand() % 9; b = 1 + rand() % 9; c = 1 + rand() % 9; start = clock(); printf("%3d + %3d + %3d = ", a, b, c); do { scanf("%d", &x); if (x == a + b + c) break; printf("Wrong! Retry!\n"); printf("%3d + %3d + %3d = ", a, b, c); } while(1); end = clock(); return (double)(end - start) / CLOCKS_PER_SEC; } double plusminus() { clock_t start = clock(), end; int a, b, c; int x; a = 1 + rand() % 9; b = 1 + rand() % 9; c = 1 + rand() % 9; printf("%3d + %3d - %3d = ", a, b, c); do { scanf("%d", &x); if (x == a + b - c) break; printf("Wrong! Retry!\n"); printf("%3d + %3d - %3d = ", a, b, c); } while(1); end = clock(); return (double)(end - start) / CLOCKS_PER_SEC; } double minusplus() { clock_t start = clock(), end; int a, b, c; int x; a = 1 + rand() % 9; b = 1 + rand() % 9; c = 1 + rand() % 9; printf("%3d - %3d + %3d = ", a, b, c); do { scanf("%d", &x); if (x == a - b + c) break; printf("Wrong! Retry!\n"); printf("%3d - %3d + %3d = ", a, b, c); } while(1); end = clock(); return (double)(end - start) / CLOCKS_PER_SEC; } double minusminus() { clock_t start = clock(), end; int a, b, c; int x; a = 1 + rand() % 9; b = 1 + rand() % 9; c = 1 + rand() % 9; printf("%3d - %3d - %3d = ", a, b, c); do { scanf("%d", &x); if (x == a - b - c) break; printf("Wrong! Retry!\n"); printf("%3d - %3d - %3d = ", a, b, c); } while(1); end = clock(); return (double)(end - start) / CLOCKS_PER_SEC; } int sleep(unsigned long x) { clock_t c1 = clock(), c2; do { if ((c2 = clock()) == (clock_t)-1) return 0; } while (1000.0 * (c2 - c1) / CLOCKS_PER_SEC < x); return 1; } int main() { int i; double t[MAX]; double sum = 0, ave; srand(time(NULL)); printf("Calculate!!\n"); for (i = 0; i < MAX; i++) { switch (rand() % 4) { case 0: t[i] = plusplus(); break; case 1: t[i] = plusminus(); break; case 2: t[i] = minusplus(); break; case 3: t[i] = minusminus(); break; } } for (i = 0; i < MAX; i++) sum += t[i]; ave = sum / MAX; putchar('\n'); for (i = 0; i < MAX; i++) { printf("%2d: %.1f sec\n", i, t[i]); } printf("Sum: %.1f sec\n", sum); printf("Average: %.1f sec\n", ave); return 0; }

###補足情報(言語/FW/ツール等のバージョンなど)
Mac

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

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

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

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

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

guest

回答2

0

ベストアンサー

Cで計算問題を解くのに掛かった時間を求めるプログラムを作りたいのですが, 計測時間が必ず0になります。

clock関数の仕様です。非常に紛らわしいのですが、この関数を所要時間の計測につかってはいけません。

Mac OSのclock関数は「現実世界で経過した時間」ではなく、「CPUが稼動していた時間」を返します。質問にあるコードでは、キーボードからのユーザ入力待ち(=CPUは何もしない)がほとんど全てですから、このような結果になります。

所要時間の計測に使える関数として、秒単位で十分ならばtime関数を、より高精度な値が必要ならgettimeofday関数で代替できます。

投稿2016/08/30 08:00

編集2016/08/30 08:07
yohhoy

総合スコア6191

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

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

退会済みユーザー

退会済みユーザー

2016/08/30 08:13

ご回答ありがとうございます。 >Mac OSのclock関数は ということですが, Windowsや他のOSでは仕様が違うのですか? このプログラムを書くのに参考にした『明解C言語 中級編』(著: 柴田望洋)では全く同じ関数で時間を計測することが出来ていました。
yohhoy

2016/08/30 08:31 編集

私が知る限り、Windows/Microsoft Visual C++だけが特殊(実時間を計測)です。LinuxやMacではCPU時間を計測します。C言語の仕様としても"The clock function determines the processor time used"とあるので、Visual C++が仕様違反という解釈が妥当でしょう。<del>該当書籍のミスだと思います。</del>
yohhoy

2016/08/30 08:30

同書籍著者の方のページ http://www.bohyoh.com/CandCPP/C/Library/clock.html も、正しく「clock関数は、使用したプロセッサ時間を求める。」と記載されていますね。 なお、複雑な計算でCPUがずっと稼動しているなら事実上「CPU時間=実時間」となりますから、このようなケースに限れば経過時間を計測することができますよ。
退会済みユーザー

退会済みユーザー

2016/08/30 08:34

ご返答ありがとうございます。参考になりました。 timeやgettimeofdayを用いてみます。
guest

0

clock関数の値は確認しましたか?
startとendでそれぞれ別の値が取れているのであれば正常な動きだと思います。
秒換算するほど処理に時間がかかっていないんじゃないかと推測します。

投稿2016/08/30 07:49

ttyp03

総合スコア16998

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

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

退会済みユーザー

退会済みユーザー

2016/08/30 08:34

参考になりました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問