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

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

ただいまの
回答率

90.48%

  • C

    3814questions

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

実行日時、実行時間を表示して、実行時間の短い順に表示したい

解決済

回答 2

投稿 編集

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

sanchu52

score 140

実行日時、実行時間を、実行時間の短い順に表示したいのですが、
コンパイルはできる状態です。コードの下に実行結果を張り付けています。
実行時間時間の短い順に表示されない。

コード
#include <stdio.h>
#include <stdlib.h>

#define NDATA ((sizeof lst)/(sizeof(DATA_TIME)))

typedef struct       // 
{
    int year;       // 
    int mon;          // 
    int mday;        // 
    int hour;         //
    int min;        // 
    int sec; 
    double score;
}DATA_TIME;

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

int main()
{
       DATA_TIME lst[]={{2017, 9,16, 8,18,10,10.6},
                         {2015,12, 7,19,59, 8, 8.0},
                         {2016, 1, 3, 1, 9,11, 7.5},
                         {2016, 4, 5,19,16, 8, 9.0},
                         {2015, 6, 4,19, 2,44, 7.5},   
                         {2016, 8, 7,22,31,52, 9.3},
                         {2014, 1, 4,23,43,50,10.2},
                         {2016, 5,31,21, 9,53, 7.0},
                         {2014, 2,12,28,31,49,13.0},
                         {2016, 2,28, 2,27,20, 7.8},
                         {2015, 5, 2,16,43,32, 6.3},
                         {2017, 9,14,10,21,18, 6.0},
                         {2017, 9,16, 8,18,10, 8.6}};       

     int i;

    DATA_TIME *plst[NDATA];

    // ポインタの配列 plst に構造体配列のアドレスを代入
    for(i=0; i<NDATA; i++) plst[i]=&lst[i];

    // 実行時間の短い順にソート
    qsort(plst, NDATA, sizeof(DATA_TIME*), cmpptr );

    //並べ替え後の内容を表示
    for( i=0; i<NDATA; i++ )
        printf("   %d年 %d月 %d日 %d時 %d分 %d秒 実行時間:%.1f秒\n\n"
        ,plst[i]->year, plst[i]->mon, plst[i]->mday,
         plst[i]->hour, plst[i]->min, plst[i]->sec, plst[i]->score);
}

