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

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

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

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

Q&A

解決済

2回答

1726閲覧

実行時間の表示がおかしい

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2017/09/24 15:35

ラックナンバーリサーチの時間が過去の履歴は正常に表示されますが、
短い順に並べるところの年と月が2017年が3917年、10月が9月と表示され、そのほかの
時間は正常です。コードの下に実行結果をはりつけています。教えてください。

コード /* 構造体の配列を宣言して、ファイルからデータを読み込むサンプルプログラムです。 ラックナンバーリサーチの構造体配列の過去の履歴の表示と scoreの実行時間の短い順にソートします。 */ #include <stdio.h> #include <stdlib.h> #include <time.h> #define MAXCNT 100 char dtfile[] = "LACKNUM.DAT"; typedef struct{ int tm_year; int tm_mon; int tm_mday; int tm_hour; int tm_min; int tm_sec; }local; local data_t[100]; typedef struct { // 構造体の宣言 local data_t[100]; double score; } tim_t; // --------------- 比較用の関数 cmp ------------------- int cmp( const void *p, const void *q ) { double p_score = ((tim_t*)p)->score; double q_score = ((tim_t*)q)->score; if (p_score > q_score) return 1; else if(p_score < q_score) return -1; else return 0; } // ---------------------------------------------------- int main(void) { int i,count=0; FILE *fp; tim_t lst[MAXCNT]; // 構造体の宣言 local data_t[MAXCNT]; if( (fp = fopen(dtfile, "rb" )) == NULL ) { printf( "ファイルがオープンできません\n"); exit( 1 ); } for(i=0; i<MAXCNT; i++){ if(fscanf(fp,"%d %d %d %d %d %d %lf\n" // 構造体配列への読み込み , &lst->data_t[i].tm_year,&lst->data_t[i].tm_mon, &lst->data_t[i].tm_mday, &lst->data_t[i].tm_hour,&lst->data_t[i].tm_min,&lst->data_t[i].tm_sec,&lst[i].score )!= 7) break; (count)++; return count; } int n=sizeof(lst)/sizeof(tim_t); qsort( lst,n, sizeof(tim_t), cmp ); printf("\n------------実行時間の短い順にソ\ートします。--------------\n\n"); for(i=0; i<n; i++ ){ printf("%d年 %d月 %d日 %d時 %d分 %d秒 \n所要時間(score)は%.1f\n\n" // 構造体配列への読み出し , data_t[i].tm_year, data_t[i].tm_mon,data_t[i].tm_mday,data_t[i].tm_hour,data_t[i].tm_min,data_t[i].tm_sec,lst[i].score ); } fflush(stdout); fclose(fp); printf("count1:%d\n\n", count); return 0; } /* 実行結果 C:\MinGW\users\chap09\kadai>gcc -I. -o narabekae1 narabekae1.c -Wall C:\MinGW\users\chap09\kadai> narabekae count1:13 2017年 9月 16日 8時 52分 18秒 所要時間(score)は10.6 2015年 12月 7日 19時 59分 8秒 所要時間(score)は8.0 2016年 1月 4日 1時 9分 11秒 所要時間(score)は7.5 2016年 1月 4日 19時 16分 8秒 所要時間(score)は9.0 2016年 1月 4日 19時 2分 44秒 所要時間(score)は7.5 2016年 1月 4日 22時 31分 52秒 所要時間(score)は9.3 2016年 1月 4日 23時 33分 50秒 所要時間(score)は10.2 2016年 1月 31日 21時 9分 53秒 所要時間(score)は7.0 2016年 2月 2日 8時 49分 9秒 所要時間(score)は9.4 2016年 2月 27日 12時 45分 26秒 所要時間(score)は13.0 2016年 2月 28日 2時 27分 20秒 所要時間(score)は7.4 2016年 5月 2日 16時 43分 32秒 所要時間(score)は6.3 2017年 9月 14日 10時 21分 18秒 所要時間(score)は6.0 実行時間の短い順にソートします。 3917年 10月 14日 10時 21分 18秒 ....年、月の表示がおかしい 所要時間(score):6.0 3916年 6月 2日 16時 43分 32秒 所要時間(score):6.3 3916年 2月 31日 21時 9分 53秒 所要時間(score):7.0 3916年 3月 28日 2時 27分 20秒 所要時間(score):7.4 3916年 2月 4日 1時 9分 11秒 所要時間(score):7.5 3916年 2月 4日 19時 2分 44秒 所要時間(score):7.5 3915年 13月 7日 19時 59分 8秒 所要時間(score):8.0 3916年 2月 4日 19時 16分 8秒 所要時間(score):9.0 3916年 2月 4日 22時 31分 52秒 所要時間(score):9.3 3916年 3月 2日 8時 49分 9秒 所要時間(score):9.4 3916年 2月 4日 23時 33分 50秒 所要時間(score):10.2 3917年 10月 16日 8時 52分 18秒 所要時間(score):10.6 3916年 3月 27日 12時 45分 26秒 所要時間(score):13.0 count2:13 count3は13 C:\MinGW\users\chap09\kadai> */

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

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

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

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

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

