Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 26.10.2016
Сообщений: 8

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

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

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

Дана квадратная матрица порядка 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.12.2017, 12:30
Ответы с готовыми решениями:

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

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

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

5
Модератор
10422 / 5710 / 3401
Регистрация: 17.08.2012
Сообщений: 17,367
09.12.2017, 17:12
Исправил.

Вместо не очень удобной для данного случая сортировки выбором применил карманную сортировку, и, так как в данном случае требуется всего два кармана, столбец сортируется всего за 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  [ТС]
отрицательные элементы все равно стоят в начале :с

Code
Исходный массив:
  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
Модератор
10422 / 5710 / 3401
Регистрация: 17.08.2012
Сообщений: 17,367
10.12.2017, 00:13
Ох ты ж батюшки светы!
Викторияашлмп, даже и не знаю, что подумать...
Ну откуда неотрицательным элементам взяться в начале 3 столбца, если их в 3 столбце просто-напросто нет!!!
Ещё раз, может, так понятнее: ноль штук неотрицательных элементов 3 столбца располагаются в начале 3 столбца, после них идут пять штук отрицательных элементов 3 столбца.
Что не так?
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
11.12.2017, 23:41
Cyborg Drone,
также можно было пузырьком/шейкером (менее эффективно) с функцией сравнения IsLess:=(a>=0) and (b<0).
0
Модератор
10422 / 5710 / 3401
Регистрация: 17.08.2012
Сообщений: 17,367
12.12.2017, 01:53
Соблазн был очень велик: для данного случая вместо стандартного решения так и напрашивалась карманная сортировка. Средняя сложность O(n), устойчивая, реализация для данного случая вообще элементарная. Немножко памяти нужно, ну и ладно, немножко же.

Вообще, мысль была такая:
Code
1
2
3
4
5
6
7
8
9
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.12.2017, 01:53
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru