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

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

ただいまの
回答率

91.02%

  • ソート

    55questions

    複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

時間の短い順にデータを並べるには

解決済

回答 1

投稿 編集

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

sanchu52

score 121

この履歴を時間の短い順にクイックソートしたいのですが大体昇順(10個表示)になっているのですが、うまくいきません。
下にコードと実行結果を示してあります。よろしくお願いいたします。

コード/* ラックナンバーサーチ・トレーニング(最近の10回の日時)*/

#include <stdio.h>
#include <time.h>
#include <float.h>
#include <ctype.h>
#include <stdlib.h>
#include <sys/types.h> 
#include <unistd.h>
#include "getputch.h"

#define MAX_STAGE    3
#define swap(type, x, y)    do { type t = x; x = y; y = t; } while (0)
#define MAX_NUM         10

char dtfile[]  = "LACKNUM.DAT";
char dtfile2[] = "LACKNUM2.DAT";/* 最高記録用のファイル */

typedef struct {
    int tm_year;        
    int tm_mon;      
    int tm_mday;        
    int tm_hour;        
    int tm_min;      
    int tm_sec; 
    double score;   
} BEST_TEN;

// --------------- 比較用の関数 cmp -------------------
int cmpptr( const void *p, const void *q ) {
    return (*(BEST_TEN**)p)->score - (*(BEST_TEN**)q)->score;
}
// ----------------------------------------------------




/*--- 過去のトレーニング情報を取得・表示して最高得点を返す ---*/
double get_data(int *count)
{
    FILE *fp;        /* これまでの履歴を指すポインタ */
    FILE *fp2;        /* これまでの最短所要時間を指すポインタ */
    double score;            //これまでの履歴の所要時間
    double bestscore;           //これまでの最短所要時間
    int i,j=0;
    BEST_TEN best_ten[100]={0};

    if ((fp = fopen(dtfile, "rb")) == NULL) {
        printf("ファイルを作成します。\n\n");
        bestscore = DBL_MAX;  /* float.hに定義されている。double型で表現できる最大値を表すマクロDBL_MAX */
    } else {

        struct tm local;
        double line[256];

        printf("\n過去の履歴\n-------------------------- \n");

        while((i = fread(&local, sizeof(struct tm), 1, fp)) > 0 ){
             printf("%d年 %d月 %d日 %d時 %d分 %d秒\n",
                 local.tm_year + 1900, local.tm_mon + 1,
                 local.tm_mday, local.tm_hour, local.tm_min, local.tm_sec);
             fread(&score, sizeof(double), 1, fp);
             printf("得点(所要時間)は%.1f秒\n\n", score);

            best_ten[j].tm_year=local.tm_year;
             best_ten[j].tm_mon=local.tm_mon;
             best_ten[j].tm_mday=local.tm_mday;
             best_ten[j].tm_hour=local.tm_hour;
             best_ten[j].tm_min=local.tm_min;
             best_ten[j].tm_sec=local.tm_sec;
             best_ten[j].score=score;
             j++;
             (*count)++;
        }
       printf("count1は%d\n\n", *count);  
    } 
    BEST_TEN *plst[*count];
    for( i = 0; i < *count; i++ ) plst[i] = &best_ten[i];

    //qsort(配列名, 配列の数, 配列一つのバイト数, 比較関数)
    qsort( plst, *count, sizeof(BEST_TEN*), cmpptr );


        printf("\n過去のbestten\n-------------------------- \n");    
    // 並べ替え後の内容を表示
    for(i=0;i<10;i++){
        printf( "%d年 %d月 %d日 %d時 %d分 %d秒 \n"
            ,plst[i]->tm_year+1900, plst[i]->tm_mon+1, plst[i]->tm_mday,
             plst[i]->tm_hour,plst[i]->tm_min,plst[i]->tm_sec );
           printf("得点(所要時間)は %.1f秒です。\n\n",     plst[i]->score);
    }
    bestscore=plst[0]->score;
    fflush(stdout);
    fclose(fp);      
    printf("count2は%d\n\n", *count);  
    return bestscore;
}


int main(void)
{
    int       count=0;            //  
    double score;            // 今回の所要時間 
    double bestscore;        // 最短所要時間 
    double    jikan;            // 時間
    FILE *fp;

    struct tm local ;
    int k;
    int     i, j, x, stage;
    bestscore= get_data(&count);    // get_data()で前回までの最短所要時間を
                                    // ファイルから読み込んでbestscoreに代入する。 
    printf("bestscoreは%.1f\n\n", bestscore); 
    printf("count3は%d\n\n", count);                         

    return 0;

}                        