/*実行結果
C:\MinGW\users\chap09\kadai>gcc -I. -o narabekae2 narabekae2.c -Wall

C:\MinGW\users\chap09\kadai> narabekae2
   2017年 9月 14日 10時 21分 18秒 実行時間:6.0秒

   2015年 5月 2日 16時 43分 32秒 実行時間:6.3秒

   2016年 1月 3日 1時 9分 11秒 実行時間:7.5秒

   2015年 12月 7日 19時 59分 8秒 実行時間:8.0秒

   2015年 6月 4日 19時 2分 44秒 実行時間:7.5秒  ・・・おかしい

   2016年 2月 28日 2時 27分 20秒 実行時間:7.8秒 ・・・おかしい

   2016年 5月 31日 21時 9分 53秒 実行時間:7.0秒  ・・・おかしい

   2016年 4月 5日 19時 16分 8秒 実行時間:9.0秒

   2016年 8月 7日 22時 31分 52秒 実行時間:9.3秒

   2014年 1月 4日 23時 43分 50秒 実行時間:10.2秒

   2017年 9月 16日 8時 18分 10秒 実行時間:8.6秒  ・・・おかしい

   2017年 9月 16日 8時 18分 10秒 実行時間:10.6秒

   2014年 2月 12日 28時 31分 49秒 実行時間:13.0秒


C:\MinGW\users\chap09\kadai>

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

0

回答依頼ありがとうございます。原因が判明したのでお伝えします。


ずばり原因は、cmp関数にあります。
この関数の返り値は暗黙のうちにintにキャストされます。

つまり、差が0~0.99999999...までの場合、0が返されます。
これは、入れ替える必要がないと通達することと同じです。


多少泥臭いですが、次のように書き換えれば期待通りに作動します。

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;
}

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/24 15:59

    あれ、質問のプログラムが変わっていますね。
    それでも原因は一緒です。

    キャンセル

  • 2017/09/24 19:04

    すみません。同じことをいろいろ試しています。同じ目的のためです。今からやってみます。
    ありがとうございます。比較関数を直すだけでいいのですね。解らないときはまたこめんとします。

    キャンセル

  • 2017/09/24 19:27

    louiS0616さん、できました。ありがとうございます。int p_scoreはdouble p_scoreで実行させていただきました。コード書き直しながらこれだけで2日掛かりました。いろいろ試したコードの整理をしたいと思います。この次に復習に備えて。また同じような質問が出てくると思いますが、おしえてください。

    キャンセル

  • 2017/09/24 19:54

    p_scoreの型は凡ミスしたので、直しておきました。
    小さなプログラムから始めて、不安を残さないように進めていくのがよいと思います。
    他の人のコードも読んでみましょう。
    頑張ってくださいね。

    キャンセル

  • 2017/09/24 20:13

    ありがとうございます。

    キャンセル

0

コメントアウトされているqsortの呼び出しで、合ってると思います。

追記

すいません。よく見切れてませんでした。

int cmpptr( const void *p, const void *q ) {
    return ((SCORE_DATA*)p)->score - ((SCORE_DATA*)q)->score;
}
・・・・・・・
          qsort( local, *count, sizeof(SCORE_DATA), cmpptr );


じゃないですかね。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/24 09:29

    otnさんありがとうございます。過去履歴は表示されるようになりましたが、並べ替えがうまくいってないようです。いろいろやったのですが、表示がされても時間がぐちゃぐちゃだったり、今は表示自体ができない状態です。途中のアルゴリズムがおかしいようなきもします。前に作ってうまく動いたのですが、保存の仕方が
    悪くて、修正できないので、1個ずつ分割してつくりなおしています。並べ替えのコードのところを見てもらえませんか?

    キャンセル

  • 2017/09/24 10:05

    debugしてみると、Program received signal SIGSEGV, Segmentation fault.
    0x0040146b in cmpptr (p=0x61f258, q=0x61f270) at narabekae.c:25
    25 return (*(SCORE_DATA**)p)->score - (*(SCORE_DATA**)q)->score;というふうにでています。ここをどのように調べて、どのようになおすのでしようか。

    キャンセル

  • 2017/09/24 13:28

    qsort( local, *count, sizeof(SCORE_DATA), cmpptr );とqsort( local, *count, sizeof(SCORE_DATA*), cmpptr );でやってみましたが並べ替えができないですね。簡単な書き換えプログラムに変更してみますので、おねがいします。順番が少しおかしいです。教えてください。

    キャンセル

  • 2017/09/24 15:49

    大体小さい順になっているがおかしい順番になっているところがあります。
    どうしてかわかりません。教えてください

    キャンセル

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

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

関連した質問

  • 受付中

    javaである期間の経過年月日時分秒を算出したい

    下記のようなStringで与えられる年月日時分秒 "2014/12/20 23:45:23"と 現在の時刻を比較し、 与えられた時刻から現在までyy年mmか月dd日 hh時間

  • 受付中

    JAVA dateの複数のデータの時刻だけを加算するには

    date型で 複数の日時と時刻が含まれるデータがあります、これをjavaで全部足して合計時間を出すにはどうすればいいでしょうか。 例えば 2016-2-25 06:30:10

  • 解決済

    Ruby Date 最後のX日を取得

    Cronで毎日動くRubyスクリプトがあります。 最後のX日を毎日取得することは可能でしょうか。 例えば X日を15日に指定した場合 本日が7/27だとしたら7/15を、

  • 受付中

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

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

  • 解決済

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

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

  • 解決済

    範囲を表すクラス名について

    前提・実現したいこと 二つの範囲を表すクラスがあり、名付けに困っています。 一つ目のクラスは、最大の値を示す max と最小の値を示す min というプロパティを持っています。

  • 解決済

    指定日が第何週目かを返したい

     前提・実現したいこと 53週目の追加とうるう年からずれる週を直したい。 たとえば表示週テストにて「console.log(schedule(new Date(2022,1,21)

  • 解決済

    毎日変わる日付のパス指定

    現在CSVファイルをサーバーにアップされてからMYSQL5.7にインポートするバッチを書いているのですが、日付を指定する条件が分からずにいます。 具体的にはまずサーバーに/tm

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

  • C

    3814questions

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