Печать
Категория: Главная
Просмотров: 374

Я разработал два решения для упражнения этого месяца . Базовое решение может быть решено в два этапа, а более сложное - три.

Первым шагом для обоих решений является заполнение массива и вывод его значений. Этот процесс может быть выполнен за один цикл:

для (а = 0; а <SIZE, A ++)
{
    array [a] = rand ()% 50 + 10;
    printf ("% 2d", array [a]);
}
putchar ( '\ п');

Для моего первого решения, второй шаг - разбить массив, подобный пузырьковой сортировке, чтобы найти дубликаты.

В следующем фрагменте, а во время цикла процессов array[]от нулевого элемента в переменной aк значению определенной константы SIZE, которая устанавливается до 15:

/ * найти и отобразить дубликаты * /
ставит ( "дублей:");
а = 0;
while (a <РАЗМЕР-1)
{
    для (Ь = а + 1, б <РАЗМЕР; б ++)
    {
        if (array [a] == array [b])
        {
            Е ( "% d \ п", массив [а]);
            / * нет необходимости продолжать * /
            перерыв;
        }
    }
    A ++;
}

Переменная bсканирует элементы от a+1сквозного SIZEпоиска совпадений. Когда он найден, он отображается и цикл for прерывается. Затем переменная aувеличивается и процесс продолжается. Вот пример вывода:

Array:
 26 59 47 41 37 21 47 42 50 28 30 14 21 32 22
Duplicates:
47
21

А вот вывод, когда одно и то же значение повторяется более двух раз:

Array:
 56 16 43 49 22 45 57 41 49 11 18 49 24 12 49
Duplicates:
49
49
49

Код не распознает ранее сообщенные значения, поэтому вывод выглядит глупо.

Для второй попытки я решил быстро отсортировать массив, прежде чем сканировать дубликаты. С отсортированным массивом дубликаты появляются рядом друг с другом. Следовательно, цикл для поиска повторяющихся значений работает иначе, чем цикл типа пузырей в моем первом решении:

/ * сортировка и отображение дубликатов * /
QSort (массив, SIZE, SizeOf (INT), сравните);
ставит ( "дублей:");
для (а = 0; а <SIZE-1; A ++)
{
    б = 1;
    while (array [a] == array [a + b])
    {
        d = массив [a];
        б ++;
        A ++;
        / * предотвратить переполнение * /
        если (a + b> РАЗМЕР)
            перерыв;
    }
    / * b равно> 1 только для дубликатов * /
    если (b> 1)
        Е ( "% d \ п", д);
}

Переменные aи bэлементы сравнения. Цикл for перемещает переменную aпо всему массиву. Переменная bустанавливается равным 1 , и в то время как цикл сравнивает array[a]и array[a+b]. Если они совпадают, значение array[a]сохраняется в переменной d. Оба aи bувеличиваются для сравнения следующих двух элементов, которые также могут быть одинаковыми. Попутно, и если тест подтвердит, что a+bне ссылается на элементы за концом массива.

Когда во время цикла будет завершено, если оператор проверяет значение переменной b, которая будет больше , чем один , когда дубликат найден. Если это так, значение (в переменной d) выводится:

Array:
 36 18 23 41 55 46 36 10 18 45 32 11 28 43 10
Duplicates:
10
18
36

С помощью сортировки я помог устранить проблему, сообщив о дубликатах дубликатов в моем первом решении.

Я надеюсь, что вы написали некоторые умные решения. Дайте себе бонусные баллы, если вы также посчитали количество найденных дубликатов.

Нажмите здесь, чтобы посмотреть мое первое решение на Github.

Нажмите здесь, чтобы посмотреть мое второе решение на Github.

Сейчас я использую Github для размещения кода для этого блога. Причина в том, что последнее обновление для системы безопасности WordPress запрещает мне загружать *.cфайлы как носители. Я пытался работать с некоторыми патчами и разрешениями, но ничего не помогло. Вы также найдете файлы уроков на моей странице Github