

c++
で書いています。sum[10]を降順にソートして表示したいのですがどのようにすればいいのでしょうか。今だとただsumが全て表示されるだけでソートされた状態で表示されないです。

[code]

    #include<stdio.h>
    
    int main()
    {
        FILE *f;
        float exam_result[30], xmax, sum[10], sumdummy;
        int i, j, jmin, n;
    
        f = fopen("ファイル名", "r");
        if(f == NULL){
            printf("ファイル名を開けません"¥n");
            return 1; 
        }
    
        for(i = 0; i < 30; i = i + 3)
            fscanf(f, "%g", exam_result[i]);
    
        fclose(f);
    
        if(n == 0){
            printf("ファイル名にはデータがありません);
            return1;
        }
    
        for(j = 0; j <= 10; j++){
            sum[j] = exam_result[3 * j] + exam_result[3 * j + 1] + exam_result[3 * j + 2];
        }
    
        for(j = 0; j < 10; j = j + 1){
            if(sum[j] < sum[jmin]) jmin = j;
        }
    
        if(j != jmin){
            sumdummy = sum[j];
            sum[j] = sum[jmin];
            sum[jmin] = sumdummy;
        }
    
        for(j = 0; j <= 3; j++){
            printf ("%g", sum[j]);
        }
    
        return 0;
    }
    
[/code]


CC BY-SA 4.0
2019-01-21T07:44:17.157
52170
2019-01-22T01:40:59.257
2019-01-21T08:01:32.160
31857
31857
question
c++
ソートに関する質問です


目的が  
\- ソートを使って並びかえたい  
\- ソート（を実装することで）アルゴリズムを理解したい  
どちらかで回答が異なってきますが、どっちでしょう？

前者なら `std::sort`
でさっくりソートしてください。世界中のプログラマが利用していて、およそバグがあればすでに出尽くしているであろう完成品が提供されているので、これを利用しない手はありません（既に良いものがあるのにそれを使わずにオレオレ実装することを車輪の再発明とか呼び、無駄の象徴とされています）

後者なら、ソートアルゴリズムには数多くの種類がありそれぞれに長所短所が知られていて、この場の回答欄ですべてを記述するのは困難です。せめて「安西先生、＊＊＊ソートがしたいです」くらいまでは質問を絞ってください（絞れるくらいには自分で事前調査してください）。

* * *

他の質問を見るに単に得点だけを持っていてもダメで、「出席番号と得点」をセットにして保持し、ソートし、でないと目的が達せられないのではないかと思うの心。となるとクラスオブジェクトのソートが必要で、さてどう書きましょう？
なら喜んで回答付ける人がいっぱいいると思います。


CC BY-SA 4.0
2019-01-22T00:33:13.427
52182
2019-01-22T00:33:13.427
8589
52170
answer


「std::sortは使わずに」は質問者さん以外の閲覧者さんにあまり役に立たないですので、C++言語として回答します。なお、ソートと言っても[様々なソートアルゴリズム](https://ja.wikipedia.org/wiki/%E3%82%BD%E3%83%BC%E3%83%88#%E3%82%BD%E3%83%BC%E3%83%88%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E3%81%AE%E4%B8%80%E8%A6%A7)があります。質問者さんはどれを用いるかをまず検討し、それを明記しなければ質問文が完成しません。

* * *

C++言語でソートを行う場合、[`std::sort`](https://cpprefjp.github.io/reference/algorithm/sort.html)が用意されています。特に今回のように先頭４位までに限定したソートを行う場合、[`std::partial_sort`](https://cpprefjp.github.io/reference/algorithm/partial_sort.html)が用意されています。降順で比較を行うためには[`std::greater`](https://cpprefjp.github.io/reference/functional/greater.html)を使います。ソート範囲を表す際、アドレスでも構わないですが、[`std::begin`](https://cpprefjp.github.io/reference/iterator/begin.html)及び[`std::end`](https://cpprefjp.github.io/reference/iterator/end.html)を用いることもできます。

これらを用いて、降順に４位までの間を開けずに１行で出力するには次のように書けます。

[code]

    #include <algorithm>
    #include <fstream>
    #include <iostream>
    #include <iterator>
    
    int main() {
        struct {
            float kokugo, suugaku, eigo;
        } results[10];
        if (std::ifstream f{ "ファイル名" }; !f) {
            std::cout << "ファイル名を開けません" << std::endl;
            return 1;
        } else {
            for (auto& [kokugo, suugaku, eigo] : results)
                f >> kokugo >> suugaku >> eigo;
        }
    
        float sum[10];
        int j = 0;
        for (auto& [kokugo, suugaku, eigo] : results)
            sum[j++] = kokugo + suugaku + eigo;
    
        std::partial_sort(std::begin(sum), std::begin(sum) + 4, std::end(sum), std::greater{});
    
        for (int i = 0; i < 4; i++)
            std::cout << sum[i];
        return 0;
    }
    
[/code]


CC BY-SA 4.0
2019-01-22T01:40:59.257
52185
2019-01-22T01:40:59.257
4236
52170
answer