Помощь - Поиск - Пользователи - Календарь
Полная версия: Сортировка столбцов матрицы методом линейной вставки
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
ТоРоПыШеЧкА
Задание:
Написать главную программу и процедуру. В главной программе осуществляется ввод исходных данных, обращение к процедуре и вывод результатов.
Процедура оформляется в виде модуля.
Размеры матрицы и её элементы вводятся с клавиатуры. Элементы матрицы — натуральные числа. Все входные данные и результаты передаются в/из процедуру через список параметров, глобальные переменные использовать нельзя. Сортировать методом линейной вставки.
Вообще-то я новичок в этом деле.Проблема заключается в том, что при компиляции возникает ошибка ERROR 26, при вызове процедуры в главной программе.Помогите, пожалуйста!!!Что я делаю не так?

{текст модуля}
unit Sort;
interface
procedure VstavkaSort(var B: array of integer; M: integer);
implementation
procedure VstavkaSort(var B: array of integer; M: integer);
var i,x,k: integer;
begin
    for i:=0 to M do
    begin
    X:=B[i];
    k:=i;
      while (X<B[k-1]) and (k>=1) do
      begin
      B[k]:=B[k-1];
      k:=k-1;
      B[k]:=X;
      end;
    end;
end;
end.

{текст основной программы}
program zadacha;
uses crt,sort;
Var
  i,n,j,m: Integer;
  b: array [1..100,1..100] of integer;
begin
 write('Vvedite koli4estvo strok=');read(n);
 write('Vvedite koli4estvo stolbcov=');read(m);
 writeln('Vvedite e-ti massiva');
 for i:=1 to n do
  begin
   for j:=1 to m do
    read(b[i,j]);
   readln;
  end;
 vstavkasort(b,m);{Ошибка возникает в данной строке!!!}
 for i:=1 to n do
  begin
   for j:=1 to m do
    write(b[i,j]:3);
   writeln;
  end;
 readkey;
end.
volvo
Во-первых, пользуйся тегами...

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

Или перенеси описание типа в модуль, и поменяй заголовок вот так:
type
  mxType = array [0 .. 100, 0 .. 100] of integer;
procedure VstavkaSort(var B: mxType; M: integer);


или придется делать по-другому. Я показывал, как. Здесь: FAQ: Как задать матрицу, чтобы быстро поменять местами ее столбцы
ТоРоПыШеЧкА
Все сделала, но что-то все-равно не так,возникает все та же ошибка, но теперь уже в модуле....
volvo
Стоп... Задание у тебя какое? Отсортировать данные ВНУТРИ столбцов? Или САМИ столбцы отсортировать в каком-то порядке? Уточни...
ТоРоПыШеЧкА
Хороший вопрос...
Написать главную программу и процедуру. В главной программе осуществляется ввод исходных данных, обращение к процедуре и вывод результатов.
В процедуре указанные части матрицы сортируются указанным методом(столбцы методом линейной вставки). Методы сортировки описаны в книге Г. Лорина «Сортировки и системы сортировки».
Процедура оформляется в виде модуля.
volvo
Тогда так:
Модуль
unit __srt;

interface

const
  max_n = 100;
  max_m = 100;

type
  matrix = Array[1 .. max_n, 1 .. max_m] Of Integer;

Procedure Insert(Var ar: matrix; currCol: Integer; n: Integer);

implementation

Procedure Insert(Var ar: matrix; currCol: Integer; n: Integer);
Var i, j, T: Integer;
Begin
  For i := 1 To n do
	Begin
	  T := ar[i, currcol];
	  j := Pred(i);
	  While (T < ar[j, currcol]) and (j >= 0) Do
		Begin
		  ar[Succ(j), currcol] := ar[j, currcol]; Dec(j);
		End;
	  ar[Succ(j), currcol] := T;
	End;
End;

end.


Программа
uses __srt;

var
  a: matrix;
  i, j: integer;
  m, n: integer;
begin
  write('Vvedite koli4estvo strok='); read(n);
  write('Vvedite koli4estvo stolbcov='); read(m);
  for i := 1 to n do
    for j := 1 to m do begin
      write('a[', i, ', ', j, '] = ');
      readln(a[i, j]);
    end;

  for i := 1 to m do
    Insert(a, i, n);

  for i := 1 to n do begin
    for j := 1 to m do
      write(a[i, j]:5);
    writeln
  end;
end.
ТоРоПыШеЧкА
Спасибо большое........ wub.gif
ТоРоПыШеЧкА
unit __srt;

interface

const
  max_n = 100;
  max_m = 100;

type
  matrix = Array[1 .. max_n, 1 .. max_m] Of Integer;

Procedure Insert(Var ar: matrix; currCol: Integer; n: Integer);

implementation

Procedure Insert(Var ar: matrix; currCol: Integer; n: Integer);
Var i, j, T: Integer;
Begin
  For i := 1 To n do
	Begin
	  T := ar[i, currcol];
	  j := Pred(i);
	  While (T < ar[j, currcol]) and (j >= 1) Do{если j>=0, тогда программа работает некорректно}
		Begin
		  ar[Succ(j), currcol] := ar[j, currcol]; Dec(j);
		End;
	  ar[Succ(j), currcol] := T;
	End;
End;

end.


Приведу несколько примеров:
Vvedite koli4estvo strok=2
Vvedite koli4estvo stolbcov=2
a[1, 1] = -100
a[1, 2] = 0
a[2, 1] = -100
a[2, 2] = 0
-100 0
0 0
Vvedite koli4estvo strok=

Некорректно работает только с отрицательными числами.p.s Извини, что все так коряво написано....
volvo
Да, я уже нашел этот баг... В FAQ-е есть исправленная версия ...

Только я сделал вот так:
While (T < ar[j, currcol]) and (j > 0) Do


Но все равно спасибо smile.gif За бдительность smile.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.