p.176 既存のクラスを使ってみる
・ここまでで、System、Mathなどの既存のクラスを利用しているが、ここでは、インスタンスメソッドを持つクラスの一例として、 ArrayListクラスを用いよう ・ArrayListクラスは、配列の機能を拡張した仕組みを提供するもので、配列にはない柔軟な利用が可能 ・利用には「using Sytem.Collections;」を指定する ※ ArrayListクラスなどのデータ構造を表すことのできるクラスをコレクションと呼ぶ ・インスタンスを生成すると、配列に似たデータ構造が生成されるが、配列とは異なり、要素数を事前に決める必要がなく、 動的に変更することもできる ・要素の追加にはインスタンスメソッドのAdd(データ)を用い、追加にしたがって要素数が拡張される ・件数を返すCountプロパティも利用可能 ※ プロパティは特殊なメソッドで8章で説明 ・格納済の要素は、配列と同様にオブジェクト名[添字]で直接アクセスできる
p.177 arraylist01.cs
//p.177 arraylist01.cs
using System;
using System.Collections; //ArrayList用
class arraylist01 {
public static void Main() {
bool bEnd = false; //終了フラグをオフで初期化
string strData; //読込用
double sum = 0.0; //合計
ArrayList al = new ArrayList(); //ArrayListオブジェクトを生成
while (true) { //無限ループ
Console.Write("データ(数値以外入力で終了)-- ");
strData = Console.ReadLine();
if (!Char.IsDigit(strData[0]) && strData[0] != '-') { //1文字目が数字ではなくマイナスでもない?
bEnd = true; //終了フラグをオンにする
} else { //数字またはマイナスなら
al.Add(double.Parse(strData)); //実数に変換してArrayListに格納
}
if (bEnd) { //終了フラグがオン?
break; //繰返しを抜ける
}
}
for (int i = 0; i < al.Count; i++) { //ArrayListに格納した件数の分、繰返す
Console.WriteLine("Data[{0}] = {1}", i + 1, al[i]); //値を表示
sum += (double)al[i]; //合計に足し込む
}
int count = al.Count; //ArrayListに格納した件数を得る
double avr = sum / count; //合計を件数で割って平均値を得る
Console.WriteLine("データ個数 = {0}", count);
Console.WriteLine("平均値 = {0}", avr);
}
}
アレンジ演習:p.177 arraylist01.cs
・Countプロパティを2回呼び出しているが、1回にしよう ・終了フラグを廃止しよう
作成例
//アレンジ演習:p.177 arraylist01.cs
using System;
using System.Collections; //ArrayList用
class arraylist01 {
public static void Main() {
string strData; //読込用
double sum = 0.0; //合計
ArrayList al = new ArrayList(); //ArrayListオブジェクトを生成
while (true) { //無限ループ
Console.Write("データ(数値以外入力で終了)-- ");
strData = Console.ReadLine();
if (!Char.IsDigit(strData[0]) && strData[0] != '-') { //1文字目が数字ではなくマイナスでもない?
break; //【移動】繰返しを抜ける
} else { //数字またはマイナスなら
al.Add(double.Parse(strData)); //実数に変換してArrayListに格納
}
}
int count = al.Count; //【移動】ArrayListに格納した件数を得る
for (int i = 0; i < count; i++) { //【変更】件数の分、繰返す
Console.WriteLine("Data[{0}] = {1}", i + 1, al[i]); //値を表示
sum += (double)al[i]; //合計に足し込む
}
Console.WriteLine("データ個数 = {0}", count);
Console.WriteLine("平均値 = {0}", sum / count); //【変更】合計を件数で割って平均値を得る
}
}
p.180 練習問題1 ヒント
・クラス名や変数名は自由
・例: class MyClass { public int i; }
・読みだした値は確認用に表示すると良い
作成例
//p.180 練習問題1
using System;
class MyClass { public int i; } //int型のpublicインスタンス変数のみを持つクラス
class ex0701 {
public static void Main() {
MyClass mc = new MyClass(); //MyClassオブジェクトを生成
mc.i = 10;
Console.WriteLine("mc.i = {0}", mc.i);
}
}
p.180 練習問題2 ヒント
・クラス名やメソッド名は自由 ・ただし、オーバーロードなので、同じメソッド名とすること ・Mainメソッドから呼び出すために、2つのメソッドはpublicにする ・int型とint型の和を求めるメソッドは戻り値型もintにする ・double型とdouble型の和を求めるメソッドは戻り値型もdoubleにする ・結果は確認用に表示すると良い
作成例
//p.180 練習問題2
using System;
class MyClass {
public int sum(int a, int b) { //メソッド①
return a + b;
}
public double sum(double a, double b) { //メソッド②=①のオーバーロード
return a + b;
}
}
class ex0702 {
public static void Main() {
MyClass mc = new MyClass(); //MyClassオブジェクトを生成
Console.WriteLine("整数 {0} + {1} = {2}", 2, 3, mc.sum(2, 3)); //メソッド①が呼ばれる
Console.WriteLine("実数 {0} + {1} = {2}", 3.14, 4.99, mc.sum(3.14, 4.99)); //メソッド②が呼ばれる
}
}
第8章 クラスとメソッドの詳細
p.181 メソッドの再帰呼び出し
・最近のプログラム言語では、あるメソッドの中で自分自身を呼び出すことが可能で、これを再帰という。 ・再帰を上手く利用すると、プログラムをシンプルに記述出来る場合がある ・単純に自分自身を呼び出すと呼び出しが無限ループするので(これ以上)自分を呼び出さずに式や値を返す処置が必要
p.181 階乗を計算する
・階乗とは、ある正の整数において、その数から1までの全整数の積
※ 実質的にはその数から2までの全整数の積になる
・整数nの階乗を「n!」で表し、例えば、2!は2、3!は6、4!は24、5!は120、…
・これを逆順で展開すると
5! = 5×4×3×2×1
4! = 4×3×2×1
3! = 3×2×1
・なので、5!=5×4!、4!=4×3! であることから「n! = n×(n-1)!」が導ける。
・これをメソッドFactにすると、
int CalcFact(int n) { //nの階乗
return n * CalcFact(n - 1); //n×(n-1)!を返す(再帰する)
}
・これに、再帰の終了条件として「0の階乗は1」を加えると良い
int CalcFact(int n) { //nの階乗
return (n > 0) ? n * CalcFact(n - 1) : 1; //nが0超ならn×(n-1)!を返す(再帰する)でなければ1を返す
}
・p.182 fact01.csは上記を展開したメソッドになっている
p.182 fact01.cs
//p.182 fact01.cs
using System;
class Fact {
public long CalcFact(int n) { //n!を返す
long fact; //階乗値
if (n == 0) { //0!は1なので(再帰の終了条件になる)
fact = 1; //1を返す
} else { //1以上ならば
fact = n * CalcFact(n - 1); //「n! = n * (n - 1)!」により再帰する
}
return fact; //階乗値を返す
}
}
class fact01 {
public static void Main() {
Fact f = new Fact();
for (int i = 0; i <= 20; i++) {
Console.WriteLine("{0}! = {1}", i, f.CalcFact(i));
}
}
}
アレンジ演習:p.182 fact01.cs
・CalcFact(int n)メソッドを上記を用いてシンプルにしよう
提出:アレンジ演習:p.182 fact01.cs