Дан одномерный вещественный массив X из n элементов

Дан одномерный вещественный массив X из n элементов. Для каждой тройки идущих элементов массива((X0,X1,X2),(X1,X2,X3), ...,(Xn-3,Xn-2,Xn-1)) найти минимальный элемент. Какая ошибка в коде и как вывести тройки элементов?

#include <stdio.h>
#include <locale.h>
int main()
{
  char *locale=setlocale(LC_ALL, "");
  float *a;
  int n, i , in;
  float d,min;
  puts("Введите число элементов массива a");
  scanf("%d",&n);
    a = new float[n];
  for (i=0;i<n;i++)
    { printf("Введите число a[%2d]=",i);
      scanf("%f",&a[i]);       
    }
 d=0;
  for(i=0;i<*(a+1);i++)
  {
     printf("Первая тройка a[%2d]=%.2f\n",i,a[i]);
         min=a[i];
         if(min>a[i])
          {
            min=a[i];
          }
  }
      printf("min=%.2f \n", min);

  puts("Массив a");
  for(i=0;i<n;i++)
    printf("a[%2d]=%.2f \n", i, a[i]);
  return(0);
}

Ответы (1 шт):

Автор решения: Павел Ериков

Ошибка в коде? У вас в целом алгоритм не пойми, что делает :)

Например вот:

for(i=0;i<*(a+1);i++)

Цикл проходит от 0 до значения 2 элемента, если a[1] = 100000 то цикл будет проходит от [0, 100000).

Я так думаю вы пытались этим циклом найти первую минимальное значение в первой тройке, ну значит как минимум нужно было писать i = 0; i < 3; i++, но вам нужно пройтись по всем тройкам.

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

Например вот так:

float getMinTriple(float* a, int index) {
    //Сразу возьмем первый элемент как минимальный
    float min = a[index];
    //т.к. 1 элемент мы считай рассмотрели, то начнем с index + 1
    //и до index + 3 т.к. тройка
    for (int i = index + 1; i < index + 3; i++)
        if (min > a[i])
            min = a[i];
    return min;
}

Но можно было сделать проще, вот пример для понимания:

double min_triple(double x, double y, double z) {
    //Если x самый маленький возвращаем его
    if (x <= y && x <= z) return x;
    //Если y то возвращаем y
    if (y <= x && y <= z) return y;
    //иначе z
    return z;
}

Всё! Вся работа считай уже сделана, осталось только вывести минимальные элементы каждой тройки.

Например вот так:

for (i = 0; i < n - 2; i++)
    printf("min[%2d]=%.2f\n", i, getMinTriple(a, i));

А для 2 примера min_triple вот так:

for(i = 0; i < n - 2; i++)
    printf("min[%2d]=%.2f\n", i, min_triple(a[i], a[i + 1], a[i + 2]));

Проходим от 0 до n - 2 т.к. последняя тройка начинается с n - 3 индекса. Иначе мы выйдем за пределы массива.

Индексы:  0 1 2 3 4
Значения: 2 3 4 1 5

Проверяем сначала 2 3 4 (от 0 до 2) тут минимальная 2, потом 3 4 1 (от 1 до 3) тут уже 1, и потом 4 1 5 (от 2 до 4) тут тоже 1, а далее троек нет.

Результат получаем такой: 2 1 1

→ Ссылка