prg-lang-2 / week03 / report03.c
report03.c
Raw
#include <stdio.h>
#define NUMBER 6

/*
 * 比較回数を減らすために、すでに比較した要素の状態を配列に保存し、
 * その要素の比較をスキップする。
 * また、場合2と3におけるエラー処理を逐次的に行うことで複雑な処理を減らしている。
 */

int main()
{
    int num[NUMBER] = {1, 6, 3, 1, 3, 6};
    int count = 0;

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

    // すでに比較を行ったかを保存する配列
    int seen[NUMBER] = {0};

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

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

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

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

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

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

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

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

        // 状態を保存
        seen[i] = 1;
    }

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

    return 0;
}