2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4, 5, 6  След.
 
 Re: Сравнение двух стилей программирования
Сообщение15.12.2012, 22:59 
Аватара пользователя


27/01/09
814
Уфа
shau-kote в сообщении #658885 писал(а):
А чем Ваш вариант лучше тех, что были в этом треде ранее?
Тем, что обращается из подпрограммы к глобальным переменным?
Элемент списка присоединяется к списку (в вершину) одной процедурой. Меньше лишних телодвижений. :) Поскольку указатель на вершину списка глобальный и один, то естесственно список один, что не выходит за пределы задачи. Если нужны ещё списки, то заводим ещё (глобальные) указатели на вершину списка, они (указатели на вершину списка) не динамические. По логике список задаётся вершиной, процедура добавления элемента к списку соответственно изменяет его вершину, указатель на вершину является внешним по отношению к процедуре добавления элемента, всё по логике операций со списками. :) Указатель на вершину рабочий и текущий, поэтому глобальный, его может изменять ещё например процедура удаления элемента. Если не нравятся процедуры, можно сделать функцию, которая будет возвращать указатель на новую вершину списка. Указатель на конец списка можно завести, но т.к. изменене списка происходит только в вершине, то он инициализируется один раз и больше не изменяется (до удаления списка). Получился стек, т.е. в вашей задаче можно ограничиться стеком, но если добавить поиск элемента в списке и вставку элемента в произвольное место в списке, которые не должны изменять указатели на вершину и конец списка, то получится вполне себе линейный (однонаправленный) список.

 Профиль  
                  
 
 Re: Сравнение двух стилей программирования
Сообщение16.12.2012, 01:00 
Аватара пользователя


31/10/08
1244
Цитата:
Элемент списка присоединяется к списку (в вершину) одной процедурой. Меньше лишних телодвижений. :) Поскольку указатель на вершину списка глобальный и один, то естесственно список один, что не выходит за пределы задачи. Если нужны ещё списки, то заводим ещё (глобальные)

Глобальные переменные дурной стиль.

 Профиль  
                  
 
 Re: Сравнение двух стилей программирования
Сообщение16.12.2012, 02:04 
Аватара пользователя


27/01/09
814
Уфа
Pavia в сообщении #658940 писал(а):
Глобальные переменные дурной стиль.
Ну ладно, тогда procedure make (var top, lst : lst_ptr); Ещё что исправить?

 Профиль  
                  
 
 Re: Сравнение двух стилей программирования
Сообщение16.12.2012, 04:14 
Заслуженный участник
Аватара пользователя


30/01/06
72407
shau-kote в сообщении #658734 писал(а):
Процедура AddElement() добавляет в список-очередь новый элемент и помещает в него данные.
Соответственно, довольно очевидно, что она должна получать на вход собственно "данные" (число в данном случае) и указатель на конец списка.

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

 Профиль  
                  
 
 Re: Сравнение двух стилей программирования
Сообщение16.12.2012, 16:04 
Аватара пользователя


31/10/08
1244
{ Создание нового узла списка }
По английски создание это Create или Generate.
А "make" - это "выполнить". Так что лучше переименовать в ElementCreate или ItemCreate, а то не понятно, что делает процедура.

Во вторых ReadLn тут не место.
1. Основная логика программы должна быть отделена от внутренней структуры.
2. Во вторых логически семантически тут ей не место. Так как мы создаем, а не читаем.

Цитата:
shau-kote к сожелению, список может быть зациклен не на стартовый элемент. Например 1->2->3->2->3->2->3->...
Не может он быть таким. Иначе это нарушение семантики. И надо называть не списком, а графом.
И вообще зацикленный список я бы так и называл зацикленным, а не просто списком.

Цитата:
Процедура AddElement() добавляет в список-очередь новый элемент и помещает в него данные.
Соответственно, довольно очевидно, что она должна получать на вход собственно "данные" (число в данном случае) и указатель на конец списка.

То что она должна получать указатель на конец списка не очевидно. Очевидно что она должна получать список на входе. Для структурирования надо чтобы остальная часть не знала о конце или начале списка. Иначе это не структура, а чёрти что. И ошибок не избежать.

Лучше предусмотреть защиту от дурака и не надеяться на то что он правильно передаст конец списка. И если мы будем передавать список и сами внутри процедуры определять конец списка(к примеру читать из структуры списка), то это будет лучше.
А вот с тем что не требуется проверка конца согласен.

 Профиль  
                  
 
 Re: Сравнение двух стилей программирования
Сообщение16.12.2012, 16:25 
Аватара пользователя


15/01/12
87
г. Москва
Munin в сообщении #658978 писал(а):
должно было быть не меньше полстраницы текста.

А при добавленной обработке всех возможных неприятных ситуаций и их описания будет страницы три?
Синтаксис и примеры использования есть в начале треда. (:
А необходимые предусловия очевидны - памяти должно хватать, типы очевидны, и т.д.

Pavia в сообщении #659212 писал(а):
То что она должна получать указатель на конец списка не очевидно. Очевидно что она должна получать список на входе. Для структурирования надо чтобы остальная часть не знала о конце или начале списка. Иначе это не структура, а чёрти что. И ошибок не избежать.

Лучше предусмотреть защиту от дурака и не надеяться на то что он правильно передаст конец списка. И если мы будем передавать список и сами внутри процедуры определять конец списка(к примеру читать из структуры списка), то это будет лучше.

Ну, EtCetera в начале треда предложил именно такой вариант. В процедуру передаётся структура типа TList, которая хранит указатели на конец и начало списка.
Я описывал логику работу своей оригинальной процедуры, хотя да, пожалуй, вариант с TList лучше.

-- 16.12.2012, 17:29 --

Pavia в сообщении #659212 писал(а):
Не может он быть таким. Иначе это нарушение семантики. И надо называть не списком, а графом.

Вот да, я как-то тоже думаю, что у собственно спискам такая структура будет иметь весьма отдалённое отношение.

 Профиль  
                  
 
 Re: Сравнение двух стилей программирования
Сообщение16.12.2012, 16:59 
Заслуженный участник
Аватара пользователя


30/01/06
72407
shau-kote в сообщении #659226 писал(а):
А необходимые предусловия очевидны - памяти должно хватать, типы очевидны, и т.д.

Вот с такими замашками никогда вам не достичь привычек по написанию хорошего кода.

 Профиль  
                  
 
 Re: Сравнение двух стилей программирования
Сообщение16.12.2012, 17:50 
Аватара пользователя


15/01/12
87
г. Москва
Munin в сообщении #659254 писал(а):
Вот с такими замашками никогда вам не достичь привычек по написанию хорошего кода.

Вы хотите сказать, что это не очевидно (не стоит считать очевидным)?

 Профиль  
                  
 
 Re: Сравнение двух стилей программирования
Сообщение16.12.2012, 19:40 


26/08/11
2102
Pavia, мы обсуждали другую задачу:
Shadow в сообщении #658865 писал(а):
Написать функцию, проверяющая является ли односвязанный список зацикленным. (или заканчивает на nil). Входные параметры: указатель к стартовому элементу. Структура известна.
Pavia в сообщении #659212 писал(а):
И вообще зацикленный список я бы так и называл зацикленным, а не просто списком.
Я тоже. Задача - проверить каким он является.

 Профиль  
                  
 
 Re: Сравнение двух стилей программирования
Сообщение16.12.2012, 19:53 
Аватара пользователя


15/01/12
87
г. Москва
Shadow в сообщении #659382 писал(а):
Я тоже. Задача - проверить каким он является.

У меня пока единственный вариант - использовать множество.
Идти по списку, добавляя каждый указатель в множество.
Соответственно, выйти по достижению nil или по нахождению очередного указателя в множестве предыдущих.

 Профиль  
                  
 
 Re: Сравнение двух стилей программирования
Сообщение16.12.2012, 20:28 


26/08/11
2102
Памяти может не хватит... если там плохой указатель.
Подсказака: Ахил и черепаха :wink:

 Профиль  
                  
 
 
Сообщение16.12.2012, 22:16 
Аватара пользователя


15/01/12
87
г. Москва
Shadow в сообщении #659410 писал(а):
Памяти может не хватит... если там плохой указатель.

Памяти не хватит, если будет более 255 указателей. Ну, может, не памяти, но допустимого объёма массива.

Shadow в сообщении #659410 писал(а):
Подсказака: Ахил и черепаха

Ужасная подсказка, если Вы понимаете, о чём я. :wink:

 Профиль  
                  
 
 Re: Сравнение двух стилей программирования
Сообщение16.12.2012, 22:53 
Заслуженный участник


27/04/09
28128
Pavia в сообщении #659212 писал(а):
По английски создание это Create или Generate.
А "make" - это "выполнить".
От выполнить оно как раз сильно далеко.

 Профиль  
                  
 
 Re: Сравнение двух стилей программирования
Сообщение16.12.2012, 23:31 
Заслуженный участник


06/07/11
5627
кран.набрать.грамота
shau-kote в сообщении #659396 писал(а):
Shadow в сообщении #659382 писал(а):
Я тоже. Задача - проверить каким он является.

У меня пока единственный вариант - использовать множество.
Идти по списку, добавляя каждый указатель в множество.
Соответственно, выйти по достижению nil или по нахождению очередного указателя в множестве предыдущих.

Я слышал эту задачу в более жесткой формулировке. Когда нельзя использовать для хранения промежуточных данных структуры, сравнимые по размером со списком. Например, у вас список из 1000 элементов, а вам разрешается использовать 2 - 3 переменные. Тут уже говорилось еще и о том, что цикл может начинаться не с первого элемента. Например:
1->2->3->4->5->6->7->4->5->6->7
Я придумал, как решить задачу, если находишься на участке 4 - 7 (там двух-трех переменных достаточно независимо от длины цикла), а вот на участке 1 - 3 пока не знаю :oops: (не знаю, как сделать именно в жестком варианте).

-- 17.12.2012, 00:33 --

Pavia в сообщении #659212 писал(а):
{ Создание нового узла списка }
По английски создание это Create или Generate.
А "make" - это "выполнить".

make - сделать
execute - выполнить.

 Профиль  
                  
 
 Re: Сравнение двух стилей программирования
Сообщение16.12.2012, 23:42 
Аватара пользователя


15/01/12
87
г. Москва
rockclimber в сообщении #659522 писал(а):
Я слышал эту задачу в более жесткой формулировке. Когда нельзя использовать для хранения промежуточных данных структуры, сравнимые по размером со списком.

Ну можно тогда перебирать список и для каждого элемента проверять равенство со всеми предыдущими.
Но у такого алгоритма сложность будет O$(n^2)$.

-- 17.12.2012, 00:58 --

А, нет, так просто не получится. :(

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 82 ]  На страницу Пред.  1, 2, 3, 4, 5, 6  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group