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

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

ただいまの
回答率

90.52%

  • C

    3685questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 338

sanchu52

score 140

ラックナンバーリサーチの時間が過去の履歴は正常に表示されますが、
短い順に並べるところの年と月が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>

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • LouiS0616

    2017/09/25 00:45

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

    キャンセル

  • LouiS0616

    2017/09/25 00:47

    あれ、バイナリモードなのにfscanf使ってるんですか?

    キャンセル

  • sanchu52

    2017/09/25 08:04

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

    キャンセル

  • sanchu52

    2017/09/25 08:06

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

    キャンセル

回答 2

checkベストアンサー

+1

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

#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;
    double score;
}local;

// --------------- 比較用の関数 cmp -------------------
int cmp( const void *p, const void *q )
{
    double p_score = ((local*)p)->score;
    double q_score = ((local*)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,n;
    FILE *fp;
    local lst[MAXCNT];          // 構造体の宣言
    local data_t[MAXCNT];

    if( (fp = fopen(dtfile, "rb" )) == NULL ) {
        printf( "ファイルがオープンできません\n");
        exit( 1 );
    }
    i=count=0;
    while (fscanf(fp,"%d %d %d %d %d %d %lf"                  // 構造体配列への読み込み
                    , &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 )!= EOF){
           i++;
           count++;
    }

    n=count;
    qsort( lst,n, sizeof(local), cmp );

    printf("\n------------実行時間の短い順にソートします。--------------\n\n");
    for(i=0; i<n; i++ ){
       printf("%d年 %d月 %d日 %d時 %d分 %d秒 \n所要時間(score)は%.1f\n\n"              // 構造体配列への読み出し
       , 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 );
    }
    fclose(fp);
    printf("count1:%d\n\n", count);
    return 0;

}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/25 13:29

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

    キャンセル

  • 2017/09/25 13:39

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

    キャンセル

  • 2017/09/25 14:34

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

    キャンセル

+1

ファイルからの読み込み先→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])しか使われていません。
そこらへんの仕様も明確にしていただけると、よりよい回答が得られると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C

    3685questions

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