Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 15.04.2015
Сообщений: 59
1

Не могу найти ошибку в коде

06.05.2015, 21:03. Показов 2144. Ответов 43
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть текст обычный. Провели его через морфологический анализатор русского языка. Теперь 2 файла: первый оригинал текста, второй размеченный.
слева обычный
справа размеченный
Есть БД (со столбцами: объект1, объект 2, экземпляр, тип отношения). Загружаем Текст первый в RichEdit. а второй в RichEdit2.
из БД берутся слова(они хранятся в массиве). И эти слова нужно сначала найти в тексте слева. То есть. Если наше слова из БД находится между { и = то, слово стоящее перед { надо закрасить, но в тексте который срава)
ПРоцесс работы программы:Загрузить тексты в ричэдиты. Извлекаем слова из БД в массив,по запросу. Затем Эти слова ищем в тексте размеченном(ричэдит1). если в указанный промежуток { и = попадает, значит это же слово закрашиваем его в тексте обычном(ричэдит2).
Видимость RichEdit1=false
он для работы только с ним
После раскраски: если в пределах одного предложения есть два закрашенных слова существительных (в размеченном тексте они =S и падеж: им, а также есть любое не закрашенное слово =V то эту тройку нужно изъять)
и выдать пользователю.
он говорит отменить или добавить в бд

Не могу найти ошибку в коде

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
function SearchForText(RichEdit: TRichEdit): Boolean;
var
StartPos, Position, Endpos: Integer;
begin
for i:=1 to count do
begin
StartPos := 0;
with RichEdit do
begin
Endpos := Length(RichEdit.Text);
Lines.BeginUpdate;
while FindText(slova[i], StartPos, Endpos, [stMatchCase])<>-1 do
begin
Endpos := Length(RichEdit.Text) - startpos;
Position := FindText(slova[i]+' ', StartPos, EndPos, []); //stMatchCase
Inc(StartPos, Length(slova[i]+' '));
SetFocus;
SelStart := Position;
SelLength := Length(slova[i]);
SelAttributes.Style:=[fsBold];
SelAttributes.Color:=clYellow;
 
end;
Lines.EndUpdate;
end;
end;
end;
 
procedure TForm1.btn1Click(Sender: TObject);
begin
try
i:=1;
ADOQuery1.Active := False;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM Predikat WHERE TipOtn = "'+ DBComboBox1.Text+'"');
ADOQuery1.Active:=True;
while(ADOQuery1.Eof <> true) do
begin
slova[i]:= ADOQuery1.Fields[1].AsString;
i:=i+1;
slova[i]:= ADOQuery1.Fields[2].AsString;
i:=i+1;
slova[i]:= ADOQuery1.Fields[3].AsString;
count:=i;
i:=i+1;
ADOQuery1.Next;
end;
 
end;
end;
Пример. вот одно предложение в оригинале такое: 
1. Процессор есть центральное устройство компьютера.
в размеченном такое:
Процессор{процессор=S,муж,неод=им,ед|=S,муж,неод=вин,ед}
есть{есть=V,несов=инф,пе|есть=S,сред,неод=им,ед|=V,нп=наст,ед,изъяв,2-л,несов|=V,нп=наст,ед,изъяв,3-л,несов }
центральное{центральный=A=им,ед,полн,сред|=A=вин,ед,полн,сред}
устройство{устройство=S,сред,неод=им,ед|=S,сред,неод=вин,ед}
компьютера{компьютер=S,муж,неод=род,ед}
Пример. вот одно предложение в оригинале такое:
1. Процессор есть центральное устройство компьютера.
в размеченном такое:
Процессор{процессор=S,муж,неод=им,ед|=S,муж,неод=вин,ед}
есть{есть=V,несов=инф,пе|есть=S,сред,неод=им,ед|=V,нп=наст,ед,изъяв,2-л,несов|=V,нп=наст,ед,изъяв,3-л,несов }
центральное{центральный=A=им,ед,полн,сред|=A=вин,ед,полн,сред}
устройство{устройство=S,сред,неод=им,ед|=S,сред,неод=вин,ед}
компьютера{компьютер=S,муж,неод=род,ед}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.05.2015, 21:03
Ответы с готовыми решениями:

Не могу найти ошибку в коде
Нужно, чтобы программа показывала количество нечётных элементов массива. А у меня оно всё время...

Не могу найти ошибку в коде
Сформировать текстовый файл d из файла f, включая в него строки, которые начинаются на гласную...

Не могу найти ошибку в коде
uses SysUtils; const t=5; type t1=array of integer; var n,m,max1,max2,l:integer; mas:t1;...

Не могу найти ошибку в коде
Слова в тексте разделены пробелом. Подсчитать количество слов, длина которых не превышает 4-х букв....

43
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
06.05.2015, 21:44 2
Самое главное забыл: в чем ошибка-то проявляется ?)
0
0 / 0 / 0
Регистрация: 15.04.2015
Сообщений: 59
06.05.2015, 21:54  [ТС] 3
FIL,
Цитата Сообщение от vladellec Посмотреть сообщение
После раскраски: если в пределах одного предложения есть два закрашенных слова существительных (в размеченном тексте они =S и падеж: им, а также есть любое не закрашенное слово =V то эту тройку нужно изъять)
и выдать пользователю.
А он говорит отменить или добавить в бд
0
243 / 193 / 94
Регистрация: 01.05.2015
Сообщений: 732
06.05.2015, 22:46 4
vladellec, это понятно. У тебя это не реализовано как я вижу. В чем проблема то?
1
0 / 0 / 0
Регистрация: 15.04.2015
Сообщений: 59
06.05.2015, 23:50  [ТС] 5
VladWH, проблема в синтаксисе. Не представляю как представить.

Добавлено через 9 минут
VladWH, Представленный код закрашивает слова из БД через функцию, а как дальше провернуть, чтобы находил в одном файле и размечал в другом? А затем выдавал триплеты.... то что описано выше?
0
243 / 193 / 94
Регистрация: 01.05.2015
Сообщений: 732
07.05.2015, 00:04 6
Цитата Сообщение от vladellec Посмотреть сообщение
чтобы находил в одном файле и размечал в другом
Так у тебя изначально только не размеченный текст есть или как?
Или и обычный и в таком виде?
Цитата Сообщение от vladellec Посмотреть сообщение
компьютера{компьютер=S,муж,неод=род,ед}
1
0 / 0 / 0
Регистрация: 15.04.2015
Сообщений: 59
07.05.2015, 00:06  [ТС] 7
VladWH, и обычный и в таком виде текст.
0
243 / 193 / 94
Регистрация: 01.05.2015
Сообщений: 732
07.05.2015, 00:16 8
vladellec, я просто понять пытаюсь... вот закрасил ты его, а дальше то что осталось сделать? только предложения вытащить, верно?

Просто меня немного смутило найти и закрасить в одном файле, а разметить в другом.
Что значит разметить в другом?
0
0 / 0 / 0
Регистрация: 15.04.2015
Сообщений: 59
07.05.2015, 00:26  [ТС] 9
VladWH, Размеченный текст нужен, чтобы по начальным формам определять подходит слово или нет. Т.е. если вот слово из БД и слово в размеченном тексте, которое находится между { и = совпадает, то получается, что слово которое перед { нужно закрасить. Это сокращает возможность закрашивания лишних слов в обычном тексте.
0
243 / 193 / 94
Регистрация: 01.05.2015
Сообщений: 732
07.05.2015, 00:41 10
vladellec, могу завтра скинуть пример того как бы я это реализовал, но в случае с данной задачей я не уверен, что мое решение будет абсолютно верным.
1
0 / 0 / 0
Регистрация: 15.04.2015
Сообщений: 59
07.05.2015, 00:48  [ТС] 11
VladWH, будет здорово! твои решения верны относительно=) Абсолютность - она у каждого своя=)
0
243 / 193 / 94
Регистрация: 01.05.2015
Сообщений: 732
07.05.2015, 12:04 12
Сделал небольшой набросок... к сожалению без комментариев... Некоторые процедуры и функции не дописаны, то есть идею того "как сделать" я свою там изложил, а подойдет тебе такой вариант или нет смотри сам. Будут вопросы, спрашивай.
Вложения
Тип файла: rar Работа с текстом.rar (173.6 Кб, 3 просмотров)
1
0 / 0 / 0
Регистрация: 15.04.2015
Сообщений: 59
07.05.2015, 17:29  [ТС] 13
VladWH,
1. Откуда загружаются файлы в компоненты?
2. Что значит case 83 и 86?
Не могу найти ошибку в коде

3. Я понимаю работу этой функции и процедуры. А вот чем еще можно его дополнить?
Не могу найти ошибку в коде

Не могу найти ошибку в коде
0
243 / 193 / 94
Регистрация: 01.05.2015
Сообщений: 732
08.05.2015, 00:03 14
Цитата Сообщение от vladellec Посмотреть сообщение
Откуда загружаются файлы в компоненты?
В данный момент ни откуда. Я текст в design-time ввел
Цитата Сообщение от vladellec Посмотреть сообщение
Что значит case 83 и 86?
код букв S и V соответственно
Цитата Сообщение от vladellec Посмотреть сообщение
А вот чем еще можно его дополнить?
Удаление пробелов( на всякий случай), отлов ошибок, чтение если все в одну строку и так далее.
1
0 / 0 / 0
Регистрация: 15.04.2015
Сообщений: 59
08.05.2015, 00:20  [ТС] 15
VladWH,
У меня слова из бд извлекаются таким образом:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
try
i:=1;
ADOQuery1.Active := False;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM Predikat WHERE TipOtn = "'+ DBComboBox1.Text+'"');
ADOQuery1.Active:=True;
while(ADOQuery1.Eof <> true) do
begin
slova[i]:= ADOQuery1.Fields[1].AsString;
i:=i+1;
slova[i]:= ADOQuery1.Fields[2].AsString;
i:=i+1;
slova[i]:= ADOQuery1.Fields[3].AsString;
count:=i;
i:=i+1;
ADOQuery1.Next;
end;
except
on e:Exception do
end;
Код находится на кнопке Закрасить. У тебя бд в Мемо задана. Этот массив slova[] он каждый столбец в отдельный собирает. В этом случае каким будет код, если слова из массива идут…?
Насчет Триплета: если он сначала выдавать в окно будет эти триплеты, с кнопками отменить или добавить. Если выбрано добавить, то потом уже сразу в бд загружать. Так можно здесь сделать?
То есть с Мемо не работая.
0
243 / 193 / 94
Регистрация: 01.05.2015
Сообщений: 732
08.05.2015, 00:34 16
Цитата Сообщение от vladellec Посмотреть сообщение
меня слова из бд извлекаются
И что? Пусть хоть из космоса извлекаются) главное получить массив слов, а как это не важно
Цитата Сообщение от vladellec Посмотреть сообщение
В этом случае каким будет код, если слова из массива идут
Таким же и будет. Сейчас слова откуда по твоему идут? Из массива и идут
Цитата Сообщение от vladellec Посмотреть сообщение
если он сначала выдавать в окно будет эти триплеты, с кнопками отменить или добавить. Если выбрано добавить, то потом уже сразу в бд загружать. Так можно здесь сделать?
можно, потому что опять таки не важно куда ты их будешь отправлять в Memo, в бд или еще куда. Ты их вытащил, а дальше работай с ними как тебе удобно
1
0 / 0 / 0
Регистрация: 15.04.2015
Сообщений: 59
08.05.2015, 00:48  [ТС] 17
VladWH,
А как правильно массив из бд вместо слов из Мемо сделать? Что то я совсем не то сделал по ходу, думал только как-нибудь так получится:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
procedure TForm1.btn1Click(Sender: TObject);
var i, StartPos, Position, Endpos: Integer;
begin
try
i:=1;
ADOQuery1.Active := False;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('SELECT * FROM Predikat WHERE TipOtn = "'+ DBComboBox1.Text+'"');
ADOQuery1.Active:=True;
while(ADOQuery1.Eof <> true) do
begin
slova[i]:= ADOQuery1.Fields[1].AsString;
i:=i+1;
slova[i]:= ADOQuery1.Fields[2].AsString;
i:=i+1;
slova[i]:= ADOQuery1.Fields[3].AsString;
count:=i;
i:=i+1;
ADOQuery1.Next;
end;
 
