モチベーションも大事だと思うので覚書として使用します。
一週目は、北米Amazonで購入した英字キーボードのレジストリ設定に始まり、
コードは一行読むのに20分かかっていたのが、10分、3分今は何も見ずある程度理解できてきた。
実際の型の使い方を覚え書くようになると、子供の頃ハッカー気分でカタカタ遊んでたのを思いだした…
①読みやすくPascal形式(クラス名プロパティ名メソッド名構造体等)BackColor や FormBorderStyle テスト担当者たちは、プログラマの敵ではなく「友人」であると私は言いたいです。1.styleと原則
1.可読性
2.保守性
3.開発効率
4.美しさ
プログラマが知るべき97のこと
②但し3つはcamel形式使う。(パラメータ、public以外のフィールド、ローカル変数)backColor や formBorderStyle
③表記ブレ防ぐjpeg, jpg, message, msg, win, windows
④桁位置合わせ スペースうまく使って=をあわせる
⑤変数とループにもスタイルがある(クラスのメンバ変数=フィールド。
C++ プログラマはメンバ変数に "m_" を付ける習慣がありますが、
フィールドをあらわすFを付けることをすすめます。というのはm_の2文字よりコンパクトになる)
⑥xxxManager / xxxControllerとかの説明系は長い
⑦get / setはプロパティで使うから、代わりにload, save, add等を使う。
checkは意味が広すぎて何してるか分からないから具体的にisNull, isEmpty
テスターに遭遇した場合
彼らは、取るに足りないと思えるような問題を逐一指摘してくるかもしれません。
それで「恥をかかされた」と思う人もいるでしょう。
しかし、些細に思える問題でも社内で解決しておけば、
顧客や投資家はその問題に煩わされずに済みます。
そうすれば、あなたは恥をかくどころか、顧客や投資家から高く評価されるでしょう。
概念を理解するためには、オブジェクト指向があると何が便利になるのかをおさえること。2.オブジェクト指向
明確な答えはない、効率的なモノ作りをするための思考と解釈。
プログラミングの変数やそのプロパティ、その継承も効率的なモノ作りのためです。
(説明しろと言われたらそう答えたい)
構造体と関数があって、この構造体と関数はセットみたいなもんだから一緒にまとめられると便利だ→クラス
クラスの中の変数へのアクセスを制限できると便利だ→カプセル化
1つのクラスから、追加したい差分を定義することによってクラスを定義できると便利だ→継承
継承したクラスは、親クラスと同じように扱えると便利だ。
継承したクラスの関数は親クラスのものと処理が違うこともあるが、やりたいことは一緒なので、
関数がどのクラスのものか勝手に判定して呼びわけてくれると便利だ→多態(ポリモフィズム)
classやpropertyには、 名詞 コミット:変更(ロールバック:取り消す)Githubでソース管理を行い問題ないと判断した場合にコミットして変更情報を確定 変数(=クラスclass データの箱 VARiable) プロパティ:9.変数-④参照 ture(真)false(偽) ==等しい <=以下 >=以上 冗長…曖昧語、多くの業態で失敗に備えた予備として使用。3.初めて知った用語
namespace 名前空間の名付けについては、企業名、製品名、技術名をドットでつなげるMicrosoft.WindowsMobile.DirexcX
method メソッド名には、動詞
デバッグ:バグ&修正
パス:PATH 場所 絶対パスc:---.txt
関数(=メソッドmethod, func 処理の箱) 代入(=と違う)
関数について:1処理名→2引数入れる(実行させたい値.別名パラメータ)→3実行→4戻り値(結果の値)
ex)代替サーバーを用意し冗長性をもたせる←明らか肯定文。重複し長くて無駄という意味もあるが…
・キーボードUS配列設定 1.コンパネ>システム>デバマネ>キーボード削除>メニュの操作>4.VisualStudio 扱い方/キーボードUS配列設定
VisualStudio>新規プロジェクト>コンソールアプリ>コードファイル追加>コード入力>ビルド(正常orエラー)>デバッグなしで実行
VisualStudio>新規プロジェクト>空のソリューション>Visual C#追加
・ついでにWebBrowser作り方
新規プロジェクト>フォームアプリ>ツールボックスのWebBrowserでプロパティURL指定でゲームできる
(できたゲームはプロジェクト内にexeあるから)プロジェクトはUser内sourceに入ってる
注意:Insertキーで上書き/挿入モード切り替わってしまう。
ショートカット:
Ctrl+K(N)(F) ブクマ(移動)(整形)
+G 行
+M 畳
+Shift+L 行削除
ハードウェア変更のスキャン(キーボード復活したら閉じる)
2.レジストリ>MSの言う通りにする
3.レジストリ> HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts\
内の使用してるInputツールのLayout関連の該当DLLを片っ端からJPからUSにする(GoogleやIME)
4.再起動後、Alt+`きかない場合、Google日本語入力再インストール(タスクから辞書ツールのエクスポート後)
uncs(p/i)ci using System;←システム使う宣言で必要 public どこからでもアクセス可能 ※{}で改行するのは見やすくするためのルール(インデントという)5.Hello, World(Console.WriteLine 文+改行)
console.Writeは文(code内で改行しても、どんなに長文でも1行出力)
先頭で"\n"入れれば以前がLineでなくとも改行。Console.Write"\n~~~"
変数として改行を入れる場合、Environment.NewLine
console.WriteLineは文+改行、console.Writeは文(code内で改行しようと1行となる)
// myname01.cs
namespace practice;←クラスの上の階層でパックできる
class MyName01←クラスでカプセル化する宣言
public static void Main()←必ずMainメソッド。パブリックスタティックボイドメイン()
//publicアクセシビリティ(クラス外呼出可能)staticクラスのインスタンス外呼出可能
void値返さない()には引数((実行させたい値.別名パラメータ.コマンドライン引数))書ける
インスタンスはクラスメンバーを基にして実際に値まで入った実体(宣言しただけはゴミと同じ)
protected クラス内部と派生クラスの内部からのみアクセス可能
private protected(C# 7.2)同一プロジェクト内のクラス内部と派生クラスの内部からのみアクセス可能
private クラス内部からのみアクセス可能
//Hello, World
Console.WriteLine("Hello, World");
Console.WriteLine("私の名前はh.okabeです");
//Write(ただ書くだけ改行なし!)
Console.Write("あ");
Console.Write("い");
Console.Write("う");
Console.Write("え");
Console.Write("お");//下記コードとも繋がる
6以前 正しいですが、その通りややこしいので今はこういう書き方は主流ではありません。 var now = DateTime.Now;// "2018年04月01日"書式設定も可能6. string.Format() をやめて$"{}";
ちょっと長いけど要するにこう(testerString は使い回す場合追加で)
var testerString =
"\n入力内容の確認:\n" +
$"Tester number: No.{counter}\n" +
$"Tester Name: {t.Name}\n" +
$"Tester Age: {t.Age}\n" +
$"Tester Country: {t.Country}\n" +
$"Tester Lang: {t.Lang}\n" +
$"Tester Response: {t.Response}\n" +
$"Tester Rating: {t.Rating}\n" +
$"Tester Specialty: {t.Specialty}\n";
Console.Write(testerString);
/*
Console.WriteLine("\n入力内容の確認:");
Console.WriteLine($"Tester number: No.{counter}");// counter
Console.WriteLine($"Tester Name: {t.Name}");
Console.WriteLine($"Tester Age: {t.Age}");
Console.WriteLine($"Tester Country: {t.Country}");
Console.WriteLine($"Tester Lang: {t.Lang}");
Console.WriteLine($"Tester Response: {t.Response}");
Console.WriteLine($"Tester Rating: {t.Rating}");
Console.WriteLine($"Tester Specialty: {t.Specialty}");*/
//変数の扱い方(C#6以降、文字列補間)
int a = 10, b = 20, total = a + b;
Console.WriteLine($"{a}+{b}={total}");//{}で囲まないと文字列なる
Console.WriteLine(a+ "+" +b+ "=" +(a+b));
←aと"+"とb、と"="と(a+b)。と表示される、演算子は接続子みたいなもの
次のように書きます。
Console.WriteLine($"{a}+{b}={a+b}");//+ややこしい、($"{}");表記追加
※変数は{}で囲まないと文字列なる
Console.WriteLine($"{now:yyyy年MM月dd日}"
※スペースは見やすさのために入れているので、あってもなくても構いません。
("{0:D6}",表示したい値); 例("{0:d6}", 100);//000100 100をDの6桁表示7.書式指定文字(精度指定子は桁数/小数点以下桁数の精度を指定)
Console.WriteLine($"123:#.##");// #.## D6 C f5..etc
C通貨 Console.WriteLine("{0:C}", 10000);//\10,000
D10進 Console.WriteLine("{0:d6}", 100);//000333※整数のみ("{0:d}", -100.5);エラー
F小数 Console.WriteLine("{0:f}, {0:f5}", 0.1234); // 0.12, 0.12340※GでFかE簡潔な方表示
P% Console.WriteLine("{0:p1}", 0.1234); // 12.30%
・カスタム
("0")ゼロプレースフォロダ対応する数字に置き換えるなくても0表示。例1234.5678 ("00000") -> 01235
("#")桁プレースホルダー対応する数字に置き換えるなければ非表示、整数は#有無関わらず表示1234.567("#.##") -> 01235
Console.WriteLine("{0:#.##}", 1234.567);1234.57
Console.WriteLine("{0:#,#.00}", 1234567);123,456,7.00※#と0の合わせ技。#,#で三桁区切、00で小数点以下0詰 Console.WriteLine("{0:D6}", 333);
Console.WriteLine("{0:C}", 10000);
Console.WriteLine("{0:e}", 1234);
Console.WriteLine("{0:E}", 123456789);
Console.WriteLine("{0:e10}", 1.23456789);
Console.WriteLine("{0:f}, {0:f5}", 0.1234);
Console.WriteLine("{0:p1}", 0.1234);
Console.WriteLine("{0:p2}", 0.1234);
Console.WriteLine("{0:#,#.00}", 1234567);
Console.WriteLine("{0:#,#.00}", 1234567890);
Console.WriteLine("{0:#.##}", 1234.567);
8.Console.ReadLine(); 質問、入力値を返せる
using System;
namespace practice//名前空間(namespace、classの上階層で名前つけて整理 N1やN2と表せる)
{
class Program//ユーザー定義型
{
static void Main()//メソッド
{
Console.WriteLine("あなたの名前を入力してください");
string name;
name = Console.ReadLine();
Console.WriteLine("あなたの年齢を入力してください");
string age;
age = int.Parse(Console.ReadLine());
//デフォはStringなのでint.Parse()で囲むと文字列を整数型として変換できる
Console.WriteLine($"{name}さんは{age}歳です");//AさんはB歳です
//{}も文字にしたい場合ブレイス2個追加で($"{{{name}}}。"も文字にしたい場合\追加で\"とする。
Console.WriteLine($"\"{{{name}}}さんは{{{age}}}歳です\"");
}
}
}
1クラスは、データとその振る舞いをカプセル化したもの 2この1つのオブジェクトが持つ範囲の値をフィールド(メンバ変数)(メソッド宣言時)という。 (変数にはint型変数(int x;)やstring型変数(string str;)等データ型しか入らない、別の箱に入れるというかコピーできる) 前の書き方 これでPersonというユーザー定義型を自分で作った&プロパティ作った事に (定義した変数に値代入すると"初期化"という、その値の事を"初期値"という) 変数は最初にデータ型例えばint(整数型) 次にスペースあけて変数名 int x=10;値型 str="10"参照型 ex ) ・参照型には「実体がどこにあるのかという情報」が格納。実体はずっと別の場所(ヒープ)に確保。 ex ) メソッドを変数のように扱えるため実際にはメソッドなのにまるで変数を操作しているよう このような表を作りたいとする。 //クラスStaffのインスタンスを作成。(引数で$nameを入れてあげます。) echo $tanaka->name; // tanaka 流れ↓ ・public以外のアクセシビリティ //あとはインスタンス生成してくだけ ・自動プロパティでクラスとプロパティのみになり、コンストラクタはget;}後ろに="ダニエル";でOK ・配列の宣言と初期化 実行結果 配列は変数の並び。100個の変数が必要なら ・配列 COLLECTION LIST 他説明 コンテナの実例(果物の名前) 何個あるかチェック9.変数(class VARiable)とデータ型の詳細
①変数と関数
(データはフィールド(メンバ変数)、振る舞いは関数(メソッド)と言える)
3コンストラクタはクラスをインスタンス化した時にフィールドの初期化できる
4関数は[修飾子] 戻り値のデータ型 メソッド名(引数1, 引数2, ....){省略}//チャンネルを変えろでなくチャンネルを1chに変えろだと()に引数1chがはいる-
(ちなみにデフォである機能なので組み込み型という、Person等自分で作った変数はユーザー定義型)
これはいちいち整数int文字列stringとわけずとも、1つのデータとしてまとめる事できる
例1
private int fuga;//(関数 メソッド フィールド メンバ関数)
public int Hoge{
get{ return fuga; }// get{return フィールド名;}
set{ fuga = value; }//set{フィールド名 = value;}
}
//前のプロパティ定義の仕方
class Person
{
public string name; // 名前
public uint age; // 年齢
public string address; // 住所
}
※定義しただけなので"ゴミが入っている"と俗に言う
②初期化
※変数を宣言と同時に初期化した状態(10は初期化子という)→int x=10;//あとから代入int x; x=10;の事を動的初期化という
変数に同時に初期化子代入で初期化、あとから初期値代入が動的初期化。
ちなみにこの変数にconstフィールドを付加して定数(constant)にできる。
※定数は定まった数で確定できる(変更してもコンパイルエラーなるから分かりやすい)
定数型は3つconst、readonly、static readonlyがあり、それぞれ特徴が違う。
constは変数宣言時のみ可能(const int x=10;)
readonlyは宣言時、コンストラクト内も可能。但しconstより遅い
static readonly(基本これ使う)は定数にシンボル名必要でもconstのように使える
例えばx; yourAge; myAge;等(但し先頭数字不可・予約語(キーワード)不可例えばclassやusing)
int x; となる。複数もできる int x,y;この場合 int x,y = 5,z;
x=12; もしくわまとめて int x = 10;
x=5; ←あとから代入された整数が正しい
x=5.1;←小数点は整数型ではないのでコンパイルエラーなる!
int a=10, b=20;
③値型 参照型
・値型には直接値が格納。x専用メモリ作成される
変数 A の値を変数 B へ代入した時、値がコピーされて渡される。
変数 A が持っている値、変数 b が持っている値、と実体は 2 つある。
定義した時点でその全てはその場所から参照された残像みたいなもの。
変数 A の値を変数 B へ代入した時、変数 B には値のアドレスが渡される。
変数 A が持っているのは、値がいる番地001。
変数 B が持っているのも、値がいる番地001。
実体である値は番地 001 にしかいない。つまり実体は 1 つしかない。
複数の場所 ( 変数 ) から、1 つの実体をみている。④プロパティ
メソッドの中にはかけないクラスの中に書く、そのためクラスプロパティメソッドインスタンスの順に書く
クラスの値が持つ範囲(フィールド)別名メンバ変数
フィールドの値を取得、設定する窓口(プロパティ)、隠蔽。
クラス外部から見るとメンバ変数(フィールド)のように振る舞い、 クラス内部から見るとメソッドのように振舞う
name
age
田中
18
佐藤
22
山本
34
index4.php
<?php
// Staffというクラス(型)を宣言。クラスの1文字目は大文字(Pascal)
class Staff {
>// property
public $name;
public $age;
}
//クラスStaffのインスタンスを作成
$tanaka = new Staff;
//インスタンス名->プロパティ名 ※プロパティの"$"はつけない
//tanakaというインスタンスのプロパティ$nameに、tanakaを挿入。
$tanaka->name = "tanaka";
echo $tanaka->name; // tanaka
$tanaka = new Staff("tanaka");
$tanaka->Hello(); // hi, i am tanaka!
uncs(p/i)ci=using,namespace,class,
(public) static void Main(string[] args)/public PROPERTY(int Age{get; set;})/public interface
constructa(値代入),instance(←new演算子)
public どこからでもアクセス可能
protected クラス内部と派生クラスの内部からのみアクセス可能
private protected(C# 7.2)同一プロジェクト内のクラス内部と派生クラスの内部からのみアクセス可能
private クラス内部からのみアクセス可能
using System;
namespace memberlist
{
class Person
{
//private string name;//フィールド
//private int age;
public string Name { get; set; }
//{
// get { return name; }
// set { name = value; }
//}
//get{return フィールド;}set{フィールド=value}
//getで値呼び出せる、setで値設定できる
public int Age { get; set; }
//{
// get { return age; }
// set { age = value; }
//}
}
class Program
{
static void Main(string[] args)
{
var person= new Person { Name = "シュミット・ダニエル", Age = 1992 };
Console.WriteLine($"{person.Name}は{person.Age}年生まれです。");
//var p = new Person()//インスタンスにnew演算子で値代入(コンストラクタ)
//{
// Name = "Taro Yamada",
// Age = 30
//};
//Console.WriteLine("{0} ({1})", p.Name, p.Age);
// var ... new... {instance}
// 実行文
var person2 = new Person { Name = "東口 順昭", Age = 1986 };
Console.WriteLine($"{person2.Name}は{person2.Age}年生まれです。");
}
}
}
// var ... new... {instance}
// 実行文
//public string Name { get; set; }は{get;}のみでも使える
//(get-only プロパティ;読み取り専用なので、コンストラクタ内で代入するのみ)
//(この読み取りはget専用でget以外newとかはreadonlyでも可能)
//省略されたFieldはどこ行ったのか、BackingFieldに格納されてるらしい(必要なったら勉強)
//Field、setのみならず、値代入(コンストラクタ)も省略できるようなった。
//uncs(p/i)ci
(プロパティは必ずクラスにつき、静的メソッドの中にはつけない、そのためクラスプロパティメソッドインスタンスの順なり、インスタンスはクラス内のプロパティ下の後ろのメソッド内で記述する事になる)
また、インスタンス化はNew演算子でvar p=new 変数名とすれば使える、インスタンスで変数は{p.変数名}とする。
using System;
namespace practice3
{
class Program
{
public string Name { get; } = "ダニエル";
public string Age { get; } = "1991";
public string Name2 { get; } = "シュミット";
public string Age2 { get; } = "1992";
static void Main(string[] args)
{
var p = new Program();
Console.WriteLine($"{p.Name}は{p.Age2}年生まれ");
//staticなメソッドなので変数が含まれるとオブジェクト参照が必要です。というエラー(文字のみならOK)
//static内でインスタンス化すれば普通に使える(それがNew演算子)var p = new Program();の部分と{}内p.変数名とする
}
}
⑤配列(コレクション) New演算子
上記の自動プロパティで静的メソッドでインスタンス化のためNew使ったが配列でも使う
static void Main(string[] args)
{
var vs = new[] { "あああ","123","daniel" };//全部暗黙
Console.WriteLine($"{vs[0]}");
int[] numbers = new int[3] { 4, 5, 6 };//同時宣言
//int[] numbers = new int[3];//宣言
//numbers[0] = 4;//初期化
//numbers[1] = 5;//初期化
for (int a = 0; a < numbers.Length; a++)
{
Console.WriteLine("{0}番目の要素の値は{1}です。", a + 1, numbers[a]);
}
あああ
1番目の要素の値は4です。
2番目の要素の値は5です。
3番目の要素の値は6です。
ダニエルは1992年生まれ
int a, b, c, d, e, ...;//このようにいちいち作るわけにはいかない
int[] a = new int[100];//このようにすれば
a[0],a[1],a[2],……,a[99]//という100個の変数が生成される。
var vs = new[] { "あああ","123","daniel" };
List(リスト)//list.Add("GHI");//動的に変更
LinkedList(二重リンクリスト)//linkedlist.AddFirst("GHI");//線形データ構造なので要素を追加(削除)すると、元の要素が横にずれてくれる(未知数データの場合使う)
HashSet(セット)HashSet内に指定した要素が存在するかどうかを調べるため
Dictionary(ディクショナリ)連想配列。辞書は単語と意味、Dictionaryはキーと値、dict.Add(1,"One");
Queue(キュー)待ち行列。FIFOスタイル(First In First Out)要素削除せずともFirst Outするため要素数はnのまま循環できる
Stack(スタック)派遣してた時のホテルに重ねた皿LIFOスタイル(Last in First Out)新しい実行履歴から見れる
以上は配列のデータ構造で、どういう順番で表示するかは別個作る。
データ構造は、
[1] 要素を1つ入れる
[2] 要素を1つ取り出す
だけです。
入れたとおりの順序で取り出されてくるのがキュー、
逆順になる(最後に入れたのが最初に出てくる)のがスタック。
コンテナのためのおまじない
// デフォルトだと、自動的に用意されます
using System;
// リスト、連想配列を使うために必要です
using System.Collections.Generic;
// 順序つき連想配列を使うために必要です
using System.Collections.Specialized;
// コンテナに関するライブラリを使うために必要です
using System.Linq;
// string[]というのは、"文字列(string)が入った配列(コンテナの一種)ですよという意味
// fruitsは配列の名前。中に2つ以上のデータが入ることが前提なので、複数形にします
// {}の中に、順番にデータを書いていきます
// データの中身は、"peach"(桃), "cherry"(さくらんぼ), "tangerine"(みかん), "apple"(りんご)
// 『,』(コンマ)区切りで並べていきます
string[] fruits = {"peach", "cherry", "tangerine", "apple"};
Console.WriteLine(severalEvens.Length);
*C#型:(C#で使用する別名の事{エイリアス})10.データ型 早見表
Alias
.NET型
説明
Size (bits)
Range (Values)
byte
byte
符号なし(byteに限り元々Uなし)
8
0 to 255
$\color{red}{\rm s}$byte
SByte
符号あり(なので$\color{red}{\rm Signed}$)
8
-128 to 127
int
Int32
符号あり($\color{red}{\rm Signed}$)
32
-2,147,483,648 to 2,147,483,647
$\color{blue}{\rm u}$int
UInt32
符号なし($\color{blue}{\rm Unsigned}$)
32
0 to 4294967295
short
Int16
符号あり($\color{red}{\rm Signed}$)
16
-32,768 to 32,767
$\color{blue}{\rm u}$short
UInt16
符号なし($\color{blue}{\rm Unsigned}$)
16
0 to 65,535
long
Int64
符号あり($\color{red}{\rm Signed}$) $\color{silver}{\rm サL}$
64
-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
$\color{blue}{\rm u}$long
UInt64
符号なし($\color{blue}{\rm Unsigned}$) $\color{silver}{\rm サL}$
64
0 to 18,446,744,073,709,551,615
float
Single
単精度浮動小数点Single-precision floating point type
32
-3.402823e38 to 3.402823e38
double
Double
倍精度浮動小数点Double-precision floating point type $\color{silver}{\rm サD}$
64
-1.79769313486232e308 to 1.79769313486232e308
char
Char
文字型(Character type)
16
Unicode文字
bool
Boolean
ブーリアン型
8
True or False 複雑な演算
object
Object
基底の型 Base object たぶん全ての型を継承してる
string
String
文字列型
decimal
Decimal
範囲も精度も高い10進数演算(小数点OK) $\color{silver}{\rm サM}$
128
(+ or -)1.0 x 10e-28 to 7.9 x 10e28
DateTime
DateTime
日付時刻 ※他の日付系統どうなる?
0:00:00am 1/1/01 to 11:59:59pm 12/31/9999
*.NET型:.Net Coreや.NET Frameworkで使用できる共通言語(クロスプラットフォームなら.Net Core)
*Byte:何Byte使うか、必要なストレージ量(扱いたい値が大きくなる程32.64.128..と当然使用ストレージも増加)
*範囲:扱える値の範囲、shortは16ビットだから約3万で短いけどintは32Bなので約2兆!小数点基本double
*.NET型System.はusing Systemすれば不要
*Mの表記はサフィックス(暗黙の変換を防ぐ decimalM, doubleはD, Lでlong/ulong, Uでuint/ulong)
*bit数見て幅、size抑えてメモリ節約
*範囲調べるConsole.WriteLine($"int:{int.MinValue}~{int.MaxValue}");
*数値調べるConsole.WriteLine(100.GetType());
*英語の方が理解しやすい事に気付いた(日本語も覚える必要あるけど。海外とのアドバンテージを感じる…)
ReadLineで数値のユーザー入力の際strをint等に"変換"しないと計算できないから。11.変換/int.Parse/ToString
byte ~ = byte.Parse() ~ Convert to int/str
// int.TryParseはparseの成否を返すが、成功の場合は変換結果がnumberへ格納される 失敗は何も返さない
bool result = int.TryParse("1234", out number)
//out ~はメソッド内からメソッド外へデータを受け渡す(numberに一旦値代入して定数にしないとエラー!)
(数値を文字にするToString、文字の日付を日付にするDateTime.Parse)
Console.Write("1の位の整数を入力してください:");//intとわかってるので下記で入力と同時に変換
int x = int.Parse(Console.ReadLine());//int.Parse/Convert.ToInt32
Console.WriteLine($"その数字を2倍すると{x * 2}ですね?");
12.構造体struct
ユーザー定義型と同じ振る舞い?使い所必要な時勉強
structを宣言して構造化(パッケージ化)(メンバーを決める)
struct PERSON
{
char name;
int age;
float sincho;
float taijyu;
}
・利息計算で使う13.浮動小数点数型(BMIと利息)
浮動は123.45や1.2345×10^2のように"."が左右にふわふわするから。
(だからfloat:ただほぼ使われてないdouble常用)
では何故わざわざ複雑な呼び?数式するか?気になった結果→PCは0と1で構成されていて
(0と1で2進数、人は0~9の10進数)"."を扱わない。
そこでPCに12345E-002。仮数12345*基数10の指数-2乗という覚え方させて123.45を理解させた。
(123.45は123.45*10^-2で12345E-002、E=Exponential(指数)の頭文字で、ここでは*基数^(=*10^)の代わり)
ex)BMI計算コード作る練習(Mathクラスを用いて)
public static class Math //Mathクラスは色んな式を求める事ができるクラス
累乗Pow=x^n、abs=絶対値:原点からの距離
切り捨て上げFloor,Truncateどちらも単に小数点以下切り捨て//double h=$\color{blue}{\rm Math.Floor/Truncate(±val)}$
また(val/-val*valの部分は何でもいい)で調整するがFloorの-valは正方向のTruncateと違い1.5が単に符号付き-1.5、負方向に丸めるので-2)
豆知識unityのC#は独特だが例としてunityEngine.Mathf.Absがある。Unityはクロプラなので重いが安全。
累乗 double e = Math.Pow(2, 3);//2の3乗
Console.WriteLine(e);8
1.5丸め Console.WriteLine($"{Math.Ceiling(val)},{Math.Ceiling(-val)}");//2,-1 Ceiling 両方天井・正と正
Console.WriteLine($"{Math.Truncate(val)},{Math.Truncate(-val)}");//1,-1 Truncate単に切捨・定と正
Console.WriteLine($"{Math.Floor(val)},{Math.Floor(-val)}");//1,-2 Floor 両方床 ・定と負
・BMI計算で使う
Console.Write("身長(m)は何mですか。");
double f = double.Parse(Console.ReadLine());
Console.Write("体重(kg)は何kgですか。");
double g = Convert.ToDouble(Console.ReadLine());
Console.WriteLine("BMI={0:#.#}", g/Math.Pow(f, 2));
(decimal=10進演算で精度、範囲ともにup)
複雑なので使う事があれば勉強。今は端折る。
C#でローン返済額計算
14.char 一文字
index化して変換できる
string p = "ihj";//宣言
char[] array = p.ToCharArray();//変換
array[2] = 'q';//何文字目
p = new string(array);//pにarrayかけた(これないとただの宣言止まり)
Console.WriteLine(p);//ihq array[2]は012ときて3文字目
Console.WriteLine('q');//q
Console.WriteLine("q");//q
15.bool(if(条件!){}else{}) (true or false)
Console.Write("名前を入力してください");
string name1 = "okabe";
name1 = (Console.ReadLine());
if (name1 != "okabe")
Console.WriteLine("Welcome " + name1);
else
Console.WriteLine("We don't know your name.");
//boolは数値でも便利
int mynumber = 2;
if (mynumber >= 2)
//>,<だとfalseなので何も返さないが>=,==,=<でtrueなので文字列発動
Console.WriteLine($"Your number is {mynumber}");
//分岐が複数ある場合else if
int mynumber1 = 2;
if (mynumber1 > 2)
{
Console.WriteLine("Your number is greater than two. ");
}
else if (mynumber1 == 2)
{
Console.WriteLine("Your number is equal to two.");
}
else
{
Console.WriteLine("We don't know your number.");
}
Console.WriteLine("1+1=?");//答えは2
int r;
r = int.Parse(Console.ReadLine());
if (r > 5)
{
Console.WriteLine($"{r}より小さい数値です");
}
else if (r > 2)
{
Console.WriteLine("Close!");//close=近い,おしい
}
else if (r == 2)
{
Console.WriteLine("true!");//以下else if..
}
else
{
Console.WriteLine($"{r}より大きい数値です");
}
16.リテラル(=値)暗黙の変換 値から型/型から範囲 確認方法
//GetType(型調べる)
Console.WriteLine(100.GetType());//int
Console.WriteLine(5.1.GetType());//double
Console.WriteLine(1.7.GetType());//double
Console.WriteLine(3.4.GetType());//double
//MaxValue(範囲調べる)
Console.WriteLine($"int:{int.MinValue}~{int.MaxValue}");