Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.04.2010, 00:43   #1
Irisa
Пользователь
 
Регистрация: 21.05.2009
Сообщений: 10
Печаль Непонятная ошибка Delphi

Здравствуйте!
Есть задача. Задана матрица размером NxM. Упорядочить ее строки по возрастанию первого элемента. В случае равенства первых элементов выполнять проверку по вторым элементам строки, и т.д.
C решением я что то намудрила и разобраться уже не в силах подскажите пожалуйста.
Код
procedure TZadanie12.BitBtn1Click(Sender: TObject);
var i,j:integer;
begin

for i:=1 to m do
begin
for j:=1 to N do
begin
if Length(StringGrid2.Cells[i,j])<>0
then a[i,j]:=StrToInt(StringGrid1.Cells[i,j]);
// else a[i,j]:=0;
end;
end;
K:=1;
for i:=1 to m do
begin
for j:=i+1 to n do
if a[k,i]> a[k,j] then//при компиляции на эту строчку ругается так:Project Project1.exe raised exception class Eaccessviolation with message Access violation at address 0046379C in module project1.exe. Read of addres 00000004
begin //ïîìåíÿòü ìåñòàìè
for l:=0 to m-1 do
begin
temp[l]:=a[k,i];
a[k,i]:=a[k,j];
a[k,j]:=temp[l];
end;
//StringGrid2.Cells[i,0]:=FloatToStrf(a[i,j],fffixed,3,0);
end;

end;
end;

Очень жду помощи......Заранее спасибо.
Irisa вне форума Ответить с цитированием
Старый 01.04.2010, 01:12   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Где и как описывались переменные остаётся только гадать...
Access violation at address - нет доступа по адресу. Скорее всего массив a объявлен как динамический, но setlength'a нет или неправильный. Вобщем диагноз - выход за границы массива.
eoln вне форума Ответить с цитированием
Старый 01.04.2010, 01:15   #3
Irisa
Пользователь
 
Регистрация: 21.05.2009
Сообщений: 10
По умолчанию

a:array of array of integer;
Irisa вне форума Ответить с цитированием
Старый 01.04.2010, 01:17   #4
Irisa
Пользователь
 
Регистрация: 21.05.2009
Сообщений: 10
По умолчанию

Да описывала я так a:array of array of integer;

Подскажите пожалуйста что мне с кодом сделать ...ОЧЕНЬ надо....А своих знаний не хватает....
Irisa вне форума Ответить с цитированием
Старый 01.04.2010, 01:20   #5
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

setlength(a, m, n) и циклы для динамических массивов должны идти от 0 до n-1 и от 0 до m-1, а не с единицы до n и m
Код:
for i:=1 to m do
begin
for j:=i+1 to n do
if a[k,i]> a[k,j] then
Столбцы тут могут пробегать до max(m, n). А если матрица неквадратная, то это снова ошибку потянет.

Последний раз редактировалось eoln; 01.04.2010 в 01:27.
eoln вне форума Ответить с цитированием
Старый 01.04.2010, 01:24   #6
Irisa
Пользователь
 
Регистрация: 21.05.2009
Сообщений: 10
По умолчанию

У меня и такой вариант был ошибка от этого не исчезала, вот я и пробовала разные вариации...То что он за границы выходит я понимаю но не один вариант кот я использовала не подходит....Просто вывод массива я сделала бы но там еще и сортировка....
Irisa вне форума Ответить с цитированием
Старый 01.04.2010, 02:10   #7
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Цитата:
Сообщение от Irisa Посмотреть сообщение
У меня и такой вариант был ошибка от этого не исчезала, вот я и пробовала разные вариации...То что он за границы выходит я понимаю но не один вариант кот я использовала не подходит
Ошибок море. Тут и неправильные границы и путаница строк и столбцов...
Вот рабочий код.
Код:
procedure TForm1.Button1Click(Sender: TObject);
const
  n=3; m=2;
var
  a: array of array of integer;
  i,j,k,l:integer;
  temp: integer;