for i:=0 to High(slova) do
begin
StartPos := 0;
with TextRichEdit do
begin
Endpos := Length(TextRichEdit.Text);
Lines.BeginUpdate;
while FindText(slova[i],
StartPos, Endpos, [stMatchCase])<>-1 do
begin
Position := FindText(slova[i]+' ',
StartPos, EndPos, [stMatchCase]);
Endpos := Length(TextRichEdit.Text) - startpos;
Inc(StartPos, Position+Length(words[i]));
SetFocus;
SelStart := Position;
SelLength := Length(slova[i]);
SelAttributes.Style:=[fsBold];
SelAttributes.Color:=clYellow;
if Position<>-1 then
AddSelWord(Position, Words[i]);
end;
Lines.EndUpdate;
end;
end;
except
on e:Exception do
end;
end;
0
243 / 193 / 94
Регистрация: 01.05.2015
Сообщений: 732
08.05.2015, 00:53 18
переменная slova - что это? где объявлена?

Добавлено через 1 минуту
Цитата Сообщение от vladellec Посмотреть сообщение
AddSelWord(Position, Words[i]);
тогда и тут slova
1
0 / 0 / 0
Регистрация: 15.04.2015
Сообщений: 59
08.05.2015, 00:56  [ТС] 19
VladWH,
Delphi
1
slova: array [1..100] of string;
Массив для слов из бд по запросу.
Просто твой предложенный вариант отлично подходит, только вот процесс того, что брать слова из бд вместо Мемо и записывать так же в БД вместо Мемо меня немного ввел в тупик.
0
243 / 193 / 94
Регистрация: 01.05.2015
Сообщений: 732
08.05.2015, 01:05 20
Лучший ответ Сообщение было отмечено vladellec как решение

Решение

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
i:=0; 
while(ADOQuery1.Eof <> true) do
begin
SetLength(words,i+3);
words[i]:= ADOQuery1.Fields[1].AsString;
Inc(i)
words[i]:= ADOQuery1.Fields[2].AsString;
Inc(i)
words[i]:= ADOQuery1.Fields[3].AsString;
count:=i;
Inc(i)
ADOQuery1.Next;
end;
1
08.05.2015, 01:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.05.2015, 01:05
Помогаю со студенческими работами здесь

Не могу найти ошибку в коде
В общем сидел я делал програмку и тут столкнулся с не понятной вещью. Сидел около часа, но так и не...

Не могу найти ошибку в коде
Вот такая задачка: Какое давление на дно сосуда оказывает слой керосина высотой 0,6м?...

Не могу найти ошибку в коде
Здравствуйте. Очень нужна помощь. Есть форма 1, на ней расположены компонент RadioGroup c двумя...

Не могу найти ошибку в коде Delphi
Текст Задачи: Описать класс «Обыкновенная дробь» с двумя полями: числитель и знаменатель, с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru