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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2008, 22:52   #1
Sergeevich
Пользователь
 
Регистрация: 26.05.2008
Сообщений: 30
По умолчанию Переставить строки

Помогите пожалуйсто справиться с этим массивом, тоесть нужно переставить строки, а алгоритм не могу составить, заранее спасибо
Условие задачи таково: В матрице n-го порядка переставить строки так, чтобы на главной диагонали матрицы были расположены элементы, наибольшие по абсолютной величине.
В принципе интерфейс программы есть, только нужно добавить алгоритм позволяющий работать по условию, очень нужна помощь.
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Edit1: TEdit;
    Button1: TButton;
    Label1: TLabel;
    StringGrid2: TStringGrid;
    Button2: TButton;
    Button3: TButton;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
nmax=10;
Type
mas1 = array[1..nmax,1..nmax] of extended;
mas2 = array[1..nmax,1..nmax] of extended;
var
Form1: TForm1;
a:mas1;
b:mas2;
n,i,j:integer;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
n:=3;
Edit1.Text:=FloatToStr(n);
StringGrid1.ColCount:=n+1;
StringGrid1.RowCount:=n+1;
StringGrid2.ColCount:=n+1;
StringGrid2.RowCount:=n+1;
StringGrid1.Cells[0,0]:='Массив A:';
StringGrid2.Cells[0,0]:='Массив B:';
for i:=1 to n do begin
StringGrid1.Cells[0,i]:=' i= '+IntToStr(i);
StringGrid1.Cells[i,0]:=' j= '+IntToStr(i);
end;
for i:=1 to n do begin
StringGrid2.Cells[0,i]:=' i= '+IntToStr(i);
StringGrid2.Cells[i,0]:=' j= '+IntToStr(i);
end;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
n:=StrToInt(Edit1.Text);
if (n<3) or (n>10) then begin
showmessage('Введите число не меньше 3 и не больше 10');
n:=3;
edit1.Text:='3';
end;
StringGrid1.ColCount:=n+1;
StringGrid1.RowCount:=n+1;
StringGrid2.ColCount:=n+1;
StringGrid2.RowCount:=n+1;
for i:=1 to n do begin
StringGrid1.Cells[0,i]:=' i= '+IntToStr(i);
StringGrid1.Cells[i,0]:=' j= '+IntToStr(i);
end;
for i:=1 to n do begin
StringGrid2.Cells[0,i]:=' i= '+IntToStr(i);
StringGrid2.Cells[i,0]:=' j= '+IntToStr(i);
end;

end;

procedure TForm1.Button3Click(Sender: TObject);
begin
close;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
for i:=1 to n do
for j:=1 to n do
if stringgrid1.Cells[i,j]='' then begin
showmessage('Введите число во все ячейки');
stringgrid1.Cells[i,j]:='0';
end;
for i:=1 to n do
for j:=1 to n do
a[i,j]:=StrToint(StringGrid1.Cells[i,j]);
end;

end.
На скриншоте, там два массива А и В, массив А заполняется, а после высчитывается алгоритм и выводится результат перестановки строк массива А в массив В, тоесть в массиве А все элементы остаются на своих местах, а в массиве В строки изменены по условию. Отрицательные числа должны быть равными как и положительные, тоесть Abs(). Спасибо
Изображения
Тип файла: jpg 1.JPG (18.7 Кб, 152 просмотров)

Последний раз редактировалось Sergeevich; 26.05.2008 в 22:59. Причина: Забыл объяснить для чего массив В :)
Sergeevich вне форума Ответить с цитированием
Старый 27.05.2008, 09:53   #2
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Цитата:
Сообщение от Sergeevich Посмотреть сообщение
Помогите пожалуйсто справиться с этим массивом, тоесть нужно переставить строки, а алгоритм не могу составить, заранее спасибо
Условие задачи таково: В матрице n-го порядка переставить строки так, чтобы на главной диагонали матрицы были расположены элементы, наибольшие по абсолютной величине.
Переставить элементы строк ?

Для каждой строки:
- ищем максимальный элемент
- переставляем его с элементом, находящимся на главной диагонали.

В результате
Цитата:
на главной диагонали матрицы были расположены элементы, наибольшие по абсолютной величине
alexBlack вне форума Ответить с цитированием
Старый 27.05.2008, 10:18   #3
Sergeevich
Пользователь
 
Регистрация: 26.05.2008
Сообщений: 30
По умолчанию

Я не понимаю как это реализовать в коде, вот я нарисовал подробнее как должны переставляться строки, помогите пожалуйсто.
Изображения
Тип файла: jpg 2.jpg (18.7 Кб, 164 просмотров)
Sergeevich вне форума Ответить с цитированием
Старый 27.05.2008, 10:45   #4
alexBlack
Участник клуба
 
Регистрация: 12.10.2007
Сообщений: 1,204
По умолчанию

Как у Вас нарисовано - для MAS[1..N, 1..N]:

