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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2009, 19:28   #1
пыхонин филипп
 
Регистрация: 05.01.2009
Сообщений: 3
По умолчанию обьявление классов

помогите доделать
вот задание и ниже точто у меня получилось
Задан текстовый файл, содержащий фрагмент программы на Object Pascal. Найти объявления классов, имеющих конструкторы, и сформировать файл, состоящий из записей следующей структуры: имя класса – число конструкторов. Файл должен быть отсортирован по именам классов.


unit Unit1;

interface

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

type
TForm1 = class(TForm)
Panel1: TPanel;
Panel2: TPanel;
Button1: TButton;
Button2: TButton;
Button3: TButton;
ListBox1: TListBox;
Splitter1: TSplitter;
ListBox2: TListBox;
OpenDialog1: TOpenDialog;
SaveDialog1: TSaveDialog;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
if
opendialog1.execute then
listbox1.Items.LoadFromFile(OpenDia log1.FileName);

end;

procedure TForm1.Button2Click(Sender: TObject);
var
i:integer;
begin
i:=0;
while listbox1.items[i]<>'implementation' do
begin
if (pos('= class',listbox1.Items[i])>0) and (pos(';',listbox1.Items[i])=0) then
listbox2.items.Add(copy(Listbox1.It ems[i], 1, pos('=',listbox1.Items[i])-1));
i:=i+1;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if Savedialog1.Execute then listbox2.Items.SaveToFile(savedialo g1.filename);
end;

end.
пыхонин филипп вне форума Ответить с цитированием
Старый 21.03.2009, 20:10   #2
Jean-Esther
Пользователь
 
Аватар для Jean-Esther
 
Регистрация: 15.01.2009
Сообщений: 69
По умолчанию

Не совсем понятно, к чему был приведен код, но будем считать, что это какая-то наработка решения.
Код:
procedure TForm1.Button1Click(Sender: TObject); {по событию кнопки открываем файл и загружаем в визуальный список}
begin
if opendialog1.execute then
listbox1.Items.LoadFromFile(OpenDialog1.FileName); 
end;

procedure TForm1.Button2Click(Sender: TObject); {это анализ кода}
var i:integer;
begin
i:=0;
while listbox1.items[i]<>'implementation' do {пока мы в интерфейсе...хотя не факт, что в строке кроме 'implementation' иных символов не будет, включая пробелы}
begin 
if (pos('= class',listbox1.Items[i])>0) {если в строке есть '= class' через пробел (почему так?)}
and (pos(';',listbox1.Items[i])=0) {и нет ';'}
then
listbox2.items.Add(copy(Listbox1.Items[i], 1, pos('=',listbox1.Items[i])-1)); {добавляем во второй список то,что перед знаком равенства}
i:=i+1; {инкремент счетчика}
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
if Savedialog1.Execute then listbox2.Items.SaveToFile(savedialog1.filename);
end;
Так-с, будем думать, как сделать, чтобы по событию второй кнопки подсчитывало количество классов с конструкторами.
Во-первых, у меня неприятное чувство, что для анализа придется весь файл кода затолкать в одну строку (т.е. убрать LF и CR) и анализировать все одним потоком.
Во-вторых, описание класса начинается словом «class» и заканчивается словом «end;». Имя класса — первое слово до «class».
Попытаюсь сходу привести код, поясняющий "глубоко филосовские" мысли:
Код:
procedure GetCode(const FileName:string; var s:string);
var F:TextFile; line:string;
begin
AssignFile(F,FileName);
Reset(F);
s:='';
while Not Eof(F) do
  begin
    Readln(F,line);
    s:=s+line;
  end;
{<!-- Сюда неплохо (...необходимо!) было бы вставить перевод верхнего регистра в нижний -->}
CloseFile(F);
end;

procedure Analyze(s:string);
var cc:array[1..100] of record name:string; count:byte; {count of construcotrs}
var k,c,p,q:integer;
begin
count:=0;
Repeat
k:=pos('class',k);
if k<>0 then {существет еще какой-то класс}
  begin
    inc(count); {добавляем класс}
    q:=k-1;
    while s[q]<>'=' do dec(q); {доходим до знака равенства}
    repeat dec(q);
    until s[q]<>' '; {доходим до конца имени класса}
    p:=q;
    repeat dec(p);
    until s[p]<>' ';
    inc(p); {начало имени}
    cc[count].name:=copy(s,p,q-p+1);
    delete(s,1,k+4); {далее идет описание класса}
    k:=pos('end;',s); {конец описания}
    cc[count].count:=0; {пока ничего не найдено}
    repeat
      q:=pos('constructor',copy(s,1,k-1));
      if q<>0 then {и по аналогии определяем имя}
      cc[count].count+=1;
    until q=0;
  end;
Until k=0;
end;
Silence is of great value...
Jean-Esther вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массив классов nns2009 Общие вопросы C/C++ 15 03.02.2009 00:47
Регистрация классов. Nytlec Помощь студентам 1 18.01.2009 14:05
агрегирование классов M_Yuri Общие вопросы Delphi 3 12.02.2008 18:31
использование множества классов studenth Общие вопросы C/C++ 5 08.11.2007 14:57