Помощь - Поиск - Пользователи - Календарь
Полная версия: Найти в массиве элемент, наиболее близкий к среднему арифметическому суммы его элементов
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
Shmaniche
 
#include <stdio.h>
#include <conio.h>
#include <math.h>

int main()
{
int i, j;
float mas[5];
float sum_mas, sr_arif, razn1, razn2;

printf("Vvedite massiv iz 5 elementov \n:");
for (i=0; i<5; i++)
{ printf("Vvedite element[%d]: ", i);
scanf("%f", &mas[i]); }

for(i=0 ; i<5 ; i++)
{
sum_mas += mas[i]; // Сумма элементов массива.
sr_arif = sum_mas / 5; // Сумма элементов массива деленая на кол-во элементов = Ср. ариф.
}

razn1 = mas[0]-sr_arif; // Из первого элемента массива вычитаем среднее ариф-ое, получаем разницу1.
razn2 = mas[i]-sr_arif; // Из каждого элемента массива вычитаем среднее ариф-ое, получаем разницу2.
j=0 ; // Обнуляем переменную.
for (i = 1 ; i<10 ; i++)
{
if( fabs(razn1) > fabs(razn2)) // Если модуль разницы1 больше модуля разницы2, то...
{ j=i; // элемент массива вводим в новую переменную и...
razn1 = razn2; } // разницу1 приравниваем к разнице2.
}

printf ("\n Srednee arifmechicheskoe: %3.3f", sr_arif); // Вывести среднее арифм-ое с оукруглением.
printf ("\n Naibolee blizkoe znachenie: %3.3f", mas[j]); // Вывести наиболее близкое значение.
getch(); // Ожидать нажатия любой клавиши.
return 0; // Вернуть 0 функции int main().
}



1 элем: 1
2 элем: 5
3 элем: 4
4 элем: 3
5 элем: 3
Ср. Ариф: 3.200
Наиболее близкий: 1.000.
Тоже неверно, думаю наиболее близкий 3.000, либо может быть и 4.000.

9
8
7
6
5
Ср. Ариф: 7.000
Наиболее близкий: 9.000.
Почему 9, когда наиболее близкое значение еще м.б. 8.000.

Как можно исправить?

PS: В условии что имеется ввиду под наиболее близким элементом? В меньшую сторону от ср. арифм. или в большую?
Krjuger
Это вы у нас спрашиваете???)Ваша же задача.
По логике вещей, если специально не обговорены дополнительные условия,то более близкое число принято вычислять,как модуль разности текущего и среднего.

razn2 = mas[i]-sr_arif;

А ничего что у вас i используется как счетчик циклов?
for (i = 1 ; i<10 ; i++) 

Почему 10,если у вас в массиве всего 5 элементов.
В общем вот тут

razn1 = mas[0]-sr_arif; // Из первого элемента массива вычитаем среднее ариф-ое, получаем разницу1.
razn2 = mas[i]-sr_arif; // Из каждого элемента массива вычитаем среднее ариф-ое, получаем разницу2.
j=0 ; // Обнуляем переменную.
for (i = 1 ; i<10 ; i++)
{
if( fabs(razn1) > fabs(razn2)) // Если модуль разницы1 больше модуля разницы2, то...
{ j=i; // элемент массива вводим в новую переменную и...
razn1 = razn2; } // разницу1 приравниваем к разнице2.
}

Все неверно.
Shmaniche
Цитата(Krjuger @ 27.05.2012 15:51) *

razn2 = mas[i]-sr_arif;

А ничего что у вас i используется как счетчик циклов?
for (i = 1 ; i<10 ; i++) 

Почему 10,если у вас в массиве всего 5 элементов.


Потому что до этого вводил 10 элементов, потом заменил на 5, а в счетчике не убрал.

Цитата
Все неверно.


Не распишете как верно? Уже мозг сломал.
Krjuger
Расписывать не стану,но обьясню,что происходит и почему это так происходит.
У вас i глобальная переменная,существующая вне циклов, соответственно, после окончания цикла ,она будет хранить значение, равное длинне цикла,в вашем случае 5.
В этом куске

razn1 = mas[0]-sr_arif; // Из первого элемента массива вычитаем среднее ариф-ое, получаем разницу1.
razn2 = mas[i]-sr_arif; // Из каждого элемента массива вычитаем среднее ариф-ое, получаем разницу2.


Вы находите две разности, первая, это разность между первым элементом и средним.Вторая, это разность между пятым элементом и средним.И вы из сравниваете.Ваши тесты построены так,что первая разница меньше второй.Вы в j записываете ноль, переприсваиваете,и что же вы сравниваете.
razn1 = razn2; } // разницу1 приравниваем к разнице2. 
Во-первых,наоборот, вы разницу 2 присваиваете разнице 1.А во вторых,ваша разница 2 никак не меняется,поэтому у вас выходит, что и в разнице 1 и в разнице 2 храниться одно и тоже число.Проверку условия оно конешно же не проходит, в результате остальные 9 циклов вообще ничего не делают и в качестве результата у вас всегда 0.
Могу дать подсказку.

razn1 = mas[0]-sr_arif; // Из первого элемента массива вычитаем среднее ариф-ое, получаем разницу1.
j=0 ; // Обнуляем переменную.
for (i = 1 ; i<5 ; i++)
{
razn2 = mas[i]-sr_arif; // Из каждого элемента массива вычитаем среднее ариф-ое, получаем разницу2.
if( fabs(razn1) > fabs(razn2)) // Если модуль разницы1 больше модуля разницы2, то...
{ j=i; // элемент массива вводим в новую переменную и...
razn1 = razn2; } // разницу1 приравниваем к разнице2.
}


Вот так оно уже будет менять разницу 2,но все равно ответ будет не всегда верным.
Shmaniche
Krjuger

Спасибо, но при вводе чисел 5, 4, 3, 2, 1 выводится, что ближ. знач. к ср. арифм. - это 3.000, а не 2 или 4. Если честно я так до конца и не понял, что значит это близкое к ср. арифм. Надо найти близкой в меньшую или в большую сторону? unsure.gif

Krjuger
Я же сказал, по модулю. Если среднее 3, а есть числа 4 и 2 то оба этих числа ближайшие,а если 3,2 среднее, то тогда уже 4 ближайшее,если среднее 2,8 то 2 ближайшее.

А ты что хотел сумма твоих числек 15, среднее арифметическое 3, при этом у тебя есть число 3, ясное дело что расстояние от 3 до 3 будет ближайшим, потому что оно равно нулю!!!!!!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.