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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

ソート

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

1711閲覧

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

_._._ami

総合スコア26

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

ソート

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/07/21 08:57

編集2020/07/22 00:54

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

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

c++

1#include <cmath> 2#include <functional> 3#include <iostream> 4#include <stdexcept> 5#include <string> 6#include <limits> 7using namespace std; 8 9class mArray { 10 double* pd; // 記憶域へのポインタ 11 int cs; // 現在の見かけの配列長さ 12 int max; // 最大の配列長さ 13public: 14 mArray()//最小限のコンストラクタ.指定されない時呼び出される. 15 { 16 max = 2; 17 pd = new double[max]; 18 cs = 0; 19 } 20 mArray(int max):max{max}//引数付きのコンストラクタ 21 { 22 this->max; 23 pd = new double[max]; 24 cs = 0; 25 } 26 27 mArray& operator<<(double a){ 28 // 引数を配列へ格納,必要なら拡張するコードを記載 29 // 最大長さは 2 倍 + 1ずつ増やしていくと効率が良い. 30 // 配列を大きくする時,以前の記憶域は削除する 31 // ただし,削除する前に新しい記憶域へ値をコピーする. 32 double* pt; 33 if(cs >= max){ 34 max = max*2 + 1; 35 pt = new double[max]; 36 for(int i=0;i<cs;++i){ 37 pt[i] = pd[i]; 38 } 39 delete [] pd; 40 pd = pt; 41 } 42 43 pt[cs] = a; 44 cs++; 45 46 return *this; 47 } 48 double& operator[](int i){ 49 // i >= cs ならば例外を送信するコードを記載 50 if(i >= cs){ 51 try{ 52 throw "Exception\n"; 53 } 54 55 catch(int a){ 56 } 57 } 58 return pd[i]; 59 } 60 61 int size(){ 62 // 配列長を返す. 63 return 0; // ここを変更 64 } 65 66 ~mArray(){ 67 delete [] pd; // 記憶域を開放 68 } 69}; 70 71int main() 72{ 73 ifstream ifs("10th0.in"); 74 if(!ifs) return 1; 75 76 int n; 77 ifs >> n; 78 79 { 80 mArray aB; 81 } 82 for(int i=0;i< 2000000; ++i){ 83 mArray aC; 84 mArray aB(16); 85 } 86 string s; 87 cout <<"type something to continue...\n"; 88 cin >> s; 89 return 0; 90}

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

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

c++

1#include <iostream> 2#include <string> 3#include<fstream> 4#include<array> 5#include<algorithm> 6#include<vector> 7using namespace std; 8 9int main(){ 10 std::ifstream ifs("10th0.in"); 11 if(!ifs) return 1; 12 std::size_t n; 13 14 ifs >> n; 15 std::vector<int> input(n); 16 for(auto&& e : input)ifs >> e; 17 std::sort(begin(input),end(input)); 18 std::ofstream ofs{"10th0.out"}; 19 for(auto e : input)ofs << e << '\n'; 20 21 return 0; 22 23}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mitama_rs

2020/07/21 10:57

使っているコンパイラとC++のバージョンを教えていただけませんか? 加えて、「ファイル出力で1行ごとに数値を記載し出力」というのは何らかの別のファイルに書き出すということで合ってますか?
episteme

2020/07/21 12:03

std::vector, std::sort 使っちゃダメなんですか?
yumetodo

2020/07/21 14:00

(*this).ってまた斬新な書き方だなぁ、たしかにそう書けるけどさ・・・ あとそのコンストラクタ、多分要素を初期化してないですが大丈夫ですか?
_._._ami

2020/07/21 17:13

バージョンはApple clang version 11.0.3 (clang-1103.0.32.62) Target: x86_64-apple-darwin19.4.0 Thread model: posix と出てきました! コンパイラは分からないです...すみません.
_._._ami

2020/07/21 17:14

なんでも使って大丈夫です!
_._._ami

2020/07/21 17:16

他の書き方を知らないです...! もしよかったら一般的な書き方教えて頂きたいです。 どうやったら初期化できますか??
yumetodo

2020/07/21 17:18

ふつうthis->maxだろうし、そもそも mArray(int max) : max{max} { // do something } じゃない?
_._._ami

2020/07/21 17:18

mitama_rsさん すみません答えそびれました!合ってます!別のファイルに書き出したいです。
episteme

2020/07/21 17:21

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

2020/07/21 17:22

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

2020/07/21 17:23

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

回答3

0

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

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

cpp

1#include <iostream> 2#include <fstream> 3#include <string> 4#include <algorithm> 5 6int main() 7{ 8 std::ifstream ifs("10th0.in"); 9 if(!ifs) return 1; 10 std::size_t n; 11 ifs >> n; 12 std::vector<int /* 仮 */> input(n); 13 for (auto& e : input) ifs >> e; 14 std::sort(begin(input), end(input)); 15 std::ofstream ofs{"./out.dat"}; 16 for (auto e : input) ofs << e << '\n'; 17 return 0; 18}

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

Wandbox

投稿2020/07/21 17:39

編集2020/07/21 17:40
mitama_rs

総合スコア165

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

_._._ami

2020/07/21 23:46

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

0

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

C++

1#include <iostream> 2#include <fstream> 3#include <algorithm> 4#include <vector> 5#include <iterator> 6 7int main() { 8 std::vector<double> data; 9 10 // ファイルを開けて 11 std::ifstream stream("10th0.in"); 12 if ( !stream.is_open() ) return 1; 13 14 // dataに読み込み 15 data.assign(std::istream_iterator<double>(stream), std::istream_iterator<double>()); 16 17 // ソートして 18 std::sort(data.begin(), data.end()); 19 20 // プリント 21 for ( double item : data ) { 22 std::cout << item << std::endl; 23 } 24}

投稿2020/07/21 17:33

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yumetodo

2020/07/21 17:35

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

2020/07/21 17:39

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

2020/07/21 17:43

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

2020/07/21 23:44

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

0

ベストアンサー

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

cpp

1#include <vector> 2#include <iostream> 3#include <algorithm> 4int main() 5{ 6 std::size_t n; 7 std::cin >> n; 8 std::vector<int> v(n); 9 for (auto&& e : v) std::cin >> e; 10 std::sort(std::begin(v), std::end(v)); 11 for (auto&& e : v) std::cout << e << std::endl; 12}

https://wandbox.org/permlink/JCm43lk1VFnA8FlP

投稿2020/07/21 17:23

yumetodo

総合スコア5850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

_._._ami

2020/07/21 17:27

具体的なコードまで本当にありがとうございますたすかります!!
yumetodo

2020/07/21 17:30

基本的にC++でnew/deleteを書くのは間違いです。std::stringやstd::vectorなどのコンテナクラス、std::unique_ptr/std::shared_ptrなどのスマートポインタを検討してください。 ところで結局何がしたかったんだろうか。頑張ってクラスを書いていたからにはなんかそういう練習がしたかったのだとエスパーしていたのですが。
yumetodo

2020/07/21 17:33

まあいいっか。
_._._ami

2020/07/21 23:44

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

2020/07/22 03:28

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問