Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Двумерный массив ошибка 
:(
    Опции темы
frogg
Дата 24.4.2009, 22:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.4.2009

Репутация: нет
Всего: нет



Код

program laba;
 
type mas=array [1..10,1..10] of integer;
 var i,j:integer;
procedure input(var t,r:byte; var m:mas; c:string);
 
begin
writeln(c);
writeln('введите размерность массива');
readln(t,r);
for i:=1 to t do
for j:=1 to r do begin
write ('m[',i,',',j,']=');
readln (m[i,j]);
end;
end;
procedure output(t,r:byte; var m:mas; c:string);
var i,j:integer;
begin
writeln(c);
for i:=1 to t do  begin
for j:=1 to r do
write(m[i,j],'':3);
writeln;
end;
end;
 
procedure q(t,r:byte; m:mas; c:string);
var i,j:integer;
    max,min,jmax,jmin,p:integer;
begin
for i:=1 to t do
begin
min:=m[i,1];
max:=m[i,1];
for j:=1 to r do
if m[i,j]<min then begin
min:=m[i,j];
jmin:=j;
end;
for j:=1 to r do
if m[i,j]>max then begin
max:=m[i,j];
jmax:=j;
 
end;
p:=m[i,jmin];
m[i,jmin]:= m[i,jmax];
m[i,jmax]:=p;
 
for i:=1 to t do  begin
for j:=1 to r do
write(m[i,j],'':3);
writeln;
end;
end;
end;
 
var a1,a2,a3:mas;
n1,n2,n3,m1,m2,m3: byte;
 
begin
 
input(n1,m1,a1,'Матрица a1');
output(n1,m1,a1,'');
q(n1,m1,a1,'');
 
{input(n2,m2,a2,'Матрица a2');
output(n2,m2,a2,'');
 
input(n3,m3,a3,'Матрица a3');
output(n3,m3,a3,'');}
 
 
end.



ошибка в строке
p:=m[i,jmin];
пишет выходит за границы диапазона изменения индекса 1..10

помоги пожалуйста
зы на абц надо и там вот не работает как раз

Это сообщение отредактировал(а) volvo877 - 25.4.2009, 01:36
PM MAIL   Вверх
volvo877
Дата 25.4.2009, 01:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата(frogg @  24.4.2009,  22:51 Найти цитируемый пост)
зы на абц надо и там вот не работает как раз
Да оно в принципе нигде работать не должно... Может и отработать в зависимости от настроения компилятора... Дельфи или FPC этот код вообще компилировать не будут, потому что нельзя делать то, что делаешь ты. А ты этого не видишь, потому что наштамповал строк без отступов и рад... Смотри (твой же код, но с отступами и с указанием места ошибки):

Код
procedure q(t,r:byte; m:mas; c:string);
var i,j:integer;
    max,min,jmax,jmin,p:integer;
begin
  for i:=1 to t do begin { <---  Здесь начат внешний цикл по i }
    min:=m[i,1];
    max:=m[i,1];
    for j:=1 to r do
      if m[i,j]<min then begin
        min:=m[i,j];
        jmin:=j;
      end;
    for j:=1 to r do
      if m[i,j]>max then begin
        max:=m[i,j];
        jmax:=j;
      end;

    p:=m[i,jmin];
    m[i,jmin]:= m[i,jmax];
    m[i,jmax]:=p;

    for i:=1 to t do  begin { <--- А это что такое ??? Второй цикл и опять по i ??? }
      for j:=1 to r do
        write(m[i,j],'':3);
      writeln;
    end;
  end; { <--- Внешний цикл заканчивается только вот тут !!! }
end;
Теперь понятно, почему результатам твоей программы доверять будет нельзя даже, если она откомпилируется и что-то выполнит? Исправляй ошибку, потом продолжим разговор...

P.S. Неплохо бы и постановку задачи увидеть...
PM MAIL   Вверх
frogg
Дата 25.4.2009, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.4.2009

Репутация: нет
Всего: нет



Код

program laba;

type mas=array [1..10,1..10] of integer;
var a1,a2,a3:mas;
n1,n2,n3,m1,m2,m3: byte;



procedure input(var t,r:byte; var m:mas; c:string);
var i,j:integer;
begin
writeln(c);
writeln('введите размерность массива');
readln(t,r);
for i:=1 to t do
for j:=1 to r do begin
write ('m[',i,',',j,']=');
readln (m[i,j]);
end;
end;
procedure output(t,r:byte; var m:mas; c:string);
var i,j:integer;
begin
writeln(c);
for i:=1 to t do  begin
for j:=1 to r do
write(m[i,j],'':3);
writeln;
end;
end;

procedure q(t,r:byte; m:mas; c:string);
var i,j:integer;
    max,min,jmax,jmin,p:integer;
begin
  for i:=1 to t do begin
    min:=m[i,1];
    max:=m[i,1];
    for j:=1 to r do
      if m[i,j]<min then begin
        min:=m[i,j];
        jmin:=j;
      end;
    for j:=1 to r do
      if m[i,j]>max then begin
        max:=m[i,j];
        jmax:=j;
      end;
    p:=m[i,jmin];
    m[i,jmin]:= m[i,jmax];
    m[i,jmax]:=p;

      for j:=1 to r do  begin
        write(m[i,j],'':3);
      writeln;
    end;
  end;
end;



begin

input(n1,m1,a1,'Матрица a1');
output(n1,m1,a1,'');
q(n1,m1,a1,'');

{input(n2,m2,a2,'Матрица a2');
output(n2,m2,a2,'');

input(n3,m3,a3,'Матрица a3');
output(n3,m3,a3,'');}


end.


исправил. Вот задача

дано:массивы А1 (N1,M1), A2(N1,M2),A3(N3,M3).найти в каждой строке исходного массива наименьший и наибольший элементы и поменять их местами. нахождение в каждой строке массива наименьшего и наибольшего элементов а также перестановку их местами оформить в виде подпрограммы



Это сообщение отредактировал(а) frogg - 25.4.2009, 10:46
PM MAIL   Вверх
volvo877
Дата 25.4.2009, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



frogg, а что будет, если первый же элемент строки будет минимальным или максимальным, ты не подумал? Чем инициализируются jmin/jmax у тебя, и к каким индексам ты сделаешь попытку обратиться здесь:
Цитата
Код
    p:=m[i,jmin];
    m[i,jmin]:= m[i,jmax];
    m[i,jmax]:=p;
? Инициализируй ВСЕ переменные всегда. И обращай внимание на предупреждения компилятора. Помогает...
PM MAIL   Вверх
frogg
Дата 25.4.2009, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.4.2009

Репутация: нет
Всего: нет



подскажи поточнее пожалуйста
PM MAIL   Вверх
volvo877
Дата 25.4.2009, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Поточнее? Ну, смотри, что можно сделать:

Код
procedure q(t, r: byte; var m: mas; c: string);
var i, j: integer;
    jmax, jmin, p: integer;
begin
  for i:=1 to t do begin

    jmin := 1; jmax := 1; { <--- Видишь, jmin/jmax уже инициализированы }
    for j := 2 to r do begin
      if m[i, j] < m[i, jmin] then jmin := j;
      if m[i, j] > m[i, jmax] then jmax := j;
    end;

    {
      и неважно что является мин/макс элементом, индексы jmin и jmax
      гарантированно будут в пределах 1 .. R, ошибка ушла ...
    }
    p := m[i, jmin]; 
    m[i, jmin] := m[i, jmax];
    m[i, jmax] := p;

    for j := 1 to r do write(m[i, j]:4);
    writeln;

  end;
end;
Обрати внимание, я не стал делать 2 цикла - один для нахождения мин., другой - для макс., проще обойтись одним. Кроме всего прочего, посмотри на заголовок процедуры, там у тебя не хватало слова Var, без него - меняй или не меняй что-то в массиве местами, оно не будет запоминаться. Это на случай, если тебе понадобится вынести печать матрицы из этой процедуры (а оно понадобится рано или поздно. Не надо делать "все в одном"). Пока ты печатаешь содержимое матрицы внутри процедуры Q, описание может оставаться без Var...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0498 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.