begin
  setlength(a, m, n);
  for i:=1 to m do
    for j:=1 to n do
      if Length(StringGrid2.Cells[i,j])<>0
        then a[i-1,j-1]:=StrToInt(StringGrid2.Cells[i,j]);
  for i:=0 to n-2 do
    for j:=i+1 to n-1 do
    begin
      for k := 0 to m-1 do
        if a[k,i] <> a[k,j] then break;
      if k > m-1 then continue;
      if a[k,i] > a[k,j] then
      for l:=0 to m-1 do
      begin
        temp:=a[l,i];
        a[l,i]:=a[l,j];
        a[l,j]:=temp;
      end;
    end;

  for i:=1 to m do
    for j:=1 to n do
      StringGrid1.Cells[i,j] := inttostr(a[i-1,j-1]);
end;
На форме Button1, StringGrid2 и StringGrid1. В StringGrid2 вводятся данные (n строк и m столбцов), в StringGrid1 выводится результат

Последний раз редактировалось eoln; 01.04.2010 в 02:22. Причина: оптимизация
eoln вне форума Ответить с цитированием
Старый 01.04.2010, 02:38   #8
Irisa
Пользователь
 
Регистрация: 21.05.2009
Сообщений: 10
По умолчанию

Да большое спасибо теперь работает но сортирут что то не так...и не то.
Irisa вне форума Ответить с цитированием
Старый 01.04.2010, 03:40   #9
Irisa
Пользователь
 
Регистрация: 21.05.2009
Сообщений: 10
По умолчанию Сделала!

Правда обошлась без динамических массивов, но главное работает!!!
Ура!!!
Кого заинтересует вот код:var
Zadanie12: TZadanie12;
M,N:integer; // Ðàçìåð òàáëèöû Stringgrid
temp:array [0..14] of integer;
i,j,l,x,y,k:integer;
s,v:integer; //ðàçìåð îêíà stringRID

//a:array of array of integer;
a:array [0..14,0..7] of integer;
implementation

{$R *.dfm}

procedure TZadanie12.BitBtn2Click(Sender: TObject);
begin

M:=StrToInt(Edit1.Text);
N:=StrToInt(Edit2.Text);
if m >=8 then MessageDlg('Ââåäèòå ÷èñëî M ìåíüøå 15 ',mtInformation,[mbOK],0)
else
begin
StringGrid1.RowCount:=M;
StringGrid2.RowCount:=M;
s:=M*20+15;
end;
if n >=15 then MessageDlg('Ââåäèòå ÷èñëî N ìåíüøå 8 ',mtInformation,[mbOK],0)
else
begin
StringGrid1.ColCount:=N;
StringGrid2.ColCount:=N;
v:=N*20+15;
end;
StringGrid1.height:=s;
StringGrid1.width:=v;
StringGrid2.height:=s;
StringGrid2.width:=v;
end;



procedure TZadanie12.BitBtn1Click(Sender: TObject);
begin


for i:=0 to N-1 do
begin
for j:=0 to M-1 do
begin
if Length(StringGrid1.Cells[i,j])<>0
then a[i,j]:=StrToInt(StringGrid1.Cells[i,j])
else a[i,j]:=0;
end;
end;
K:=0;
for i:=0 to n do
for j:=i+1 to n do
begin
for k := 0 to m do
if a[k,i] <> a[k,j] then break;
if a[k,i] > a[k,j] then
for l:=0 to n do
begin
temp[l]:=a[l,i];
a[l,i]:=a[l,j];
a[l,j]:=temp[l];
end;
end;

for i:=0 to N-1 do
for j:=0 to M-1 do
StringGrid2.Cells[i,j]:=IntToStr(a[i,j]);

end;

end.
Irisa вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
(СИ)непонятная ошибка. RZMTZM Помощь студентам 7 04.02.2010 02:49
непонятная ошибка в Delphi smithana Помощь студентам 2 07.06.2009 19:18
Непонятная ошибка RealSHELS Общие вопросы Delphi 16 24.10.2008 20:49
Непонятная ошибка!!! Delphi Dimon88 Помощь студентам 7 06.05.2008 00:14
Непонятная ошибка Slash Общие вопросы Delphi 6 19.06.2007 14:45