prg-lang-2 / week11 / ExerR03.java
ExerR03.java
Raw
// レポート課題03
/* //Cプログラム
#include <stdio.h>
#define NUMBER 8
//オブジェクト形式マクロを追加してもよい
int main(void) {
    int num[NUMBER] = {1, 3, 3, 1, 6, 8, 6, 8};
    int count = 0;

    //ここに処理を書く(独自変数の追加OK,独自関数の追加NG)

    return 0;
}

//実行例
# ./report3
numが{ 1, 6, 3, 1, 3, 6 }の場合,

数値:1 インデックス:0,3
数値:6 インデックス:1,5
数値:3 インデックス:2,4
要素間の比較回数:15

---------------

numが{ 3, 1, 3 }の場合,
エラー:配列の要素数が奇数です.
*/

public class ExerR03 {
    public static final int NUMBER = 8;

    @SuppressWarnings("unused")
    public static void main(String[] args) {
        int[] num = {1, 3, 3, 1, 6, 8, 6, 8};
        int count = 0;

        // 場合1におけるエラー処理
        if (NUMBER % 2 == 1) {
            System.out.printf("エラー:配列の要素数が奇数です\n");
            return;
        }

        // すでに比較を行ったかを保存する配列
        boolean[] seen = new boolean[NUMBER];

        // 比較を行う
        for (int i = 0; i < NUMBER - 1; i++) {
            // すでに比較を行った要素の場合スキップ
            if (seen[i]) continue;

            System.out.printf("数値: %d インデックス: %d", num[i], i);

            // 比較する要素の登場回数を保存する変数
            int lcount = 1;

            // 比較対象以降の要素と比較
            for (int l = i + 1; l < NUMBER; l++) {
                // すでに比較を行った場合はスキップ
                if (seen[l]) continue;

                // 比較し一致した場合状態を保存、結果を出力し登場回数を加算
                if (num[i] == num[l]) {
                    System.out.printf(",%d", l);
                    seen[l] = true;
                    lcount++;
                }

                // 比較回数を加算
                count++;
            }
            System.out.printf("\n");

            // 場合2におけるエラー処理
            if (lcount == 1) {
                System.out.printf("エラー:%dは1度しか登場しません\n", num[i]);
                return;
            }

            // 場合3におけるエラー処理
            if (lcount > 2) {
                System.out.printf("エラー:%dは3度以上登場します\n", num[i]);
                return;
            }

            seen[i] = true;
        }

        System.out.printf("要素間の比較回数:%d\n", count);
    }
}