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

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

ただいまの
回答率

88.78%

c++ 配列クラス 昇順ソート

解決済

回答 3

投稿 編集

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

aimztmyrsk

score 21

やりたいこと↓
・10th0.in,10th1.in(1行目に要素数n,2からn行目に数値の書かれたファイル)をファイル入力で受取後,昇順にソートしてファイル出力で1行ごとに数値を記載し出力
・範囲外参照に対し例外を生成
・デストラクタにより記憶域が開放されていることをdeleteをなくすなどして確認
・配列の大きさはnの値を読み取った後に要素の数に応じて変えられるものとする

途中まで書いたソースファイル↓

#include <cmath>
#include <functional>
#include <iostream>
#include <stdexcept>
#include <string>
#include <limits>
using namespace std;

class mArray {
    double* pd; // 記憶域へのポインタ
    int cs; // 現在の見かけの配列長さ
    int max; // 最大の配列長さ
public:
    mArray()//最小限のコンストラクタ.指定されない時呼び出される.
    {
        max = 2;
        pd = new double[max];
        cs = 0;
    }
    mArray(int max):max{max}//引数付きのコンストラクタ
    {
        this->max;
        pd = new double[max];
        cs = 0;
    }

    mArray& operator<<(double a){
        // 引数を配列へ格納,必要なら拡張するコードを記載
        // 最大長さは 2 倍 + 1ずつ増やしていくと効率が良い.
        // 配列を大きくする時,以前の記憶域は削除する
        // ただし,削除する前に新しい記憶域へ値をコピーする.
        double* pt;
        if(cs >= max){
            max = max*2 + 1;
            pt = new double[max];
            for(int i=0;i<cs;++i){
                pt[i] = pd[i];
            }
            delete [] pd;
            pd = pt;
        }

        pt[cs] = a;
        cs++;

        return *this;
    }
    double& operator[](int i){
        // i >= cs ならば例外を送信するコードを記載
        if(i >= cs){
            try{
                throw "Exception\n";
            }

            catch(int a){
            }
        }
        return pd[i];
    }

    int size(){
        // 配列長を返す.
        return 0; // ここを変更
    } 

    ~mArray(){
        delete [] pd; // 記憶域を開放
    }
};

int main()
{
    ifstream ifs("10th0.in");
    if(!ifs) return 1;

    int n;
    ifs >> n;

    {
        mArray aB;
    }
    for(int i=0;i< 2000000; ++i){
        mArray aC;
        mArray aB(16);
    }
    string s;
    cout <<"type something to continue...\n";
    cin >> s;
    return 0;
}

配列長のところが分からないのと,昇順にするやり方が分からないです.
ヒントでも些細なことでもなんでもいいので回答もらえると嬉しいですm(; ;)m

たくさんの回答ありがとうございました!!!
最終的に皆さんの回答を参考にこのように書きました↓

#include <iostream>
#include <string>
#include<fstream>
#include<array>
#include<algorithm>
#include<vector>
using namespace std;

int main(){
    std::ifstream ifs("10th0.in");
    if(!ifs) return 1;
    std::size_t n;

    ifs >> n;
    std::vector<int> input(n);
    for(auto&& e : input)ifs >> e;
    std::sort(begin(input),end(input));
    std::ofstream ofs{"10th0.out"};
    for(auto e : input)ofs << e << '\n';

    return 0;

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • episteme

    2020/07/22 02:21

    > なんでも使って大丈夫です!

    だったら mArray とか自作せんでいい。std::vector<double> これイッパツ。
    昇順ソートもかかなくていい。std::sort これイッパツ。

    キャンセル

  • aimztmyrsk

    2020/07/22 02:22

    yumetodoさんありがとうございます!!
    書き換えてみました。

    キャンセル

  • aimztmyrsk

    2020/07/22 02:23

    epistemeさんありがとうございます!!
    知らなかったです、調べてみます!

    キャンセル

回答 3

+2

yumetodoさんに先を越されたー...
せっかく書いたから読んでもらおうか:

#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <iterator>

int main() {
  std::vector<double> data;

  // ファイルを開けて
  std::ifstream stream("10th0.in");
  if ( !stream.is_open() ) return 1;

  // dataに読み込み
  data.assign(std::istream_iterator<double>(stream), std::istream_iterator<double>());

  // ソートして
  std::sort(data.begin(), data.end());

  // プリント
  for ( double item : data ) {
    std::cout << item << std::endl;
  }
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/22 02:35

    それassignじゃなくてvectorのコンストラクタに渡したほうがいいのでは?誤差だろうけど。

    キャンセル

  • 2020/07/22 02:39

    うん、そー思う。
    mainのアタマに std::vector<double> data; って書いちまったもんだから、その"流れ"でwww

    キャンセル

  • 2020/07/22 02:43

    おっとチョンボ。
    10th0.in のアタマにある要素数は使ってないので一回だけ"空読み"せにゃならんかった。

    キャンセル

  • 2020/07/22 08:44

    本当にありがとうございます...!!!

    キャンセル

+2

ファイル入出力するところまで書くとこうです。

配列クラスは<vector>ヘッダをインクルードしてstd::vectorを使う。
昇順ソートは<algorithm>ヘッダをインクルードしてstd::sortを使う。

#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>

int main()
{
    std::ifstream ifs("10th0.in");
    if(!ifs) return 1;
    std::size_t n;
    ifs >> n;
    std::vector<int /* 仮 */> input(n);
    for (auto& e : input) ifs >> e;
    std::sort(begin(input), end(input));
    std::ofstream ofs{"./out.dat"};
    for (auto e : input) ofs << e << '\n';
    return 0;
}

一応実行可能な状態のものもおいておきます。
prog.cppのタブがソースコードです。

Wandbox

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/22 08:46

    ファイルの入出力全くうまくできなかったのでとてもたすかります,ありがとうございます!!!

    キャンセル

checkベストアンサー

+1

本当になんでも使っていいならそもそもクラス作らなくていいのですよね

#include <vector>
#include <iostream>
#include <algorithm>
int main()
{
  std::size_t n;
  std::cin >> n;
  std::vector<int> v(n);
  for (auto&& e : v) std::cin >> e;
  std::sort(std::begin(v), std::end(v));
  for (auto&& e : v) std::cout << e << std::endl;
}

https://wandbox.org/permlink/JCm43lk1VFnA8FlP

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/07/22 02:33

    まあいいっか。

    キャンセル

  • 2020/07/22 08:44

    なるほど、ありがとうございます!!
    大学生でプログラミング初心者なんですけど,最近学校でクラスを習ったので使っていました!

    キャンセル

  • 2020/07/22 12:28

    vectorのようなクラスを作る練習は所有権とかそういう概念の学習にいいので、std::vectorを真似て作ってみるのはありだと思いますよ。まずはイテレータを作るところからですかね。
    https://qiita.com/yumetodo/items/245e94a0e85db9bf5cbb

    キャンセル

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

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

関連した質問

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