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

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

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

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

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

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

Сразу извиняюсь если вопрос является дублированным.

На Form имеются компоненты: StreengGreed2, StreengGreed3, edt1, edt2, btn1.
Код программы в btn1:
Код:
procedure TForm1.btn1Click(Sender: TObject);
var
x,y,i:byte;
str,col:array[1..5] of integer;
begin
x:=strtoint(edt1.text);
y:=strtoint(edt2.text);
for i:=1 to 5 do begin
  str[i]:=strtoint(stringgrid2.cells[x,i-1]);
  col[i]:=strtoint(stringgrid2.cells[i-1,y]);
end;
end;

end.

Нажимаем на RUN заполняем таблицу StreenGreed2 цифрами (эелементами матрицы), edt1-номер строки edt2-номер столбца.
Проблема такая: как изменить текст программы в btn1, чтобы после нажатия на кнопку btn1, в StreenGreed3 выходила матрица с вырезанной строкой edit1 и вырезанным столбцом edit2

Последний раз редактировалось Stilet; 12.09.2011 в 17:49.
Макспч21 вне форума Ответить с цитированием
Старый 08.09.2011, 19:12   #2
GetMax
Форумчанин
 
Регистрация: 21.10.2010
Сообщений: 588
По умолчанию

Можно так:
Код:
procedure TForm1.Button2Click(Sender: TObject);
Var
  i,j:Byte;
  n,m:Byte;
begin
  n:=StrToInt(Edit1.Text); //номер строки
  m:=StrToInt(Edit2.Text); //номер столбца
  j:=0;
  For i:=0 to StringGrid2.RowCount-1 do
  Begin
    If i <> m-1 then   //если номер столбца не совпадает с тем, что нужно удалить
    Begin
      StringGrid3.Cols[j]:=StringGrid2.Cols[i]; //то переносим его в новую матрицу
      inc(j)
    End;
  End;
  For i:=n-1 to StringGrid3.RowCount-2 do  //удаляем не нужную строку матрицы
  StringGrid3.Rows[i]:=StringGrid3.Rows[i+1];   // смещая вверх нижние строки
  StringGrid3.RowCount:=StringGrid3.RowCount-1;  //удааляем пустую строку
  StringGrid3.ColCount:=StringGrid3.ColCount-1   //удаляем пустой столбец
end;
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Для благодарностей WMR R145235935681

Последний раз редактировалось GetMax; 09.09.2011 в 08:07.
GetMax вне форума Ответить с цитированием
Старый 09.09.2011, 14:42   #3
Макспч21
Пользователь
 
Регистрация: 08.09.2011
Сообщений: 28
По умолчанию

БОЛЬШОЕ СПАСИБО!

Теперь такой глупый вопрос, после заполнения edit1 и edit2 цифрами(номерами удаляемых строки и столбца) и нажатия на кнопку в StrengGrid3 появляется результативная матрица, однако после смены номеров edit1 и edit2 и каждого очередного нажатия на кнопку матрица уменьшается на 1 столбец и 1 строку от УЖЕ РЕЗУЛЬТАТИВНОЙ а не той что мы ввели в StringGrid2. Вопрос такой, что изменить дабы не приходилось заново перезапускать программу и заполнять ту же матрицу элементами снова и снова, ведь к примеру нужно мне вырезать 3 стр и 3стлб. нажал на кнопку получил. А если нужно ещё 2 и 2 приходится закрывать форму нажимать RUN и снова заполнять матрицу элементами и тд.
(Извиняюсь если что-человек я в этом деле абсолютно новый и никогда раньше этим не занимался)
Макспч21 вне форума Ответить с цитированием
Старый 09.09.2011, 17:11   #4
GetMax
Форумчанин
 
Регистрация: 21.10.2010
Сообщений: 588
По умолчанию

Решение такое:
Код:
procedure TForm1.Button2Click(Sender: TObject);
Var
  i,j:Byte;
  n,m:Byte;
begin
  n:=StrToInt(Edit1.Text); //номер строки
  m:=StrToInt(Edit2.Text); //номер столбца
  For i:=0 to StringGrid2.RowCount-1 do // копируем исходную матрицу
  StringGrid3.Rows[i]:=StringGrid2.Rows[i];
  For i:=n-1 to StringGrid3.RowCount-1 do  //удаляем не нужную строку матрицы
  StringGrid3.Rows[i]:=StringGrid3.Rows[i+1];
  For j:=m-1 to StringGrid3.ColCount-1 do  //удаляем не нужный столбец
  StringGrid3.Cols[j]:=StringGrid3.Cols[j+1];
End;
Пользователь не знает, чего он хочет, пока не увидит то, что он получил.
Для благодарностей WMR R145235935681
GetMax вне форума Ответить с цитированием
Старый 09.09.2011, 18:07   #5
Макспч21
Пользователь
 
Регистрация: 08.09.2011
Сообщений: 28
По умолчанию

Спасибо! Появляются ещё вопросы но их задам попозже-если сам не смогу сделать))
Ещё раз спс.

В продолжение данной темы.
Задача: edt1 edt2 воспринимают пока только один элемент-однозначное число, надо чтобы воспринималось несколько чисел и возможно двухзначных-то есть надо мне сразу вырезать 7,13,22 строки и соответсвенно столбцы.

Вот общий код:

Код:
procedure TForm1.btn1Click(Sender: TObject);
Var
  i,j:Byte;
  n,m:Byte;
  arr: array[1..10] of byte;
begin
  n:=arr1[x];[/B] //номер строки
  m:=arr2[x]; //номер столбца
  For i:=0 to StringGrid2.RowCount-1 do // копируем исходную матрицу
  StringGrid3.Rows[i]:=StringGrid2.Rows[i];
      begin      // подпрограмма для распознавания элементов массива строки
         str:=edt1.Text;
         i:=1;
          j:=1;
             while i<length(str) do begin
                 if str[i]<>',' then begin
                  if str[i+1]<>',' then begin
                   s:=str[i]+str[i+1];
                   arr[j]:=strtoint(s);
                   inc(i,2);
              end else 
                 begin
                   arr[j]:=strtoint(str[i]);
                   inc(i);
                 end;
                    inc(j);
            end else inc(i);
          end;
        end;
  For i:=n-1 to StringGrid3.RowCount-1 do  //удаляем не нужную строку матрицы
  StringGrid3.Rows[i]:=StringGrid3.Rows[i+1];  
        begin       // подпрограмма для распознавания элементов массива столбца
           str:=edt2.Text;
             i:=1;
             j:=1;
              while i<length(str) do begin
                  if str[i]<>',' then begin
                  if str[i+1]<>',' then begin
                 s:=str[i]+str[i+1];
                  arr[j]:=strtoint(s);
                  inc(i,2);
                end else begin
             arr[j]:=strtoint(str[i]);
             inc(i);
           end;
             inc(j);
           end else inc(i);
       end;
      end;
     For j:=m-1 to StringGrid3.ColCount-1 do  //удаляем не нужный столбец
     [B]StringGrid3.Cols[j]:=StringGrid3.Cols[j+1];
  End;

end.
Выдает ошибку на: n:=arr1[x]; //номер строки


Сам то я понимаю что неправильно проименовал массивы и ключ к решению вот в этой части:

Код:
Var
  i,j:Byte;
  n,m:Byte;
  arr: array[1..10] of byte;
begin
  n:=arr1[x]; //номер строки
  m:=arr2[x]; //номер столбца
, но честно запутался совершенно, пожалуйста распутайте меня кого не затруднит это сделать (если можно с разъяснением ибо хотелось бы разобраться)

Последний раз редактировалось Stilet; 12.09.2011 в 17:50.
Макспч21 вне форума Ответить с цитированием
Старый 12.09.2011, 09:38   #6
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

А что ты вообще хотел сказать этим?..
Ни arr1, ни arr2, ни x - у тебя не определены. Если ты их даже определишь - все равно их значения у тебя не заданы. Как ты их используешь? И что это там за круглые скобки за arr2[x] ?
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Старый 12.09.2011, 09:45   #7
Макспч21
Пользователь
 
Регистрация: 08.09.2011
Сообщений: 28
По умолчанию

Цитата:
Сообщение от TinMan Посмотреть сообщение
А что ты вообще хотел сказать этим?..
Ни arr1, ни arr2, ни x - у тебя не определены. Если ты их даже определишь - все равно их значения у тебя не заданы. Как ты их используешь? И что это там за круглые скобки за arr2[x] ?
ну я хотел сказать что edt1 и edt2 -массив, который должен восприниматься примерно так: {1,11,26,4} например. И из матрицы вырезались бы соответствующие элементам массива строки и столбцы.

Круглые скобки опечатка.
Макспч21 вне форума Ответить с цитированием
Старый 12.09.2011, 10:24   #8
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от Макспч21 Посмотреть сообщение
ну я хотел сказать что edt1 и edt2 -массив, который должен восприниматься примерно так: {1,11,26,4} например. И из матрицы вырезались бы соответствующие элементам массива строки и столбцы.
То есть в поле ввода edt1 у тебя несколько номеров строк, а в edt2 - столбцов? Как они перечислены - через запятую или пробел? или еще как-то?

Короче, если так, то тебе надо интерпертировать их как строки. Разбить их на части по разделителям (в цикле) и положить в массивы arr1 и arr2. Потом упорядочить эти массивы по убыванию и сделать цикл удаления.

хех )), подумал - упорядочивание по возрастанию позволит организовать цикл удаления более эффективно, но логика будет чуть сложнее..
Предпочитаю на "ты".

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

Цитата:
Сообщение от TinMan Посмотреть сообщение
То есть в поле ввода edt1 у тебя несколько номеров строк, а в edt2 - столбцов? Как они перечислены - через запятую или пробел? или еще как-то?

Короче, если так, то тебе надо интерпертировать их как строки. Разбить их на части по разделителям (в цикле) и положить в массивы arr1 и arr2. Потом упорядочить эти массивы по убыванию и сделать цикл удаления.
Да верно-в edit 1 - несколько номеров строк, а в edt2 - столбцов.
Перечисляются номера через запятую. Ну так в коде это все сделано-я так понимаю проблема именно в верхней части:
Var
i,j:Byte;
n,m:Byte;
arr: array[1..10] of byte;
begin
n:=arr1[x]; //номер строки
m:=arr2[x]; //номер столбца


или я неправильно понимаю?
Макспч21 вне форума Ответить с цитированием
Старый 12.09.2011, 11:24   #10
TinMan
Форумчанин
 
Аватар для TinMan
 
Регистрация: 05.09.2011
Сообщений: 869
По умолчанию

Цитата:
Сообщение от Макспч21 Посмотреть сообщение
я неправильно понимаю?
Если отбросить знак вопроса, то будет верное утверждение.

Смотри, вот так определялись номера удаляемых строки и столбца, когда их было по одному:
Код:
  n:=StrToInt(Edit1.Text); //номер строки
  m:=StrToInt(Edit2.Text); //номер столбца
Теперь нужно сделать массивы n и m
Код:
  n,m: array[1..10] of byte;
Теперь нужно в цикле их заполнить, что-то типа такого:
Код:
  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;
После этого у тебя в массиве n будут номера строк для удаления. Так же нужно поступить и со столбцами.
Возможно, в Delphi есть встроенные средства для разбивания строки на слова (как Explode в PHP).

А потом нужно будет упорядочить массивы n и m и сделать цикл для удаления.
Предпочитаю на "ты".
TinMan вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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