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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.12.2009, 18:09   #1
akialex
Пользователь
 
Регистрация: 25.11.2009
Сообщений: 11
Восклицание Доработка программы

У меня была вот такая задача на Delphi (задачи интерфейсные):
Дана действительная матрица размера n на m, в которой не все элементы равны нулю. Получить новую матрицу путем деления всех элементов данной матрицы на ее наибольший по модулю элемент.

Я её решил без особых проблем:unit Unit1;

interface

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

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

var
Form1: TForm1;
n:integer; {количество строк}
m:integer; {количество столбцов}
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
n:=StrToInt(Edit1.Text);
m:=StrToInt(Edit2.Text);
StringGrid1.ColCount:=m;
StringGrid1.RowCount:=n;
StringGrid2.ColCount:=m;
StringGrid2.RowCount:=n;
end;

procedure TForm1.Button2Click(Sender: TObject);
var a:array[1..100,1..100] of integer; {исходная матрица}
b:array[1..100,1..100] of single; {конечная матрица}
i:integer; {номер строки}
j:integer; {номер столбца}
max,del:integer; {наибольший по модулю элемент и его модуль}
begin
for i:=1 to n do
for j:=1 to m do
a[i,j]:=StrToInt(StringGrid1.Cells[j-1,i-1]);
max:=abs(a[1,1]);del:=a[1,1]; {нахождение наиб. элемента по модулю}
for i:=1 to n do
for j:=1 to m do
if abs(a[i,j])>max then
begin
max:=abs(a[i,j]); {максимальный по модулю}
del:=a[i,j]; {само число, если число -10, то его модуль=10, а делить надо на -10}
end;
Edit3.Text:=IntToStr(del);
for i:=1 to n do {деление каждого эл. нового массива на max}
for j:=1 to m do
b[i,j]:=a[i,j]/del;
for i:=1 to n do {вывод элементов конечной матрицы}
for j:=1 to m do
StringGrid2.Cells[j-1,i-1]:=FloatToStrF(b[i,j],ffFixed,5,2);
end;

end.

Но преподаватель потребовал,
- чтобы изначальный массив был заполнен рандомно, а не вводился с клавиатуры.
- чтобы массивы были динамические.
Помогите доработать программу грамотно, т.к. то, что я сделал на паре (код остался в лаборатории) выдает ошибку, хоть и справляется с поставленной задачей. Очень надеюсь на Вашу помошь.
akialex вне форума Ответить с цитированием
Старый 23.12.2009, 18:34   #2
meravingin
Пользователь
 
Регистрация: 06.07.2009
Сообщений: 17
По умолчанию

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

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

var
Form1: TForm1;
n:integer; {количество строк}
m:integer; {количество столбцов}
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
n:=StrToInt(Edit1.Text);
m:=StrToInt(Edit2.Text);
StringGrid1.ColCount:=m;
StringGrid1.RowCount:=n;
StringGrid2.ColCount:=m;
StringGrid2.RowCount:=n;
end;

procedure TForm1.Button2Click(Sender: TObject);

var
a:array of array of integer; {исходная матрица}
b:array of array of single; {конечная матрица}
buf:string;
i:integer; {номер строки}
j:integer; {номер столбца}
max,del:integer; {наибольший по модулю элемент и его модуль}
begin
//
SetLength(a,n+1,m+1);
SetLength(b,n+1,m+1);
//задаем размерность динамических масивов
//
for i:=1 to n do
for j:=1 to m do
begin
a[i,j]:=random();
end;
//как я понял этот кусок где требовался ввод с клавиатуры

max:=abs(a[1,1]);del:=a[1,1]; {нахождение наиб. элемента по модулю}
for i:=1 to n do
for j:=1 to m do
if abs(a[i,j])>max
then
begin
max:=abs(a[i,j]); {максимальный по модулю}
del:=a[i,j]; {само число, если число -10, то его модуль=10, а делить надо на -10}
end;
Edit3.Text:=IntToStr(del);
for i:=1 to n do {деление каждого эл. нового массива на max}
for j:=1 to m do
b[i,j]:=a[i,j]/del;
for i:=1 to n do {вывод элементов конечной матрицы}
for j:=1 to m do
StringGrid2.Cells[j-1,i-1]:=FloatToStrF(b[i,j],ffFixed,5,2);
nil(a);//освобождаем масивы
nil(b);//освобождаем масивы
end;

end.

В итоге что то такое
meravingin вне форума Ответить с цитированием
Старый 24.12.2009, 00:23   #3
akialex
Пользователь
 
Регистрация: 25.11.2009
Сообщений: 11
По умолчанию

Всё делает кроме заполнения массива графически. Т.е. он действие происходит, но в матрице изначальные числа не показывает
akialex вне форума Ответить с цитированием
Старый 24.12.2009, 21:09   #4
akialex
Пользователь
 
Регистрация: 25.11.2009
Сообщений: 11
По умолчанию

Доработал. Всё отлично. Спасибо
akialex вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Доработка программы Дмитрий Н. Общие вопросы Delphi 5 15.04.2009 20:17
Доработка программы сортировки Delphi!! Дмитрий Н. Помощь студентам 0 15.04.2009 11:28
Доработка программы!! Дмитрий Н. Компоненты Delphi 0 15.04.2009 11:26
Доработка программы... barmaJIei Фриланс 1 24.04.2008 21:23