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

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

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

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

Q&A

3回答

1876閲覧

この問題のプログラムはどうなるのですか?

kuro19991026

総合スコア6

C++

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

0グッド

0クリップ

投稿2016/12/19 09:32

###実現したいこと
初歩的な質問だとは思うのですが、答えていただけると幸いです
下の問題を解くとプログラムはどういう風になるのかプログラムを書いていただけると幸いです。
お願いします。

###問題

099までに分布する23個のデータが配列dに格納されている。このデータを019,2039,4059,6079,8099の5階級に分け、各級の度数、全体の平均と標準偏差を計算し、次のように表示するプログラムを作成しなさい。

各級の度数 a[y]は、次のようにして求められる。
y=d[i]/20; a[y]=a[y]+1;
表示例
0 ― 19 4
20 ― 39 3
40 ― 59 6
60 ― 79 7
80 ― 99 3
平 均 = 52.2
標準偏差 = 24.7

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

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

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

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

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

coco_bauer

2016/12/19 09:35

まず、自分でコードを書いてみましょう!
guest

回答3

0

ざくざくっと書いてみた。

C++

1#include <iostream> 2#include <random> 3#include <array> 4#include <algorithm> 5#include <numeric> 6#include <cmath> 7#include <ctime> 8 9using namespace std; 10 11int main() { 12 const int N = 23; 13 array<float,N> data; // 元データ 14 15 // 平均50/標準偏差25 の正規分布乱数で初期化する 16 mt19937 gen(time(nullptr)); // メルセンヌ・ツイスタ 17 normal_distribution<float> dist(50.0f, 25.0f); // 正規分布 18 generate_n(begin(data), N, 19 [&]() { 20 int val; 21 do { val = static_cast<int>(dist(gen)); } 22 while ( val < 0 || val > 99 ); 23 return static_cast<float>(val); 24 }); 25 26 array<int,5> histogram; 27 histogram.fill(0); 28 29 // 総和, 二乗和, 度数分布を求める 30 float sum = 0.0f; 31 float sqsum = 0.0f; 32 for_each(begin(data), end(data), 33 [&](float val) { 34 sum += val; 35 sqsum += val*val; 36 ++histogram[val/20]; 37 }); 38 39 // 総和から平均、 二乗和と平均から標準偏差 を求める 40 float mean = sum / N; 41 float stddev = sqrtf(sqsum / N - mean * mean); 42 43 // できたかな? 44 for ( int i = 0; i < 5; ++i ) { 45 cout << i*20 << " - " << i*20+19 << '\t' << histogram[i] << endl; 46 } 47 cout << "平均 = " << mean << endl; 48 cout << "標準偏差 = " << stddev << endl; 49}

投稿2016/12/20 01:04

episteme

総合スコア16614

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

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

0

全くもって初歩的ではありませんでした。データの配列がintなのかlongなのか、また、配列と言っても単純なarrayなのかlistなのかvectorなのかさっぱり示してくれていませんので、テンプレートを使って色々やるしかありません。ネストしたテンプレートなんて初めて使いましたよ。

C++

1#include <array> 2#include <cmath> 3#include <cstddef> 4#include <iostream> 5#include <tuple> 6#include <vector> 7 8template <class Int> class IntDataAnalyzer 9{ 10public: 11 template <class Float> class Result; 12 13private: 14 const Int min; 15 const Int max; 16 const std::size_t rate; 17 18public: 19 IntDataAnalyzer(Int min, Int max, std::size_t rate); 20 21 template <class Float, template <class, class> class Container, 22 class AllocInt> 23 Result<Float> analyze(const Container<Int, AllocInt> &list) const; 24 template <class Float> 25 Result<Float> analyze(const Int list[], std::size_t n) const; 26 template <class Float, std::size_t N> 27 Result<Float> analyze(const std::array<Int, N> list) const; 28 29public: 30 template <class Float> class Result 31 { 32 const IntDataAnalyzer analyzer; 33 const Float average; 34 const Float standardDeviation; 35 const std::vector<std::size_t> frequencies; 36 37 public: 38 Result(IntDataAnalyzer analyzer, Float average, 39 Float standardDeviation, 40 std::vector<std::size_t> frequencies); 41 std::vector<std::tuple<Int, Int, std::size_t>> 42 frequenciesMinMaxList() const; 43 auto statisticalData() const; 44 }; 45}; 46 47template <class Int> 48IntDataAnalyzer<Int>::IntDataAnalyzer(Int min, Int max, std::size_t rate) 49 : min(min), max(max), rate(rate) 50{ 51} 52 53template <class Int> 54template <class Float, template <class, class> class Container, class AllocInt> 55IntDataAnalyzer<Int>::Result<Float> IntDataAnalyzer<Int>::analyze( 56 const Container<Int, AllocInt> &list) const 57{ 58 Float sum = 0; 59 std::vector<std::size_t> frequencies(this->rate, 0); 60 Int range = (this->max - this->min + 1) / this->rate; 61 for (const auto &i : list) { 62 sum += i; 63 ++frequencies[(i - this->min) / range]; 64 } 65 Float average = static_cast<Float>(sum) / list.size(); 66 Float variance = 0; 67 for (const auto &i : list) { 68 variance += std::pow((i - average), 2); 69 } 70 return IntDataAnalyzer<Int>::Result<Float>( 71 *this, average, std::sqrt(variance / list.size()), frequencies); 72} 73template <class Int> 74template <class Float> 75IntDataAnalyzer<Int>::Result<Float> IntDataAnalyzer<Int>::analyze( 76 const Int list[], std::size_t n) const 77{ 78 return this->analyze<Float>(std::vector<Int>(list, list + n)); 79} 80template <class Int> 81template <class Float, std::size_t N> 82IntDataAnalyzer<Int>::Result<Float> IntDataAnalyzer<Int>::analyze( 83 const std::array<Int, N> list) const 84{ 85 return this->analyze<Float>(std::vector<Int>(list.begin(), list.end())); 86} 87 88template <class Int> 89template <class Float> 90IntDataAnalyzer<Int>::Result<Float>::Result(IntDataAnalyzer analyzer, 91 Float average, Float standardDeviation, 92 std::vector<std::size_t> frequencies) 93 : analyzer(analyzer), average(average), 94 standardDeviation(standardDeviation), frequencies(frequencies) 95{ 96} 97template <class Int> 98template <class Float> 99std::vector<std::tuple<Int, Int, std::size_t>> 100IntDataAnalyzer<Int>::Result<Float>::frequenciesMinMaxList() const 101{ 102 std::vector<std::tuple<Int, Int, std::size_t>> list; 103 Int range = 104 (this->analyzer.max - this->analyzer.min + 1) / this->analyzer.rate; 105 Int min = this->analyzer.min; 106 Int max = this->analyzer.min + range - 1; 107 for (const auto &n : this->frequencies) { 108 if (max > this->analyzer.max) max = this->analyzer.max; 109 list.push_back(std::make_tuple(min, max, n)); 110 min += range; 111 max += range; 112 } 113 return list; 114} 115template <class Int> 116template <class Float> 117auto IntDataAnalyzer<Int>::Result<Float>::statisticalData() const 118{ 119 struct { 120 Float average; 121 Float standardDeviation; 122 } ret{this->average, this->standardDeviation}; 123 return ret; 124} 125 126int main() 127{ 128 auto output = [](auto result) { 129 for (const auto &data : result.frequenciesMinMaxList()) { 130 std::cout << std::get<0>(data) << u8" ― " 131 << std::get<1>(data) << " " 132 << std::get<2>(data) << std::endl; 133 } 134 const auto sData = result.statisticalData(); 135 std::cout << u8"平均 = " << sData.average << std::endl; 136 std::cout << u8"標準偏差 = " << sData.standardDeviation 137 << std::endl; 138 }; 139 { 140 const IntDataAnalyzer<int> ida(0, 99, 5); 141 const std::vector<int> a = {35, 75, 23, 98, 64, 97, 10, 83, 44, 142 36, 83, 9, 19, 26, 61, 41, 89, 50, 8, 86, 18, 22, 78}; 143 output(ida.analyze<double>(a)); 144 } 145 146 { 147 const IntDataAnalyzer<long long> ida(0, 99, 5); 148 const std::vector<long long> a = {35, 75, 23, 98, 64, 97, 10, 149 83, 44, 36, 83, 9, 19, 26, 61, 41, 89, 50, 8, 86, 18, 22, 150 78}; 151 output(ida.analyze<double>(a)); 152 } 153 { 154 const IntDataAnalyzer<int> ida(0, 99, 5); 155 const int a[] = {35, 75, 23, 98, 64, 97, 10, 83, 44, 36, 83, 9, 156 19, 26, 61, 41, 89, 50, 8, 86, 18, 22, 78}; 157 output(ida.analyze<double>(a, 23)); 158 } 159 { 160 const IntDataAnalyzer<int> ida(0, 99, 5); 161 const std::array<int, 23> a{{35, 75, 23, 98, 64, 97, 10, 83, 44, 162 36, 83, 9, 19, 26, 61, 41, 89, 50, 8, 86, 18, 22, 78}}; 163 output(ida.analyze<double>(a)); 164 } 165 166 return 0; 167}

あなたが初心者なら、上のコードは色々と理解できないところばかりだと思います。自主的な勉強なら、そんな曖昧で想定すべき事が多すぎる難しい問題をやらずに、プログラミング初心者向けの定義が明確な問題をすることをお勧めします。

投稿2016/12/19 13:25

raccy

総合スコア21733

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

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

kuro19991026

2016/12/19 13:31

全く示してなくてすいません。 1つだけ書き忘れたことがあって 始まりは、 #include <stdio.h> #define N 5 main() になるってことだけがヒントで出ていました。 書き忘れていてすいませんでした。
raccy

2016/12/19 13:37 編集

C++で<stdio.h>ではなく<cstdio>を使うべきです。また、定数はマクロ定数ではなくconstを使うべきです。<stdio.h>を使え、マクロ定数を使えという時点で、C++としてはかなり悪い問題です。即刻、そのような問題は捨てて、もっとよいC++の本なりサイトなりを探すことをお勧めします。そのような悪問だけをやっても、正しいプログラミングが身に付くことはありません。
majiponi

2016/12/20 07:50

長すぎて保守が大変そう…ここまでやる必要ありますかねえ? (問題が曖昧なことと、初学者向けではないことは同意しますが) 指導書の学習「順序」として、まず古典的なCを勉強しているかもしれないので、一概には「悪い問題」だとは決めつけられないかと。 まあ、raccyさんの危惧はごもっともですし、私も「いい指導書」だとは1mmも思いませんが。 stdio.hについては、Cのレガシーを弄っただけのcstdioより、raccyさんも使われているiostreamを勧めるべきかと(テンプレート使うなら尚更)。マクロ定数については完全に同意。
raccy

2016/12/20 09:38

iostreamを使うべきってのは同意っすね。printfなんか使うよりstd::coutの方がはるかに使いやすくて、問題も起きにくいですから。 結局、問題の前提条件が曖昧というのは、そもそも問題を書いている人が問題を理解していないのだと思います。こんな問題なら普通は色々と疑問点が湧くはず何ですが・・・ そもそもa[y]=a[y]+1;とか書いている時点で、出題者のレベルの低さがうかがえます。なぜ、++a[y];とか書かないのかと、せめてa[y]+=1;だろうとかと、この出題者はC/C++を知らないんじゃ無いのかなー。
guest

0

他のサイトでも同じ質問をだしてますね。
ja.stackoverflow.com/questions/31242/

まず、「度数」、「平均」、「標準偏差」の求め方はわかりますか?

投稿2016/12/19 12:50

sleepsheep

総合スコア310

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

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

kuro19991026

2016/12/19 13:28

標準偏差以外の2つはわかります。
sleepsheep

2016/12/19 14:43

C++というよりはC言語の問題ですね。 では、まず度数と平均を求めるためのプログラムを書いてみて下さい。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問