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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 12.11.2012, 19:45   #1
CrOsP
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 26
По умолчанию Сортировка матрицы по сложным маршрутам

Здравствуйте нужно реализовать сортировку матрицы Уголком, сверху – вниз – налево, с конца главной диагонали.(Как на картинке)
Написал , но почему то как попало сортирует , подскажите пожалуйста где ошибка ?
Код:
procedure TForm1.N7Click(Sender: TObject);
    var m: TMatrixInt10x10;  nRow, nCol: integer;  ar: TArray100;
begin
   nCol:=StrToInt(edit1.Text);
   nRow:=StrToInt(Edit2.Text);
    //Читаем матрицу с экрана
    getMatrFromGrid(m, nRow, nCol, StringGrid1);
    //Переписываем в массив
    MatrToArray(m,nRow,nCol,ar);
    //Сортируем массив
    SortArray(ar,nRow*nCol);
    //Переписываем упорядоченный массив в матрицу по заданному маршруту
    fillCornerTopLeft(m,nRow, nCol, ar);
    // Выводим матрицу на экран
    showMatrInGrid( m,nRow,nCol,StringGrid2);
end;
 
procedure getMatrFromGrid(var m:TMatrixInt10x10; var nRow,nCol:integer;grid:TStringGrid);
    var i,j:integer;
  begin
    nRow:=grid.RowCount;
    nCol:=grid.ColCount;
    for i:=1 to nRow do
    for j:=1 to nCol do
    m[i,j]:=strToInt(Trim(grid.Cells[j-1,i-1]));
  end;
 
 procedure showMatrInGrid(const m:TMatrixInt10x10;nRow,nCol:integer;grid:TStringGrid);
       var i,j:integer;
  begin
    //Меняем размер StringGrid
    grid.ColCount:=nCol;
    grid.RowCount:=nRow;
    //Заполняем ячейки элементами матрицы
    for i:=1 to nRow do
    for j:=1 to nCol do
    grid.Cells[j-1,i-1]:=format('%3d',[m[i,j]]);
  end;
 
 
procedure fillCornerTopLeft(var m: TMatrixInt10x10; nRow, nCol: integer;
										ar: TArray100);
	var i, row, col: integer;
begin
	//Переписываем  массив в матрицу по  маршруту кутом Зверху-ліворуч
	row:=1;col:=ncol;	 // Координаты начала маршрута
	// Цикл по элементам массива
	for i:=1 to nRow*nCol do
	begin
		// Записываем в матрицу элемент массива
		m[row,col] := ar[i];
		// Определяем координаты в матрице для следующего элемента
		if col = ncol then begin col := row - 1;row := nrow; end
		else if row < col then row := row - 1
		else col := col - 1;
	end;
end;
procedure SortArray (var ar:TArray100; d:Integer);
    var i, j, x: integer;
begin
    for i := 1 to d- 1 do
    begin
                for j := i + 1 to d do
            if ar[j]  > ar[i] then
                begin
                    x :=  ar[i];
                    ar[i] :=  ar[j];
                    ar[j] :=  x;
                end;
    end;
end;
Изображения
Тип файла: gif image002.gif (9.0 Кб, 72 просмотров)
CrOsP вне форума
Старый 14.11.2012, 09:35   #2
CrOsP
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 26
По умолчанию

Код:
procedure fillCornerTopLeft(var m: TMatrixInt10x10; nRow, nCol: integer;
										ar: TArray100);
	var i, row, col: integer;
begin
	//Переписываем  массив в матрицу по  маршруту кутом Зверху-ліворуч
	row:=1;col:=ncol;	 // Координаты начала маршрута
	// Цикл по элементам массива
	for i:=1 to nRow*nCol do
	begin
		// Записываем в матрицу элемент массива
		m[row,col] := ar[i];
		// Определяем координаты в матрице для следующего элемента
     if row<=nrow then
     begin
    col := ncol;row := row+1;
    end
   else if  col=1 then
   row:=nrow
   else
   col:=col-1;
	end;
end;
Так делает первый проход но пропускает одно число в правом нижнем углу . Подскажите пожалуйста

Последний раз редактировалось CrOsP; 14.11.2012 в 09:38.
CrOsP вне форума
Старый 14.11.2012, 10:33   #3
CrOsP
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 26
По умолчанию

Хотя нет , только для квадратных матрицах , в других что попало .
CrOsP вне форума
Старый 14.11.2012, 20:26   #4
CrOsP
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 26
По умолчанию

Код:
procedure fillCornerTopLeft(nRow, nCol: integer;
                                        ar: TArray100; var grid:TStringGrid);
    var i,j,y,x,xrow: integer;
begin
 y := 0;
  xRow := nRow-1;
  for x := nCol-1 downto 0 do
  begin
    for i := 0 to xRow do
    begin
       inc(y);
       grid.cells[x,i] := IntToStr(Ar[y]);
 
    end;
    for j := x-1 downto 0 do
    begin
       inc(y);
      grid.Cells[j,xrow] := IntToStr(Ar[y]);
 
 
    end;
    dec(xRow);
end;
end;
Закрывайте тему
CrOsP вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как в RichEdit сделать строку со сложным форматированием? Freimaks Общие вопросы Delphi 3 20.05.2012 19:53
Программа для шифрования по маршрутам гамильтона F1ok Фриланс 3 01.06.2011 22:54
Сортировка матрицы GOODMAN Microsoft Office Excel 3 09.07.2009 23:31
Вопрос по сложным if the else. danswin БД в Delphi 3 26.01.2009 01:25