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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.06.2009, 13:36   #1
Roman Charming
Пользователь
 
Регистрация: 18.06.2009
Сообщений: 10
По умолчанию Просьба объяснения выделенных строк кода проги...

Всем привет

Задачка вот такая:

Дан файл, который содержит текст на русском языке и некоторые два слова (их можно задавать). Определить, сколько раз они встречаются в тексте и сколько из них – непосредственно друг за другом.


Код программы мне частично понятен, но преподаватель прикапывается очень строго . В конце на всякий случай вставил скрин проги в Дельфи

Прошу помочь, пожалуйста, с объяснением выделенного фрагмента. Особенно те, что красным цветом

Вот код:


----------------------------------------------------------

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
OpenDialog1: TOpenDialog;
Memo1: TMemo;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
f: textfile;
str,edit: string;
slovo1,slovo2: string;
count, count1, count2,i: integer;
slova: array of string;
begin
slovo1:=edit1.Text;
slovo2:=Edit2.Text;
//Открываем опендиалог, чтобы выбрать нужный нам путь к файлу
if OpenDialog1.Execute
then begin
//Открываем файл
assignfile (f, OpenDialog1.FileName);
reset(f);
//Считываем с него информацию в переменную str
while not Eof(F) do
begin
readln(f,edit);
str:=str+' '+edit;
end;
CloseFile(F);

edit:='';
//Посимвольно считываем строку
for i:=1 to length(str)-1 do
begin
//убираем все знаки препинания и лишние пробелы
if (str[i] <>'.')
and (str[i]<>'!')
and (str[i]<>',')
and (str[i]<>'"')
and (str[i]<>'-')
and (str[i]+str[i+1]<>' ') then edit:=edit+str[i];


end;

Memo1.Clear;
count:=1;

//Заносим все слова в массив
while (pos(' ',edit)>0) do
begin
SetLength(slova,count);
slova[count-1]:=copy(edit,1,pos(' ',edit)-1);
Delete(edit,1,pos(' ',edit));
count:=count+1;
end;
slova[count-1]:=edit;


count1:=0; //количество 1 слова
count2:=0; //количество 2 слова
count:=0; //количество следю за друг другом

for i:=0 to High(slova) do
begin
if slovo1=slova[i] then count1:= count1+1;
if slovo2=slova[i] then count2:= count2+1;
if ((slovo1=slova[i]) and (slovo2=slova[i+1])) or
((slovo2=slova[i]) and (slovo1=slova[i+1])) then count:=count+1;
end;

Memo1.Clear;
Memo1.Text:=str;

Label1.Caption:=slovo1+': '+
IntToStr(count1)+' '+slovo2+': '+
IntToStr(count2)+' След. друг за другом: '+IntToStr(count);
end;
end;
end.
Изображения
Тип файла: jpg 1.jpg (22.1 Кб, 123 просмотров)
Roman Charming вне форума Ответить с цитированием
Старый 18.06.2009, 13:53   #2
GROWZER
Пользователь
 
Аватар для GROWZER
 
Регистрация: 16.06.2009
Сообщений: 47
По умолчанию

Код:
.............
edit:='';
//Посимвольно считываем строку
for i:=1 to length(str)-1 do // ЗАПУСК цыкла с перебором от 1 до длины сформированой строки считаной из файла.
begin
//убираем все знаки препинания и лишние пробелы
   if (str[i] <>'.') // берем итый элемент строки и анализируем его на наличие знаков припинания...
      and (str[i]<>'!')
      and (str[i]<>',')
      and (str[i]<>''')
      and (str[i]<>'-')
      and (str[i]+str[i+1]<>'  ') then   edit:=edit+str[i]; // Если сивол не являеться не одним из 
                                                                        // "знаков препинания "( ! | , | ' | - |   |) тогда дописуем его в 
                                                                        // конец переменной edit .... в которой по завершению цыкла сформируеться 
                                                                        // новая строка сосотояшая из слов разделеннх одним пробелом.....
............
GROWZER вне форума Ответить с цитированием
Старый 18.06.2009, 14:27   #3
Roman Charming
Пользователь
 
Регистрация: 18.06.2009
Сообщений: 10
По умолчанию

for i:=1 to length(str)-1 do

А почему там -1 а не просто 1? что значит -1, в строке ? как такое может быть?
Roman Charming вне форума Ответить с цитированием
Старый 18.06.2009, 16:44   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Может потому что автор сего писания стратегию заранее не продумал. Или недоотладил.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 19.06.2009, 07:00   #5
Roman Charming
Пользователь
 
Регистрация: 18.06.2009
Сообщений: 10
По умолчанию

Нет -1 должна быть, исходя из условия...где идет подсчет.
Roman Charming вне форума Ответить с цитированием
Старый 19.06.2009, 07:00   #6
Roman Charming
Пользователь
 
Регистрация: 18.06.2009
Сообщений: 10
По умолчанию

Вопрос на миллион ммм?
Roman Charming вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как запустить приложение через список выделенных файлов simpolmix Общие вопросы Delphi 3 07.05.2009 23:14
Текстовый редактор для открытия всех файлов в выделенных папках, подпапках. Alar Софт 5 20.01.2009 16:25
Как получить имена нескольких файлов выделенных в OpenDialog Comer_Jus Общие вопросы Delphi 2 26.05.2008 19:47