IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Сортировка столбцов матрицы методом линейной вставки
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 5
Пол: Женский

Репутация: -  0  +


Задание:
Написать главную программу и процедуру. В главной программе осуществляется ввод исходных данных, обращение к процедуре и вывод результатов.
Процедура оформляется в виде модуля.
Размеры матрицы и её элементы вводятся с клавиатуры. Элементы матрицы — натуральные числа. Все входные данные и результаты передаются в/из процедуру через список параметров, глобальные переменные использовать нельзя. Сортировать методом линейной вставки.
Вообще-то я новичок в этом деле.Проблема заключается в том, что при компиляции возникает ошибка 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 -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Во-первых, пользуйся тегами...

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

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


или придется делать по-другому. Я показывал, как. Здесь: FAQ: Как задать матрицу, чтобы быстро поменять местами ее столбцы
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





Группа: Пользователи
Сообщений: 5
Пол: Женский

Репутация: -  0  +


Все сделала, но что-то все-равно не так,возникает все та же ошибка, но теперь уже в модуле....
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Стоп... Задание у тебя какое? Отсортировать данные ВНУТРИ столбцов? Или САМИ столбцы отсортировать в каком-то порядке? Уточни...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5





Группа: Пользователи
Сообщений: 5
Пол: Женский

Репутация: -  0  +


Хороший вопрос...
Написать главную программу и процедуру. В главной программе осуществляется ввод исходных данных, обращение к процедуре и вывод результатов.
В процедуре указанные части матрицы сортируются указанным методом(столбцы методом линейной вставки). Методы сортировки описаны в книге Г. Лорина «Сортировки и системы сортировки».
Процедура оформляется в виде модуля.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Тогда так:
Модуль
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.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7





Группа: Пользователи
Сообщений: 5
Пол: Женский

Репутация: -  0  +


Спасибо большое........ wub.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8





Группа: Пользователи
Сообщений: 5
Пол: Женский

Репутация: -  0  +


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 Извини, что все так коряво написано....
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Да, я уже нашел этот баг... В FAQ-е есть исправленная версия ...

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


Но все равно спасибо smile.gif За бдительность smile.gif
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 17.12.2025 13:12
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name