Учитывая 10 входных чисел и сохраненные в массиве, как я могу проверить, что следующее значение отличается от последнего? - PullRequest
3 голосов
/ 04 марта 2020

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

Сохранение 10 чисел в массиве, печать каждого из них без печати одного и того же числа дважды.

Примеры:

значения массива: 1, 2, 4, 6, 3, 7, 8, 44, 2,1

значения для печати: 1, 2, 4, 6, 3, 7, 8, 44

Мне удалось сделать для l oop, чтобы сохранить каждое из 10 значений в массиве, но я не могу понять, как проверить значения, хранящиеся между собой.

мой код до сих пор.

int main()
{
    int array[10], values[10], i;

    printf("insert 10 integers:");
    for(i=0; i<10; i++)
    {
        printf("\n");
        scanf("%d", &array[i]);
    }

    return 0;
}

Я пытался подумать об использовании переменной для хранения значений, в то время как фактические значения в массиве меняются, так что я могу сделать выбор и проверьте, что новое значение равно / отличается от переменной. Но для этого мне пришлось бы включить переменную в l oop, что сделало бы все это бесполезным, потому что новая переменная всегда будет равна новому вводу.

РЕДАКТИРОВАТЬ 1:

int main()
{
    int array[10], values[10], i, a=1;

    printf("insert 10 integers:");
    for(i=0; i<10; i++)
    {
        printf("\n");
        scanf("%d", &array[i]);
        a=i-1;
        if(array[i]!=array[a])
        {
            values[i]=array[i];
        }
    }
    for(i=0; i<10; i++)
    {
        printf("\n%d", values[i]);
    }
    return 0;
}

Я написал эту новую часть кода, которая фактически печатает значения массива без повторной печати значений, равных друг другу. Для этого я подумал об использовании нового индекса, «а», который всегда будет на 1 меньше, чем «я», первый индекс. За исключением того, что я все еще печатаю 10 чисел и заменяет удаленные значения случайными значениями

Ответы [ 3 ]

4 голосов
/ 04 марта 2020

Мне нравится предложение Говинда Пармара.

Другим подходом может быть сохранение списка «дубликатов» * КАК ВЫ ПЕЧАТИЛИ ИХ .

Например (псевдокод) :

#define ARRAY_SIZE 10

void get_values(int[] array, int n_elements) {     
    printf("insert %d integers:", n_elements);
    for(int i=0; i<n_elements i++) {
        printf("\n");
        scanf("%d", &array[i]);
    }
}

bool check_printed (int[] array, int idx) {
    int value = array[idx];
    for (int i=0; i < idx-1; i++) {
        if (array[i] == value) {
            return TRUE;
        }
    }
    return FALSE;
}

int main() {
    int array[ARRAY_SIZE];    
    get_values(array, ARRAY_SIZE);    
    for(i=0; i<ARRAY_SIZE; i++) {
        if (!check_printed(array[i]) {
          printf("\n%d", array[i]);
        }
    }
    return 0;
}
2 голосов
/ 04 марта 2020

Пока количество элементов невелико, вам не нужно беспокоиться о производительности. Поэтому вы можете просто l oop через все элементы до текущего элемента, чтобы увидеть, было ли текущее значение уже напечатано.

Другими словами - если вы хотите узнать, печатать ли элемент по индексу 3 или нет, посмотрите, имеют ли элементы в индексах 0, 1 или 2 одинаковое значение.

Это может быть реализовано несколькими способами - вот один из них:

for(int i=0; i<10; i++)
{
    // Flag to tell if current element shall be printed.
    //       Set flag to 1, i.e. assume current element shall be printed
    int doPrint = 1;

    // Now check for duplicates in the elements before the i'th element
    for(int j=0; j<i; j++)
    {
        if (values[i] == values[j])
        {
            // Duplicate found. Don't print. Clear flag.
            doPrint = 0;
        }
    }

    // Print if doPrint-flag is still 1
    if (doPrint) printf("%d ", values[i]);
}
printf("\n");

Эта реализация имеет сложность O (n ^ 2) и, следовательно, она не очень подходит для огромных массивов, но пока у вас есть только 10 элементов, это хорошо и просто.

1 голос
/ 04 марта 2020

Это очень просто.

Для начала, если вам нужно просто вывести массив, когда он не изменяется. Вывести массив и изменить его - это две разные вещи.

Кроме того, потребуется объявить вспомогательный массив того же размера для вывода исходного массива.

Что вам нужно два вложенных цикла и ничего более.

И не используйте магические числа c, например, 10, в своих программах. Используйте именованные константы.

Вот демонстрационная программа.

#include <stdio.h>

int main(void) 
{
    int array[] = { 1, 2, 4, 6, 3, 7, 8, 44, 2, 1 };
    const size_t N = sizeof( array ) / sizeof( *array );

    for ( size_t i = 0; i < N; i++ )
    {
        size_t j = 0;
        while ( j != i && array[j] != array[i] ) ++j;

        if ( j == i ) printf( "%d ", array[i] );
    }

    putchar( '\n' );

    return 0;
}

Ее вывод

1 2 4 6 3 7 8 44 
...