大復活C#学習_Listを使って合計と平均値を求める

f:id:yasui_swift:20201218164234p:plain

Listを用いた平均と標準偏差の計算


お年玉プロジェクトへはなかなか到達しない。まだまだ遠い道のりが続く。

今回はジェネリックなコレクションであるListを使ったプロジェクトを作り、Listの初歩的な使い方を学習する。入門なので、今回はデータ数をはじめに与えて使い方を学習する(文末<覚え書き>参照)。

配列とは違う使い勝手に慣れることを目的とする。ソートして昇順、降順の表示や最大値、最小値の表示も学ぶ。

メインは画面表示とListを用いた入力、集計、計算結果のみを表示する。

画面と入力・計算はそれぞれ別のクラスとしてメソッドを記載する。

【学習のポイント】

・p = Console.ReadLine(); //(Console.Readline();は文字型stringで入力される)

・int x = int.Parse(p); //文字列を整数に変換.型を変換することをキャストという.

・List<int> numList = new List<int>(); //numListという名前のリストを作る

・numList.Add(w);  //Listにwを追加する

・numList.Sort();  //昇順にソートする 

・numlist.Reverse();  //降順にソートする

・numList.Count  //Listの長さ(件数)を数える

・ Math.Pow((numList[a]-mean),2.0);//べき乗の変数はdouble型でないとエラーになる

・Math.Sqrt(bunsan_calc1 / b);//平方根も変数はdouble型

 【リストの作成コード】

class CalcList
{
 public CalcList() { }
 public void Calclist()
 {
  //Listの件数を入力する 
  string p; //件数はstring型、あとでint型に変換
        string value; //値もstring型、あとでint型に変換
  int w;
  var sum = 0;
  float mean;
  int maxW = 0;
  int minW = 0;

  Console.Write(" 件数を入れてください__ "); //はじめに件数を入れる
  p = Console.ReadLine(); //(Console.Readline();は文字型stringで入力される)
  Console.WriteLine(); //

  int x = int.Parse(p); //文字列を整数に変換が必要

  //Listの作成
  List<int> numList = new List<int>(); //numというnumListを作る
  for (int n = 0; n < x; n++)
   {
    Console.Write(" " + (n + 1) + "番目の整数の値を入れてください__ ");

    value = Console.ReadLine();//値の入力
    w = int.Parse(value);
    numList.Add(w); //Listに加える

    sum +=  w; //合計を求める

   }

  float y = x;
  mean = sum / y;

  //昇順にソートする
  Console.WriteLine();
  Console.WriteLine(" 昇順にソートの結果を表示します");
  numList.Sort();

  for (int i = 0; i < numList.Count; i++)
  {
   Console.WriteLine(" " + numList[i]);
   maxW = numList[i];
   minW = numList[0];
  }

  //標準偏差を計算する
  double bunsan_calc1 = 0;

  double sd = 0;

  for (int a = 0;a<numList.Count;a++)
  {
   bunsan_calc1 += Math.Pow((numList[a]-mean),2.0); //2乗して加算
  }
  double b = numList.Count;
  sd = Math.Sqrt(bunsan_calc1 / b);

  Console.WriteLine();
  Console.Write(" 合計 = {0}", sum);
  Console.Write(" 平均 = {0:##.##}", mean);
  Console.WriteLine(" 標準偏差 = {0:##.#}",sd);
  Console.WriteLine(" 最小値{0}, 最大値{1}", minW, maxW);
 }
}

【画面の表示】

class GamenConsole
{
 public void gamenConsole()
 {
  Console.WriteLine();
  Console.WriteLine(" ================================");
  Console.WriteLine(" 平均値の計 算:整数(Listを使用)");
  Console.WriteLine(" ================================");
  Console.WriteLine();
 }

【メイン】

class Program
{
 static void Main( )
 {
  GamenConsole gamen = new GamenConsole();
  gamen.gamenConsole();
  CalcList calc = new CalcList();
  calc.calclist();
 }

f:id:yasui_swift:20201219075634j:plain

線路は続く

*********

これで今度の試験の採点は平均点と標準偏差が計算できるようになった。

できれば最初に件数を入れないで数値だけどんどん入れてリストを作り、それぞれの学生の偏差値も計算できるといいけれどなあ。まだ出来ない。こんど考えよう(お年玉プロジェクトをさきに作らないといけないし)。でも、名前と点数が紐づけられていないと実用性はないな。

*** Listのメソッド ***

Add(値)//最後尾に要素を追加

Insert(位置、値)//指定した位置に要素を挿入

Remobve(値)//指定した位置の要素を削除

RemoveAtClear(インデックス) //指定したインデックスの要素を削除

Clear()//すべての要素を削除

IndexOf(検索する値)//要素の位置を検索

Contains(検索する値)//要素の有無を調べる

Sort()//昇順にソート

Reverse()//降順にソート

f:id:yasui_swift:20201219075723j:plain

海辺を走る

*** <コレクションに関する覚え書き> ***

C#ではプログラムで複数のデータを扱う場合、配列とコレクションのふたつの方法で取り扱う。配列は処理スピードが早いが、初期化時にデータ数を指定する必要がある(固定長)。

コレクションはプログラムの途中でデータの数を変更でき、初期化時にデータの数を指定しなくてもよい利点がある。C#には歴史的な経緯で非ジェネリックジェネリックなコレクションがあるが、現在では新しいジェネリックを使用すべきで、非ジェネリックなコレクションを用いる利点はない。ジェネリックなコレクションには、List、Dictionary、SortedList、SortedDictionary、Queue、Stack、LinkedListがある。