Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: 1 [2]  Все   Вниз
  Печать  
Автор Тема: Разочарование  (Прочитано 48391 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #30 : 26-03-2009 13:16 » 

For read only, ошибки: как минимум - то, что указал Джон, включая указанное, надо полагать, при правке листинга: память будет течь безбожно (это будет труднозаметно в случае "карманного тестирования", но ошибку представляет собой очень серьёзную).
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #31 : 26-03-2009 15:45 » 

Джон, я тестила, всё работает и даже на крайних случаях)
подгонкой результата под ответ я никогда не занималась.
а что не так с Print_list() ?  Она по-идее распечатывает список с хвоста к голове, соответственно цикл отработает столько раз, сколько элементов в списке

Ну давай начнём вот с этого:

По-моему всё наглядно) имена говорящие Улыбаюсь

Значит имена говорящие...

Итак до сих пор "tail" был хвостом или в данном случае указателем КОНЦА списка, указатель на след. элемент которого (NEXT) всегда равен нулю. А что получается у тебя? (домашнее задание - нарисовать список из 5ти элементов каждый с полями PREV NEXT DATA и стрелочками установить связи; первый элемент назвать ГОЛОВА, последний - ХВОСТ; полученную схему тщательно проанализировать).

Таким же образом проанализировать ф-ю, которая должна добавлять новый элемент списка в ГОЛОВУ. В твоём случае происходит добавление элемента в хвост, хотя все "имена говорящие" утверждают обратное. Ну и про Print_list - ты говоришь, что он распечатывает список от хвоста к голове (от такого порядка слегка подташнивает, но это принципиально не запрещено), а я вижу что начиная с хвостового элемента делается попытка получить СЛЕДУЮЩИЙ элемент -> r=r->next; ,  который у ХВОСТА всегда нуль.

Вот таким образом "имена говорящие" и приводят к тому, что твой код понимаешь (я надеюсь) только ты, и поскольку он всё-таки работает, я и сказал, что результат был подогнан под ответ. Те я бы сказал, что логику ты примерно поняла, но при реализации ей абсолютно не следовала. Получилось - и ура. Победителей не судят.
Но вот только чем это чревато в дальнейшем? А если бы у тебя были гораздо более сложные ф-ции? А наследуемые объекты с шаблонами? А если бы ты работала "интимно" (in team)?

Ну собственно как я уже и сказал, что остальное даже не смотрел - пропало желание. За освобождением памяти абсолютно не следишь. Создаёшь ненужные объекты, где достаточно объявить переменную типа указателя... Действительно - "Разочарование".

Может всё-таки от простого к сложному? А мы поможем. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
For read only
Интересующийся

ru
Offline Offline

« Ответ #32 : 09-05-2009 13:45 » 

Я ПОНЯЛА!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Я поняла к чему эти всё делить на 2 класса, делать отдельные функции типа GetData, SetData!!!!
« Последнее редактирование: 09-05-2009 13:49 от Алексей1153++ » Записан
Люсь
Команда клуба

ru
Offline Offline
Пол: Женский

« Ответ #33 : 16-06-2009 14:29 » 

Dimka, заинтриговала твоя программа обучения. Как можно ознакомиться, а лучше поступить к тебе студентом на этот курс? Улыбаюсь
Записан

Посторонним просьба не беспокоить!
-------------------------------------------------
O (I) Rh +
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #34 : 16-06-2009 14:57 » 

Люсь, ну если только переводом в наш университет... А по поводу ознакомиться - тут ж сильно зависит от степени твоей предварительной подготовки. Если я представляю, чему учат наших студентов, то понятия не имею, чему учили тебя.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Люсь
Команда клуба

ru
Offline Offline
Пол: Женский

« Ответ #35 : 16-06-2009 15:15 » 

Dimka, не, переводом нет )
Предварительная подготовка моя - это лёгкое понимание структурного программирования и затруднённое - в использовании классов и объектов. Постоянной практики в программировании нет, так что успешно забыла и то, что удалось понять в ООП год назад при сдаче экзамена...
https://forum.shelek.ru/index.php/topic,14070.0.html
https://forum.shelek.ru/index.php/topic,17824.0.html

Сейчас у меня великая потребность в восстановлении своих знаний и качественном хорошем обучении тому, чего я ещё не знаю. Так как меня угораздило перевестись на другую кафедру, потому что мне понравилось, что у них более углубленно изучается программирование, и я посчитала, что в программировании мне разобраться легче, чем в электронике и микропроцессорной технике.

Так что мне интересен путь от простого к сложному ) Где что конкретно можно почитать по твоей программе.
Записан

Посторонним просьба не беспокоить!
-------------------------------------------------
O (I) Rh +
Dmitry
Помогающий

ru
Offline Offline

« Ответ #36 : 23-07-2010 09:59 » 

Код: (C++)
     bool getNextData(string &data)
    {
     if(this->current == NULL)
      {
       return false;
      }
     else
      {
       data = this->current->getData();
       this->current = this->current->getNextItem();
       return this->current != NULL;
      }
    }
 
В самом конце только просто
Код:
return true;
Улыбаюсь
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #37 : 23-07-2010 10:04 » 

Зачем?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dmitry
Помогающий

ru
Offline Offline

« Ответ #38 : 23-07-2010 11:24 » 

По возвращаемому значению смотрим, существует ли следующий непросмотренный элемент списка (тот, на который указывает current). Если ф-я вернула истину - считываем data. Сurrent после этого уже хранит адрес  следующего эл-та, или NULL. Вроде идея такая, и чисто логически именно так напрашивается. А тут получается,  если элемент есть -  передаём его через параметр data, а функция возвращает инфу о наличии следующего эл-та, а не того, что записала. С первым элементом head некрасиво будет.
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #39 : 23-07-2010 11:41 » 

с любым кодом можно извращаться

Код:
bool getNextData(string &data)
    {
     if(this->current == NULL)
      {
       return false;
      }
       data = this->current->getData();
       this->current = this->current->getNextItem();
       return this->current != NULL;
}

Так на else { } короче, но при этом теряется читабельность.

 
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #40 : 23-07-2010 11:48 » 

Никакого return true - будет баг.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dmitry
Помогающий

ru
Offline Offline

« Ответ #41 : 23-07-2010 12:05 » 

Я вобще не понимаю, как можно делать ф-ю с названием GetData, которая бы возвращала статус след. элемента.
И я не понимаю.
Обратите внимание на
Код:
this->current = this->current->getNextItem();
return this->current != NULL;
current в последней строчке на что указывает?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #42 : 23-07-2010 12:19 » 

Цитата: Dmitry
current в последней строчке на что указывает?
На то, что ему присвоено в предыдущей строчке.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dmitry
Помогающий

ru
Offline Offline

« Ответ #43 : 23-07-2010 12:43 » 

На то, что ему присвоено в предыдущей строчке.
Круто... Так и чувствуется желание разобраться в ошибке, чьей-либо.
Т.е. на следующий элемент после элемента, содержимое которого мы передаём через data.

Теперь смотрим код:
Цитата: Dimka
Код:
list.beginIteration();
string myString = "";
while(list.getNextData(myString))
 {
  cout << myString << endl;
 }
Представляем, что в списке только один элемент. Он будет выведен?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #44 : 23-07-2010 12:46 » 

Dmitry, нет, не будет.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #45 : 23-07-2010 13:07 » 

Джон, если по-хорошему, то нужно иметь 3 вещи:
1) Функцию GetCurrentData (которую можно вызывать несколько раз в рамках одной итерации).
2) Процедуру MoveNext.
3) Функцию IsEndOfSequence.

Нередко пункты 2-3 объединяют в одно целое (например, в .NET так реализовано). Тогда для правильного обхода нужны некоторые оговорки для крайних случаев (типа элемента, следующего за последним или предыдущего первому).

Ну а тут вообще все 3 этих вещи объединены в одну функцию.

Зачем? Для краткости. Улыбаюсь Целью являлось не написание программы, а иллюстрация подхода с выделением курсора/итератора как отдельной сущности. Делать мне больше нечего, как всё расписывать до конца - там в начале и законченной программы нет.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dmitry
Помогающий

ru
Offline Offline

« Ответ #46 : 23-07-2010 13:17 » 

Я не так понял Джона. Показалось, что речь о неправильности возврашения функцией статуса имнное следующего элемента, о чём я и пытаюсь достучаться.. С названием менее критично Улыбаюсь

2Dimka, так ты согласился, что там "return true" должно быть?
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #47 : 23-07-2010 13:24 » 

Dmitry, зачем? а тем более в свете описанного словами в необходимости этой функции.
если возвращать true, то будет ж...о...
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #48 : 23-07-2010 13:33 » 

