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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.07.2009, 17:29   #1
blackberryx
 
Аватар для blackberryx
 
Регистрация: 05.10.2008
Сообщений: 9
По умолчанию Игра - составление слов.

Правила просты : есть исходное слово. Допустим, космонавтика.
Есть база данных слов в файле baza.txt
Надо записать в файл ans.txt все слова из baza.txt , которые можно составить из букв слова космонавтика.
Написал программу, однако при trace обнаружил, что берёт слова не из baza.txt, а из левого источника. (Или проблема с кодировкой, которою я решить не могу)


Код:
var t,a : text;
    slovo,source : string;
    bukva : char;
    i,j : integer;
    m : array[1..40] of char;
Function check (slovo, source : string) : boolean;
Var tmp, src : string; k : integer;
Begin
   For k:=1 To Length(slovo) Do
   Begin
      tmp:=copy(source,pos(slovo[i], source),1);
      src:=src+tmp;
   End;
   If src=slovo Then check:=true else check:=false;
End;
begin
   Writeln('Vvedite ishodnoe slovo');
   Readln(source);
   Assign(t, 'baza.txt');
   Reset(t);
   Assign(a, 'ans.txt');
   Append(a);
   While not EoF(t) do
   Begin
      Readln(t, slovo);
      If check(slovo, source) then Writeln(a, slovo);
   End;
End.
Помогите дописать программу, пожалуйста. Файл базы могу приложить, если надо.
blackberryx вне форума Ответить с цитированием
Старый 02.07.2009, 18:07   #2
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Цитата:
Или проблема с кодировкой, которою я решить не могу)
Именно так. Кодировка в текстовых редакторах под Виндой ANSI под Дос - ASCII. Выходы: 1. Писать файл базы в редакторе Паскаля и сохранять *.pas 2. Конвертировать предварительно файл из Win в Dos. Написать процедуру конвертирования в программе.
Код:
procedure Convert(var a:string);
var i:integer;
begin
for i:=1 to length(a) do
if ord(a[i]) in [192..239] then a[i]:=chr(ord(a[i])-64)
else if ord(a[i]) in [240..255] then a[i]:=chr(ord(a[i])-16)
else if ord(a[i])=168 then a[i]:=chr(ord(240))
else if ord(a[i])=184 then a[i]:=chr(ord(241));
end;
После чтения строки из файла писать Convert(s);
puporev вне форума Ответить с цитированием
Старый 02.07.2009, 18:25   #3
blackberryx
 
Аватар для blackberryx
 
Регистрация: 05.10.2008
Сообщений: 9
По умолчанию

puporev, огромнейшее вам спасибо

Ещё вопрос возник : а если база данных около мегабайта и там около 1000000 слов, может ли программка не работать?
Алгоритм, походу, корявый. Поэтому в ans.txt вообще ничего не выводится.

Последний раз редактировалось blackberryx; 02.07.2009 в 18:36.
blackberryx вне форума Ответить с цитированием
Старый 02.07.2009, 21:23   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) в конце программы надо ОБЯЗАТЕЛЬНО закрывать открытые файлы! (тем более те файлы, куда идёт запись).

2)
Цитата:
а если база данных около мегабайта и там около 1000000 слов,
У Вас линейный последовательный алгоритм, он никак не привязан к количеству слов в базе, поэтому слов может быть хоть миллиард. Проблема в другом - быстродействие. в реальной (практической) задаче, я бы выводил % обработки или при обработки каждого тысячного (или каждую десятитысячного - надо смотреть по скорости) слова выводил на экран символ- чтобы было видно, что программа работает и не зависла... Психологически мы все устроены так, что если запущенная программа "молчит" две-три минуты, то мы ждём, ещё минуты через 2-3 начинаем нервничать и подозревать, что всё повисло, а минут через 15-20 программа будет жестко снята с выполнения как наглухо зависшая...
А вот если она будет писать процентики - такого уже не произойдёт...


ВАЖНО!
имхо, алгоритм нахождения слова у вас неверный!
1) src не очищается перед циклом
2) не проверяется есть ли позиция нужного символа в строке
3) берётся переменная, которая от цикла вообще не зависит (надо
copy(source,pos(slovo[k], source),1);
Код:
 For k:=1 To Length(slovo) Do
   Begin
      tmp:=copy(source,pos(slovo[i], source),1);
не зачёт...

p.s. если сформулируете правила по которому из одного слова может быть составлено другое слово - я постараюсь Вам функцию Check написать... под правилами я имею в виду следующее - 1) все ли буквы исходного слова должны войти в новое слово (я предполагаю, что могут НЕ ВСЕ например, из слова КОСТЬ можно составить слова КОТ и ТОК. Верно? ) 2) можно ли задействовать одну букву из заданного слова НЕСКОЛЬКО раз? Например, из слова ЛОМКА слово МОЛОКО можно составить?

p.p.s. и ещё, если это не учебная задача, то я бы рекомендовал Вам использовать для реализации какой нибудь ЯП (и компилятор под Windows (т.е. получить WIN32 приложение). Это на современных компьютерах будет работать намного быстрее и эффективнее!

Последний раз редактировалось Serge_Bliznykov; 02.07.2009 в 23:07. Причина: неработоспособность функции проверки
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.07.2009, 00:23   #5
blackberryx
 
Аватар для blackberryx
 
Регистрация: 05.10.2008
Сообщений: 9
По умолчанию

О! Вроде заработало. Только там левая кодировка... Как перевести из Досовской в Анси?
blackberryx вне форума Ответить с цитированием
Старый 03.07.2009, 06:49   #6
puporev
Старожил
 
Регистрация: 13.10.2007
Сообщений: 2,740
По умолчанию

Код:
procedure Convert1(var a:string);{ASCII->ANSI}
var i:integer;
begin
for i:=1 to length(a) do
if ord(a[i]) in [128..175] then a[i]:=chr(ord(a[i])+64)
else if ord(a[i]) in [224..239] then a[i]:=chr(ord(a[i])+16)
else if ord(a[i])=240 then a[i]:=chr(ord(168))
else if ord(a[i])=241then a[i]:=chr(ord(184));
end;
puporev вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дана строка, состоящая из нескольких слов. Найти количество слов, которые содержат хотя бы одну букву "А" Mashaa Помощь студентам 13 09.12.2009 13:28
Составление бинарного дерева [MI_nor] Общие вопросы C/C++ 1 08.05.2009 00:28
Составить в алфавитном порядке список всех слов, встречающихся в тексте, и количество этих слов. KAPAHDAW Паскаль, Turbo Pascal, PascalABC.NET 2 17.02.2009 01:19
Составление слова Cawboy Общие вопросы Delphi 2 03.06.2008 13:21
Составление диаграммы Иля Microsoft Office Excel 1 06.04.2008 18:08