Найти и вывести номер элемента, для которого сумма разностей с соседними элементами максимальна - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Ввести массив вещественных чисел. Найти и вывести номер элемента, для которого сумма разностей с соседними элементами максимальна. Для крайних элементов использовать циклическое замыкание. Простенькая программа, но она не работает, не понятно, почему...
#include <stdio.h>
#define MAX 100
 
int t;
int getline(char s[], int lim)
{
    int i=0, f;
    char c;
    for (i=0; (i<(lim-1)) && ((c=getchar()) != EOF) && (c != '\n'); i++)
        s[i]=c;
    t=i;
    return i;
}
 
void main (void)
{
 
char line[MAX];
int dif1, dif2;
int num1=1, num2; //num1 текущий элемент; num2 искомый элемент
int sum, max;
int i;
 
printf("Enter string:\n");
getline(line, MAX);

max=0;
for (i=1; i<t; i++)
{
dif1= (line[i]- '0') - (line[i+1]- '0');
dif2= (line[i-1]- '0') - (line[i]- '0');
sum = dif1+dif2;
if (sum> max)
{max = sum;
num2 = num1;}
num1++;
}
 
dif1= (line[0]- '0') - (line[1]- '0');
dif2= (line[t]- '0') - (line[0]- '0');
sum = dif1+dif2;
if (sum> max)
{max = sum;
num2=0;}
 
dif1= (line[t-1]- '0') - (line[t]- '0');
dif2= (line[t]- '0') - (line[0]- '0');
sum = dif1+dif2;
if (sum> max)
{max = sum;
num2=t;}
 
printf("number= %d %d", num2, max);
}

Решение задачи: «Найти и вывести номер элемента, для которого сумма разностей с соседними элементами максимальна»

textual
Листинг программы
#include <stdio.h>
 
float getDiff(float* arr, int size, int pos) {
    if (pos == 0) {
        return 2*arr[0] - arr[1] - arr[size-1];
    } else if (pos == size-1) {
        return 2*arr[size-1] - arr[size-2] - arr[0];
    } else {
        return 2*arr[pos] - arr[pos-1] - arr[pos+1];
    }
}
 
int main(void) {
    float arr[] = {1, 2, 100, 4, 5};
    int size = sizeof(arr) / sizeof(arr[0]);
    int max = 0;
    for (int i=1; i < size; ++i) {
        if (getDiff(arr, size, max) < getDiff(arr, size, i)) {
            max = i;
        }
    }
    printf("%d %f", max, getDiff(arr, size, max));
    return 0;
}

Объяснение кода листинга программы

  1. Включаем стандартную библиотеку ввода-вывода (stdio.h).
  2. Создаем функцию getDiff, которая принимает на вход массив, его размер и позицию текущего элемента. Функция вычисляет разность между текущим элементом и его соседями (с предыдущим и следующим элементами). Если позиция равна 0, то возвращается разность между вторым и первым элементом, если позиция равна размеру массива минус 1, то возвращается разность между последним и предпоследним элементом, в остальных случаях возвращается разность между текущим элементом, предыдущим и следующим элементом.
  3. Создаем функцию main. Инициализируем массив arr, вычисляем его размер. Создаем переменную max, которая будет хранить номер максимального элемента. Проходим циклом по массиву от 1 до размера массива минус 1. В каждой итерации сравниваем разность, которую вернула функция getDiff для текущего элемента и max, с разностью, которую вернула функция getDiff для следующего элемента. Если разность для текущего элемента меньше, то обновляем значение max.
  4. Выводим на экран номер максимального элемента и разность, которую вернула функция getDiff для этого элемента.
  5. Возвращаем 0, чтобы указать, что программа успешно завершилась.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.286 из 5
Похожие ответы