Джон, если по-хорошему, то нужно иметь 3 вещи:
1) Функцию GetCurrentData (которую можно вызывать несколько раз в рамках одной итерации).
2) Процедуру MoveNext.
3) Функцию IsEndOfSequence.


 Класс!  Внимание! Говорит и показывает...  RTFM

Я не знаю может это от серости, но шеф у нас в последнее время совсем озверел. Поначитался всяких умных книжек (ему-то хорошо, времени дофига, чёб не читать). Код запретил коментировать. Точнее не то, чтобы запретил, а сказал - коменты в коде только для refactoring и что если он в релизе увидит коменты он их поудаляет. Код должен быть читаем и понятен без коментов. Вдобавок очень больно бъёт по рукам, если одна ф-я выполняет действия двух и более ф-ций. Ф-я должна выполнять только то, для чего она предназначена.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #49 : 23-07-2010 13:37 » 

Зачем? Для краткости. Улыбаюсь Целью являлось не написание программы, а иллюстрация подхода с выделением курсора/итератора как отдельной сущности.

Это я только теперь понял. Сначала я увидел название темы и сразу этот топик, вот и решил, что Dmitry нашёл где-то код и хочет над ним поприкалываться. А тут оказывается...
Короче сорри. Не со зла я это.

Dmitry, в свете выше сказанного забудь, что я говорил.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #50 : 23-07-2010 13:58 » 

Цитата: Dmitry
2Dimka, так ты согласился, что там "return true" должно быть?
Там ни в коем разе не должно быть return true.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dmitry
Помогающий

ru
Offline Offline

« Ответ #51 : 23-07-2010 14:09 » 

Код:
bool getNextData(string &data)
    {
     if(this->current == NULL)
      {
       return false;
      }
     else
      {
       data = this->current->getData();
       this->current = this->current->getNextItem();
       return true;
      }
    }

Код:
list.beginIteration();
string myString = "";
while(list.getNextData(myString))
 {
  cout << myString << endl;
 }
Где ошибка?
В твоей реализации я же показал нехороший момент, и ты согласился.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #52 : 23-07-2010 14:12 » 

Dmitry, здесь нет никакой ошибки. Просто второй кусок кода нужно дополнить, если так хочется. Мне не хотелось.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dmitry
Помогающий

ru
Offline Offline

« Ответ #53 : 23-07-2010 14:30 » 

Dimka, ты не издеваешься надо мной? Джон уже хотел "поприкалываться" Улыбаюсь
Рабочий же код. Что тут дополнять?
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #54 : 23-07-2010 15:14 » 

Dmitry, кто и где тебе сказал, что это рабочий код? Где ты тут увидел программу? Где ты увидел законченное решение?

Это лишь кусок кода, иллюстрирующий использование итератора, который приводился в рассуждениях о том, как выделять сущности и инкапсулировать особенности их реализации.

Тут нет ни постановки задачи, ни спецификаций, и нигде нет моих слов вида: "Вставь вот этот код в свою программу, и будет тебе счастье."

Ты чего сказать хочешь? Что кусок кода не будет работать с пустым списком? Не будет - никто и не обещал, что будет. Это тебя беспокоит? Меня - нет.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dmitry
Помогающий

ru
Offline Offline

« Ответ #55 : 23-07-2010 18:01 » 

Всё-таки сложные люди, эти программисты. Наверное, я не имел в виду, что эти огрызки - готовая программа, компилируй и запускай...  В моём сообщении перед этим функция с изменённой одной строчкой, которая теперь адекватно работает, и пример, как её использовать, твой же. Я просто подметил ошибку в коде, сделал это для новичков, для которых и создан этот раздел, чтобы,  если вдруг станут использовать написанное тобой, не путались. Было с багом - стало без. Что плохого?
И к чему было всё это:
Никакого return true - будет баг.
Там ни в коем разе не должно быть return true.
Неуместный сарказм, или что? Я уже не говорю про оттенки хамства. Если смысл был просто показать ООП и на реализацию методов не надо было обращать внимание - ну и отлично, только тогда тем более не понятно процитированное.
И мне это нисколко не нужно, на эту тему я случайно наткнулся, просматривая твои сообщения, т.к. кое-что из того, что ты пишешь, мне кажется интересным...
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #56 : 23-07-2010 19:49 » 

