Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > программу простейшего редактора текстов.


Автор: Yanochka 18.12.2004, 18:13
Помогите пожалуйста. smile
http://www5.pochta.ru/hosting/N36c689cf0f3bc66b7e90f139a5c0602/go/?f=%2FDelphi_3_i.doc
Что то я не понимаю что от меня хотят, помогите мне smile

Автор: Vladimir13 18.12.2004, 18:28
Задача 1

Условие задачи. Разработать программу простейшего редак-тора текстов.
С экрана вводится произвольный текст. Текст построчно со-храняется в файле. Прочитать текст построчно из файла и в ка-ждой строке удалить лишние пробелы между словами, кроме од-ного. Вывести преобразованный текст в другое экранное окно.
Пояснения к решению задачи. Решение задачи с большим объ-емом входной информации, типа многострочного текста, требует обеспечения работы пользователя в более удобной форме, чем обычный ввод данных с клавиатуры компьютера. Чтобы один раз введенный текст не приходилось набирать заново, его предлагается сохранять в файле. Если в условии задачи предлагается работать с текстом, то для работы с текстом надо определить текстовый файл.


Запихиваешь текст в Мемо ( Memo1.Lines.LoadFromFile(filename) ). Потом считываешь построчно, пробегаешь циклом удаляя пробелы, и записываешь новую строку в новый ММемо.
Понятно?


Автор: Yanochka 18.12.2004, 18:35
не, не понятно, не могу по алгоритму составить текст функции для удаления лишних пробелов в одной строке текста.
Добавлено @ 18:36
у меня есть первое решение, так мне выдает ошибку после того как текст введен, и не удаляет пробелы

Автор: Vladimir13 18.12.2004, 18:39
for k:=1 to Memo1.LinesCount do
for i:=1 to Lendth(Memo1.Lines[k]) do
begin
if copy(Memo1.Lines[k],i,1)=' ' then del(Memo1.Lines[k],i,1);
end;

Автор: Yanochka 18.12.2004, 18:44
У меня вот как
function Stroka(s:string):string;
var i,k:integer;
begin
k:=length(s);
for i:=1 to k do
while (s[i]=' ') and (s[i+1]=' ') do begin delete(s,i+1,1);
k:=k-1;end;
Stroka:=s;

Автор: Vladimir13 18.12.2004, 18:46
чуть не дочитал условие smile . Вроде правильно, что не работает?

Автор: Yanochka 18.12.2004, 18:50
не знаю smile
Вот смотри что у меня:

Код

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, Menus, StdCtrls, System.ComponentModel;

type
 TForm1 = class(TForm)
   OpenDialog1: TOpenDialog;
   MainMenu1: TMainMenu;
   N1: TMenuItem;
   N2: TMenuItem;
   N3: TMenuItem;
   N4: TMenuItem;
   Label1: TLabel;
   Memo1: TMemo;
   Label2: TLabel;
   Label3: TLabel;
   Edit1: TEdit;
   Memo2: TMemo;
   SaveDialog1: TSaveDialog;
   procedure N3Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure N4Click(Sender: TObject);
   procedure N1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 q,w:string;
 f,f1:textfile;
 j,p:integer;

implementation

{$R *.dfm}
function Stroka(s:string):string;
var i,k:integer;
begin
k:=length(s);
for i:=1 to k do
while (s[i]=' ') and (s[i+1]=' ') do begin delete(s,i+1,1);
k:=k-1;end;
Stroka:=s;
end;

procedure TForm1.N3Click(Sender: TObject);
begin
Application.Terminate;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
memo1.Clear;
memo2.Clear;
edit1.Text:='';
if opendialog1.Execute then w:=opendialog1.filename;
assignfile(f,w);
if fileexists(w) then begin
reset(f);
memo1.Clear;
edit1.Text:=OpenDialog1.Files.DelimitedText;
while eof(f)<>true do begin readln(f,q); memo1.lines.Append(q);end;
closefile(f);
end else showmessage('Найдите файл!!!');
end;

procedure TForm1.N4Click(Sender: TObject);
begin
j:=memo1.Lines.Capacity;
memo2.Clear;
for p:=0 to j do
memo2.Lines.Append(stroka(memo1.Lines.Strings[p]));
end;

