Найти и вывести номер элемента, для которого сумма разностей с соседними элементами максимальна - 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;
}
Объяснение кода листинга программы
- Включаем стандартную библиотеку ввода-вывода (stdio.h).
- Создаем функцию getDiff, которая принимает на вход массив, его размер и позицию текущего элемента. Функция вычисляет разность между текущим элементом и его соседями (с предыдущим и следующим элементами). Если позиция равна 0, то возвращается разность между вторым и первым элементом, если позиция равна размеру массива минус 1, то возвращается разность между последним и предпоследним элементом, в остальных случаях возвращается разность между текущим элементом, предыдущим и следующим элементом.
- Создаем функцию main. Инициализируем массив arr, вычисляем его размер. Создаем переменную max, которая будет хранить номер максимального элемента. Проходим циклом по массиву от 1 до размера массива минус 1. В каждой итерации сравниваем разность, которую вернула функция getDiff для текущего элемента и max, с разностью, которую вернула функция getDiff для следующего элемента. Если разность для текущего элемента меньше, то обновляем значение max.
- Выводим на экран номер максимального элемента и разность, которую вернула функция getDiff для этого элемента.
- Возвращаем 0, чтобы указать, что программа успешно завершилась.