C как сравнить элементы массива
Перейти к содержимому

C как сравнить элементы массива

  • автор:

C как сравнить элементы массива

Эта глава описывает функции для поиска и сортировки массивов произвольных объектов. Вы определяете соответствующую функцию сравнения, которую нужно применить как аргумент, наряду с размером объектов в массиве и общим числом элементов.

Чтобы использовать библиотечные функции сортировки массива, Вы должны описать, как сравнить элементы массива.

Чтобы сделать это, Вы обеспечиваете функцию сравнения, для сравнения двух элементов массива. Библиотека вызовет эту функцию, передавая как указатели на аргументы два элемента массива, которые нужно сравнить. Ваша функция сравнения должна возвратить значение как strcmp (см. Раздел 5.5 [Сравнение СТРОКИ/МАССИВА]): отрицательное, если первый аргумент — «меньше» чем второй, нуль, если они «равны», и положительное если первый аргумент «больше».

Вот пример функции сравнения, которая работает с массивом чисел типа double:

int compare_doubles (const double *a, const double *b)

Заглавный файл » stdlib.h » определяет имя для типа данных функций сравнения. Этот тип — расширение GNU.

int comparison_fn_t (const void *, const void *);

Чтобы искать в сортируемом массиве элемент, соответствующий ключу, используйте bsearch функцию. Прототип для этой функции находится в заглавном файле » stdlib.h «.

void * bsearch (const void *key, const void *array, size_t count, size_t size, comparison_fn_t compare)

Bsearch функция ищет в сортируемом массиве объект, который является эквивалентным key. Массив содержит count элементов, каждый из которых имеет байты размера sise.

Возвращаемое значение — указатель на соответствующий элемент массива, или пустой указатель, если никакое соответствие не найдено. Если массив содержит больше чем один подходящий элемент, неопределено который же возвращается.

Эта функция получила имя из предположения, что она выполнена, используя двоичный алгоритм поиска.

Для сортировки массива, используюя произвольную функцию сравнения, используйте qsort функцию. Прототип для этой функции находится в » stdlib.h «.

void qsort (void *array, size_t count, size_t size, comparison_fn_t compare)

Qsort функция сортирует заланный массив. Массив содержит count элементов, каждый из которых имеет размер size.

Функция compare используется, чтобы выполнить сравнение на элементах массива. Эта функция вызывается с двумя аргументами указателями и должна возвратить целое число меньше , равное, или больше нуля, если первый аргумент меньше , равен, или больше чем второй аргумент.

Предупреждение: если, два объекта сравниваются как равные, их порядок после сортировки, непредсказуем. То есть сортировка не устойчива. Она может делать различие, когда сравнение рассматривает только часть элементов. А также, два элемента с тем же самым ключом сортировки могут отличиться в других отношениях.

Вот простой пример сортировки массива double значений в числовом порядке используя функцию сравнения, определенную выше (см. Раздел 15.1 [Функции Сравнения]):

Qsort функция получила имя из предположения, что она была первоначально выполнена, используя алгоритм «быстрой сортировки».

Вот пример, показывающий использование qsort и bsearch с массивом структур. Объекты в массиве сортируются, сравнивнением их name полей функцией strcmp.

#include #include #include struct critter < const char *name; const char *species; >; struct critter muppets[] = < , , , , , , , , , , , , , , >; int count=sizeof(muppets)/sizeof(struct critter); int critter_cmp (const struct critter *c1, const struct critter *c2) < return strcmp (c1->name, c2->name); > void print_critter (const struct critter *c) < printf ("%s, the %s\n", c->name, c->species); > void find_critter (const char *name) < struct critter target, *result; target.name = name; result = bsearch (&target, muppets, count, sizeof (struct critter), critter_cmp); if (result) print_critter (result); else printf ("Couldn't find %s.\n", name); >int main (void)
Вывод этой программы:

Kermit, the frog Piggy, the pig Gonzo, the whatever Fozzie, the bear Sam, the eagle Robin, the frog Animal, the animal Camilla, the chicken Sweetums, the monster Dr. Strangepork, the pig Link Hogthrob, the pig Zoot, the human Dr. Bunsen Honeydew, the human Beaker, the human Swedish Chef, the human Animal, the animal Beaker, the human Camilla, the chicken Dr. Bunsen Honeydew, the human Dr. Strangepork, the pig Fozzie, the bear Gonzo, the whatever Kermit, the frog Link Hogthrob, the pig Piggy, the pig Robin, the frog Sam, the eagle Swedish Chef, the human Sweetums, the monster Zoot, the human Kermit, the frog Gonzo, the whatever Couldn't find Janice.

C как сравнить элементы массива

Регистрация: 05.02.2018

Сообщений: 1

Как сравнить переменную со всеми елементами массива?

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

Форумчанин

Регистрация: 12.04.2017

Сообщений: 889

В цикле конечно, по количеству элементов массива. Внутри цикла проверка, если не совпадает, то.

Регистрация: 09.01.2008

Сообщений: 26,238

Сообщение от alexzk

Внутри цикла проверка, если не совпадает, то..

