• 締切済み

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というものを使っていると思います(ここらへんは勉強不足でよくわかりません。) もしよければご回答お願いします。

みんなの回答

回答No.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); }

関連するQ&A

  • それぞれの暗算にかかった時間

    このプログラムは3つの数字の和を暗算させるプログラムです。 プログラムでは、10回の暗算にかかった合計時間を表示させて います。 質問としては「それぞれの回数にかかった時間をそれぞれ 表示させるにはどうすればいいのかか?」です。 #include<stdio.h> #include<time.h> #include<stdlib.h> int main(void) { int a,b,c,i,n; int num; clock_t start,end; srand(time(NULL)); printf("暗算トレーニング開始!!\n"); start=clock(); for(i=0;i<10;i++) { a=10+rand()%90; b=10+rand()%90; c=10+rand()%90; n=rand()%17; printf("%d%*s+%*s%d%*s+%*s%d:",a,n,"",n,"",b,n,"",n,"",c); do{ scanf("%d",&num); if(num==a+b+c) { break; } printf("\a違います。再入力してください。\n"); }while(1); } end=clock(); printf("%.1f秒かかりました。\n",(double)(end-start)/CLOCKS_PER_SEC); return 0; }

  • C言語 スロットみたいにするやり方が分かりません

    今自由課題でスロットのように数字を乱数で表示させて、Enterを押すと押したときの値を表示させたいです しかし、今書いているやつだとなぜかスロットみたいに数字の表示ができません。 おそらくif文で一旦止まってしまっていると思うのですが、どこが悪いのか教えてください。 #include <stdio.h> #include <stdlib.h> int main(){ int a,b,c; srand(time(NULL)); c = getchar(); b = rand()%6+1; for(;;){ a = rand()%6+1; printf("\033[H\033[J"); printf("%d",a); if(getchar() == '\n'){ printf("あなたのサイコロの値は%dです!!\n",a); break; }else{ continue; } } return 0; }

  • 学校の授業でC言語をやっているので「猫でも分かるC言語プログラミング」

    学校の授業でC言語をやっているので「猫でも分かるC言語プログラミング」を買ったのですが、 下記のソースを実行しようとしても「'a' :仮パラメーター リスト内にありません」とエラーが出てしまいます。 プログラミングに関してはど素人なので何をどうすればいいのかまったく分かりません。もしよければ誰か助けてください! ちなみにMicrosoft visual C++ 2010を使っています #include <stdio.h> int main() {     int a, b, c; a = 10; b = 15; c = a + b; printf("%dたす%dは%dです\n", a, b, c); return 0; }

  • C言語についてなのですが、

    C言語についてなのですが、 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<search.h> int main(void) { int i,j,k,temp,n,count,time,list[65537]; clock_t startTime, endTime; printf("取得する乱数の個数を入力してください\n"); scanf("%d",&n); srand((unsigned)time(NULL)); printf("Before sort\n"); startTime = clock(); for(i = 0; i < n; i++) { list[i] = rand(); /* printf("%d\n", list[i]);*/ } count = 0; for (i = 1; i < n; i++) { for (j = i; j < n-i-1; j++) { count++; if(list[j] < list[j+1]) { temp = list[j]; list[j] = list[j+1]; list[j+1] = temp; } } } endTime = clock(); printf("\nAfter sort\n"); for(k = 0; k < n; k++) { /* printf("%d\n", list[k]);*/ } printf("\n比較回数:%d\n", count); printf("実行時間:%.4f秒\n", (double)(endTime - startTime) / CLOCKS_PER_SEC); return 0; } 上記のソースコードをcygwinで gcc -Wall -o k5-1-2 k5-1-2.c でコンパイルしようとすると k5-1-2.c:関数'main'内 k5-1-2.c:14:error:called object is not a function と表示されます。 いろいろなサイトを参考にして乱数取得用に srand((unsigned)time(NULL));を使うように書かれていたので使っているのですが、何かだめなのでしょうか?自分ではお手上げ状態で。

  • 高(1)男子 初めてC言語でコードを書きました!!

    C言語を独学し始めた高校一年男子です。 「猫でもわかる C言語プログラミング」という本で勉強しています。 その本のポインタなどの難しいところを除いて 一通り読んで1~100までの数を当てる数当てゲームを作ってみました! これまでは、本に書かれていることを写してやっていたので、自分で組むのは初めてです。 これからは、もっと高度なプログラムやゲームを作っていきたいと思っています。 それを踏まえて、今後どのようなことを気をつけて書いていけばいいかなどの アドバイスをコードを見てしてもらいたいのですが、 だれか、お願いできないでしょうか? これが、そのコードです↓ //<if,goto,rand関数を使った数当てゲーム>// #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { printf("いまから数当てゲームをします\n"); R: printf("0~100のうちどれが答えなのか当ててください\n"); int Q,A,Y,i; srand((unsigned)time(NULL)); Q=rand()%100+1; for(i=1; i<6; i++) {printf("あと%d回で当ててください!\n",6-i); scanf("%d",&A); if(Q<A){printf("もっと小さい数です\n"); } else if(Q>A){printf("もっと大きい数です\n"); } else{printf("正解です!!(^O^)/\nもう一回やりますか??\nはい→1\nいいえ→それ以外の数字\n選択してください\n"); scanf("%d",&Y); if(1==Y){goto R;} if(1!=Y){}break;}} printf("\n「「「終了します」」」\n"); return 0; } 長くなりましたが、アドバイスお願いします m(._.)m

  • C言語で計算が合いません(初心者)

    C言語で計算が合いません(初心者) 簡単な計算のプログミングをしているのですが 計算が合わなくて困っています。 整数型変数aと実数型変数bを定義 整数型変数cとdを定義して、c=0.5*a*b、d=a/2*b 実数型変数eとfを定義して、e=0.5*a*b、f=a/2*b という内容のプログラムを作ったのですが a=7,b=2.4を代入してみた結果 ---------------------------- Input a>>7 Input b>>2.4 8 7 8.400000 7.200000 ---------------------------- となりました どこが間違っているのでしょう? 答えは8.4でcが8なのは有効数字のためだと思いますが dとeで答えが全く違う理由が分かりません。 下に私が書いたものを貼っています。 ---------------------------- #include<stdio.h> int main(void){ int a,c,d; double b,e,f,ans; printf("Input a>>"); scanf("%d",&a); printf("Input b>>"); scanf("%lf",&b); c=0.5*a*b; printf("%d\n",c); d=a/2*b; printf("%d\n",d); e=0.5*a*b; printf("%lf\n",e); f=a/2*b; printf("%lf\n",f); return 0; } ---------------------------- よろしくお願いします。

  • C言語の問題で困っています。

    C言語の問題で困っています。 誰か教えてください。 下の問題ですが、intがiだけでプログラムするにはどうしたら良いでしょうか? (a)から(d)に入るプログラムをすいませんが教えてください。 お願いします。 【問題】 1以上10以下の整数を昇順に区切って表示するプログラムです。 実行例 1 2 3 4 5 #include <stdio.h> int main (void) { int i; (A) while ((b)){ (c); (d); } printf("¥n"); return(0); }

  • c言語なのですが

    c言語なのですが #include<stdio.h> main() { int a; printf("整数を5回足し算する\n"); scanf("%d %d",&a); printf("a*5=%d\n",a*5); return(0); } でエラーが起こります どこを修正すればいいのでしょうか

  • C言語でこのプログラムを完成させるには

    C言語でこのプログラムを完成させるには C言語初心者です。 1~6の乱数を100回発生させて、それぞれの出現回数をカウントし、ヒストグラムとして表示するプログラムを作成したいのですが上手くいきません。 #include <stdio.h> #include <time.h> #include <stdlib.h> int rnd(int m, int n) { return (int)(n-m+1)*(rand()/(RAND_MAX+0.1))+m; } int main(void) { int i, j, r; int hist[7]; for (i=1; i<7; i++) hist[i]=0; srand((unsigned)time(NULL)); for (i=0; i<100; i++) { r=6; while (6-- > 0) putchar('*'); putchar('\n'); } for (i=1; i<7; i++) { printf("%2d:", i); for (j=0; j<hist[i]; j++) printf("*"); printf("\n"); } return 0; } 何がいけないのでしょうか? よろしくお願いします。

  • C言語でscanfが認識されません

    下記のプログラムですがまずc言語でlevel個の文字列を記憶させます。その後その文字列を0.5秒ほど表示して消し、コンピュータによって指示された番号の文字を当てることを複数回繰り返すプログラムです。 たとえば問題としてABCDEFがでて、その後3が指定されるとCと答えるようにしたいのです。 しかしループの奇数回目の時にscanfが認識がされていない(?)ようで答えを打ち込むことができず勝手に不正解になってしまい自分でプログラムを見直しても間違っている場所が分かりませんでした。 回答よろしくお願いします。 #include<stdio.h> #include<time.h> #include<stdlib.h> #define MAX_STAGE 10 #define MAX_LEVEL 10 #define MIN_LEVEL 3 int sleep(unsigned long x){ /*時間を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(void){ int stage; int success = 0; int level; clock_t start,end; srand(time(NULL)); printf("いくつかの文字を記憶しましょう\n");/*レベルの設定*/ do{ printf("レベルを%d以上%d以下で入力してください\nLEVEL:",MIN_LEVEL,MAX_LEVEL); scanf("%d",&level); }while(level >MAX_LEVEL || level<MIN_LEVEL); start = clock(); /*本体スタート*/ for(stage = 0;stage < MAX_STAGE;stage++){ char *no; int i,j,k; char alpha[] = "abcdef"; int ans; char kotae; no = calloc(level+1,sizeof(char)); /*答えが含まれる文字列の領域を確保*/ for(i=0;i<level;i++) /*記憶する文字列の作成*/ no[i] = alpha[rand() % 6]; no[i] = '\0'; printf("%s",no); /*答えが含まれる文字列を表示*/ fflush(stdout); sleep(500); ans = rand() % level; /*答える文字を決定*/ printf("\r%d番目の文字を答えよ:",ans + 1); scanf("%c",&kotae); if(no[ans] != kotae) printf("不正解です\n"); else{ printf("正解です\n"); success++; } } end = clock(); printf("%d回中%d回成功しました。\n",MAX_STAGE,success); printf("%.1f秒でした。\n",(double)(end - start) / CLOCKS_PER_SEC); return(0); }