/*

C:\MinGW\users\chap09\kadai>gcc -I. -o kadai9-1-5 kadai9-1-5.c pdcurs
es.a

C:\MinGW\users\chap09\kadai>kadai9-1-5

過去の履歴
--------------------------
2015年 10月 27日 19時 9分 59秒
得点(所要時間)は11.0秒

2016年 1月 4日 19時 15分 11秒
得点(所要時間)は8.0秒

2016年 1月 4日 19時 16分 8秒
得点(所要時間)は9.0秒

2016年 1月 4日 19時 16分 39秒
得点(所要時間)は10.0秒

2016年 1月 4日 19時 19分 7秒
得点(所要時間)は10.0秒

2016年 1月 4日 19時 21分 11秒
得点(所要時間)は10.0秒

2016年 1月 4日 19時 21分 44秒
得点(所要時間)は8.0秒

2016年 1月 4日 19時 22分 55秒
得点(所要時間)は13.0秒

2016年 1月 5日 21時 31分 52秒
得点(所要時間)は12.0秒

2016年 1月 5日 21時 33分 29秒
得点(所要時間)は10.0秒

2016年 1月 31日 20時 41分 8秒
得点(所要時間)は10.0秒

2016年 1月 31日 21時 9分 59秒
得点(所要時間)は17.0秒

2016年 1月 31日 21時 12分 13秒
得点(所要時間)は8.0秒

2016年 1月 31日 21時 41分 42秒
得点(所要時間)は9.0秒

2016年 2月 2日 8時 39分 50秒
得点(所要時間)は13.0秒

2016年 2月 2日 8時 49分 31秒
得点(所要時間)は13.0秒

2016年 2月 2日 8時 58分 15秒
得点(所要時間)は13.0秒

2016年 2月 27日 8時 28分 42秒
得点(所要時間)は14.0秒

2016年 3月 27日 12時 47分 52秒
得点(所要時間)は8.0秒

2016年 3月 27日 12時 52分 31秒
得点(所要時間)は11.0秒

2016年 3月 27日 12時 54分 35秒
得点(所要時間)は9.0秒

2016年 3月 27日 13時 5分 4秒
得点(所要時間)は9.0秒

2016年 3月 27日 13時 15分 12秒
得点(所要時間)は13.0秒

2016年 5月 2日 15時 54分 51秒
得点(所要時間)は16.0秒

2016年 5月 2日 15時 57分 18秒
得点(所要時間)は9.0秒

2016年 5月 2日 16時 24分 25秒
得点(所要時間)は14.0秒

2016年 5月 2日 16時 40分 31秒
得点(所要時間)は16.0秒

2016年 5月 2日 16時 42分 52秒
得点(所要時間)は11.0秒

2016年 5月 2日 16時 43分 30秒
得点(所要時間)は12.0秒

2016年 5月 2日 16時 44分 14秒
得点(所要時間)は12.0秒

2016年 5月 2日 17時 0分 48秒
得点(所要時間)は7.0秒

2017年 8月 14日 16時 36分 8秒
得点(所要時間)は12.0秒

2017年 8月 14日 20時 57分 13秒
得点(所要時間)は10.0秒

2017年 8月 14日 20時 57分 40秒
得点(所要時間)は6.0秒

2017年 8月 14日 21時 3分 21秒
得点(所要時間)は13.0秒

2017年 8月 14日 21時 7分 3秒
得点(所要時間)は11.0秒

2017年 8月 14日 21時 23分 16秒
得点(所要時間)は13.0秒

2017年 8月 14日 22時 11分 55秒
得点(所要時間)は11.0秒

2017年 8月 14日 22時 16分 22秒
得点(所要時間)は8.0秒

2017年 9月 9日 10時 20分 15秒
得点(所要時間)は12.0秒

2017年 9月 9日 10時 25分 1秒
得点(所要時間)は13.0秒

2017年 9月 9日 10時 57分 21秒
得点(所要時間)は12.0秒

2017年 9月 9日 11時 3分 6秒
得点(所要時間)は16.0秒

2017年 9月 9日 11時 10分 34秒
得点(所要時間)は24.0秒

2017年 9月 9日 11時 11分 18秒
得点(所要時間)は28.0秒

2017年 9月 9日 11時 17分 44秒
得点(所要時間)は15.0秒

2017年 9月 9日 11時 22分 20秒
得点(所要時間)は9.0秒

2017年 9月 9日 11時 27分 33秒
得点(所要時間)は12.0秒

2017年 9月 9日 11時 28分 59秒
得点(所要時間)は8.0秒

2017年 9月 9日 12時 0分 59秒
得点(所要時間)は13.3秒

2017年 9月 9日 12時 3分 5秒
得点(所要時間)は6.1秒

2017年 9月 9日 12時 3分 29秒
得点(所要時間)は11.0秒

2017年 9月 9日 12時 4分 2秒
得点(所要時間)は7.5秒

2017年 9月 9日 12時 7分 46秒
得点(所要時間)は22.0秒

2017年 9月 9日 12時 9分 56秒
得点(所要時間)は11.0秒

2017年 9月 9日 12時 14分 36秒
得点(所要時間)は6.2秒

2017年 9月 9日 12時 38分 12秒
得点(所要時間)は8.0秒

2017年 9月 9日 12時 39分 12秒
得点(所要時間)は21.0秒

2017年 9月 10日 12時 48分 1秒
得点(所要時間)は15.0秒

2017年 9月 10日 16時 9分 3秒
得点(所要時間)は11.0秒

2017年 9月 10日 16時 13分 40秒
得点(所要時間)は13.0秒

2017年 9月 10日 16時 15分 25秒
得点(所要時間)は10.0秒

2017年 9月 10日 16時 16分 4秒
得点(所要時間)は22.0秒

2017年 9月 10日 16時 18分 14秒
得点(所要時間)は15.0秒

2017年 9月 10日 16時 19分 27秒
得点(所要時間)は9.0秒

2017年 9月 10日 16時 19分 47秒
得点(所要時間)は9.0秒

count1は66


過去のbestten
--------------------------
2017年 8月 14日 20時 57分 40秒
得点(所要時間)は 6.0秒です。

2017年 9月 9日 12時 14分 36秒
得点(所要時間)は 6.2秒です。

2016年 5月 2日 17時 0分 48秒
得点(所要時間)は 7.0秒です。

2017年 9月 9日 12時 3分 5秒
得点(所要時間)は 6.1秒です。

2016年 1月 4日 19時 15分 11秒
得点(所要時間)は 8.0秒です。

2016年 1月 4日 19時 21分 44秒
得点(所要時間)は 8.0秒です。

2017年 9月 9日 12時 4分 2秒
得点(所要時間)は 7.5秒です。

2017年 9月 9日 12時 38分 12秒
得点(所要時間)は 8.0秒です。

2016年 1月 31日 21時 12分 13秒
得点(所要時間)は 8.0秒です。

2017年 9月 9日 11時 28分 59秒
得点(所要時間)は 8.0秒です。

count2は66

bestscoreは6.0

count3は66


C:\MinGW\users\chap09\kadai>
*/
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • kei344

    2017/09/12 19:21

    質問タグにて言語を指定されたほうが回答を得やすいと思います。

    キャンセル

  • sanchu52

    2017/09/12 19:33

    すみません。このコーナーの使い方がいまいちわかりません。質問文を送る時、タグ欄はどうすればいいかよくわからないし、”ここに言語を記入”というところはどこに何を書けばいいのですか、c言語をつかっていますがそれを書くってことですか?質問の内容はここにかいていいのですか?教えてください。

    キャンセル