не, лучше — если совпадает, то «найдено» и выход из цикла, результат = «true»
а если цикл завершился и не было «найдено», тогда — не найдено, результат = «false»

Serge_Bliznykov
Посмотреть профиль
Найти ещё сообщения от Serge_Bliznykov

C как сравнить элементы массива

Что то тут в условии напутано, нафига сравнивать n-ый элемент массива с n-ым элементом массива, и без сравнения они абсолютно равны.

Цитата REC0N @ 22.12.11, 21:26
Не знаю где ошибка.

Тут тоже эльфов нема, телепатией никто, кого я знаю не обладает.

Ошибки, найти? Да запросто:

Цитата REC0N @ 22.12.11, 21:26

а следующее:
Цитата REC0N @ 22.12.11, 21:26
r1[i] = Convert::ToInt32(dataGridView3->Rows[i]->Cells[0]->Value);

Если nm — больше 10, то будет ошибка доступа к памяти

Цитата REC0N @ 22.12.11, 21:26
for(int i=0; iText=»Overlap»; > else < OverlapRichTb->Text=»Not Overlap»; >

Ты и вправду решил что тут все нормально? Вообще ты тут сравниваешь предыдущий элемент массива со следующим(это грубо говоря), это не смотря на это:

Цитата REC0N @ 22.12.11, 21:26
Подскажите алгоритм чтобы сравнить каждый элемент массива с каждым

Тобишь тоже ошибка.
Сообщ. #3 , 22.12.11, 21:46
Рейтинг (т): нет
Цитата KILLER @ 22.12.11, 21:34

Что то тут в условии напутано, нафига сравнивать n-ый элемент массива с n-ым элементом массива, и без сравнения они абсолютно равны.

Ошибки, найти? Да запросто:

Цитата REC0N @ 22.12.11, 21:26

а следующее:
Цитата REC0N @ 22.12.11, 21:26
r1[i] = Convert::ToInt32(dataGridView3->Rows[i]->Cells[0]->Value);

Если nm — больше 10, то будет ошибка доступа к памяти

1.Пример:
Массив 4 элемента(элементы любые)
Сравниваем 1-2,1-3,1-4
2-3 2-4
3-4
Думаю вы меня поняли

2.Hа nm не смотрите,суть не в этом,а в алгоритме

Сообщение отредактировано: REC0N — 22.12.11, 21:48
Сообщ. #4 , 22.12.11, 22:09
Unregistered
int arr_size = 4; //размер массива
for(int i =0 ; i < arr_size-1; i++) for(int z = i+1; z < arr_size; z++) if(arr[i] == arr[z]) // есть совпадение

А вообще крайне советую почитать «Объектно оРиентированное программирование на С++» — Лафоре

Сообщ. #5 , 22.12.11, 22:21
Рейтинг (т): нет
Цитата aster_x @ 22.12.11, 22:09
int arr_size = 4; //размер массива
for(int i =0 ; i < arr_size-1; i++) for(int z = i+1; z < arr_size; z++) if(arr[i] == arr[z]) // есть совпадение

А вообще крайне советую почитать «Объектно оРиентированное программирование на С++» — Лафоре

Да у меня так же было
P.S:Дело не в алгоритме!
Сообщение отредактировано: REC0N — 22.12.11, 22:21
Сообщ. #6 , 22.12.11, 22:38
Unregistered
Обрати внимание на слова.
Цитата KILLER @ 22.12.11, 21:34

а следующее:
Цитата (REC0N @ Вчера, 23:26)
r1[i] = Convert::ToInt32(dataGridView3->Rows[i]->Cells[0]->Value);

Если nm — больше 10, то будет ошибка доступа к памяти

1) Поставь на каждую строчку кода «BreakPoint» и посмотри под отладчиком где полезет ошибка.
2) Твой алгоритм такой же, извеняюсь втыкнул, в таком случае случае ошибки у тебя явно возникают где в другой части программы, ищи.

И старайся использовать отладчик, ок?

[C++]Сравнить элементы массива между собой

Суть задачи такая. Дана непрямоугольная матрица, заполнить её элементами. В первом элементе каждой строки я сохраняю кол-во элементов в этой строке. И мне, исходя из полученной матрицы, нужно сформировать другую, в которой будут выводиться только повторяющиеся более 2-х раз эелементы в строке. Потом переходм на следующую строку и там опять сравниваем все элементы между собой. Вот алгоритм то я понимаю, но программно что-то не могу реализовать, торможу =)

using namespace std;
const int M = 100, N = 100;

void input(int (*p)[M], int mn, int nn);
void source(int &m, int (*p)[M]);
void result(int &m, int (*p)[M]);

int main() int arr[M][N], m;
input(arr, M, N);
return 0;
>

/*функция, в которой хочу сравнить элементы в каждой строке между собой и сформировать новую матрицу,
если совпадений не найдено, то вставляем пустую строку или ничего не делаем*/
void result(int &m, int (*p)[M]) int tmp, r[M][N], count;
cout for(int i=0;i // тут, собственно начинаю что-то делать, только не знаю как дальше
if(tmp == p[j])

Вроде как чуть-чуть осталось, но не получается ))

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *