Это принесет пользу, если вы нарушите задачу до нескольких функций, как указано другими. Это устраняет, как минимум, 4 независимые переменные итерации для индексов во вложенном цикле.После того, как у вас есть свой начальный массив, ваша основная цель - перебрать каждое значение в вашем оригинале и убедиться, что новое значение, которое вы пытаетесь добавить ко второму, не существует в первом.
Возьмем в качестве примера существующего массива и пустой второй массив (a
и b
ниже):
int a[][ASZ] = {{19, 1,38,51,37},
{95,74,42,23,76},
{17,24,14,22,25},
{11,50,10,84,45},
{78,44,66,46,98}};
int b[ASZ][ASZ] = {{0}};
(Примечание: любой значительно большой массив, итерации каждого значения для каждого дополнение к второй очень неэффективно. Для повышения эффективности было бы целесообразно отсортировать оригинал (даже в массиве temp), позволяющий поиск типа бисекции/брекетинга резко сократить итерации, необходимые для проверки повторяющихся значений)
Проверка на наличие d uplicates, в простейшем смысле может быть целочисленной функцией, принимающей исходный массив и предлагаемое значение в качестве аргументов (вместе с размером массива), а затем сравнивая значения, возвращая 1
или 0
для unique
или non-unique
. Что-то вроде следующего:
int check_uniq (int a[][ASZ], size_t n, int v)
{
size_t i, j;
for (i = 0; i < n; i++)
for (j = 0; j < ASZ; j++)
if (a[i][j] == v)
return 0;
return 1;
}
(где:ASZ
просто константа для ряда размера массива)
С таким образом, чтобы проверить для уникальных значений, заполнение массива сводится к вашему основной подход:
/* fill second array with values unique to values in a[][] */
for (i = 0; i < n; i++) {
for (j = 0; j < ASZ; j++) {
for (;;) {
tmp = rand() % 100 + 1;
if (check_uniq (a, n, tmp))
break;
}
b[i][j] = tmp;
}
}
(примечание: вы можете использовать любой тип внутренней петли вы предпочитаете for
,. 210, или do .. while
. Простая непрерывная итерация с break
после того, как найденное значение найдено так же просто, как и все остальное).
И наконец, тестирование. Вместо того, чтобы неоднократно вводить предлагаемые значения во время тестирования, иногда имеет смысл создать простой способ заполнить второй массив случайными числами, чтобы обеспечить тщательную проверку. Ниже приведен краткий пример, в котором собраны все части. Надеюсь, это поможет. Дайте мне знать, если у вас есть какие-либо вопросы:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define ASZ 5
int check_uniq (int a[][ASZ], size_t n, int v);
void prn_array (int a[][ASZ], size_t n);
void prn_array_1d (int a[][ASZ], size_t n);
void quick_sort (int *a, size_t n);
int main (void) {
int a[][ASZ] = {{19, 1,38,51,37},
{95,74,42,23,76},
{17,24,14,22,25},
{11,50,10,84,45},
{78,44,66,46,98}};
int b[ASZ][ASZ] = {{0}};
int tmp = 0;
size_t i, j;
const size_t n = sizeof a/sizeof *a;
srand (time (NULL));
/* fill second array with values unique to values in a[][] */
for (i = 0; i < n; i++) {
for (j = 0; j < ASZ; j++) {
for (;;) {
tmp = rand() % 100 + 1;
if (check_uniq (a, n, tmp))
break;
}
b[i][j] = tmp;
}
}
printf ("\n the original array is:\n\n");
prn_array (a, n);
printf ("\n the second array with unique values is:\n\n");
prn_array (b, n);
printf ("\n comparison in sorted 1D array format (easier to check):\n\n");
prn_array_1d (a, n);
printf ("\n");
prn_array_1d (b, n);
printf ("\n\n");
return 0;
}
int check_uniq (int a[][ASZ], size_t n, int v)
{
size_t i, j;
for (i = 0; i < n; i++)
for (j = 0; j < ASZ; j++)
if (a[i][j] == v)
return 0;
return 1;
}
void prn_array (int a[][ASZ], size_t n)
{
size_t i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < ASZ; j++)
printf (" %3d", a[i][j]);
printf ("\n");
}
}
void prn_array_1d (int a[][ASZ], size_t n)
{
size_t i, j;
int tmp [n * ASZ];
for (i = 0; i < n; i++)
for (j = 0; j < ASZ; j++)
tmp [i * ASZ + j] = a[i][j];
quick_sort (tmp, n * ASZ);
for (i = 0; i < n * ASZ; i++)
printf (" %3d", tmp[i]);
}
void quick_sort (int *a, size_t n)
{
int pvt, tmp;
size_t i, j;
if (n < 2) return;
pvt = a[n/2];
for (i = 0, j = n - 1;; i++, j--)
{
while (a[i] < pvt) i++;
while (pvt < a[j]) j--;
if (i >= j)
break;
tmp = a[i];
a[i] = a[j];
a[j] = tmp;
}
quick_sort (a, i);
quick_sort (a + i, n - i);
}
Выходные
$ ./bin/array_2d_fill_uniq
the original array is:
19 1 38 51 37
95 74 42 23 76
17 24 14 22 25
11 50 10 84 45
78 44 66 46 98
the second array with unique values is:
81 16 34 69 65
87 88 35 67 79
89 43 55 18 12
77 83 93 9 99
34 94 75 2 72
comparison in sorted 1D array format (easier to check):
1 10 11 14 17 19 22 23 24 25 37 38 42 44 45 46 50 51 66 74 76 78 84 95 98
2 9 12 16 18 34 34 35 43 55 65 67 69 72 75 77 79 81 83 87 88 89 93 94 99
Что вы имеете в виду «это не работает правильно»? Какая ошибка? – rost0031
Не ошибка для каждого, но она не работает для каждой позиции. – Fuga
Можете ли вы привести пример? – rost0031