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

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

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

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


Гость






Подскажите пожалуйста как процедуры generic и swap вынести в отдельный модуль
Код

uses crt;
var a:array[1..50,1..50] of integer;
    i,j,m,n,i1,j1,i2,j2,i3,j3,i4,j4:integer;
    key:char;

procedure input;
begin
  for i:=1 to n do
  for j:=1 to m do
    begin
      A[i,j]:=random(19)-9;
    end;
end;

procedure out;
begin
  for i:=1 to n do
    begin
      for j:=1 to m do
      write(' ',a[i,j]);
      writeln;
    end;
end;

procedure generic;
begin
  a[i1,j1]:=maxint;
  for i:=1 to n do
  for j:=1 to m do
  begin
    if (a[i,j]>0) and (a[i,j]<a[i1,j1]) then
      begin
        i1:=i;j1:=j;
      end;
  end;
  a[i2,j2]:=maxint;
  for i:=1 to n do
  for j:=1 to m do
  begin
    if (a[i,j]>0) and (a[i,j]<a[i2,j2]) and (a[i,j]<>a[i1,j1]) then
      begin
        i2:=i;j2:=j;
      end;
  end;
  a[i3,j3]:=a[1,1];
  for i:=1 to n do
  for j:=1 to m do
  begin
    if (a[i,j]<0) and (a[i,j]>a[i3,j3]) then
      begin
        i3:=i;j3:=j;
      end;
  end;
  a[i4,j4]:=a[1,1];
  for i:=1 to n do
  for j:=1 to m do
  begin
    if (a[i,j]<0) and (a[i,j]>a[i4,j4]) and (a[i,j]<>a[i3,j3]) then begin i4:=i;j4:=j;end;
  end;
end;

procedure outinfo;
begin
writeln('naim poloz 1: ',a[i1,j1]);
writeln('naim poloz 2: ',a[i2,j2]);
writeln('naib otric 1: ',a[i3,j3]);
writeln('naib otric 2: ',a[i4,j4]);
writeln;
writeln(a[i1,j1],' -> ',a[i2,j2],'; ',a[i2,j2],' -> ',a[i1,j1]);
writeln;
writeln(a[i3,j3],' -> ',a[i4,j4],'; ',a[i4,j4],' -> ',a[i3,j3]);
writeln;
end;

procedure swap;
begin
a[i2,j2]:=a[i2,j2]-a[i1,j1];
a[i1,j1]:=a[i1,j1]+a[i2,j2];
a[i2,j2]:=a[i1,j1]-a[i2,j2];
a[i3,j3]:=a[i3,j3]-a[i4,j4];
a[i4,j4]:=a[i4,j4]+a[i3,j3];
a[i3,j3]:=a[i4,j4]-a[i3,j3];
end;

begin
clrscr;
writeln('vvedite kol-vo strok');
readln(n);
writeln('vvedite kol-vo stolbcov');
readln(m);
writeln;
writeln('Ishodnuy massiv: ');
input;
out;
generic;
outinfo;
swap;
writeln('Modif massiv: ');
out;
key:=readkey;
end.

{условие задачи:В заданном двумерном массиве поменять местами минимальные элементы среди положительных и максимальные среди отрицательных.}
нужен текст модуля....
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
как процедуры generic и swap вынести в отдельный модуль
Прежде всего - переписать их так, чтобы они не использовали глобальных переменных... "Уж сколько раз твердили миру..." (С), ... что глобальные переменные - это ЗЛО, но не понимает этого народ. Вот, получите проблемы, связанные с бездумным использованием глобальных переменных... А вот когда переделаешь обе процедуры - тогда и приходи, поможем разделить программу на модули...

Кстати, твоя программа написана вообще с нарушением всех правил программирования: управляющие переменные цикла должны быть описаны локально, а не глобально, как у тебя... Эта программа не везде будет даже компилироваться...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Намёк понял - спасибо smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






процедуру swap я присоединил к generic

Код

uses crt;
var a:array[1..50,1..50] of integer;
    n,m:integer;
    key:char;

procedure input;
var i,j:integer;
begin
  for i:=1 to n do
  for j:=1 to m do
    begin
      A[i,j]:=random(19)-9;
    end;
end;

procedure out;
var i,j:integer;
begin
  for i:=1 to n do
    begin
      for j:=1 to m do
      write(' ',a[i,j]);
      writeln;
    end;
end;

procedure generic;
var
  s,k,mx,nx,i1,j1,i2,j2,i3,j3,i4,j4:integer;
begin
  a[i1,j1]:=maxint;
  for s:=1 to nx do
  for k:=1 to mx do
  begin
    if (a[s,k]>0) and (a[s,k]<a[i1,j1]) then
      begin
        i1:=s;j1:=k;
      end;
  end;
  a[i2,j2]:=maxint;
  for s:=1 to nx do
  for k:=1 to mx do
  begin
    if (a[s,k]>0) and (a[s,k]<a[i2,j2]) and (a[s,k]<>a[i1,j1]) then
      begin
        i2:=s;j2:=k;
      end;
  end;
  a[i3,j3]:=a[1,1];
  for s:=1 to nx do
  for k:=1 to mx do
  begin
    if (a[s,k]<0) and (a[s,k]>a[i3,j3]) then
      begin
        i3:=s;j3:=k;
      end;
  end;
  a[i4,j4]:=a[1,1];
  for s:=1 to nx do
  for k:=1 to mx do
  begin
    if (a[s,k]<0) and (a[s,k]>a[i4,j4]) and (a[s,k]<>a[i3,j3]) then begin i4:=s;j4:=k;end;
  end;
  a[i2,j2]:=a[i2,j2]-a[i1,j1];
  a[i1,j1]:=a[i1,j1]+a[i2,j2];
  a[i2,j2]:=a[i1,j1]-a[i2,j2];
  a[i3,j3]:=a[i3,j3]-a[i4,j4];
  a[i4,j4]:=a[i4,j4]+a[i3,j3];
  a[i3,j3]:=a[i4,j4]-a[i3,j3];
end;

begin
clrscr;
writeln('vvedite kol-vo strok');
readln(n);
writeln('vvedite kol-vo stolbcov');
readln(m);
writeln;
writeln('Ishodnuy massiv: ');
input;
out;
generic;
writeln('Modif massiv: ');
out;
key:=readkey;
end.


Дальше?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гость






Помогите кто-нибудь ничего не получается!!! wacko.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






<module.pas>
Код
unit module;

interface

var
  a:array[1..50,1..50] of integer;
procedure generic;

implementation
procedure generic;
var
  s,k,mx,nx,i1,j1,i2,j2,i3,j3,i4,j4:integer;
begin
  a[i1,j1]:=maxint;
  for s:=1 to nx do
  for k:=1 to mx do
  begin
    if (a[s,k]>0) and (a[s,k]<a[i1,j1]) then
      begin
        i1:=s;j1:=k;
      end;
  end;
  a[i2,j2]:=maxint;
  for s:=1 to nx do
  for k:=1 to mx do
  begin
    if (a[s,k]>0) and (a[s,k]<a[i2,j2]) and (a[s,k]<>a[i1,j1]) then
      begin
        i2:=s;j2:=k;
      end;
  end;
  a[i3,j3]:=a[1,1];
  for s:=1 to nx do
  for k:=1 to mx do
  begin
    if (a[s,k]<0) and (a[s,k]>a[i3,j3]) then
      begin
        i3:=s;j3:=k;
      end;
  end;
  a[i4,j4]:=a[1,1];
  for s:=1 to nx do
  for k:=1 to mx do
  begin
    if (a[s,k]<0) and (a[s,k]>a[i4,j4]) and (a[s,k]<>a[i3,j3]) then begin i4:=s;j4:=k;end;
  end;
  a[i2,j2]:=a[i2,j2]-a[i1,j1];
  a[i1,j1]:=a[i1,j1]+a[i2,j2];
  a[i2,j2]:=a[i1,j1]-a[i2,j2];
  a[i3,j3]:=a[i3,j3]-a[i4,j4];
  a[i4,j4]:=a[i4,j4]+a[i3,j3];
  a[i3,j3]:=a[i4,j4]-a[i3,j3];
end;

end.


<Основная программа>
Код
uses crt, module;
var
    n,m:integer;
    key:char;

procedure input;
var i,j:integer;
begin
  for i:=1 to n do
  for j:=1 to m do
    begin
      A[i,j]:=random(19)-9;
    end;
end;

procedure out;
var i,j:integer;
begin
  for i:=1 to n do
    begin
      for j:=1 to m do
      write(' ',a[i,j]);
      writeln;
    end;
end;


begin
clrscr;
writeln('vvedite kol-vo strok');
readln(n);
writeln('vvedite kol-vo stolbcov');
readln(m);
writeln;
writeln('Ishodnuy massiv: ');
input;
out;
generic;
writeln('Modif massiv: ');
out;
key:=readkey;
end.


Что тут могло НЕ получаться? Работоспособность НЕ проверял, но если это работало в одной программе, то должно работать и с модулем...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гость






Теперь всё понятно - ошибку нашёл.Спасибо!
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Цитата

vvedite kol-vo strok
3
vvedite kol-vo stolbcov
3

Ishodnuy massiv:
-9 -9 7
-6 -4 3
-3 -6 -2
Modif massiv:
-9 -9 7
-6 -4 3
-3 -6 -1


???????
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Ну, я же предупреждал: если исходная программа работает - то и вариант с модулем будет работать... Запускаем исходную программу (пост №4):
Цитата
vvedite kol-vo strok
3
vvedite kol-vo stolbcov
3

Ishodnuy massiv:
1 2 4
7 2 7
1 7 -1
Runtime error 216 at $00401188
$00401188 GENERIC, line 31 of f:/vlady documents/programs/pas/__hhh.pp
$004016E9 main, line 82 of f:/vlady documents/programs/pas/__hhh.pp


Исправляй программу...

А вот и места ошибок:
  a[i1,j1]:=maxint; { Чему равно i1, j1 ? }
for s:=1 to nx do { Чему здесь равно nx ? }

и так далее, по тексту...

Кто тебе позволил использовать неинициализированные переменные? Я тебя предупреждал, что программа некорректно написана... Теперь ты видишь, НАСКОЛЬКО некорректно?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






Можно немного попонятнее?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Гость






Куда уж понятнее? Перед использованием i1 и j1 ты должен присвоить им начальное значение, иначе в i1 и j1 содержится "мусор" (у меня i1=552, а j1=4249460), и при попытке обратиться к элементу a[i1, j1] будет выход за пределы матрицы, и естественно ошибка... То же самое со всеми остальными переменными.

P.S. Если Turbo Pascal компилирует твою программу и ни о чем тебя не предупреждает, это еще не значит, что программа правильная... При попытке ее откомпилировать в FPC/Delphi получаем предупреждения (о которых я тебе и говорю - использование неинициализированных переменных)
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гость






какие именно начальные значения?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






Ты же программу писал - тебе лучше знать, что делает алгоритм...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Гость






Тема закрыта, чтоб неповадно было на форуме флудом заниматься. mad.gif
 К началу страницы 
+ Ответить 

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

 





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