// レポート課題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);
}
}