LouiS0616

2017/09/24 15:45

localとtim_tが混在してわけがわからなくなっている気がします。あと、DATをテキストファイルに変えたのでしたら、サンプルデータを載せていただけると原因究明しやすいです。
LouiS0616

2017/09/24 15:47

あれ、バイナリモードなのにfscanf使ってるんですか?
退会済みユーザー

退会済みユーザー

2017/09/24 23:04

はい、freadを使う章なので、これを使うべきですね。ありがとうございます。理解するのに15分かかりました。
退会済みユーザー

退会済みユーザー

2017/09/24 23:06

バイナリデータを使っています。コードを眺めて修正します。
guest

回答2

0

ファイルからの読み込み先→lst配列
qsort対象→lst配列
短い順に表示している配列→data_t配列

というわけで、data_t配列には何も値を代入していないので、表示がおかしいのは当たり前です。
lst配列の値を出力するようにしてみてください。

但し現状の構造体の定義には不明な点があります。
lst配列は100個の要素があり、その1要素の中に更にlocal構造体の配列が100個ある。
ソートしたいのは、lst配列でしょうか、それとも各要素内のlocal配列でしょうか。
ファイルからの読み込み先も、lst->data_t[i]となっており、これは、lst[0].data_t[i]と同じです。
つまりlst配列は100個の要素があるけど、実際には1個([0])しか使われていません。
そこらへんの仕様も明確にしていただけると、よりよい回答が得られると思います。

投稿2017/09/25 00:50

ttyp03

総合スコア16998

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

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

0

ベストアンサー

ご提示のソースを参考にqsortを使い作成してみました。構造体の定義を変えておりますのでご参考です。

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <time.h> 4 5#define MAXCNT 100 6char dtfile[] = "LACKNUM.DAT"; 7 8typedef struct{ 9 int tm_year; 10 int tm_mon; 11 int tm_mday; 12 int tm_hour; 13 int tm_min; 14 int tm_sec; 15 double score; 16}local; 17 18// --------------- 比較用の関数 cmp ------------------- 19int cmp( const void *p, const void *q ) 20{ 21 double p_score = ((local*)p)->score; 22 double q_score = ((local*)q)->score; 23 24 if (p_score > q_score) return 1; 25 else if(p_score < q_score) return -1; 26 else return 0; 27} 28// ---------------------------------------------------- 29 30int main(void) 31{ 32 int i,count,n; 33 FILE *fp; 34 local lst[MAXCNT]; // 構造体の宣言 35 local data_t[MAXCNT]; 36 37 if( (fp = fopen(dtfile, "rb" )) == NULL ) { 38 printf( "ファイルがオープンできません\n"); 39 exit( 1 ); 40 } 41 i=count=0; 42 while (fscanf(fp,"%d %d %d %d %d %d %lf" // 構造体配列への読み込み 43 , &lst[i].tm_year,&lst[i].tm_mon,&lst[i].tm_mday, 44 &lst[i].tm_hour,&lst[i].tm_min,&lst[i].tm_sec, &lst[i].score )!= EOF){ 45 i++; 46 count++; 47 } 48 49 n=count; 50 qsort( lst,n, sizeof(local), cmp ); 51 52 printf("\n------------実行時間の短い順にソートします。--------------\n\n"); 53 for(i=0; i<n; i++ ){ 54 printf("%d年 %d月 %d日 %d時 %d分 %d秒 \n所要時間(score)は%.1f\n\n" // 構造体配列への読み出し 55 , lst[i].tm_year, lst[i].tm_mon,lst[i].tm_mday,lst[i].tm_hour,lst[i].tm_min,lst[i].tm_sec,lst[i].score ); 56 } 57 fclose(fp); 58 printf("count1:%d\n\n", count); 59 return 0; 60 61} 62

投稿2017/09/25 00:08

A.Ichi

総合スコア4070

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

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

退会済みユーザー

退会済みユーザー

2017/09/25 04:29

お手数をおかけしました。ありがとうございました。ほかの人に構造体の宣言の仕方を指摘いただいたので、上のようにやってみたのですが、うまく改変できませんでした。実行してみました。うまくいきました。
A.Ichi

2017/09/25 04:39

構造体の部分で勘違いをされている様な気がします。私は、よく間違えるので図に書いてみたりしています。 尚、local data_t[MAXCNT];は消し忘れです。
退会済みユーザー

退会済みユーザー

2017/09/25 05:34

A.Ichiさんありがとうございます。趣味でやっています。独学なので1個引っかかると次から次と調べながらやっています。 間口が広がって、何をしたかったのかわからなくなることもしばしばあります。 柴田望洋著のc言語中級編で勉強しています。今9章の自由課題の1を復習しています。答えがないので なかなかたいへんです。以前解答出来たところで、コードの見直しをしていて、うまくいかなくなって四苦八苦しています。これからもよろしくおねがいします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問