Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Найти в массиве элемент, наиболее близкий к среднему арифметическому суммы его элементов

Автор: Shmaniche 27.05.2012 15:01

 
#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 27.05.2012 15:51

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

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 27.05.2012 16:43

Цитата(Krjuger @ 27.05.2012 15:51) *

razn2 = mas[i]-sr_arif;

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

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


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

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


Не распишете как верно? Уже мозг сломал.

Автор: Krjuger 27.05.2012 21:01

Расписывать не стану,но обьясню,что происходит и почему это так происходит.
У вас 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 27.05.2012 21:21

Krjuger

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


Автор: Krjuger 27.05.2012 22:15

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

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

Автор: buy cialis online with a prescri 31.10.2021 10:30

Achat Kamagra Angleterre

Автор: cialis online without prescripti 5.12.2021 19:25

Amoxicillin And Tinitis

Автор: when does the patent on viagra e 19.12.2021 18:42

Kamagra Women

Автор: nishaknapp 29.07.2022 17:17

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. https://thewebmagazine.org/the-donts-of-baccarat/