第7講 多次元配列と1次元配列の関係
第4話 第6講第4話の課題を1次元配列によって実現する
を1次元配列とデータ生成とデータ表示をすべて2次元for文で実現するコード例
//以下C#を始めるためのお呪い
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
//以上C#を始めるためのお呪い
namespace a //初心者はお呪い=決まり事と思い一切気にしない
{
class Program //初心者はお呪い=決まり事と思い一切気にしない
{
static void Main(string[] args) //私は社長だ。
{
f();
}
static void f()
{
int[] a = new int[12];
Random r = new Random();
//以下データ生成
for (int i = 0; i < 12; i++)
{
a[i] = r.Next(100);
}
//以下行列データ表示
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
if (a[4 * i + j] < 10) Console.Write(" {0:d} ", a[4 * i + j]); //1桁の場合
if (a[4 * i + j] >= 10) Console.Write("{0:d} ", a[4 * i + j]); //2桁の場合
}
Console.WriteLine(); //改行
}
Console.WriteLine(); //改行
//以下左右反転行列データ表示
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
if (a[4 * i + 3 - j] < 10) Console.Write(" {0:d} ", a[4 * i + 3 - j]); //1桁の場合
if (a[4 * i + 3 - j] >= 10) Console.Write("{0:d} ", a[4 * i + 3 - j]); //2桁の場合
}
Console.WriteLine(); //改行
}
Console.WriteLine(); //改行
//以下上下反転行列データ表示
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
if (a[4 * (2 - i) + j] < 10) Console.Write(" {0:d} ", a[4 * (2 - i) + j]); //1桁の場合
if (a[4 * (2 - i) + j] >= 10) Console.Write("{0:d} ", a[4 * (2 - i) + j]); //2桁の場合
}
Console.WriteLine(); //改行
}
Console.WriteLine(); //改行
//以下転置行列データ表示
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 3; j++)
{
if (a[4 * j + i] < 10) Console.Write(" {0:d} ", a[4 * j + i]); //1桁の場合
if (a[4 * j + i] >= 10) Console.Write("{0:d} ", a[4 * j + i]); //2桁の場合
}
Console.WriteLine();
}
}
}
}
第5話の課題は、
//以下左右反転行列データ表示
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
if (a[4 * i + 3 - j] < 10) Console.Write(" {0:d} ", a[4 * i + 3 - j]); //1桁の場合
if (a[4 * i + 3 - j] >= 10) Console.Write("{0:d} ", a[4 * i + 3 - j]); //2桁の場合
}
Console.WriteLine(); //改行
}
Console.WriteLine(); //改行
までの部分を1次元for文で実現するです。
ノーヒントでは難しすぎる課題ですから、
ヒントを出しておきます。
改行のタイミングは、第3話の
//以下左右反転行列データ表示
for (int i = 0; i < 12; i++)
{
if (i > 0 && i % 4 == 0) Console.WriteLine(); //改行
if (a[i] < 10) Console.Write(" {0:d} ", a[i]); //1桁の場合
if (a[i] >= 10) Console.Write("{0:d} ", a[i]); //2桁の場合
}
Console.WriteLine(); //改行
赤
if (i > 0 && i % 4 == 0) Console.WriteLine(); //改行
で良いわけですが、表示内容を左右反転にするのが難問中の難問です。
|
0 | 1 | 2 | 3 | ||||||
0 | 0 | 1 | 2 | 3 | ||||||
1 | 4 | 5 | 6 | 7 | ||||||
2 | 8 | 9 | 10 | 11 |
1次元配列の添え字0は3に、
1次元配列の添え字1は2に、
1次元配列の添え字2は1に、
1次元配列の添え字3は0に、
1次元配列の添え字4は7に、
1次元配列の添え字5は6に、
1次元配列の添え字6は5に、
・
・
・
1次元配列の添え字11は8に、
に変換できればクリアです。
そんなうまい方法はあるでしょうか。
これを実現するには、
0,1,2,3
4,5,6,7
8,9,10,11
を一方では
0,0,0,0
4,4,4,4
8,8,8,8
に変換し、他方では、
0,1,2,3
0,1,2,3
0,1,2,3
に変換して、
さらに、
0,1,2,3
を
3,2,1,0
に変換する方法を考え組み合わせます。
組み合わせるのは
0,0,0,0
4,4,4,4
8,8,8,8
と
3,2,1,0
3,2,1,0
3,2,1,0
です。
0,1,2,3
4,5,6,7
8,9,10,11
を
0,1,2,3
0,1,2,3
0,1,2,3
に変換するには、%を利用します。
11 % 4 =3
ですね。11を4で割った余りを求めます。
0,1,2,3
4,5,6,7
8,9,10,11
を
0,0,0,0
4,4,4,4
8,8,8,8
に変換するには、割り算を利用します。
int型の割り算はint型になるのでしたね。