1.Резюме
1.1.Язык: C
У меня есть такой массив {30, 220, 219, 220, 221}, и у меня есть разностное значение, допустим 9 (k = 9).Я хочу получить все целочисленные элементы массива, которые имеют меньшую разницу.Затем верните среднее значение этих допустимых значений.
Примечание 1. размер массива не фиксирован.например, это может быть так:
{220, 219, 220, 30, 216, 224, 217} // больший размер массива
или {222, 220, 219, 220, 221} // все значения находятся в пределах разницы
или {30, 66, 89, 220, 221} // другие значения выходят за пределы диапазона
Примечание 2. дублирующиеся элементы не должны бытьудален.Иначе, это может повлиять на усреднение.
1.2.Пример:
Заданный массив: {30, 219, 220, 221, 216, 220};
Разница = 9;Я ищу среднее значение 219 220 221 216 220, возвращаемое в целых числах, равное 219.
Что я делаю, так это сначала нахожу индексы подходящих элементов.Затем удаляем дубликаты индексов, затем усредняем.
2.Справочная информация
Я написал следующий код с помощью примеров, которые я нашел на разных страницах, но есть некоторые проблемы с ним.
3.Код
#include <stdio.h>
#include <math.h>
int countPairs(int a[], int n, int k)
{
printf( "n is %d \tand\t", n); //debug
printf( "k is %d\n\n", k); //debug
//////////////////////////////////////// finding indexes ////////////////
//credit: https://www.geeksforgeeks.org/pairs-difference-less-k/
int index[n*2];
int res = 0;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if ((a[j] - a[i]) < k) {
index[res] = j;
printf("index[%d]= %d,\t", res, index[res]); //debug
printf("(%d,%d), (%d,%d)\n", i, j, a[i], a[j]); //debug
res++;
}
}
}
///////////////////////////////////////// removing duplicate indexes //////
// credit: https://www.studytonight.com/c/programs/array/remove-duplicate-element-program
int i, j, t, m=n*2;
for (i = 0; i < m; i++)
{
for (j = i + 1; j < m; )
{
if (index[j] == index[i])
{
for (t = j; t < m; t++)
{
index[t] = index[t + 1];
}
m--;
}
else
{
j++;
}
}
}
//////////////////////////////////////////////averaging ///////////
int arr[6],avg=0;
for (int i = 0; i <4; i++ ) {
arr[i]=a[index[i]];
avg+=arr[i];
printf( "a[%d] : %d\n", i, arr[i]); //debug
}
avg/=4;
printf( "Average : %d\n", avg); //debug
////////////////////////////////////////////////////////////////
return avg;
}
int main()
{
int a[] = {30, 219, 220, 221, 216, 220};
int k = 9;
int n = sizeof(a) / sizeof(a[0]);
/////////////////////////////////
printf("\nGiven array: {");
for (int i = 0; i <n; i++ ) {
printf("%d", a[i]);
if(i<n-1){
printf(", ");
}
}
printf("}\n\n");
/////////////////////////////////
countPairs(a, n, k);
///////////////////////////////
return 0;
}
4.Фактические результаты, включая сообщения об ошибках
С этим кодом связаны две проблемы:
пропущен первый действительный индекс.В моем коде выходные данные пропускают индекс 1 данного массива, который является элементом 219. Как я могу это исправить?В настоящее время он основан на переменной J.
Я не могу сделать код универсальным и гибким в отношении размеров массива или номеров циклов.
Например, если вы посмотрите на:
строка 50 и 57-число 4 в :: для (int i = 0; i <4; i ++) </em> и avg / = 4;
строка 47-номер 6 в :: обр [6]
строка 24 переменная m- in :: m = n * 2;// это значение не логично, я просто сделал это на основе простого предположения
строка 9-размер массива в :: index [n * 2];// этот размер массива не логичен, я просто сделал это на основе простого предположения
Копия моего кода с нумерацией строк может быть найдена по адресу: https://repl.it/repls/SuburbanRelevantDisassembly
Заглядывая впередиметь вашу помощь / предложения.Или вы предлагаете лучшее решение по сравнению с этим?
Заранее спасибо