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

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

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

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

Q&A

解決済

3回答

2043閲覧

C言語(プログラム作動時間の表示)

FumiakiNakao

総合スコア180

C

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

0グッド

0クリップ

投稿2016/01/12 00:21

以下のようなラックナンバーサーチのプログラムを作ったのですが、最後の使用時間の表示が
なぜか毎回「0.0秒かかりました」になってしまいます

時間自体の分岐はできているようなのでjikan変数には正しく値は代入されているようなのですが…
皆さんの意見をお聞かせ願えれば幸いです

c

1#include<stdio.h> 2#include<time.h> 3#include<stdlib.h> 4 5#define MAX_STAGE 10 6 7int main(void){ 8 9 int i,j,stage; 10 int dgt[9]={1,2,3,4,5,6,7,8,9}; 11 int a[8]; 12 double jikan; 13 clock_t start,end; 14 15 srand(time(NULL)); 16 17 printf("欠けている数字を入力してください。\n"); 18 19 start=clock(); 20 21 for(stage=0;stage<MAX_STAGE;stage++){ 22 int x=rand()%9; 23 int no; 24 25 i=j=0; 26 27 while(i<9){ 28 if(i!=x) 29 a[j++]=dgt[i]; 30 i++; 31 } 32 33 for(i=0;i<8;i++) 34 printf("%d",a[i]); 35 printf(":"); 36 37 do{ 38 scanf("%d",&no); 39 }while(no!=dgt[x]); 40 } 41 42 end=clock(); 43 44 jikan=(double)((end-start)/CLOCKS_PER_SEC); 45 46 printf("%.1f秒かかりました。\n",jikan); 47 48 if(jikan>25.0) 49 printf("鈍すぎます。\n"); 50 else if(jikan>20.0) 51 printf("少し鈍いですね。\n"); 52 else if(jikan>17.0) 53 printf("まあまあですね。\n"); 54 else 55 printf("素早いですね。\n"); 56 57 return 0; 58 59} 60

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

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

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

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

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

KoichiSugiyama

2016/01/12 01:32

startとendそれぞれに入っている値がどういうものか表示させてみた結果を教えてください。
FumiakiNakao

2016/01/12 05:32

start,end ともに0.0との表示がでました
guest

回答3

0

ベストアンサー

ozwkさんのおっしゃるように、C標準のclock関数は処理系によって挙動が違うので時間計測には使えません。おそらくscanfでの入力待ち時間が含まれないため、常に0.0秒になっているのだと思います。
C++だと標準で時間計測に使えるクラスがあるのですがCにはないので、たぶんシステムコールを呼ぶしかないと思います。

UNIX系ならgettimeofdayclock_gettimeなど
WindowsならGetTickCount64QueryPerformanceCounterなど

投稿2016/01/12 02:22

catsforepaw

総合スコア5938

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

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

FumiakiNakao

2016/01/12 06:42

start=GetTickCount64() としendにも同じように代入した結果、jikanが20.7秒と表示されました ありがとうございました!
guest

0

(double)((end - start)/CLOCKS_PER_SEC)

(double)(end - start)/CLOCKS_PER_SEC
にしてみてください。


UNIX系だと
IO処理はclock()の経過時間に含まれないようです。

投稿2016/01/12 00:34

編集2016/01/12 01:27
ozwk

総合スコア13512

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

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

FumiakiNakao

2016/01/12 00:50

実は最初はその書き方でだめだったので、今の書き方にしてみたんですよね(´;ω;`) 他に何かあれば教えてくださいm(__)m
ozwk

2016/01/12 01:23

「時間自体の分岐はできている」というのはどう判断しましたか?
FumiakiNakao

2016/01/12 05:29

「時間自体の分岐」は経過時間によってその後のif文が正確に機能していることから判断しました なるほど!OSによる問題だったのですね 無知で恥ずかしい限りなのですが、windows10もその限りなのでしょうか?…
ozwk

2016/01/12 05:34 編集

startとendの値が(longにキャストして)どうなっているかと 実際の計測時間(大体でよい)がかけ離れていれば、scanfの入力待ちか何かが カウントされていないということです。
FumiakiNakao

2016/01/12 05:35

すみません さきほど「時間自体の分岐ができている」と書いたのですが、今試したところ、どんなに遅くとも「素早いですね」とのコメントがでることから、それすらできていないことがわかりました… ちなみにend start を表示させた結果は両方とも0.0になっていました おっしゃる通りIO処理はclock関数に含まれていないようです…
guest

0

こんにちは。

msvc 2015では31.0秒等と表示されました。
もちろん、小数点以下が常に0になります。
(double)((end - start)/CLOCKS_PER_SEC)では除算も整数型のまま行われるため、小数点以下は切り捨てられます。ozwkさんの回答のように変更すると小数点以下の値も表示されます。

なぜ、FumiakiNakaoさんの環境では常に0.0秒のままなのか分かりませんが、環境の問題の可能性がありそうです。start、end、CLOCKS_PER_SECの値を直接printfされてみれば何か判るかも知れません。


【追記】

ozwkさんの下記を見て調べてみました。

UNIX系だと IO処理はclock()の経過時間に含まれないようです。

http://man7.org/linux/man-pages/man3/clock.3.html
http://www.cplusplus.com/reference/ctime/clock/
を見るとプログラムが使ったプロセッサ時間と記載されてます。経過時間ではないのですね。

Windowsでは下記のように記載されているので、マイクロソフトは規格とは異なる実装をしているようです。
https://msdn.microsoft.com/ja-jp/library/4e2ess30.aspx

ということは、catsforepawさんの対策が妥当と感じます。

投稿2016/01/12 01:46

編集2016/01/12 02:38
Chironian

総合スコア23272

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問