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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2009, 11:09   #1
serj-07
Пользователь
 
Аватар для serj-07
 
Регистрация: 07.03.2009
Сообщений: 68
По умолчанию массив замена -, на+. Delphi

что-то запутался помогите найти ошибку. нужно отриц. заменить на полож.
Код:
 const
  n=5;
  type
  ta= array of real;

var
  Form1: TForm1;
  a:ta;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
var
n:integer;

begin
n:= StrToInt(Trim(edit1.Text));
SetLength(a,n);
StringGrid1.ColCount:=n;

end;

procedure TForm1.Button2Click(Sender: TObject);
var
i: integer;
s:real;
begin
 For i:=1 to n do
 a[i]:= StrToFloat( STringGrid1.Cells[i-1,0]);
 For i:=1 to n do
 i:=0;
 if a[i]<0 then
 a[i]:=abs(a[i])  
 
 s:=a[i];
 StringGrid1.Cells [i,0]:=FloatToStr(s)

end;

end.
Мы все учились понемногу
Чему-нибудь и как-нибудь!!!
serj-07 вне форума Ответить с цитированием
Старый 07.03.2009, 11:45   #2
[Smarik]
Веб-разработчик
Форумчанин
 
Аватар для [Smarik]
 
Регистрация: 16.01.2008
Сообщений: 451
По умолчанию

Цитата:
For i:=1 to n do
i:=0;
if a[i]<0 then
a[i]:=abs(a[i])

s:=a[i];
StringGrid1.Cells [i,0]:=FloatToStr(s)
в цикле нельзя изменять значение i если оно используется, еще ты видимо забыл поставить begin end в цикле ну и совсем не обязательно проверять число меньше 0 или нет
For i:=1 to n do
a[i]:= StrToFloat(abs( STringGrid1.Cells[i-1,0])); - вот так все числа будут положительными
Я ваш новый друг, смиритесь!
[Smarik] вне форума Ответить с цитированием
Старый 07.03.2009, 11:53   #3
Sm1Le
Форумчанин
 
Аватар для Sm1Le
 
Регистрация: 31.10.2008
Сообщений: 500
По умолчанию

begin end в помощь ...
Skype : UASm1Le.
Sm1Le вне форума Ответить с цитированием
Старый 07.03.2009, 12:35   #4
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Вроде как у Вас динамический массив и, надеюсь нет фиксированного столбца в Гриде. Тогда так.
Код:
For i:=0 to n-1 do
 a[i]:= StrToFloat( STringGrid1.Cells[i]);
For i:=0 to n-1 do
if a[i]<0 then
a[i]:=abs(a[i]) ;
puporev вне форума Ответить с цитированием
Старый 07.03.2009, 12:36   #5
serj-07
Пользователь
 
Аватар для serj-07
 
Регистрация: 07.03.2009
Сообщений: 68
По умолчанию

В общем мне нужно в динамическом массиве составить процедуру, заменяющую все отрицательные элементы исходной матрицы их модулями и фиксирующую число таких замен. Применить эту процедуру для заданной матрицы NхM, причем в случае совпадения числа замен с общим числом элементов в матрице предусмотреть дополнительно вывод поясняющего текста.
загвозка пока в самой прцедуре.


Код:
Type
  TA=array of real;
  TA1=array of TA;

var
  Form1: TForm1;
   a: TA1;  n,m: Longint;

implementation

{$R *.dfm}


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

procedure Samena (a:TA1 );
var
i,j,n,m: Longint;
    s:real;

 begin

 n:=Length(a);
 m:=Length(a);
 s:=a[0,0];
  for i:=0 to n-1 do
 for j:=0 to m-1 do
 if s<0 then
 begin
 s:=abs(a[i,j]);

 end;

 end;

procedure TForm1.Button2Click(Sender: TObject);
var
 i,j:Longint;

begin
  for i:=0 to n-1 do
  for j:=0 to m-1 do
  a[i,j]:= StrToFloat (StringGrid1.Cells[i,j]);
  Samena (a);
  StringGrid1.Cells[i,j]:=FloatToStr(a[i,j]);
end;

end.
Мы все учились понемногу
Чему-нибудь и как-нибудь!!!
serj-07 вне форума Ответить с цитированием
Старый 07.03.2009, 13:18   #6
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

А в чем проблема?

На форму помести один Button и два StringGrid:

Код:
//Создаешь переменные
var
  mas:array of array of Integer;
  col,row,k:integer;

//По нажатию на кнопку пишешь
SetLength(mas,3,3);

for col:=0 to 2 do
  for row:=0 to 2 do
 mas[row,col]:=StrToInt(StringGrid1.Cells[col,row]);

for col:=0 to 2 do
  for row:=0 to 2 do
    if mas[col,row] < 0 then
    begin
      mas[col,row]:= abs(mas[col,row]);    //Замена всех отрицательных элементов исходной 
                                                         //матрицы их модулями
      k:= k+1;   //Считаем количество замен
    end;