回答 1

check解決した方法

-1

この質問を棚上げしたいと思います。解答していただいている方に申し訳ないので、このコードを使っている
全文を完成してから、指摘いただいたコードの修正にとりかかりたいとおもいます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

  • 受付中

    c言語:time.hを使い現在時刻を取得して、if文で使う方法

    前提・実現したいこと c言語で現在の時刻を取得し、午前中なら「午前中です」と表示、午後なら「午後です」と表示したいのですが、時間に関する関数の使い方がわかりません。 発生してい

  • 解決済

    配列

    n個のデータを配列に読み込み、平均と分散を求めるプログラムを作成して、下記のデータで試せ、という問題です。 {3.9,10.4,9.5,7.5,2.8,4.8,2.9,8.1,3

  • 解決済

    可変引数の引数の数を取得する。

    int func(int count, ...){ int sum = 0; va_list ap; va_start(ap, count);

  • 解決済

    C言語で都道府県を表示するプログラムで、選択ソートが機能していません

    名前、面積、人口、人口密度からなる構造体を配列で宣言し、テキストファイルから都道府県名、人口、面積を読み取って、そこから人口密度を計算し、配列に代入したら、人口密度でソート(選択ソ

  • 解決済

    プログラミング言語 テスト

    include <stdio.h> main(){ int data[10]; double ave;//平均点 int max, min, n, i =0;//nはデータ数に使用

  • 受付中

    プログラムを見やすく改良したい

    正常に動くプルグラムを見やすく改良したい。 具体的に教えていただければありがたいです。セグメンテーションフォルトでベスト7まで表示して停止します。173行あたりだと思うのですが、よ

  • 解決済

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

    ラックナンバーリサーチの時間が過去の履歴は正常に表示されますが、 短い順に並べるところの年と月が2017年が3917年、10月が9月と表示され、そのほかの 時間は正常です。コードの

  • 解決済

    C言語のネストした構造体の配列の初期化

    前提・実現したいこと C言語でネスとした構造体の配列を初期化したい。 該当のソースコード typedef struct { long l1; long l2; }T1 ty

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

  • ソート

    55questions

    複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。