IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

2 страниц V < 1 2  
 Ответить  Открыть новую тему 
> алгоритмы поиска
volvo
сообщение 24.05.2010 19:55
Сообщение #21


Гость






А что будет делать этот цикл, расскажешь? Чего ты добиться хочешь?
 К началу страницы 
+ Ответить 
*оля*
сообщение 24.05.2010 20:00
Сообщение #22


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


Цитата(volvo @ 24.05.2010 19:55) *

А что будет делать этот цикл, расскажешь? Чего ты добиться хочешь?



хочу найти наибольшую подстроку в 2х списках - и удалить ее.
в полученных списках снова найти наибольшую подстроку - и снова удалить.
и так до тех пор, пока наибольшая подстрока не будет меньше или равна 10.
а все это для того, чтобы потом получить значение суммы всех найденных kmax.
вот как-то так)

Сообщение отредактировано: *оля* - 24.05.2010 20:01
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 24.05.2010 20:30
Сообщение #23


Гость






Ну, так и будет, если не ошибаюсь:

sum := 0;
repeat

  kmax : = { тут находишь kmax }
  if kmax > 10 then begin
    sum := sum + kmax;
    { Что там тебе еще надо было? Удалять подпоследовательности? Удаляем здесь }
  end;

until kmax <= 10; { Как только kmax станет меньше 11, цикл закончится }


А что, не работает? Или что-то неправильно делает?
 К началу страницы 
+ Ответить 
*оля*
сообщение 25.05.2010 17:57
Сообщение #24


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


Цитата(volvo @ 24.05.2010 20:30) *

Ну, так и будет, если не ошибаюсь:

sum := 0;
repeat

  kmax : = { тут находишь kmax }
  if kmax > 10 then begin
    sum := sum + kmax;
    { Что там тебе еще надо было? Удалять подпоследовательности? Удаляем здесь }
  end;

until kmax <= 10; { Как только kmax станет меньше 11, цикл закончится }


А что, не работает? Или что-то неправильно делает?


ну вот без цикла делает все как надо, а как пишу цикл, то выдает ошибку:  Ошибка: попытка разыменовать нулевой указатель А почему выдает не понятно...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 25.05.2010 18:09
Сообщение #25


Гость






Полный код (в виде PAS-файла) присоедини, посмотрим почему ошибка возникает...
 К началу страницы 
+ Ответить 
*оля*
сообщение 25.05.2010 19:07
Сообщение #26


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


Цитата(volvo @ 25.05.2010 18:09) *

Полный код (в виде PAS-файла) присоедини, посмотрим почему ошибка возникает...


правда с оформлением проблемы, не умею я пока оформлять(


Прикрепленные файлы
Прикрепленный файл  Program1.pas ( 1.72 килобайт ) Кол-во скачиваний: 206
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 27.05.2010 12:36
Сообщение #27


Гость






*оля*, а причина - тривиальна, и Андрей уже говорил о ней: обнулить kmax надо. Если б ты это сделала в программе, то при оборачивании куска программы циклом, задумалась бы, а не надо ли инициализацию переменной делать внутри цикла. А так - нет и нет ее, и ничего не приходит в голову... Все просто:

{ Вот начало твоего цикла }
sum := 0;
repeat

  kmax := 0; { <--- Фокус вот в этом !!! }

  p := L.first;
  { ... }

Добавляешь инициализацию и все работает.

Теперь - почему это НЕ работало без обнуления переменной... Хотя нет. Давай, не я расскажу тебе, почему это не работало, а ты разберешься и расскажешь? Договорились?

Добавлено через 7 мин.
P.S. Если тебе надо удалять подпоследовательность из обоих списков - я бы вынес этот код в отдельную процедуру и вызывал бы ее дважды с разными параметрами. Так будет лучше.
 К началу страницы 
+ Ответить 
*оля*
сообщение 28.05.2010 19:07
Сообщение #28


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


Цитата(volvo @ 27.05.2010 12:36) *

Добавляешь инициализацию и все работает.


да, действительно работает!)
Цитата(volvo @ 27.05.2010 12:36) *

Теперь - почему это НЕ работало без обнуления переменной... Хотя нет. Давай, не я расскажу тебе, почему это не работало, а ты разберешься и расскажешь? Договорились?


yes2.gif , просто мы каждый раз искали наибольшую общую подстроку заново, и поэтому на входе kmax должно было ровняться 0, а до исправления ошибки оно в начале цикла ровнялось длине предыдущей подстроки. И следовательно условие k > kmax не может больше выполниться.
Ну вот, наверное, так)

Спасибо большое, я эту ошибку без вашей помощи не нашла бы!)

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 29.05.2010 1:32
Сообщение #29


Уникум
*******

Группа: Модераторы
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(*оля* @ 28.05.2010 20:07) *
Спасибо большое, я эту ошибку без вашей помощи не нашла бы!)
А между тем, на нее было указано еще в посте №13.. Ты читаешь ответы полностью или так - по диагонали? постарайся обращать внимание на то, что говорят - сэкономишь как свое время, так и чужое..

Обнаружить ошибку подобного рода на самом деле предельно просто - достаточно наконец обратить внимание на то, что пытается тебе сказать компилятор (warning'и). Считай его в некотором роде участником форума.. ))

А, вообще, общее правило таково: ВСЕ переменные должны быть инициированы.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
*оля*
сообщение 1.06.2010 8:10
Сообщение #30


Пионер
**

Группа: Пользователи
Сообщений: 125
Пол: Женский

Репутация: -  1  +


Цитата(Lapp @ 29.05.2010 1:32) *

А между тем, на нее было указано еще в посте №13.. Ты читаешь ответы полностью или так - по диагонали?


3. ВСЕ переменные перед использованием должны быть инициированы (у тебя не инициированы k и kmax).
Да, вы уже говорили об этом, я все внимательно читаю. Я сделала инициализацию,но не там, где надо. Программа работала, а как появилась необходимость немного изменить задачу, то уже забыла об этом.

Цитата(Lapp @ 29.05.2010 1:32) *

А, вообще, общее правило таково: ВСЕ переменные должны быть инициированы.

спасибо, теперь я о нем точно не забуду)

Цитата(Lapp @ 29.05.2010 1:32) *

постарайся обращать внимание на то, что говорят - сэкономишь как свое время, так и чужое.

прошу прощения за невнимательность...

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V < 1 2
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 18.07.2025 8:52
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"