Помощь - Поиск - Пользователи - Календарь
Полная версия: Найти в массиве элемент, наиболее близкий к среднему арифметическому суммы его элементов
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
Shmanich
 
#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.
}

Все неверно.
Shmanich
Цитата(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,но все равно ответ будет не всегда верным.
Shmanich
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 будет ближайшим, потому что оно равно нулю!!!!!!
buy cialis online with a prescri
Achat Kamagra Angleterre
cialis online without prescripti
Amoxicillin And Tinitis
when does the patent on viagra e
Kamagra Women
nishaknapp
Why not settling on games that is fun and at the same time your earning. Well itll make suspense because of the game as well but dude just try it and it gave me hope while pandemic is real rn. The Don’ts of Baccarat
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.