Цитата: Dmitry
В моём сообщении перед этим функция с изменённой одной строчкой, которая теперь адекватно работает
Я не заметил, куда ты вставил return true - сейчас увидел. Из ранее сказанного я понял, что ты его собрался вставить в конец функции вместо остальных return (тогда был бы баг), а не в конец ветки else.

Твой вариант будет работать.

Цитата: Dmitry
Я просто подметил ошибку в коде, сделал это для новичков, для которых и создан этот раздел, чтобы,  если вдруг станут использовать написанное тобой, не путались. Было с багом - стало без. Что плохого?
И к чему было всё это
Плохо и возмутительно следующее.

Цитата: Dmitry
По возвращаемому значению смотрим, существует ли следующий непросмотренный элемент списка (тот, на который указывает current). Если ф-я вернула истину - считываем data. Сurrent после этого уже хранит адрес  следующего эл-та, или NULL. Вроде идея такая, и чисто логически именно так напрашивается. А тут получается,  если элемент есть -  передаём его через параметр data, а функция возвращает инфу о наличии следующего эл-та, а не того, что записала. С первым элементом head некрасиво будет.
Этот вариант полностью меняет смысл функции - результат означает не отсутствие следующего элемента, а отсутствие текущего.

Ты произвольно изменил семантику функции. Адекватно, когда название и поведение функции соответствуют друг другу. Если тебе по какой-то причине не понравилась семантика, это не значит, что её не существует, а всего лишь случайно нарушена "очевидная" тебе семантика. Баг - это когда при изменении реализации изменяются соглашения о вызове, пред- и постусловий - изменяется интерфейс. Если при этом разработчик говорит: "Я тут лишь строчечку поменяю, чтобы понятнее было," - и при этом не обсуждает принцип решения и контекст, за такое пожизненный цих с гвоздями дают.

Нужно говорить подробно и в следующем порядке:
1) Итератор работат по такому-то принциу и обладает такими-то недостатками. Чтобы устранить недостатки, я предлагаю изменить принцип работы итератора.
2) Новый принцип работы заключается в ...
3) Внедрение нового принципа работы требует:
- таких-то изменений в интерфейсе;
- таких-то условий использования;
- таких-то изменений в коде реализации.

Без смены семантики для исходного куска кода нужно было добавить вывод последнего элемента:

либо
Код:
list.beginIteration();
string myString = "";
while(list.getNextData(myString))
 {
  cout << myString << endl;
 }
cout << myString << endl;

либо
Код:
list.beginIteration();
string myString = "";
bool needContinue = false;
do
 {
  needContinue = list.getNextData(myString);
  cout << myString << endl;
 }
while(needContinue);
и не пользоваться итератором для пустого списка.

Твой вариант лучше, но способ его предложения к обсуждению неудачен.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dmitry
Помогающий

ru
Offline Offline

« Ответ #57 : 23-07-2010 22:53 » 

Ты произвольно изменил семантику функции. Адекватно, когда название и поведение функции соответствуют друг другу. Если тебе по какой-то причине не понравилась семантика, это не значит, что её не существует, а всего лишь случайно нарушена "очевидная" тебе семантика. Баг - это когда при изменении реализации изменяются соглашения о вызове, пред- и постусловий - изменяется интерфейс.

Про изменение интерфейса, конечно, согласен. В данном случае реализация (и семантика) была подстроена под интерфейс, ожидаемый клиентским кодом, который ты привёл. Потому, что так существенно лучше (на мой взгляд), мне и показалось, что именно в методе  просто вкралась "описка".

По поводу названия/поведения функции. Если обходить список одной функцией, то как ни крути, клиент всё равно будет просить  - "хочу следующий элемент"   Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #58 : 24-07-2010 02:27 » 

но шеф у нас в последнее время совсем озверел. Поначитался всяких умных книжек (ему-то хорошо, времени дофига, чёб не читать). Код запретил коментировать.
Джон, можно настроить коменты цветом текста как фон:) Или загонять табом далеко вправо. Может и не прокатить, правда Отлично
Записан

Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #59 : 24-07-2010 08:21 » new

Цитата: Dmitry
В данном случае реализация (и семантика) была подстроена под интерфейс, ожидаемый клиентским кодом, который ты привёл.
"Клиентский код" может ожидать только одного - того, что прописано в интерфейсе. Первичен интерфейс, он же контракт.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: 1 [2]  Все   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines