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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.10.2009, 02:44   #1
Virtualex
 
Аватар для Virtualex
 
Регистрация: 06.10.2009
Сообщений: 6
По умолчанию

Помогите пожалуйста, чего-то я видимо не до понимаю, или не соображу
Вообщем задача такая:
В memo есть текст который может содержать любое колличество строк, в строках через пробел или другие знаки находятся слова, пример:
х1,х2,х3,
х8,х15,х5,х6
Необходимо перевести это в двумерный массив mas[j,i], в котором в таком же порядке находились эти же переменные, т.е.
mas[0,0] = x1
mas[1,1] = x15
ну и т.д.

Вот мои неудалые наработки, проблемы с столбцами массива:

Код:
procedure TForm1.Button2Click(Sender: TObject);
  begin
    m:=StrToInt(Form1.Edit1.Text);
end;

procedure TForm1.Button1Click(Sender: TObject);


const
  DelSym = ' .,!?;';
var
  Text,Word,st,s: string;
  i,j: integer;
  mas: array[0..999,0..200] of string;

begin

for j := 0 to m do begin 
  Text:=Memo1.lines[j];  

  for i :=0 to Length(Text) do 

   
    if Pos(Text[i],DelSym) > 0 then
        Text[i]:=',';
    
    if Text[1] = ',' then
        Delete(Text,1,1);
  
    while Pos(',,',Text) > 0 do
      Delete(Text,Pos(',,',Text),1);
 
    if Text[Length(Text)] <> ',' then
        Text:=Text+',';
    
    repeat
      Word:=Copy(Text,1,Pos(',',Text)-1);
      Delete(Text,1,Length(Word)+1);
        while Pos(Chr(13),Word) > 0 do
          Delete(Word,Pos(Chr(13),Word),1);
        while Pos(Chr(10),Word) > 0 do
          Delete(Word,Pos(Chr(10),Word),1);
          mas[j,i]:= Word;
        st:='Введенный массив:'+#13;
        st:=st+IntToStr(j)+' '+IntToStr(i)+' '+ mas[j,i]+#13; ShowMessage(st);
    until Length(Text) = 0;

  end;
end;

end.

Принцип по котрому хотел я сделать, превращаем каждую строку в столбцы, а затем заносим их в массив по очереди, проблема с циклом i как его реализовать

Последний раз редактировалось Stilet; 20.10.2009 в 08:31.
Virtualex вне форума Ответить с цитированием
Старый 20.10.2009, 14:56   #2
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Путанное объяснение, как я понял: надо считывать из строк мемо первые два слова. Так? Теперь - что является разделителем слов, кроме пробела?
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 20.10.2009, 16:45   #3
Virtualex
 
Аватар для Virtualex
 
Регистрация: 06.10.2009
Сообщений: 6
По умолчанию

Вроде объяснил нормально!?
Ну вообщем повторюсь:
Дана запись в memo следующего вида (как пример, может быть любых размеров):
х1,х2,х3,
х8,х15,х5,х6
Необходимо преобразовать запись в массив:
mas[0,0] = x1 mas[0,1] = x2 mas[0,2] = x3
mas[1,0] = x8 mas[1,1] = x15 mas[1,2] = x5 mas[1,3] = x6
Это я просто как пример, но если его реализовать, то можно и любого другого размера.
Проблема в моем коде заключаеться в том, что нужно создать еще один цикл для i, т.е. mas[j,i] j-работает, а вот i - надо правильный цикл!
Может я конечно сильно накрутил, если есть вариант попроще пожалуйста подскажите!
Virtualex вне форума Ответить с цитированием
Старый 20.10.2009, 19:16   #4
Virtualex
 
Аватар для Virtualex
 
Регистрация: 06.10.2009
Сообщений: 6
По умолчанию

Код:
unit Unit3;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Edit1: TEdit;
    Button2: TButton;
    Memo2: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);


  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  m : integer;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
  begin
    m:=StrToInt(Form1.Edit1.Text);
end;

procedure TForm1.Button1Click(Sender: TObject);

const
  DelSym = ' .,!?;';
var
  Text,Word,st,s: string;
  i,j,k : integer;
  mas: array[0..999,0..200] of string;

begin
for j := 0 to m do begin 
  Text:=Memo1.lines[j];  

  for i :=0 to Length(Text) do 

    if Pos(Text[i],DelSym) > 0 then
        Text[i]:=',';
    if Text[1] = ',' then
        Delete(Text,1,1);
    
    while Pos(',,',Text) > 0 do
      Delete(Text,Pos(',,',Text),1);
    if Text[Length(Text)] <> ',' then
        Text:=Text+',';
    repeat
      Word:=Copy(Text,1,Pos(',',Text)-1);
      Delete(Text,1,Length(Word)+1);
        while Pos(Chr(13),Word) > 0 do
          Delete(Word,Pos(Chr(13),Word),1);
        while Pos(Chr(10),Word) > 0 do
          Delete(Word,Pos(Chr(10),Word),1);
          Memo2.lines.Add(Word)
    until Length(Text) = 0;

    for k  := 0 to memo2.Lines.Count -1 do
      begin
      mas[j,k]:= memo2.Lines.Strings[k];
      st:='Введенный массив:'+#13;
      st:=st+IntToStr(j)+' '+IntToStr(k)+' '+ mas[j,k]+#13; ShowMessage(st);
    end;
    memo2.Clear;
  end;

end;

end.
Вот рабочий код реализующий мою задачу!
Вопрос к форумчанам такой: можно ли обойтись как нибудь без memo2, да и вообще мне кажеться что задачу можно решить гораздо проще, только КАК?
Virtualex вне форума Ответить с цитированием
Старый 21.10.2009, 10:01   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Предлагаю свое решение:
Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var  A:array of array of string;
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var x,y,i:integer;s,e:string;
begin                 {$o-}
 setlength(a,1,1);
 x:=0;y:=0;
 s:=Memo1.Lines.Text;
 i:=1; while i<length(s) do begin
  while (i<length(s))and(not (s[i] in [' ',',','.',#13])) do begin
   e:=e+s[i];inc(i);
  end;

  //******************************************
    if s[i]<>#13 then begin
     a[x,y]:=e;
     inc(y);
     SetLength(a[x],y+1);
    end else begin
     a[x,y]:=e;
     inc(x);y:=0;
     Setlength(a,x+1);
     Setlength(a[x],y+1);
     inc(i);
    end;
  //******************************************
  inc(i);  e:='';
 end;
end;

end.
Смысл надеюсь ясен?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.10.2009, 22:47   #6
Virtualex
 
Аватар для Virtualex
 
Регистрация: 06.10.2009
Сообщений: 6
По умолчанию

Смысл ясен! Все работает отлично! Stilet ОГРОМНОЕ СПАСИБО!
Virtualex вне форума Ответить с цитированием
Старый 21.10.2009, 23:01   #7
Virtualex
 
Аватар для Virtualex
 
Регистрация: 06.10.2009
Сообщений: 6
По умолчанию

Не бду создавать новую тему, хотя эту можно закрыть, но все-же
Есть еще пара вопросов!
Подскажите пожалуйста, как можно реализовать следующий алгоритм (как продолжение предидущей программы):
Получин массив (как пример):
Х1 Х2 Х3 Х4
Х1 Х3 Х2 Х5 Х6
Х1 Х2 Х4
Необходимо 1-е, упростить этот массив, вынеся все элементы имеющиеся во всех строках (по типу упращения матриц), в отдельный одномерный массив, для нашего примера это Х1 и Х2:
mas1:
Х3 Х4
Х3 Х5 Х6
Х4
mas2
X1 X2

И 2-е упорядочить массив 1 по возрастанию строк, т.е.:
Х4
Х3 Х4
Х3 Х5 Х6

Буду пытаться сам, но если у кого есть идеи или куски кода пожалуйста поделитесь!
Virtualex вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двумерный массив на С Darh Помощь студентам 2 08.10.2009 20:20
Двумерный массив... Seriy8888 Паскаль, Turbo Pascal, PascalABC.NET 1 24.12.2008 21:26
Двумерный массив Wi1D Помощь студентам 0 10.12.2008 00:29
Двумерный массив в С++ Draid Помощь студентам 2 07.03.2008 22:06
Двумерный массив help Imperceptible Паскаль, Turbo Pascal, PascalABC.NET 25 02.03.2007 20:00