#c #arrays #loops #compare
#c #массивы #циклы #Сравнить
Вопрос:
Я понимаю, что мы можем сравнить каждый элемент массива с любым другим таким образом:
for (f = 0; f < length2; f ) {
for (p = f 1; p < length2 ; p ) {
if(!(compareThem(split[f],split[p]) == 1) amp;amp; (split[f] != 0) amp;amp; (split[p] != 0)) {
no_of_unique ;
}
}
}
Однако я хочу, чтобы значение no_of_unique увеличивалось только после проверки элемента индекса f на СООТВЕТСТВИЕ ВСЕМ элементам индекса p. Это, однако, проверяет элемент f с p= f 1, увеличивает no_of_unique, затем проверяет другие элементы и увеличивает его для каждого случая. Мне нужно увеличить его только после проверки ВСЕХ элементов. Буду признателен за любую помощь.
P.S Функция compareThem в основном просто возвращает 1, если они равны друг другу.
Комментарии:
1. Что произойдет, если вы добавите оператор break после увеличения no_of_unique?
2. @Rusab — пожалуйста, поправьте меня, если я ошибаюсь, но я думаю, что вы спрашиваете о нахождении количества уникальных элементов в массиве. Но то, как вы сформулировали это, звучит так, будто вам нужно только количество элементов, за которыми не следуют копии самих себя. Мне это кажется менее полезным, но, возможно, это то, что вам нужно. Что это?
Ответ №1:
Вместо увеличения no_of_unique в рамках внутреннего цикла, вы можете просто прервать выполнение после нахождения элемента, равного split[f]. Затем, вне внутреннего цикла, вы должны проверить, равно ли p length2, что означало бы, что внутренний цикл не прерывался и не обходил все элементы до конца массива. (т. е. не встретил элемент, равный split[f])
for (f = 0; f < length2; f ) {
if (split[f] != 0) {
for (p = 0; p < length2 ; p ) {
if( f != p amp;amp; (split[p] != 0) amp;amp; (compareThem(split[f],split[p]) == 1)) {
break;
}
}
if (p == length2) {
no_of_unique ;
}
}
}
Комментарии:
1. Вы должны установить
foundUnique
значение1
в первом цикле.2. @ilim— ваш алгоритм считает более поздние элементы в массиве уникальными, независимо от того, были они уже найдены или нет.
3. @DavidBowling Вы правы. Приведенный OP пример кода сравнивал его не со всеми элементами, а скорее с остальной частью массива. Я исправил свой код, чтобы он работал и в упомянутом вами случае.
4. @DavidBowling здесь приведен пример использования кода, который я предоставил с правильным выводом.
5. @DavidBowling не беспокойтесь. Не стесняйтесь указывать идентификатор, который вы считаете правильным.
Ответ №2:
То, как я читаю ваш вопрос, учитывая, что заголовок «Сравнение одного элемента со всеми другими элементами в том же массиве», вы хотите найти количество уникальных элементов в массиве. Для каждого элемента в массиве вы должны определить, есть ли дубликаты, следующие за ним, но также предшествующие ему. Вот решение, которое делает это. В моем примере я использовал символьные массивы, но вы могли бы легко адаптировать это к другим типам. countUnique()
Функция выполняет прямой поиск дубликатов, и когда она находит потенциально уникальный элемент, alreadyFound()
функция проверяет предыдущие элементы.:
#include <stdio.h>
#include <string.h>
int countUnique(char arr[], int n);
int compareThem(char c1, char c2);
int alreadyFound(char c, char list[], int n);
int main(void)
{
char test1[] = "abcababdb";
int s_len = strlen(test1);
printf("test1: %d unique elementsn", countUnique(test1, s_len));
return 0;
}
int countUnique(char arr[], int n)
{
int no_of_unique = 0;
int f, p;
for (f = 0; f < n; f ) {
for (p = f 1; p < n; p ) {
if(compareThem(arr[f],arr[p]) == 1)
break;
}
if (p == n amp;amp; !alreadyFound(arr[f], arr, f)) {
no_of_unique ;
}
}
return no_of_unique;
}
int compareThem(char c1, char c2)
{
if (c2 - c1)
return 0;
return 1;
}
int alreadyFound(char c, char list[], int n)
{
int i;
for (i = 0; i < n; i ) {
if (c == list[i])
return 1;
}
return 0;
}