//tips
//基本情報理解及びC#
フリップフロップはビット情報を保持する回路で、キャッシュメモリの基本回路に用いられる。
二つの状態(通常「0」および「1」に対応付けられる)のいずれかを保持することができ、現在の入力と共に過去の入力も利用する順序回路の一種で、SRAMやマイクロプロセッサ(CPU/MPU)内部のレジスタ、キャッシュメモリなどに応用されている。
RS型フリップフロップ回路」はR(Reset:リセット)とS(Set:セット)の二つの入力、QとQの二つの出力で構成され、入力と出力がそれぞれ対応する。
機械学習には答えのないデータを学習する教師なし学習があり、AIデータが自らデータの特徴をもとに類似性の高いグループにクラスタリングしていくことで学習する。
正規分布は、平均値を中心に左右対称の山のようなカーブを描く確率分布で、平均と標準偏差だけで分布に関する全ての特性が規定できる。
標準偏差をσ[シグマ]とすると、次の関係が成り立つことになる。
平均±σの範囲に全体の約68%が含まれる
平均±2σの範囲に全体の約95%が含まれる
平均±3σの範囲に全体の約99%が含まれる
標準偏差が各段階の幅なので、中央に平均値を置き、左右に3段階の幅を持たせていけば、境界点も簡単にわかる。
//C#振り返り
コマンドライン引数とは、プログラム起動時にパラメーターを渡すことができるもので、そのパラメーターによって通常の起動とは違う処理をさせることができる。
通常、コマンドプロンプトでプログラムを実行する際に、プログラムのパスの後ろに文字列をパラメータとして指定する。
例えば、ファイルのパスをコマンドライン引数に指定して起動するとそのファイルが開かれた状態でメモ帳が起動するのは、メモ帳がそのように作られているからである。
この指定を行う形で作成していくが、これはMainの引数にargsを入れることで実現できる。
using System;
namespace DistanceConverter
{
public class Program
{
static void Main(string[]args)
{
if (args.Length >= 1 && args[0] == "-tom")
{
for (int feet = 1; feet <= 10; feet++)
{
double meter = FeetToMeter(feet);
Console.WriteLine("{0}ft ={1:0.0000}m", feet, meter);
}
}
else
{
for (int meter = 1; meter <= 10; meter++)
{
double meter = MeterToFeet(meter);
Console.WriteLine("{0}m ={1:0.0000}ft", meter, feet);
}
}
}
static double FeetToMeter(int feet)
{
return feet * 0.3048;
}
static double MeterToFeet(int meter)
{
return meter / 0.3048;
}
}
}
Mainメソッドにforのループが二つできて複雑になってきたので独立させる。
using System;
namespace DistanceConverter
{
public class Program
{
static void Main(string[]args)
{
if (args.Length >= 1 && args[0] == "-tom")
{
PrintFeetToMeterList(1, 10);
}
else
{
PrintMeterToFeetList(1, 10);
}
}
static void PrintFeetToMeterList(int start,int stop)
{
for (int feet = start; feet <= stop; feet++)
{
double meter = FeetToMeter(feet);
Console.WriteLine("{0}ft ={1:0.0000}m", feet, meter);
}
}
static void PrintMeterToFeetList(int start, int stop)
{
for (int meter = start; meter <= stop; meter++)
{
double feet = MeterToFeet(meter);
Console.WriteLine("{0}m ={1:0.0000}ft", meter, feet);
}
}
static double FeetToMeter(int feet)
{
return feet * 0.3048;
}
static double MeterToFeet(int meter)
{
return meter / 0.3048;
}
}
}
このようにしたらかなりスッキリした。
さらに計算部分を分離して別ファイルにすると、
namespace DistanceConverter
{
public class FeetConverter //引数の値によってのみ戻り値が確定させられる、プロパティやフィールドの利用なし
{
public static double FromMeter(double meter)
{
return meter / 0.3048;
}
public static double ToMeter(double feet)
{
return feet * 0.3048;
}
}
}
Console以外でも計算処理が使えるように設計できる。クラス内のメンバーが全てstaticなので静的クラスにする事ができる。
ベースのものは下記のように変更されるstaticで宣言されているのでnewする必要がなくクラス名とメソッド名をそのまま書けば良い。
using System;
namespace DistanceConverter
{
public class Program
{
static void Main(string[]args)
{
if (args.Length >= 1 && args[0] == "-tom")
{
PrintFeetToMeterList(1, 10);
}
else
{
PrintMeterToFeetList(1, 10);
}
}
static void PrintFeetToMeterList(int start,int stop)
{
for (int feet = start; feet <= stop; feet++)
{
double meter = FeetConverter.ToMeter(feet);
Console.WriteLine("{0}ft ={1:0.0000}m", feet, meter);
}
}
static void PrintMeterToFeetList(int start, int stop)
{
for (int meter = start; meter <= stop; meter++)
{
double feet = FeetConverter.FromMeter(meter);
Console.WriteLine("{0}m ={1:0.0000}ft", meter, feet);
}
}
static double FeetToMeter(int feet)
{
return feet * 0.3048;
}
static double MeterToFeet(int meter)
{
return meter / 0.3048;
}
}
}
private const double ratio = 0.3048;で複数回使用されている定数を統一しておく。
もし他のクラスからアクセスさせたい場合はpublic static readonly double Ratio=…とする。将来変更を予想される場合にはこちらを使う。
というのもconstにしてしまうと.exeに値が埋め込まれてしまい、後々constの変更部分があったとしても古い値のまま動き続けてしまうため。
Visual studioにて実行してみるとエラーが発生。
Error CS5001: Program does not contain a static 'Main' method suitable for an entry point (CS5001) (ctrainning)
要因を調べていくとProjectフォルダの中に、何故かDistanceConverter.csがないという事が判明。検索しても出てこない。visual studioのファイル生成の方法がまずかったよう。
別ファイルとして複製すると無事に動いた。
1m =3.2808ft
1m =3.2808ft
2m =6.5617ft
3m =9.8425ft
4m =13.1234ft
5m =16.4042ft
6m =19.6850ft
7m =22.9659ft
8m =26.2467ft
9m =29.5276ft
10m =32.8084ft
きちんと左側のソリューションエクスプローラーという枠組みのプロジェクト名を右クリックして追加していくようにする。
次にcsvファイルを読み込み金額を集計するアプリを作成していく。
Csvファイルは何行あるか分からないので、配列ではなく、インスタンス生成後に要素を追加できるList<T>ジェネリッククラスに格納する。
CsvをSaleオブジェクトに変換したのち、List<Sale>に格納していく。
これはstatic List<Sale> ReadSales(string filePath){…}で引数をファイルのパス、戻り値をList<Sale>とし、中身で取得構造を書く。
List<Sale> sales= new List<Sale>();でインスタンスを生成し、このリストにオブジェクトを追加していく。
ファイルを読み込むには
string[] lines= File.ReadAllLines(filePath);
とし、system.IO名前空間のReadAllLines静的メソッドを使い、全ての行を読み、配列に格納する。万以上の場合は難しいが、小さいファイルでは有効かつ便利。
一行単位で内容が区切られている場合は、foreach(string line in lines)とし、一行づつ取り出して処理を行う。
読み込んだ一行をさらに,単位で分解するためにstring[] items=line.Split(‘,’);を用いる。
新宿,カステラ,001
だとしたら、
items[0]=“新宿”
items[1]=“カステラ”
items[2]=“001”
と分解されることになる。
分解したらSaleオブジェクトの中に格納する。
Sale sale= new Sale
{
ShopName=items[0],
ProductCategory=items[1],
Amount=int.Parse(items[2])
};
これはオブジェクトの初期化子と呼ばれるものでsale.ShopName=items[0]などと従来書かれていたところをより文脈上わかりやすくする。
sales.Add(sale);でsalesコレクションに追加。returnでsalesオブジェクトを返す。
店舗別売上を求める際にdictionaryクラスを用いていく。