![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
Carin |
![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 9 Пол: Женский Репутация: ![]() ![]() ![]() |
Здравствуйте, господа!
Такая проблема возникла. Задачка на поиск дублетов(пар слов, разнящихся между собой в одной букве) в считанном из файла словарике. Для того чтобы эти самые дублеты найти, необходимо, как я понимаю не раз погонять словарь. Соотвественно считать надо все это счастье в строковый массив. В условии оговорено, что размер словаря не должен превышать 25143 слова, каждое из которых не более 16 символов. Вот тут и все проблемы начались. То, что я в статический массив не уложусь со своим словариком я поняла сразу ![]() Код const n_max = 25000;{это максимальное количество слов в словаре} w_max = 16;{это максимальная длина слова} label 1, 2;{метки для проверок} type str_char = string[w_max];{это для динамического строкового массива} TDynArr = array[1..1] of str_char; PDynArr = ^TDynArr; var f: text;{файл со словарем и парами для поиска} t_wd2: str_char; n, i, j: word; p_arr: PDynArr;{динамический строковый массив} begin assign(f, 'input.txt'); {сначала выясняем количество слов для получения динамического массива} reset(f); n:= 0; while not eof(f) do begin readln(f, t_wd2); if (n > n_max) or (length(t_wd2) = 0) then goto 1; n:= n + 1; end; 1: close(f); reset(f); {этот самый динамический строковый массив объявляем} GetMem(p_arr, n * SizeOf(str_char)); {зачитываем слова в словарь} writeln('Производится считывание словаря...'); i:= 1; n:= 0; while not eof(f) do begin readln(f, t_wd2); if (n > n_max) or (length(t_wd2) = 0) then goto 2; n:= n + 1; p_arr^[n]:= t_wd2; end; 2: writeln('Найдено ', n, ' слов в словаре'); close(f); {чистим собственно массив} FreeMem(p_arr, n * SizeOf(str_char)); Вот когда производится зачитывание всего словарика около 20 тыс слов разной длины, то выходит при попытке вывода на экран полученного массива, какая-то белиберда. То есть почему-то первые элементы массива оказываются затертыми последующими с повторами, с вкраплениями каких-то непечатных символов и т.д. Хотя при считываниии когда вывожу каждый новый считанный элемент для контроля - все правильно. Что это? Игры с памятью? Могу приложить полный код и словарик при необходимости. Сообщение отредактировано: Carin - 14.05.2007 17:14 |
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата Вот когда производится зачитывание всего словарика около 20 тыс слов разной длины , то тогда у тебя происходит следующее:... Сколько памяти ты берешь? 20000 * 16 = 320000, а ведь можешь - только 65К... Тебе надо пойти еще дальше, и сделать не массив строк, а массив указателей на строки... Справишься, или помочь? |
Carin |
![]()
Сообщение
#3
|
Группа: Пользователи Сообщений: 9 Пол: Женский Репутация: ![]() ![]() ![]() |
Сколько памяти ты берешь? 20000 * 16 = 320000, а ведь можешь - только 65К... Что меня смутило - не было run-time error насчет heap overflow. Почему? Просто перезаписываются начальные элементы. Тебе надо пойти еще дальше, и сделать не массив строк, а массив указателей на строки... Справишься, или помочь? Вот попробовала через линейный связный список, тут все четко - при переборе от 10 тыс. сразу идет сообщение об ошибке, но накладки нет. Код const n_max = 10000; label 2; type TWordStr = string[16]; PTItem = ^TItem; TItem = record Data: TWordStr; next: PTItem; end; TWordList = record first, last: PTItem; end; procedure InsertWord(var L: TWordList; s: string); var p: PTItem; begin New(p); p^.Data := s; p^.next := nil; if L.first = nil then L.first := p else L.last^.next := p; L.last := p end; var p, p2: PTItem; L: TWordList; f: text; t_wd: TWordStr; i: word; begin assign(f, 'input.txt'); reset(f); i:= 0; while not eof(f) do begin i:= i + 1; if i > n_max then goto 2; readln(f, t_wd); InsertWord(L, t_wd); end; 2: close(f); {проверяем вывод, не покорежены ли элементы} p:= L.first; i:= 0; while p <> nil do begin i:= i + 1; p2:= p; while p2 <> nil do begin WriteLn(p^.Data, '-', p2^.Data); p2 := p2^.next; end; p := p^.next; end; readln; end. Но все-таки очень интересно, можно ли выкрутиться на все 100% ![]() ![]() |
![]() ![]() |
![]() |
Текстовая версия | 20.07.2025 17:39 |