###実現したいこと
初歩的な質問だとは思うのですが、答えていただけると幸いです
下の問題を解くとプログラムはどういう風になるのかプログラムを書いていただけると幸いです。
お願いします。
###問題
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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア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
総合スコア21735
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/19 13:31
2016/12/19 13:37 編集
2016/12/20 07:50
2016/12/20 09:38
0
他のサイトでも同じ質問をだしてますね。
ja.stackoverflow.com/questions/31242/
まず、「度数」、「平均」、「標準偏差」の求め方はわかりますか?
投稿2016/12/19 12:50
総合スコア310
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/12/19 13:28
2016/12/19 14:43
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。