1 Востаннє редагувалося smishun (12.11.2016 22:47:42)

Тема: програмування мовою c

потрібно написати програму, щоб кожен елемент масиву замінявся на середньо арифметичне між ним та його сусідами справа і зліва за формулою an = (an-1  + an + an+1 )/3   ? Діапазон значень елементів масиву(-10 20), довжина масиву 23,перший і останній елемент масиву не змінювати. Буду дуже вдячний за допомогу

2

Re: програмування мовою c

взяти і замінити

Подякували: koala1

3 Востаннє редагувалося Betterthanyou (12.11.2016 20:26:48)

Re: програмування мовою c

НЕ правильно

Берете в циклі від першого до останнього елементу
де
і - номер поточного елемента масиву
правого сусіда

arr[i-1] (притому i-1 >= 0)

лівого сусіда

arr[i+1] (притому i+1 <= кількість елементів масиву)

додаєте їх, ділите на два, і присвоюєте поточному елементу масиву

arr[i] = (arr[i-1]+arr[i+1])/2

4 Востаннє редагувалося P.Y. (12.11.2016 19:35:01)

Re: програмування мовою c

Тут фокус у тому, що середнє арифметичне треба брати між старими значеннями, а способом, описаним вище, в елементи, що містять старі значення, потрібні для обчислень, потраплять нові значення. Тобто, треба ще десь тимчасово зберігати старі значення елементів і брати для обчислень їх.

Подякували: Betterthanyou1

5

Re: програмування мовою c

Betterthanyou, так не вийде - ви змінюєте поточний елемент, і на наступній ітерації буде братися його нове значення...

Подякували: Betterthanyou1

6 Востаннє редагувалося Betterthanyou (12.11.2016 20:25:40)

Re: програмування мовою c

Так, зрозумів
тоді потрібно
створити новий пустий масив (масив чисел - 2)

додати arr[i - 1] і arr[i], а потім поділити на 2
newArr[j] = (arr[i - 1] + arr[i]) / 2;

Перевіряємо 10) 4 і 11)5 буде 9, ділимо на 2 = 4,5 що і бачимо в 10 елементі
http://replace.org.ua/misc.php?action=pun_attachment&amp;item=1400&amp;download=0

Post's attachments

Untitled.png 5.3 kb, 206 downloads since 2016-11-12 

7

Re: програмування мовою c

Необов'язково створювати цілий масив-дублікат — достатньо кількох змінних для зберігання найближчих комірок. Хоча з масивом-дублікатом, мабуть, простіше написати, не заплутавшись у власних ногах.

Подякували: Betterthanyou, koala2

8

Re: програмування мовою c

P.Y. написав:

Необов'язково створювати цілий масив-дублікат — достатньо кількох змінних для зберігання найближчих комірок. Хоча з масивом-дублікатом, мабуть, простіше написати, не заплутавшись у власних ногах.

Так, зі зберіганням кількох комірок у проміжному масиві, і робив колись-колись. На компах з малою оперативкою і без кеша.

На сучасних, думаю, краще новий масив-дублікат і робота в нього.

По-перше, як вже сказано, простіше не заплутатися (проміжний масивчик і робота через нього є передчасною оптимізацією).
По друге, старий масив лише читається, новий лише пишеться, що може дати вищу продуктивність — при записові одного елемента інвалідується вся лінійка кеша, і якщо це запис у старий масив, то зчитування наступного елемента з цієї ж лінійки кеша може спричинити нове вичитування з оперативної пам'яті.
І якщо раптом на довгих масивах схочеться задіяти SIMD, це теж буде легше з двома незалежними масивами.

Подякували: Betterthanyou, cheappi3862