Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Среднее геометрическое элементов за минимальным элементом

dsfd dfsdfs Профи (511), закрыт 3 часа назад
Подскажите, почему при выполнение задачи(Среднее геометрическое элементов за минимальным элементом) в ответе добавляет в массив единицу?



#include<stdio.h>
#include<conio.h>
#include <stdlib.h>
#include<windows.h>
#include<math.h>
#define NMAX 100

int main()
{
int imin, min, n, i;
int x[NMAX];
int sumNegatives = 0;
double sum;
SetConsoleOutputCP(1251);
SetConsoleCP(1251);

// Задаем массив
do
{
printf("Введите размер массива от 1 до %d = ", NMAX);
scanf_s("%d", &n);

if (n <= 0 || n > NMAX)
{
printf("Размер массива n = %d, не соответствует размеру 1..%d элементов\n", n, NMAX);
printf("Для завершения программы нажмите любую клавишу\n");
exit(0);
}
} while (n < 1 || n > NMAX);

for (i = 0; i < n; i++)
{
printf("x[%3d ]=", i);
scanf_s("%d", &x[i]);
}
// Вывод исходного массива
printf("Исходный массив х размером %d\n", n);
for (i = 0; i < n; i++)
printf("%8.2d", x[i]);

imin = 0;

// Определение минимального элемента и его позиции
for (i = 0; i < n; i++)
{
if (x[i] < x[imin])
imin = i;
}
min = x[imin];
sum = 1.0;
// Определение среднего геометрического за минимальным элементом
for (i = imin + 1; i < n; i++)
sum *= x[i];
sum = pow(sum, 1.0 / n);

printf("\n\nМинимальный элемент массива: %d\n", min);
printf("Позиция минимального элемента: %d\n", imin);
printf("Среднее арифметическое за минимальным элементом: %.2f\n", sum);
printf("\n\nДля завершения программы нажмите любую клавишу\n");
system("pause");
return 0;
}
Лучший ответ
Аглая Шниц Искусственный Интеллект (145852) 12 часов назад
по-моему, ничего лишнего не рисуется:надо только
sum = pow(sum, 1.0 / n);
поменять на
if (imin < n-1) sum = pow(sum, 1.0 / (n-imin-1));
dsfd dfsdfsПрофи (511) 12 часов назад
Естественно если цифры одинаковые забейте разные цифры в масив
Аглая Шниц Искусственный Интеллект (145852) можно и разные:
dsfd dfsdfsПрофи (511) 12 часов назад
if (imin < n-1) sum = pow(sum, 1.0 / (n-imin-1));
данная функция помогает, но только при положительных элементах массива
Аглая Шниц Искусственный Интеллект (145852) среднее геометрическое определено только для положительных чисел, емнип: Средним геометрическим нескольких п̲о̲л̲о̲ж̲и̲т̲е̲л̲ь̲н̲ы̲х̲ вещественных чисел называется такое число, которым можно заменить каждое из этих чисел так, чтобы их произведение не изменилось. (вики)
dsfd dfsdfsПрофи (511) 12 часов назад
Получается если в массиве есть отрицательное число, то все оно не выполняется и никак на это не повлиять?
Аглая Шниц Искусственный Интеллект (145852) получается, так.
dsfd dfsdfsПрофи (511) 12 часов назад
Эх спасибо, однако печально.
Остальные ответы
Николай Веселуха Высший разум (370789) 14 часов назад
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

#define NMAX (size_t)100

size_t input_size(void) {
size_t value = 0;
while (!value || NMAX < value) {
printf("Введите размер массива от 1 до %zu: ", NMAX);
scanf_s("%zu", &value);
}
return value;
}

void input_vector(int* vector, size_t n) {
size_t i = 0;
printf("Введите элементы массива: ");
while (i < n) {
scanf_s("%i", &vector[i]);
++i;
}
system("cls");
}

void output_vector(const int* vector, size_t n, int w) {
size_t i = 0;
puts("Исходный массив:");
while (i < n) {
printf("%*d", w, vector[i]);
++i;
}
putchar('\n');
}

int* min_elemnet(int* begin, const int* end) {
int* min = begin;
while (++begin < end) {
if (*begin < *min) {
min = begin;
}
}
return min;
}

double arithmetic_mean(const int* begin, const int* end) {
unsigned n = 1;
double sum = *begin;
while (++begin < end) {
sum += *begin;
++n;
}
return sum / n;
}

double geometric_mean(const int* begin, const int* end) {
unsigned n = 1;
double product = *begin;
while (++begin < end) {
product *= *begin;
++n;
}
return pow(product, 1.0 / (double)n);
}

int main(void) {
int vector[NMAX] = { 0 };
size_t n;
const int* end = NULL;
const int* position = NULL;
int min;
system("chcp 1251 > nul");
n = input_size();
input_vector(vector, n);
output_vector(vector, n, 8);
end = vector + n;
position = min_elemnet(vector, end);
min = *position;
printf("Минимальное значение в массиве: %d\n", min);
printf("Индекс первого вхождения в массиве: %lli\n", position - vector);
if (position + 1 == end) {
puts("Минимальный элемент последний в массиве.");
} else {
int const* begin = position + 1;
double am = arithmetic_mean(begin, end);
double gm = geometric_mean(begin, end);
printf("Среднее арифметическое после минимального: %.2lf\n", am);
printf("Среднее геометрическое после минимального: %.2lf\n", gm);
}
system("pause > nul");
return 0;
}
Похожие вопросы