Дан одномерный вещественный массив 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