|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
23.12.2009, 18:09 | #1 |
Пользователь
Регистрация: 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. Но преподаватель потребовал, - чтобы изначальный массив был заполнен рандомно, а не вводился с клавиатуры. - чтобы массивы были динамические. Помогите доработать программу грамотно, т.к. то, что я сделал на паре (код остался в лаборатории) выдает ошибку, хоть и справляется с поставленной задачей. Очень надеюсь на Вашу помошь. |
23.12.2009, 18:34 | #2 |
Пользователь
Регистрация: 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. В итоге что то такое |
24.12.2009, 00:23 | #3 |
Пользователь
Регистрация: 25.11.2009
Сообщений: 11
|
Всё делает кроме заполнения массива графически. Т.е. он действие происходит, но в матрице изначальные числа не показывает
|
24.12.2009, 21:09 | #4 |
Пользователь
Регистрация: 25.11.2009
Сообщений: 11
|
Доработал. Всё отлично. Спасибо
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Доработка программы | Дмитрий Н. | Общие вопросы 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 |