Код:
   // Для каждого столбца кроме последнего
   for j:=1 to N-1 do begin
      // Для столбца j ищем строку с максимальным элементом в позиции j
      NI := j; max := -1;
      for i:=j to N do begin
         if abs(mas[i, j]) > max then begin
            NI := i;
            max := abs(mas[i, j])
         end;
      end;
      // Меняем найденную строку строку NI со строкой j
      if NI <> j then begin
         for i:=1 to N do begin
            t := mas[j, i];
            mas[j, i] := mas[NI, i];
            mas[NI, i] := t;
         end;
      end;
   end;
alexBlack вне форума Ответить с цитированием
Старый 27.05.2008, 16:00   #5
Sergeevich
Пользователь
 
Регистрация: 26.05.2008
Сообщений: 30
По умолчанию

Спасибо
Sergeevich вне форума Ответить с цитированием
Старый 18.12.2008, 12:37   #6
ПаФка
Новичок
Джуниор
 
Регистрация: 20.11.2008
Сообщений: 2
По умолчанию

Ребят,выложите пожалуйста код программы,который получился,а то у меня ошибки типов.вроде занёс NI,t,max,А тамошибка почему NI:=j?(массиву присваивается число),сплошные ошибки у меня короче,спасите=)
ПаФка вне форума Ответить с цитированием
Старый 12.05.2016, 03:07   #7
mmmmmmmmmm
Новичок
Джуниор
 
Регистрация: 12.05.2016
Сообщений: 1
Хорошо

Спасибо вот конечный код
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Grids,Math;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    StringGrid1: TStringGrid;
    Edit1: TEdit;
    Label1: TLabel;
    StringGrid2: TStringGrid;
    Label2: TLabel;
    Button4: TButton;
    procedure Label1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
nmax=10;
Type
mas = array[1..nmax,1..nmax] of integer;
mas2 = array[1..nmax,1..nmax] of integer;
var
Form1: TForm1;
a:mas;
b:mas2;
n,i,j,NI,max,mai,t:integer;

implementation

{$R *.dfm}

procedure TForm1.Label1Click(Sender: TObject);
begin
n:=3;
Edit1.Text:=FloatToStr(n);
StringGrid1.ColCount:=n+1;
StringGrid1.RowCount:=n+1;
StringGrid2.ColCount:=n+1;
StringGrid2.RowCount:=n+1;
StringGrid1.Cells[0,0]:='Ìàññèâ A:';
StringGrid2.Cells[0,0]:='Ìàññèâ B:';
for i:=1 to n do begin
StringGrid1.Cells[0,i]:=' i= '+IntToStr(i);
StringGrid1.Cells[i,0]:=' j= '+IntToStr(i);
end;
for i:=1 to n do begin
StringGrid2.Cells[0,i]:=' i= '+IntToStr(i);
StringGrid2.Cells[i,0]:=' j= '+IntToStr(i);
end;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
n:=StrToInt(Edit1.Text);
if (n<3) or (n>10) then begin
n:=3;
edit1.Text:='3';
end;
StringGrid1.ColCount:=n+1;
StringGrid1.RowCount:=n+1;
StringGrid2.ColCount:=n+1;
StringGrid2.RowCount:=n+1;
for i:=1 to n do begin
StringGrid1.Cells[0,i]:=' i= '+IntToStr(i);
StringGrid1.Cells[i,0]:=' j= '+IntToStr(i);
end;
for i:=1 to n do begin
StringGrid2.Cells[0,i]:=' i= '+IntToStr(i);
StringGrid2.Cells[i,0]:=' j= '+IntToStr(i);
end;

end;

procedure TForm1.Button3Click(Sender: TObject);
begin
close;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
for i:=1 to n do
for j:=1 to n do
if stringgrid1.Cells[i,j]='' then begin
stringgrid1.Cells[i,j]:=IntToStr(random(10));
end;
for i:=1 to n do
for j:=1 to n do
a[i,j]:=StrToint(StringGrid1.Cells[i,j]);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
  for j:=1 to N-1 do begin
      NI := j; max := -1;
      for i:=j to N do begin
         if abs(a[i, j]) > max then begin
            NI := i;
            max := abs(a[i, j]);
         end;
      end;
      if NI <> j then begin
         for i:=1 to N do begin
            t := a[j, i];
            a[j, i] := a[NI, i];
            a[NI, i] := t;
         end;
      end;
   end;
   for i:=1 to n do
   for j:=1 to n do
   StringGrid2.Cells[i,j]:=IntToStr(a[i,j]);
end;
end.
Пожалуйста, оформляйте Ваш код согласно правилам.

Последний раз редактировалось Вадим Мошев; 11.06.2016 в 16:51.
mmmmmmmmmm вне форума Ответить с цитированием
Старый 20.06.2016, 13:46   #8
Omino
Новичок
Джуниор
 
Регистрация: 30.03.2016
Сообщений: 2
По умолчанию

Скиньте плиз архивом программу, что то вообще не получается
Omino вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
считать из файла две строки, вывести на экран символы первой строки, которые отсутствуют во второй gotex Помощь студентам 4 08.05.2008 02:27
Строки Настена Помощь студентам 1 07.01.2008 23:47
Строки. Mr.User Помощь студентам 11 08.12.2007 07:00
как вывести строку поочередно сначала первая буква первой строки потом первая буква второй строки и т.д. vitalik007 Помощь студентам 1 25.09.2007 20:45