IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Найти в массиве элемент, наиболее близкий к среднему арифметическому суммы его элементов, Помогите найти ошибку
сообщение
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 79
Пол: Мужской

Репутация: -  0  +


 
#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: В условии что имеется ввиду под наиболее близким элементом? В меньшую сторону от ср. арифм. или в большую?

Сообщение отредактировано: Shmaniche -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


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

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.
}

Все неверно.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 79
Пол: Мужской

Репутация: -  0  +


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

razn2 = mas[i]-sr_arif;

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

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


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

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


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

Сообщение отредактировано: Shmaniche -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


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

Сообщение отредактировано: Krjuger -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Пионер
**

Группа: Пользователи
Сообщений: 79
Пол: Мужской

Репутация: -  0  +


Krjuger

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

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Профи
****

Группа: Пользователи
Сообщений: 652
Пол: Мужской
Реальное имя: Алексей

Репутация: -  20  +


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

А ты что хотел сумма твоих числек 15, среднее арифметическое 3, при этом у тебя есть число 3, ясное дело что расстояние от 3 до 3 будет ближайшим, потому что оно равно нулю!!!!!!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Achat Kamagra Angleterre
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Amoxicillin And Tinitis
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Kamagra Women
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 48
Пол: Мужской

Репутация: -  0  +


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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 4.12.2022 6:07
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name