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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.09.2011, 12:23   #11
Макспч21
Пользователь
 
Регистрация: 08.09.2011
Сообщений: 28
По умолчанию

Спасибо! буду связывать)
Код:
procedure TForm1.btn1Click(Sender: TObject);
Var
i,j:Byte;
n,m: array[1..10] of byte;
s: String; 
nRow: byte;
 nCol: byte;
begin
For i:=0 to StringGrid2.RowCount-1 do // копируем исходную матрицу
StringGrid3.Rows[i]:=StringGrid2.Rows[i];
begin // подпрограмма для распознавания элементов массива строки
s:= Edt1.text;
nRow:= 0;
while (Length(s)>0) and (s[1]=' ') do Delete(s,1,1); // убираем передние пробелы
while Pos(' ',s)>0 do begin
Inc(nRow);
n[nRow]:= StrToInt(Copy(s,1,Pos(' ',s)-1));
Delete(s,1,Pos(' ',s);
while (Length(s)>0) and (s[1]=' ')) do Delete(s,1,1); // убираем пробелы
end;
For i:=n-1 to StringGrid3.RowCount-1 do //удаляем не нужную строку матрицы
StringGrid3.Rows[i]:=StringGrid3.Rows[i+1];
begin // подпрограмма дляраспознавания элементов массива столбца
s:= Edt1.text;
mCol:= 0;
while (Length(s)>0) and (s[1]=' ') do Delete(s,1,1); // убираем передние пробелы
while Pos(' ',s)>0 do begin
Inc(mCoL);
m[mCol]:= StrToInt(Copy(s,1,Pos(' ',s)-1));
Delete(s,1,Pos(' ',s);
while (Length(s)>0) and (s[1]=' ') do Delete(s,1,1); // убираем пробелы
end;
For j:=m-1 to StringGrid3.ColCount-1 do //удаляем не нужный столбец
StringGrid3.Cols[j]:=StringGrid3.Cols[j+1];
End;
end;
end.
ошибка в строке For i:=n-1 to StringGrid3.RowCount-1 do
Operator not applicable to this operand type

Что исправить?

Последний раз редактировалось Stilet; 12.09.2011 в 17:52.
Макспч21 вне форума Ответить с цитированием
Старый 12.09.2011, 12:51   #12
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
For i:=n-1 to StringGrid3.RowCount-1 do
А что вы хотите сделать? n — это массив, набор элементов.

Кстати, на Си/С++ подобный код работал бы, ибо там имя массива указывает на первый элемент.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 12.09.2011 в 13:01.
Alex11223 вне форума Ответить с цитированием
Старый 12.09.2011, 12:56   #13
Макспч21
Пользователь
 
Регистрация: 08.09.2011
Сообщений: 28
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
А что вы хотите сделать? n — это массив.
Что я хочу сделать написано выше
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    btn1: TButton;
    StringGrid2: TStringGrid;
    edt1: TEdit;
    edt2: TEdit;
    StringGrid3: TStringGrid;
    procedure btn1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure btn1Click(Sender: TObject);
 var
  str1,str2,s:string;
  i,j,x,y,n:byte;
  arr1,arr2: array[1..10] of byte;
begin
  For i:=0 to StringGrid2.RowCount-1 do StringGrid3.Rows[i]:=StringGrid2.Rows[i];
  str1:=edt1.Text;
  str2:=edt2.text;
  i:=1;
  j:=1;
  if edt1.text<>'' then begin
  while i<=length(str1) do begin
    if str1[i]<>',' then begin
      if str1[i+1]<>',' then begin
        s:=str1[i]+str1[i+1];
        arr1[j]:=strtoint(s);
        inc(i,2);
      end else begin
        arr1[j]:=strtoint(str1[i]);
        inc(i);
      end;
      inc(j);
     end else inc(i);
  end;
  for x:=1 to j do begin
    n:=arr1[x];
    For y:=n-1 to StringGrid2.RowCount-1 do
    StringGrid3.Rows[y]:=StringGrid3.Rows[y+1];
  end;
  end;
  i:=1;
  j:=1;
  if edt2.text<>'' then begin
  while i<=length(str2) do begin
    if str2[i]<>',' then begin
      if str2[i+1]<>',' then begin
        s:=str2[i]+str2[i+1];
        arr2[j]:=strtoint(s);
        inc(i,2);
      end else begin
        arr2[j]:=strtoint(str2[i]);
        inc(i);
      end;
      inc(j);
     end else inc(i);
  end;
  for x:=1 to j do begin
    n:=arr2[x];
    For y:=n-1 to StringGrid2.ColCount-1 do
    StringGrid3.Cols[y]:=StringGrid3.Cols[y+1];
  end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
  var
i,j:byte;
begin
  for i:=0 to 14 do begin
    stringgrid2.ColWidths[i]:=20;
    stringgrid2.RowHeights[i]:=20;
    stringgrid3.ColWidths[i]:=20;
    stringgrid3.RowHeights[i]:=20;  end;
  for i:=0 to 14 do
    for j:=0 to 14 do
      stringgrid2.cells[i,j]:=inttostr(i+j);
end;
end.
Это полностью код проги, выдает ошибку на строке:
Код:
For i:=0 to StringGrid2.RowCount-1 do StringGrid3.Rows[i]:=StringGrid2.Rows[i]
вида:
[Error] Unit1.pas(37): Undeclared identifier: 'StringGrid2'

Кто могет объяснить почему???

Последний раз редактировалось Stilet; 12.09.2011 в 17:52.
Макспч21 вне форума Ответить с цитированием
Старый 13.09.2011, 09:51   #14
Макспч21
Пользователь
 
Регистрация: 08.09.2011
Сообщений: 28
По умолчанию

Исправил ошибку, вот общий рабочий код:

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    btn1: TButton;
    StringGrid2: TStringGrid;
    edt1: TEdit;
    edt2: TEdit;
    StringGrid3: TStringGrid;
    procedure btn1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
      private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
 var
  str1,str2,s:string;
  i,j,x,y,n:byte;
  arr1,arr2: array[1..10] of byte;
begin
  For i:=0 to StringGrid2.RowCount-1 do
  StringGrid3.Rows[i]:=StringGrid2.Rows[i];
  str1:=edt1.Text;
  str2:=edt2.text;
  i:=1;
  j:=1;
  if edt1.text<>'' then begin
  while i<=length(str1) do begin
    if str1[i]<>',' then begin
      if str1[i+1]<>',' then begin
        s:=str1[i]+str1[i+1];
        arr1[j]:=strtoint(s);
        inc(i,2);
      end else begin
        arr1[j]:=strtoint(str1[i]);
        inc(i);
      end;
      inc(j);
     end else inc(i);
  end;
  for x:=1 to j do begin
    n:=arr1[x];
    For y:=n-1 to StringGrid2.RowCount-1 do
    StringGrid3.Rows[y]:=StringGrid3.Rows[y+1];
  end;
  end;
  i:=1;
  j:=1;
  if edt2.text<>'' then begin
  while i<=length(str2) do begin
    if str2[i]<>',' then begin
      if str2[i+1]<>',' then begin
        s:=str2[i]+str2[i+1];
        arr2[j]:=strtoint(s);
        inc(i,2);
      end else begin
        arr2[j]:=strtoint(str2[i]);
        inc(i);
      end;
      inc(j);
     end else inc(i);
  end;
  for x:=1 to j do begin
    n:=arr2[x];
    For y:=n-1 to StringGrid2.ColCount-1 do
    StringGrid3.Cols[y]:=StringGrid3.Cols[y+1];
  end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
  var
i,j:byte;
begin
  for i:=0 to 14 do begin
    stringgrid2.ColWidths[i]:=20;
    stringgrid2.RowHeights[i]:=20;
    stringgrid3.ColWidths[i]:=20;
    stringgrid3.RowHeights[i]:=20;  end;
  for i:=0 to 14 do
    for j:=0 to 14 do
      stringgrid2.cells[i,j]:=inttostr(i+j);
end;
end.

Собсно проблема то такая

Очередное удаление происходит из результативной матрцицы, то есть ввел я матрицу 5на5, поставил удаление: 1,3 сток и соответственно столбцов, и происходит удаление 1й и 4й стоки и столбца, ибо 3я строка в получившейся матрицы после первого удаления есть 4я в исодной(5на5 кторая)! То есть очередное удаление происходит в матрице после уже первого удаления! А надо то чтобы удаление всех введенных строк и столбцов было из исходной матрицы.
Помогите пожалуйста кто в силах.

Последний раз редактировалось Макспч21; 13.09.2011 в 11:00.
Макспч21 вне форума Ответить с цитированием
Старый 13.09.2011, 10:35   #15
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Может быть стоит скинуть в массив, то что нужно и потом уже в стринггрид, чтоб не запутаться в них?

И используйте значок # для сохранения форматирования кода, ибо без него будет меньше желающих читать код. И кнопку "правка".
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 13.09.2011, 10:36   #16
GetMax
Форумчанин
 
Регистрация: 21.10.2010
Сообщений: 588
По умолчанию

Ну так нужно учесть смещение строк результирующей матрицы. Сделать это можно,например, так
Код:
n:=arr1[x];
If x <> 1 then dec(n) //если строки уже удалялись, то учитываем смещение оставшихся
Потом тоже самое надо проделать со столбцами
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Для благодарностей WMR R145235935681
GetMax вне форума Ответить с цитированием
Старый 14.09.2011, 09:11   #17
Макспч21
Пользователь
 
Регистрация: 08.09.2011
Сообщений: 28
По умолчанию

Код:
If x <> 1 then dec(n)
Крутил я вертел эту строку но так и не нашел куда её вставить(((
Помогите ламеру пожалуйтса.
Макспч21 вне форума Ответить с цитированием
Старый 14.09.2011, 12:28   #18
Макспч21
Пользователь
 
Регистрация: 08.09.2011
Сообщений: 28
По умолчанию

Всё исправил, всем спасибо, вот общий готовый код программы:

Удаление стобцов и строк из матрицы

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    btn1: TButton;
    StringGrid2: TStringGrid;
    edt1: TEdit;
    edt2: TEdit;
    StringGrid3: TStringGrid;
    procedure btn1Click(Sender: TObject);
          private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.btn1Click(Sender: TObject);
 var
  str1,str2,s:string;
  i,j,x,y,n:byte;
  arr1,arr2: array[1..10] of byte;
begin
  For i:=0 to StringGrid2.RowCount-1 do
  StringGrid3.Rows[i]:=StringGrid2.Rows[i];
  str1:=edt1.Text;
  str2:=edt2.text;
  i:=1;
  j:=1;
  if edt1.text<>'' then begin
  while i<=length(str1) do begin
    if str1[i]<>',' then begin
      if str1[i+1]<>',' then begin
        s:=str1[i]+str1[i+1];
        arr1[j]:=strtoint(s);
        inc(i,2);
      end else begin
        arr1[j]:=strtoint(str1[i]);
        inc(i);
      end;
      inc(j);
     end else inc(i);
  end;
  for x:=1 to j do begin
    n:=arr1[x];
      If x <> 1 then dec(n); //если строки уже удалялись, то учитываем смещение оставшихся
        For y:=n-1 to StringGrid2.RowCount-1 do
    StringGrid3.Rows[y]:=StringGrid3.Rows[y+1];
  end;
  end;
  i:=1;
  j:=1;
  if edt2.text<>'' then begin
  while i<=length(str2) do begin
    if str2[i]<>',' then begin
      if str2[i+1]<>',' then begin
        s:=str2[i]+str2[i+1];
        arr2[j]:=strtoint(s);
        inc(i,2);
      end else begin
        arr2[j]:=strtoint(str2[i]);
        inc(i);
      end;
      inc(j);
     end else inc(i);
  end;
  for x:=1 to j do begin
    n:=arr2[x];
     If x <> 1 then dec(n); //если столбцы уже удалялись, то учитываем смещение оставшихся
    For y:=n-1 to StringGrid2.ColCount-1 do
    StringGrid3.Cols[y]:=StringGrid3.Cols[y+1];
  end;
  end;
end;


end.
Технически тему можно закрыть, но я думаю не стоит-вопросы свои буду постить в ней, чтобы не засорять форум темами, следующие вопросы все равно будут связаны с масивами.
Макспч21 вне форума Ответить с цитированием
Старый 23.09.2011, 19:01   #19
Макспч21
Пользователь
 
Регистрация: 08.09.2011
Сообщений: 28
По умолчанию

Итак очередная задача:
на форме имеется StringGrid2 (1х25), StringGrid3(2х1), StringGrid4(2х1), кнопка btn1 и пара label.
Сама задача: необходимо чтобы среди элементов StringGrid2 -введенных вручную, был найден максимальный элемент и его номер и эти два значения выведены в StringGrid3, и минимальный элемент и его номер и выведены соответственно в StrinGrid4.

Код ПАСКАЛЯ:
Код:
var a:array[1..10] of integer;
min,max,i:integer;
begin
write('Введите число элементов');
Read(n);
for i:=1 to n do begin
Write('a[',i,']=');
Readln(a[i]);
end;
for i:=1 to n do writeln(a[i]);
max:=a[1];
min:=a[1];
for i:=1 to n do
begin
if a[i]>max then max:=a[i];
if a[i]<min then min:=a[i];
end;
Макспч21 вне форума Ответить с цитированием
Старый 23.09.2011, 19:20   #20
GetMax
Форумчанин
 
Регистрация: 21.10.2010
Сообщений: 588
По умолчанию

Код вроде рабочий. Единственное, что ты упустил - запомнить номера максимального и минимального элемента. Сделать это можно так
Код:
for i:=1 to n do
begin
if a[i]>max then
Begin
  max:=a[i];
  imax:=i;
End;
if a[i]<min then
Begin
  min:=a[i];
  imin:=i
End;
end;
Затем кидаете на форму нужные компоненты и оптимизируете под них код
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Для благодарностей WMR R145235935681
GetMax вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вырезка бит в паскале. dukales Паскаль, Turbo Pascal, PascalABC.NET 6 02.09.2011 05:57
Вырезка изображения и переменные Максим139 Помощь студентам 0 31.03.2011 17:31
Canvas, вырезка, буфер... Максим139 Помощь студентам 0 28.03.2011 19:05
Ф-ия, определяющая сумму строк матрицы, если на главной диагонали матрицы имеется отрицательный эл-т. Volk_xD Помощь студентам 6 05.01.2011 13:39
На главную диагональ матрицы поместить наибольшие элементы этой матрицы mivel Помощь студентам 2 23.12.2009 21:19