こんにちは。ECF代表のヒガです。
本記事では初心者向けアルゴリズムの演習問題を紹介しています。日頃のプログラミング学習にご活用ください。
はじめに
アルゴリズムとは、コンピューターに行わせる計算手順のことです。自在にプログラムを作るには、プログラム言語の文法の知識とともにアルゴリズムの考え方を身につけることが必要になります。
アルゴリズム技法習得の肝は「繰り返し」の活用です。この連載では、簡単な題材で繰り返しを使うアルゴリズムの基本パターンを練習していきます。
演習問題の一覧や勉強スタイルについてのアドバイスはこちらからどうぞ。
Q029 配列データのコピー
配列に格納された複数の数値データについて、別に用意した配列に同じ並びでコピーしてください。
ただし、コピー元の配列はプログラムの先頭で宣言し、適当な初期値を代入してください。また、コピー先の配列はコピー元の配列と同じ型・同じ要素数となるようにプログラムの先頭で宣言してください。コピー先配列の初期値の設定は任意ですが、全要素を0で初期化しておくと下の実行例と同じになります(Javaではint型配列を宣言すると、すべての要素にデフォルトで0が設定されます)。
また、コピー処理とは別に、コピー処理の前にコピー先配列の内容の表示、コピー処理の後にコピー先配列の内容の表示を行ってください。配列から配列にデータをコピーしたところで、コンピューターの内部で行われていることは私達の目には見えません。コピーが正しく行われているかを確認するために、コピー前とコピー後の2回、コピー先の配列の内容を表示させましょう。プログラム実装では、Q024の繰り返し文をコピペしてもいいと思います。
今回の演習問題の大まかな流れは以下のとおりです。
- 2つの配列(コピー元とコピー先)の宣言と初期化
- コピー先配列の内容の表示(Q024と同じ処理)
- 配列コピー処理 ← 今回の主題
- コピー先配列の内容の表示(Q024と同じ処理)
なお、プログラム言語によっては
コピー先配列変数 = コピー元配列変数
の形で代入文を書くだけで今回の仕様を満たすことがありますが、今回はアルゴリズムの学習のために、繰り返しを使って配列を操作する形で考えてください(配列変数同士の代入の意味については、各プログラム言語の解説サイトや解説書を参照してください)。また、プログラム言語の標準ライブラリを使って実現する方法もあります。同様にこちらも今回は使用しないでください。
初期値として {10, 20, 30, 40, 50} を使って整数型(Javaではint型)配列を準備し、これとは別に「同じ型」「同じ要素数(5)」「0で初期化(Javaでは初期化処理不要)」したコピー先配列を準備した場合の実行例は次のとおりです。
前半の5個の数がコピー処理前のコピー先配列の内容、後半の5個の数がコピー処理後のコピー先配列の内容です。
ヒント
今回の主題は「配列から配列にデータを写す」ことです。配列ではありますが、やることは変数の代入と同じです。繰り返しのカウンタ変数と添字の関係をうまく使いましょう。
解答例と解説
考え方
コピー処理前後の配列内容表示処理についてはQ024と同じなので説明は省略します。
コピー処理について、まず最初に「何を繰り返す」かを考えます。今回の場合は
- 「コピー先の配列の要素」に「コピー元の配列のデータ要素」を代入する
を繰り返すことになります。代入対象の2つの配列要素の添字が同じになるようカウンタ変数で紐付ければ、単純な代入の繰り返しで結果的に配列コピーとなります。
コピー処理について箇条書きでまとめると、
- 次の動作を配列の要素数の分繰り返す
- コピー先配列の【カウンタ変数】番目の要素に、コピー元配列の【カウンタ変数】番目のデータ要素の値を代入する
という流れになります。
フローチャート例
コピー前後に行う確認用の表示は、Q024と同じということで「配列bの内容を表示」というブロックで表現しました。もちろん具体的に表示ループを書いてもいいでしょう。
Javaでの実装例
public class Q029 { public static void main(String[] args) { int[] a = {10, 20, 30, 40, 50}; // コピー元配列の宣言と初期化 int[] b = new int[a.length]; // コピー先配列の宣言(自動で0で初期化) for (int i = 0; i < b.length; i++) { // コピー先配列内容の表示 System.out.println(b[i]); } for (int i = 0; i < a.length; i++) { // 配列データのコピー b[i] = a[i]; } for (int i = 0; i < b.length; i++) { // コピー先配列内容の表示 System.out.println(b[i]); } } }
Javaでは配列の添字は「0」からスタートしますので、カウンタ変数iの初期化や継続条件式は、上記のフローチャートからはそのように変更しています。配列の要素の添字は0から4(要素数 - 1)なので、0から4までの5回の繰り返しです。
4行目のコピー先配列の宣言では、コピー元配列aと同じ要素数で宣言するためにaの要素数を「a.length」で取得しています。
おわりに
配列の各要素は添字さえ丁寧に間違いなく設定できれば、普通の変数と同じ様に使うことができます。繰り返しとの組み合わせの場合は、カウンタ変数をうまく活用できるか、ということです。今回のように2つの配列が関わっていても同様です。
今回は単純に同じ添字の要素への代入だけでしたが、これを応用して「2倍の数に変換して代入」もできますし、「元の配列とは逆順に代入」なんてこともできそうです。自身でいろいろ考えて試してみましょう。
次回はこちらです。
合同会社イー・シー・エフでは、子ども向けプログラミングなどの教育講座を実施しています。プログラミング教室の案内や教育教材の情報、また関連するご相談・問い合わせにつきましては下記よりご確認ください。