for col:=0 to 2 do
  for row:=0 to 2 do
    StringGrid2.Cells[col,row]:= IntToStr(mas[row,col]);

Label1.Caption:= IntToStr(k);
mas:= nil;
Данный код заменяет все отрицательные элементы массива на положительные и считает количество замен. Все это превратить в отдельную процедуру, я думаю труда не составит. Также сам задавай размерность массива и выделяй память уже в соответствии с размерностью массива.

P.S. Код предназначен для матрицы 3*3, переделай под себя.
Будь проще и люди к тебе потянутся

Последний раз редактировалось spamer; 07.03.2009 в 13:27.
spamer вне форума Ответить с цитированием
Старый 07.03.2009, 13:19   #7
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Код:
procedure TForm1.Button2Click(Sender: TObject);
var i,j,zamen:int;
begin
zamen:=0;
for i:=0 to n-1 do
for j:=0 to m-1 do
begin
try
if StrToFloat (StringGrid1.Cells[i,j])<0 then
begin
StringGrid1.Cells[i,j]:=FloatToStr(Abs(StrToFloat (StringGrid1.Cells[i,j])));
zamen:=zamen+1;
end;
except
ShowMessage('Обнаружено неверно введенное число');
break;
end;
if zamen=(n-1)*(m-1) then
ShowMessage('Пришлось заменить все элементы') else
ShowMessage('Произведено '+IntToStr((n-1)*(m-1))+'замен');
end;
А procedure Samena ни к чему...

Последний раз редактировалось mihali4; 07.03.2009 в 13:22.
mihali4 вне форума Ответить с цитированием
Старый 09.03.2009, 01:35   #8
serj-07
Пользователь
 
Аватар для serj-07
 
Регистрация: 07.03.2009
Сообщений: 68
По умолчанию

Всем огромное спасибо за помощь.
посмотрите вроде сделал все правельно но работать не хочет,
и еще в пояснении нада вывод если была замена всех эл. или количество замен. заранее огромное спасибо.
Код:
Type
  TA=array of real;
  TA1=array of TA;

var
  Form1: TForm1;
   a: TA1;
   n,m: Longint;

implementation

{$R *.dfm}

procedure Samena (a:TA1);
var
i,j,n,m: Longint;

 begin
 n:=Length (a);
 m:=Length (a);
 zam:=0;
    for i:=0 to n-1 do
    for j:=0 to m-1 do
     if a[i,j]<0 then
     a[i,j]:=abs(a[i,j]);
     zam:=zam+1;
     if zam=(n-1)*(m-1) then
     ShowMessage (' zam wse')
    else
      ShowMessage ('zam'+IntToStr( (n-1)*(m-1)));
 end;

procedure TForm1.Button1Click(Sender: TObject)

begin 
     m:= StrToInt (trim(Edit2.Text));
     n:= StrToInt (trim(Edit1.Text));
     SetLength(a,n,m);
   StringGrid1.ColCount:=n;
   StringGrid1.RowCount:=m;
   
end;
procedure TForm1.Button2Click(Sender: TObject);
var
 i,j:Longint;
 begin
  for i:=0 to n-1 do
  for j:=0 to m-1 do
  a[i,j]:= StrToFloat (StringGrid1.Cells[i,j]);
  Samena(a);
  StringGrid1.Cells [i,j]:= FloatToStr (a[i,j]);
 end;
end.
Мы все учились понемногу
Чему-нибудь и как-нибудь!!!
serj-07 вне форума Ответить с цитированием
Старый 09.03.2009, 07:16   #9
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Измени индексы ячеек у таблиц, в массиве сначала указываются чтроки, потом столбцы, а у StringGrid наоборот, сначала столбцы, а потом строки.
И вывод измененного массива сделай во вторую таблицу.
Код:
for i:=0 to n-1 do
  for j:=0 to m-1 do
  a[i,j]:= StrToFloat (StringGrid1.Cells[j,i]);
  Samena(a);
  StringGrid2.Cells [i,j]:= FloatToStr (a[j,i]);
puporev вне форума Ответить с цитированием
Старый 09.03.2009, 11:55   #10
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

И тут подправить надо:
Код:
if a[i,j]<0 then
begin
a[i,j]:=abs(a[i,j]);
zam:=zam+1;
end;
mihali4 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема поиск и замена текста(Delphi) KirkMETAL Помощь студентам 4 26.07.2010 08:41
Массив (Delphi) stasig Помощь студентам 2 28.02.2009 21:43
Замена кода программы с Delhi5 на Delhi7 либо замена базы данных с Acessa на MySQL DorianLeroy Фриланс 8 18.02.2009 18:52
Замена маленьких букв на большие. DELPHI Absent Помощь студентам 2 23.03.2008 17:19
[Delphi] Замена одного слова на другое... ZhooZhik Помощь студентам 5 09.01.2008 23:31