Дан указатель на целочисленный массив размера N. Переставить, в обратном порядке элементы массива, расположенные между его минимальным и максимальным элементами.
// PascalABC.NET 3.0, сборка 1156 от 30.01.2016 function Avg(a:array[,] of integer):real; begin var s:=0; var k:=0; foreach var e:integer in a do if e>0 then begin s+=e; Inc(k) end; if k>0 then Result:=s/k else Result:=1e-100; end;
begin var A:=MatrixRandom(4,4,-50,50); Writeln(A); Writeln('Среднее арифметическое положительных равно ',Avg(A):0:3); var B:=MatrixRandom(5,5,-30,30); Writeln(B); Writeln('Среднее арифметическое положительных равно ',Avg(B):0:3); var C:=MatrixRandom(4,5,-25,38); Writeln(C); Writeln('Среднее арифметическое положительных равно ',Avg(C):0:3); end.
Тестовое решение: [[35,35,5,-47],[14,34,35,-13],[25,-5,35,-29],[-7,10,-12,12]] Среднее арифметическое положительных равно 24.000 [[-12,-17,-10,19,14],[20,17,-27,-2,16],[-3,-21,30,2,10],[5,-3,-17,-3,18],[0,-26,29,1,-22]] Среднее арифметическое положительных равно 15.083 [[-5,-11,17,-4,15],[15,17,-24,36,15],[-8,-3,-22,28,-25],[-21,6,12,31,-1]] Среднее арифметическое положительных равно 19.200
В начале в строке находилось 333 троек по 8 плюс одна 8, всего 1000 восьмерок. 1. При выполнения цикла каждая из троек 8 будет заменена на одну 9. Значит у нас получится строка длиной в 334 символа, где 333 девятки и последний символ - восьмерка 2. Далее 333 девятки заменятся на 111 восьмерок плюс последняя восьмерка - всего получим 112 восьмерок 3. Из 112 восьмерок получится 37 девяток и одна восьмерка 4. И 37 девяток получим 12 восьмерок плюс одна девятка и плюс последняя восьмерка 5. 12 восьмерок дадут 4 девятки плюс последние 9 и 8 6. И наконец получаем строку 8998 ответ: 8998
Решение с использованием указателей:
#include <iostream>
#include <ctime>
#define N 15
int main()
{
int A[N];
int i, tmp, cnt;
int *min = A,*max = A, *j;
setlocale(LC_ALL, "Russian");
// Автозаполнение
srand(time(0));
for (i = 0; i < N; i++)
A[i] = rand() % 201 - 100;
std::cout << "Исходный массив:" << std::endl;
for (i = 0; i < N; i++)
std::cout << *(A + i) << " ";
// Находим минимальный и максимальный элементы массива, запоминаем их адреса
for (i = 0; i < N; i++)
{
if (*(A + i) > *max) max = A + i;
if (*(A + i) < *min) min = A + i;
}
// Мин. и макс. элементы могут находиться в разных местах относительно друг друга
if (min < max)
{
cnt = ((max) - (min)) / 2;
for (j = min + 1, i = 0; i < cnt; j++, i++)
{
tmp = *j;
*j = *(min + 1 + (max - 1 - j));
*(min + 1 + (max - 1 - j)) = tmp;
}
}
else
{
cnt = ((min) - (max)) / 2;
for (j = max + 1, i = 0; i < cnt; j++, i++)
{
tmp = *j;
*j = *(max + 1 + (min - 1 - j));
*(max + 1 + (min - 1 - j)) = tmp;
}
}
std::cout << "\nРезультат:" << std::endl;
for (i = 0; i < N; i++)
std::cout << *(A + i) << " ";
return 0;
}