Kozlovao4
?>

Ввести одномерный массив x(n определить в нем среднее арифметическое отрицательных элементов, стоящих после первого элемента, большего 10 и среднее арифметическое всех элементов до этого элемента. выдать на печать массив и вычисленные средние арифметические значения или сообщения о невозможности их вычислить с указанием конкретных причин.

Информатика

Ответы

optikmir
Алгоритм решения предполагает, что если в массиве не будет найдено элемента, большего 10, то позиции этого элемента не существует и средние арифметические членов, располагающихся как после этой позиции, так и до нее, тоже не могут существовать.

"Современное решение"
// PascalABC.NET 3.0, сборка 1076
begin
  var n:=ReadInteger('Количество элементов в массиве: ');
  var x:=ArrRandom(n,-20,20);
  Writeln('Массив Х'); x.Println;
  Write('Ср. арифм. отрицательных элементов после первого, большего 10: ');
  var a1:=x.SkipWhile(x->x<=10).Where(x->x<0);
  if a1.Count=0 then Writeln('пусто')
  else Writeln(a1.Average);
  Write('Ср. арифм. всех элементов до первого, большего 10: ');
  a1:=x.TakeWhile(x->x<=10);
  if a1.Count=0 then Writeln('пусто')
  else Writeln(a1.Average)
end.

Тестовые просчеты:
Количество элементов в массиве: 15
Массив Х
-11 11 16 -7 11 -8 10 -16 15 -15 -10 -8 -6 -13 -17
Ср. арифм. отрицательных элементов после первого, большего 10: -11.1111111111111
Ср. арифм. всех элементов до первого, большего 10: -11

Количество элементов в массиве: 13
Массив Х
14 -9 1 2 12 -15 0 16 -19 16 -11 -15 -12
Ср. арифм. отрицательных элементов после первого, большего 10: -13.5
Ср. арифм. всех элементов до первого, большего 10: пусто

Количество элементов в массиве: 5
Массив Х
-11 2 0 15 7
Ср. арифм. отрицательных элементов после первого, большего 10: пусто
Ср. арифм. всех элементов до первого, большего 10: -3

Количество элементов в массиве: 3
Массив Х
15 10 8
Ср. арифм. отрицательных элементов после первого, большего 10: пусто
Ср. арифм. всех элементов до первого, большего 10: пусто

"Школьный вариант решения"
// PascalABC.NET 3.0, сборка 1076
const
  nmax=50; { максимальное кол-во элементов }
var
  i,n,p,s1,s2,k2:integer;
  x:array[1..nmax] of integer;
begin
  Write('Количество элементов в массиве: '); Read(n);
  Randomize;
  Writeln('Массив Х');
  p:=0;
  for i:=1 to n do begin
    x[i]:=Random(41)-20;
    Write(x[i],' ');
    if p=0 then
      if x[i]>10 then p:=i;
    end;
  Writeln;
  Write('Ср. арифм. отрицательных элементов после первого, большего 10: ');
  if p=0 then Writeln('пусто')
  else begin
    s2:=0; k2:=0;
    for i:=p+1 to n do
      if x[i]<0 then begin s2:=s2+x[i]; Inc(k2) end;
    if k2=0 then Writeln('пусто')
    else Writeln(s2/k2)
  end;
  Write('Ср. арифм. всех элементов до первого, большего 10: ');
  if p=0 then Writeln('пусто')
  else begin
    s1:=0;
    for i:=1 to p-1 do s1:=s1+x[i];
    Writeln(s1/(p-1))
  end
end. 

Этот вариант существенно длиннее, но главное, что нужно долго вглядываться в текст программы, чтобы понять, что именно она делает.
Vladimirovich Aleksandr1889

Задачка мне очень понравилась, прилагаю решение на C#, консольное приложение

Объяснение:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

namespace Археологи_строители

{ class Program

   {

       static void Main(string[] args)

       {

           //Объявляем и задаем переменные "M" и "N", а так же переменную для результата

           int M,N=new int();

           int MyResult = 0;

           Console.WriteLine("Ведите Текущее количество ступенек и Сколько их должно быть:");

           M = int.Parse(Console.ReadLine());

           N = int.Parse(Console.ReadLine());

           // Создаем массив для хранения данных о ступенях. M-Количество ступенек, Цифра - для колонок длины и высоты

           int[,] mass = new int[M,2];

           // Запись значений в массив

           for (int x = 0; x < M; x++){

               for (int y = 0; y < 2; y++){

                   if (y==0){  //Чисто для юзерфрендли отображения

                       Console.Write($"Введите значение Длины для ступеньки №{x + 1}= ");} else{

                       Console.Write($"Введите значение Высоты для ступеньки №{x + 1}= ");}

                   mass[x, y] = Convert.ToInt32(Console.ReadLine());}

                   Console.WriteLine();}

           /* Как оказалось, самый простой определить какую же ступеньку надо "поднимать"-

            * это вычислить площадь гипотетически "заполняемого" пространства над ступенькой и взять

            * наименьшее значение.

            *  

            * Итак, допустим если у нас 5 ступенек, то нам нам необходимо записать 4 значения

            * (в рамках лестницы) площади заполняемых ступенек.

            *  

            * Перемножаем Длину ступеньки N на высоту ступеньки N+1, M-1 раз и сохраняем в массив

            */

           int M2 = M; //Дублируем изначальное число ступенек для контроля цикла

           for (int z = 0; z <M2-N; z++)

           {

               int[] acreage = new int[M - 1];

               for (int x = 0; x < M - 1; x++)

               {

                   for (int y = 0; y < 2; y++)

                   {

                       acreage[x] = mass[x, 0] * mass[x + 1, 1];

                   }

               }

               /*

                * И так у нас есть все значения гипотетически заполняемой ступеньки.

                * Ищем минимальное значение площади  

                */

               int minAcreage = acreage[0];

               for (int i = 0; i < M - 1; i++)

               {

                   if (minAcreage > acreage[i])

                   {

                       minAcreage = acreage[i];

                   }

               }

               MyResult = MyResult+minAcreage; //Плюсуем данное значение в переменную результата

               // У нас есть минимальная площадь. Найдем номер данной ступеньки

               int IndexAcreage = Array.IndexOf(acreage, minAcreage);

               //"Достроим нужную нам ступеньку и запишем обновленные данные во временный массив"

               int[,] tempMass = new int[M - 1, 2]; //Он на размер меньше, т.к. и "полных" ступенек у нас стало меньше

               for (int x = 0; x < M - 1; x++)

               {

                   for (int y = 0; y < 2; y++)

                   {

                       //Ступеньки до IndexAcreage мы просто переписываем во временный массив

                       if (x < IndexAcreage)

                       {

                           tempMass[x, y] = mass[x, y];

                       }

                       //2 ступеньки от IndexAcreage мы превращаем в одну (застраивая их блоками)

                       else if (x == IndexAcreage)

                       {

                           tempMass[x, y] = mass[x, y] + mass[x + 1, y];

                       }

                       /* и после IndexAcreage мы та же копируем, но со сдвигом вправо, т.к. полноценных  

                        * ступенек стало меньше

                        */

                       else if (x > IndexAcreage)

                       {

                           tempMass[x, y] = mass[x + 1, y];

                       }

                   }

               }

               M = M - 1; //Поскольку ступенек теперь меньше, то и их фактическое число необходимо уменьшить

               for (int x = 0; x < M + 1; x++)

               {

                   for (int y = 0; y < 2; y++)

                   {

                       mass[x, y] = 0;

                   }

               }

               //переписываем данные в основной массив и запускаем следющую интерацию цикла

               for (int x = 0; x < M; x++)

               {

                   for (int y = 0; y < 2; y++)

                   {

                       mass[x, y] = tempMass[x, y];

                   }

               }

           }

           Console.WriteLine($"Минимально необходимое число блоков: {MyResult}");

           Console.ReadKey(true);

       }

   }

}

Zelinskaya-Andrei

Ввод x

readln(x);

Далее идет просто ифовое перечисление условий.

Промежутки:

(-oo;1]

[5;9)

Снизу левый не ясно откуда. Напишу что от 0. Вставишь своё число по заданию.

(0;3]

[7;+oo)

Всё, промежутки установили. Теперь вбиваем их в if

var

x:integer;

begin

readln(x);

if (x<=1) or ((x>=5) and(x<9)) or ((x>0) and (x<=3)) or (x>=7) then writeln('Принаждежит') else writeln('не принаждежит');

end.

Только я сделал 4 промежутка в одном задании)

Теперь ты разложи как нужно (либо на 2 задания, либо найди их общее решение.)

Ответить на вопрос

Поделитесь своими знаниями, ответьте на вопрос:

Ввести одномерный массив x(n определить в нем среднее арифметическое отрицательных элементов, стоящих после первого элемента, большего 10 и среднее арифметическое всех элементов до этого элемента. выдать на печать массив и вычисленные средние арифметические значения или сообщения о невозможности их вычислить с указанием конкретных причин.
Ваше имя (никнейм)*
Email*
Комментарий*

Популярные вопросы в разделе

vantoslaltd
ashkiperova6
Alena824
zhunina71807
Nataliyaof
Taniagrachev
MIKhAILOVNAAnton
allo22-27
Лихачев Полина1978
Smolkovaya
bg1967bg
Prokopeva1062
strannaya2018
maryshecka
tatyanakras911248