procedure TForm1.N1Click(Sender: TObject);
begin
if SaveDialog1.Execute then  q:=SaveDialog1.FileName;
assignfile(f1,q);
rewrite(f1);
j:=memo1.Lines.Capacity;
for p:=0 to j do
writeln(f1,memo1.lines.strings[p]);
closefile(f1)
end;

end.

Автор: Vladimir13 18.12.2004, 18:53
вместо while надо if
Добавлено @ 18:56
алгоритм правильный: найти пробел - если за ним еще пробел то удалить предыдущий и вернуть позицию на 1 назад

Автор: Vit 19.12.2004, 05:05
Удаление двойных пробелов:

Код

while pos('  ',s)>0 do s:=ReplaceString(s, '  ',' ',[rfReplaceAll])

Добавлено @ 05:07
Не самое лучшее решение...

Код

procedure TForm1.N3Click(Sender: TObject);
begin
Application.Terminate;
end;


Лучше так:

Код

procedure TForm1.N3Click(Sender: TObject);
begin
 Close;
end;

Автор: Vladimir13 19.12.2004, 20:34
есть решение:
for i:=1 to Memo1.LinesCount do
begin
for j:=1 to length( Memo1.Lines[i]) do
begin
if copy(memo1.Lines[i],j,1)=' ' and copy(memo1.Lines[i],j+1,1)=' '
then delete(memo1.Lines[i],j+1,1);
end;
Memo2.Lines[i]:=Memo1.Lines[i];
end;

Автор: Vit 19.12.2004, 20:39
Vladimir13, хех... а ошибок то в этом коде... проверяйте границы массивов, потом вылавливать такие ошибки замучаешся - их лучше такие не делать. Да и алгоритм работать будет со сбоями...

Автор: Vladimir13 19.12.2004, 20:49
можно поставить условие
if j= length( Memo1.Lines[i]) and copy(memo1.Lines[i],j,1)=' ' then memo2.Lines[i]:=Memo1.Lines[i]

Автор: Yanochka 19.12.2004, 22:39
У меня выходит когда хочу запусть на исполнение : Invalid threading model (STAThreadATTribute is required)
потом когда ввожу текст, потом записать пытаюсь тогда ошибка : index was outside the bonus of the array

Автор: Vladimir13 20.12.2004, 01:57
что то лучше чем ничто. Прежде чем критиковать - убедись, что то, что ты предложил работает. а мое и подработать можно при желании

Автор: Vit 20.12.2004, 02:11
Цитата(Yanochka @ 19.12.2004, 13:39)
У меня выходит когда хочу запусть на исполнение : Invalid threading model (STAThreadATTribute is required)
потом когда ввожу текст, потом записать пытаюсь тогда ошибка : index was outside the bonus of the array



А что ты делаешь? И смысл задачи? Это учебная задача или реальная? Если учебная то алгоритм будет такой:

Код

 s:=memo1.text;
 while pos('  ',s)>0 do Delete(s,pos('  ',s),1);
 memo1.Text:=s;


Если реальная то я уже дал тебе решение:

Код

while pos('  ',memo1.text)>0 do memo1.text:=ReplaceString(memo1.text, '  ',' ',[rfReplaceAll])

Добавлено @ 02:12
Цитата(Vladimir13 @ 19.12.2004, 16:57)
что то лучше чем ничто. Прежде чем критиковать - убедись, что то, что ты предложил работает. а мое и подработать можно при желании



Подработать можно, но очень сложно, код неправильно изначально разработан, доработать - это его заново переписать, а решение я уже давал, вот и ещё раз даю...

Автор: Ddddddelphi 20.12.2004, 05:45
я попробовал сделать вот такой
Код

var
s,s1:string;

begin
s:='fdss fds f '
s1:='';
repeat
s1:=s1+copy(s,1,pos(' ',s));
delete(s,1,pos(' ',s);
delete(s1,pos(' ',s1),length(s1));
until length(s)=0;
end;

здесь получаем строку вобще без пробелов, но прибавить пробел, или заставить в команде delete оставлять один пробел тоже не получилось, иначе выдаст - fdss и всё.
есть идея запоминанать строки в строковом массиве, но не думая, что моя идея здесь подойдёт

Автор: Vit 20.12.2004, 07:46
Ddddddelphi - аааа зачем так? Чем мой код плох?

Автор: Ddddddelphi 20.12.2004, 08:17
Цитата(Vit @ 20.12.2004, 02:11)
Подработать можно, но очень сложно, код неправильно изначально разработан, доработать - это его заново переписать, а решение я уже давал, вот и ещё раз даю...

я после этих строк...
но если работает зашибись! = smile smile smile

Автор: Yanochka 20.12.2004, 12:50
Vit
Задача моя учебная. Дело в том, что мне надо вточности как в задании написано. Я уже импровезировала, когда придыдущие делала, но мне за это снижали оценки. Вот и мучаюсь теперь все в точности по условию делать. smile

Автор: Vit 20.12.2004, 16:52
Другими словами надо пробелы удалять построчно? Тогда:

Код

For i:=0 to memo1.lines.count-1 do
 begin
   s:=memo1.lines[i];
   while pos('  ',s)>0 do Delete(s,pos('  ',s),1);
   memo1.lines[i]:=s;
 end;

Добавлено @ 16:57
Yanochka - опубликуй условие задачи целиком, оно у меня не грузится по тому линку

Автор: SlaUr 20.12.2004, 17:41
1.copy(memo1.Lines[i],j,1) это все равно что memo1.Lines[i][j]
2.IMHO Лучший предложеный вариант для убирания лишних пробелов while pos(' ',s)>0 do Delete(s,pos(' ',s),1);(самый простой и работающий без ошибок)

Автор: Yanochka 20.12.2004, 17:53
Цитата
Условие задачи. Разработать программу простейшего редак-тора текстов.
С экрана вводится произвольный текст. Текст построчно со-храняется в файле. Прочитать текст построчно из файла и в ка-ждой строке удалить лишние пробелы между словами, кроме од-ного. Вывести преобразованный текст в другое экранное окно.

Пояснения к решению задачи. Решение задачи с большим объ-емом входной информации, типа многострочного текста, требует обеспечения работы пользователя в более удобной форме, чем обычный ввод данных с клавиатуры компьютера. Чтобы один раз введенный текст не приходилось набирать заново, его предлагается сохранять в файле. Если в условии задачи предлагается работать с текстом, то для работы с текстом надо определить текстовый файл.
Вопрос 1. Запишите определение текстового файла: Type_________Var
Вопрос 2. Запишите основные процедуры и функции в языке для работы с текстовыми файлами:
1. Для определения размера файла ___________
2. Для записи данных по строкам в файл ________
3. Для чтения данных по строкам из файла ______
Вопрос 3. Опишите действия, которые определяют режимы ра-боты с файлом:
1. Связь конкретного файла с файловой переменной
2. Установление режима записи данных в файл
3. Установление режима чтения данных из файла
4. Добавление записи в текстовый файл без перезаписи данных
5. Закрытие файла
Вопрос 4. Проверьте свои знания по компоненту OpenDialog:
1. Назовите страницу, на которой находится компонент:
2. Запишите предложение для проверки существования файла:
3. Запишите сообщение об отсутствии требуемого файла:
4. Запишите последовательность действий с компонентом для открытия диалога только для выбранного вами типа файлов, напри-мер, *.pas, *.myf или любого другого расширения:
Выбрать свойство компонента OpenDialog
Записать выражение, которое обеспечит выборку при открытии диалога только требуемого типа файлов – текстового:

Запишите процедуру создания формы:
procedure TForm1.FormCreate(Sender: TObject);
begin
memo1. ________________________________ ;
memo2. ________________________________ ;
edit1. ___________________________________ ;
end;

Опишите все объявленные типы данных и переменные, которые будут действительны для всех методов вашей программы. Для работы с файлами среда Delphi требует ограничить длины строк, поэтому надо ввести новый тип строки, ограниченной длины:
Type    Строка_____________
            Файл______________
            Переменные_________


Напишите текст функции для удаления лишних пробелов в одной строке текста. В списке формальных параметров функции обязательно надо указать строковую переменную. Тип результата вычисления функции должен быть также строкой.
function  Stroka( ________________ ): ____________ ;
  var
  begin
По алгоритму http://zdbhgtyuji.pochta.ru/image001.png

Написать процедуру для считывания текста из первого окна в файл
procedure TForm1.N1Click(Sender: TObject);
var
begin
// Процедура закрытия файла
end;

Напишите процедуру для чтения текста из файла, преобразования текста и вывода преобразованного текста во второе текстовое окно (для альтернативы меню «Преобразование текста»). При работе с файлами необходимо в программе иметь действие, обеспечивающее проверку существования файла или его правильного выбора.
procedure TForm1.N3Click(Sender: Tobject);
var
// Проверка существования файла
begin
End;

Для завершения текста программы осталось написать альтернативу меню «Выход». Это действие опишите самостоятель-но. Запустите программу и протестируйте ее с произвольными тек-стами и файлами.


Вот что мне надо сделать..
Может http://www2.pochta.ru/hosting/Nb84792e3a67844902e6a9b7dba02793/go/?f=%2FDelphi_3_i.doc скачается

Автор: SlaUr 20.12.2004, 18:06
Функция Для определения размера файла(выдает -1 если файла нет)

Код

Function FileSize(path:string):int64;
var s1:tSearchRec;
if FindFirst(path,faAnyFile,S1) = 0 then
begin
Result:=s1.Size;
end else Result:=-1;

end;

2. Для чтения данных по строкам из файла
Если бы не было написано по строкам то можно было бы написать просто Memo1.lines.LoadFromFile а так придется вручную:
Код

var f1:text;

Procedure Read(path:string);
var st1:string;
begin
Assign(F1,path);
{$I-}Reset(F1);        {$I+}
if IORESULT<>0 then begin ShowMessage('Нет входного файла');Exit;end;
Form1.Memo1.Lines.Clear;
While Not Eof (F1) do
begin
  ReadLn(f1,st1);
   Form1.Memo1.Lines.Add(St1);
end;
{$I-}Close(F1) {$I+};if IORESULT<>0 then;

end;



2. Для записи данных по строкам в файл
Код

var f1:text;

procedure Save(path:string);
var i1:integer;
begin
Assign(F1,path);
{$I-}Rewrite(F1);        {$I+}
if IORESULT<>0 then begin ShowMessage('Нет могу создать выходной файл');Exit;end;
For i1=0 to memo2.Lines.Count-1 do WriteLn(F1,memo2.lines[i1]);
{$I-}Close(F1) {$I+};if IORESULT<>0 then;
end;

Автор: Vit 20.12.2004, 18:22
Цитата(SlaUr @ 20.12.2004, 08:41)
1.copy(memo1.Lines[i],j,1) это все равно что memo1.Lines[i][j]


Нет, если строка короче чем j то copy(memo1.Lines[i],j,1) проглотит без ошибок, а memo1.Lines[i][j] чревато многочисленными проблемами, от index out of bound в лучшем случае до необъяснимого Access Violation в каком-то случайном месте.

Цитата
Вопрос 1. Запишите определение текстового файла: Type_________Var


Var t:TextFile;

Цитата
Вопрос 2. Запишите основные процедуры и функции в языке для работы с текстовыми файлами:
1. Для определения размера файла ___________


Код

Function GetFileSize(FileName:string):int64;
 var sr:TSearchRec;
begin
 if SysUtils.FindFirst(FileName, faAnyFile, sr)=0 then Result:=sr.Size else Result:=-1;
 SysUtils.Findclose(sr);
end;


2. Для записи данных по строкам в файл ________

Код

Procedure WriteToFile(FileName:string; Content:TStrings);
 var t:TextFile;
       i:integer;
begin
 AssignFile(t, FileName);
 Rewrite(t);
 For i:=0 to Content.count-1 do Writeln(t, Content[i]);
 CloseFile(t);
end;


Применение:

WriteToFile('c:\myText.txt', Memo1.lines);


Цитата
3. Для чтения данных по строкам из файла ______

Код

Procedure ReadFromFile(FileName:string; Content:TStrings);
 var t:TextFile;
       s:String;
begin
 AssignFile(t, FileName);
 Reset(t);
 Content.clear;
 While not eof(t) do
   begin
      Readln(t, s);
      Content.Add(s);
   end;
 CloseFile(t);
end;


Применение:

ReadFromFile('c:\myText.txt', Memo1.lines);


Цитата
Вопрос 3. Опишите действия, которые определяют режимы ра-боты с файлом:

1. Связь конкретного файла с файловой переменной

AssignFile(t, FileName);

Цитата
2. Установление режима записи данных в файл
3. Установление режима чтения данных из файла


Имеется ввиду reset/rewrite/append или FileMode?

4. Добавление записи в текстовый файл без перезаписи данных

Append(t);

5. Закрытие файла

CloseFile(t);

Вопрос 4. Проверьте свои знания по компоненту OpenDialog:
1. Назовите страницу, на которой находится компонент:

На той на которую поставишь, Дельфи позволяет менять эту страницу. По умолчанию - Dialogs

2. Запишите предложение для проверки существования файла:

Код

if FileExists(OpenDialog1.FileName) then


3. Запишите сообщение об отсутствии требуемого файла:

Код

if not FileExists(OpenDialog1.FileName) then
 ShowMessage(Format('File %s is not exist',[OpenDialog1.FileName]))



Цитата
Запишите процедуру создания формы:
procedure TForm1.FormCreate(Sender: TObject);
begin
memo1. ________________________________ ;
memo2. ________________________________ ;
edit1. ___________________________________ ;
end;


Этого я не понял!

Цитата
Опишите все объявленные типы данных и переменные, которые будут действительны для всех методов вашей программы. Для работы с файлами среда Delphi требует ограничить длины строк, поэтому надо ввести новый тип строки, ограниченной длины:
Type   Строка_____________
            Файл______________
            Переменные_________


Выделенная красным брехня! Для строковых типов ограничений по длинне нет, есть только некомпетентность преподавателей, испрользуем:

Код

procedure TForm1.Button1Click(Sender: TObject);
 var s:string;
     i:integer;
     t:TextFile;
begin
 AssignFile(t,'c:\test.txt');
 Rewrite(t);
 For i:=1 to 100000 do s:=s+'A';
 Writeln(t, s);
 CloseFile(t);
end;


Пожалуйста - этот код записывает строку в 100000 символов!

Напишите текст функции для удаления лишних пробелов в одной строке текста. В списке формальных параметров функции обязательно надо указать строковую переменную. Тип результата вычисления функции должен быть также строкой.

Код

function  Stroka(s:string):string;
 begin
   while pos('  ',s)>0 do Delete(s,pos('  ',s),1);
   result:=s;
 end;



Цитата
Написать процедуру для считывания текста из первого окна в файл



Пример уже давал

PS. Господи! За что ты наказываешь нас преподавателями-дегенератами!

Автор: Yanochka 20.12.2004, 18:27
Vit Большое тебе спасибо smile smile smile
И всем кто старался мне помочь. smile

Автор: SlaUr 21.12.2004, 05:43
Цитата
Выделенная красным брехня! Для строковых типов ограничений по длинне нет, есть только некомпетентность преподавателей,

Насколько я знаю ограничение строки все же есть (речь идет о Гигабайтах) или я не прав?

Автор: Vit 21.12.2004, 05:50
Цитата(SlaUr @ 20.12.2004, 20:43)
Насколько я знаю ограничение строки все же есть (речь идет о Гигабайтах) или я не прав?



Да, ограничения типа String - 2 Gb, но ведь тип свой городить не надо для этого! Тов. преподаватель там явно путает типизированные и текстовые файлы, это в типизированных файлах нужен какой-то дериват от shortstring типа string[20], для текстовых файлов - это на фиг не нужно...

Автор: SlaUr 21.12.2004, 05:55
Цитата
Да, ограничения типа String - 2 Gb, но ведь тип свой городить не надо для этого! Тов. преподаватель там явно путает типизированные и текстовые файлы, это в типизированных файлах нужен какой-то дериват от shortstring типа string[20], для текстовых файлов - это на фиг не нужно...

Понятно что преподователь не прав и кстати очень мало преподов действительно знающих и умеющих программировать.
Я знаю только одного.Хотя работаю в универе и с преподавтелями сталкивался когда был администратором класса ,над одним я вообще посмеивался (незлобно) он такую чушь молол по Паскалю.Ну может не чушь но некачественные у него были занятия.

Автор: Alex 16.3.2005, 08:14
smile Vit, я когда читаю задания, которые Yanochka выкладывает, я просто не могу. Было дело, реализовывал я ей программу с типизированными файлами это шоу. Кого учат, просто не понимаю. smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)