0 / 0 / 0
Регистрация: 26.10.2016
Сообщений: 8
1

Сформировать новую матрицу из данной, чтобы неотрицательные элементы каждого столбца располагались в начале столбца

09.12.2017, 12:30. Показов 1162. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите, пожалуйста, ошибки исправить

Дана квадратная матрица порядка n(n=5). Сформировать новую матрицу a из данной матрицы, таким образом чтобы неотрицательные элементы каждого столбца матрицы располагались в начале столбца.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
 type
       matr= array[1..5, 1..5] of integer;
 var
       mass: matr;
 
      procedure input (a: matr);
      var
      i,j : integer;
       begin
             for i:=1 to 5 do
              for j:=1 to 5 do
                randomize;
                a[i,j]:= random (100)-100;
                  for i:=1 to 5 do
                    write (a[i,j], ' ');
       end;
       
       procedure sort (b: matr);
       var i,j,n,m, s: integer;
        begin
          for j:=1 to 5 do
            begin
               for i:=1 to 5 do
                  begin
                     if b[i,j]>=0 then
                         begin
                            s:=b[n,m];
                            b[n,m]:=b[i,j];
                            b[i,j]:=s;
                            n:=n+1;
                          end;
                       m:=m+1;
                    end;
              end;
          end;
 
        procedure output (b: matr);
          var i,j : integer;
          begin
            for i:=1 to 5 do
               begin
                  for j:=1 to 5 do
                  write (b[i,j], ' ');
               end;
           end;
  begin
   input (mass);
   sort (mass);
   output (mass);
    end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.12.2017, 12:30
Ответы с готовыми решениями:

Сформировать новую матрицу, чтобы отрицательные элементы каждой строки располагались в начале строки
Дана квадратная матрица порядка n(n=5). Сформировать новую матрицу a из данной матрицы, таким...

Вывести элементы K-го столбца данной матрицы. Получить новую матрицу умножением всех элементов данной на min
это первая задача: Дана матрица размера M * N и целое число K (1 < K < N). Вывести элементы K-го...

Вычесть из каждого столбца матрицы максимальный элемент для каждого столбца, и результат вывести в матрицу
Что нужно добавить , чтобы вычесть из каждого столбца матрицы максимальный элемент для каждого...

Получить новую матрицу прибавлением к элементам каждого столбца первой матрицы...
Даны две целочисленные квадратные матрицы порядка n. Получить новую матрицу прибавлением к...

5
Модератор
9853 / 5223 / 3304
Регистрация: 17.08.2012
Сообщений: 15,974
09.12.2017, 17:12 2
Исправил.

Вместо не очень удобной для данного случая сортировки выбором применил карманную сортировку, и, так как в данном случае требуется всего два кармана, столбец сортируется всего за 2 прохода: распихиваем элементы столбца по карманам, затем переписываем содержимое карманов на место столбца.

Преимущество: быстрее отсортировать не удастся вообще любой известной в мире сортировкой, кроме, разве что, сортировки подсчётом, которой также требуется всего 2 прохода по массиву, однако, так как сортировка подсчётом является неустойчивой, будет потеряно взаимное расположение положительных и отрицательных элементов. Для сортировки подсчётом в данном случае требуется массив длиной в возможный диапазон значений элементов (в исправленной программе это будет 199 элементов), а для карманной сортировки - максимум два массива длиной в столбец, то есть, 10 элементов. Получается, что сортировка подсчётом в данном случае будет медленнее карманной.

Недостаток: требуются дополнительные массивы.

На самом деле, я применил один "двусторонний карман": используется один и тот же дополнительный массив c[1..m], неотрицательные элементы в него записываем с начала, отрицательные - с конца. Небольшое неудобство: при копировании элементов из карманов в столбец неотрицательные следует копировать в прямом порядке, отрицательные - в обратном. Можно неотрицательные копировать и в прямом порядке, если порядок их следования не важен, только вот программа практически не упростится, так что делать это смысла не имеет.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
const m = 5; //если нужно будет менять размер матрицы, то только здесь, а не по всей программе
 
type matr = array[1..m, 1..m] of integer;
 
procedure gen_prn(var a: matr); //не указали var, название процедуры являлось ключевым словом
var i, j: integer;
begin
  randomize; //вызывать нужно только один раз, а не в цикле
  writeln('Исходный массив:'); //ну хоть какой-то интерфейс должен быть, а то не пойёшь что выводится
  for i := 1 to m do
    begin
      for j := 1 to m do //**** в этом цикле у Вас вызывалось только randomize
        begin
          a[i, j] := random(199) - 99; //**** а это было вне цикла. Ещё исправил диапазон с [-1..99] на [-99..99]
          write (a[i, j] :4) //исправлен нелепый, неверный и некрасивый вывод строки массива
        end;
      writeln //переход на новую строку перед печатью очередной строки массива, у Вас этого не было
    end;
end;
 
procedure sort(var b: matr); //не указали var
var i, j, n, p: integer;
    c: array[1..m] of integer; //карман, отрицательные пишем в конец, остальные - в начало
begin
  for j := 1 to m do //цикл по столбцам
    begin
      p := 0; //начальная позиция для "неотрицательного" кармана
      n := m + 1; //начальная позиция для "отрицательного" кармана
      for i := 1 to m do //цикл по строкам (по элементам столбца)
        if b[i, j] < 0 //если отрицательное,
          then begin //то
            dec(n); //смещаем "отрицательную" позицию кармана
            c[n] := b[i, j] //помещаем элемент в "отрицательный" карман
          end
          else begin //иначе
            inc(p); //смещаем "неотрицательную" позицию кармана
            c[p] := b[i, j] //помещаем элемент в "неотрицательный" карман
          end;
      for i := 1 to p do b[i, j] := c[i]; //переписываем в столбец из кармана неотрицательные
      for i := n to m do b[i, j] := c[m - i + n] //переписываем в столбец из кармана отрицательные
    end;
end;
 
procedure prn(const b: matr); //забыли const, название процедуры являлось ключевым словом
var i, j: integer;
begin
  writeln('Отсортированный массив:'); //добавлено
  for i := 1 to m do
    begin
      for j:=1 to m do write (b[i,j] :4); //исправлен несуразный вывод
      writeln //перевод строки, про него Вы забыли
    end;
end;
 
var mass: matr; //глобальная переменная объявлялась до подпрограмм, что могло вызывать трудно локализуемые ошибки
begin
  gen_prn(mass);
  sort(mass);
  prn(mass);
  readln //ожидание <Enter> перед закрытием программы, убрать, если не нужно
end.
1
0 / 0 / 0
Регистрация: 26.10.2016
Сообщений: 8
09.12.2017, 17:57  [ТС] 3
отрицательные элементы все равно стоят в начале :с

Код
Исходный массив:
  15  78 -71  30   6
 -12  63 -63  44 -23
 -19   0 -65  88  10
  -3 -85 -67 -12   6
 -43  61 -26  84  20
Отсортированный массив:
  15  78 -71  30   6
 -12  63 -63  44  10
 -19   0 -65  88   6
  -3  61 -67  84  20
 -43 -85 -26 -12 -23
0
Модератор
9853 / 5223 / 3304
Регистрация: 17.08.2012
Сообщений: 15,974
10.12.2017, 00:13 4
Ох ты ж батюшки светы!
Викторияашлмп, даже и не знаю, что подумать...
Ну откуда неотрицательным элементам взяться в начале 3 столбца, если их в 3 столбце просто-напросто нет!!!
Ещё раз, может, так понятнее: ноль штук неотрицательных элементов 3 столбца располагаются в начале 3 столбца, после них идут пять штук отрицательных элементов 3 столбца.
Что не так?
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7769 / 4598 / 2823
Регистрация: 22.11.2013
Сообщений: 13,076
Записей в блоге: 1
11.12.2017, 23:41 5
Cyborg Drone,
также можно было пузырьком/шейкером (менее эффективно) с функцией сравнения IsLess:=(a>=0) and (b<0).
0
Модератор
9853 / 5223 / 3304
Регистрация: 17.08.2012
Сообщений: 15,974
12.12.2017, 01:53 6
Соблазн был очень велик: для данного случая вместо стандартного решения так и напрашивалась карманная сортировка. Средняя сложность O(n), устойчивая, реализация для данного случая вообще элементарная. Немножко памяти нужно, ну и ладно, немножко же.

Вообще, мысль была такая:
Код
var
  array: [1..n] of integer;
  ind: [1, -1] of integer = (1, n);
  bucket: [1, -1][1..n] of integer;
begin
  get(array[1..n]);
  for var i in [1..n] bucket[var p := (array[i] >= 0) ? 1 : -1][ind[p] += p] := arr[i];
  put(array[1..n] := concatenate(bucket[1][1..ind[1]], bucket[-1][n..ind[-1]))
end.
Но... Возможности паскаля не позволяют реализовывать такие мысли напрямую.
0
12.12.2017, 01:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.12.2017, 01:53
Помогаю со студенческими работами здесь

Получить новую матрицу прибавлением к элементам каждого столбца первой матрицы произведения элементов соответствующих строк
5. Даны две целочисленные квадратные матрицы порядка n. Получить новую матрицу прибавлением к...

Как сделать так, чтобы в конце записи каждого столбца, выводилось сумма столбца?
добрый день. таблица_1 (№, имя_клиента, приход, расход); надо написать запрос, чтобы в конце...

Разделить элементы каждого столбца матрицы на максимальный элемент этого столбца
Дан массив целых чисел. Разделить элементы каждого столбца матрицы на максимальный элемент этого...

Разделить элементы каждого столбца заданной матрицы В на последний элемент столбца
Разделить элементы каждого столбца заданной матрицы В на последний элемент столбца


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru