OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Среда, 18 Июнь, 2025 20:57

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 197 ]  На страницу Пред.  1 ... 3, 4, 5, 6, 7, 8, 9, 10  След.
Автор Сообщение
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 31 Май, 2007 15:01 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Vlad писал(а):
Ты так и не предоставил аргументы за WHILE vs foreach.

Ты до сих пор не прочитал работы Дейкстры???????????????


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 31 Май, 2007 15:07 
Администратор

Зарегистрирован: Вторник, 15 Ноябрь, 2005 01:14
Сообщения: 4722
Откуда: Россия, Орёл
Сергей Губанов писал(а):
Vlad писал(а):
Ты так и не предоставил аргументы за WHILE vs foreach.

Ты до сих пор не прочитал работы Дейкстры???????????????

:!: :!: :!: :!: :!: :!: :!: :!: :!: :!: :!: :!:


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 31 Май, 2007 15:11 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Сергей Губанов писал(а):
Vlad писал(а):
Ты так и не предоставил аргументы за WHILE vs foreach.

Ты до сих пор не прочитал работы Дейкстры???????????????


Уходишь от ответа?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 31 Май, 2007 20:17 

Зарегистрирован: Среда, 28 Февраль, 2007 00:08
Сообщения: 142
Откуда: Нижний Новгород
Встряну в эту милую беседу.
Vlad писал(а):
...
В смысле написал его через foreach, например?

Скорее, если написал через for/foreach с break.
Vlad писал(а):
Ты так и не предоставил аргументы за WHILE vs foreach.

Попробую ответить за него.
1) (слабый аргумент, только в Си, Си++) break~goto (break с меткой, см. К&R описание Си). т.е.
Код:
goto m1;
и
Код:
break m1;
работают одинаково.
тоже относится к continue.
Как оно в C# не знаю.

2) Умеет ли foreach бегать по структурам сложнее списка?. например, деревья, графы и циклические списки. while может.

3) А кто сказал, что у нас уже есть структура, по которой мы можем пройтись?
Помнится была такая простынькая олимпиадная задача, в ней было проще (и быстрее) не создавать массив, а генерировать его содержимое каждый раз заново.
Чтобы потом не требовали, задача такая:
Есть некое дерево. Каждому узлу приписан номер - число выходящих из него ветвей. Из корня -1 ветка в узел 2; из 2 - в 3 и 4; из 3 в 5,6,7; из 4 в 8,9,10,11 и т.д. Для 2-х чисел [1..2 млрд.] вывести кратчайший путь из одной в другую. сделать в Turbo(pascal/c). Ограничение на память - дос режим (т.е. максимум 1 integer 4 byte массив на ~65000 элементов).

Для while расход памяти 2*10integer (пути к заданным вершинам) + 1*20integer (искомый путь) + мелочевка, т.е. ~150 байт данных. foreach придется съесть 65к памяти, влезает впритык (удвоить диапазон чисел до 4млрд. - и кранты foreach), да и работать будет медленнее, чем while вообще без хранения дерева.

Про то, что памяти сейчас много я знаю, но "за что купил, за то и продаю".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 31 Май, 2007 21:17 

Зарегистрирован: Понедельник, 29 Январь, 2007 19:00
Сообщения: 370
Откуда: Украина, Запорожье
batyrmastyr писал(а):
3) А кто сказал, что у нас уже есть структура, по которой мы можем пройтись?
Помнится была такая простынькая олимпиадная задача, в ней было проще (и быстрее) не создавать массив, а генерировать его содержимое каждый раз заново.
Чтобы потом не требовали, задача такая:
Есть некое дерево. Каждому узлу приписан номер - число выходящих из него ветвей. Из корня -1 ветка в узел 2; из 2 - в 3 и 4; из 3 в 5,6,7; из 4 в 8,9,10,11 и т.д. Для 2-х чисел [1..2 млрд.] вывести кратчайший путь из одной в другую. сделать в Turbo(pascal/c). Ограничение на память - дос режим (т.е. максимум 1 integer 4 byte массив на ~65000 элементов).

Для while расход памяти 2*10integer (пути к заданным вершинам) + 1*20integer (искомый путь) + мелочевка, т.е. ~150 байт данных. foreach придется съесть 65к памяти, влезает впритык (удвоить диапазон чисел до 4млрд. - и кранты foreach), да и работать будет медленнее, чем while вообще без хранения дерева.

Напомнило...
Есть такой пакет для численных расчётов MATLAB и его бесплатный клон Scilab. Для цикла
Код:
for i = 1:n
  ...
end

MATLAB пошагово проходит все значения i и вычисляет тело цикла.
Scilab создает массив из n элементов и после этого, выбирая из него последовательно элементы, выполняет тело цикла.

Как-то подозрительно напоминает этот foreach. Наверное программисты, писавшие Scilab, тоже не знакомы с работами Дейкстры :?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 31 Май, 2007 23:42 

Зарегистрирован: Среда, 28 Февраль, 2007 00:08
Сообщения: 142
Откуда: Нижний Новгород
PGR писал(а):
Напомнило...
Есть такой пакет для численных расчётов MATLAB и его бесплатный клон Scilab. Для цикла
Код:
for i = 1:n
  ...
end

MATLAB пошагово проходит все значения i и вычисляет тело цикла.
Scilab создает массив из n элементов и после этого, выбирая из него последовательно элементы, выполняет тело цикла.

Как-то подозрительно напоминает этот foreach. Наверное программисты, писавшие Scilab, тоже не знакомы с работами Дейкстры :?

Не знаете ли Вы как именно Scilab заполняет этот массив? уж не так ли:
Код:
Index[1]:=1;
....
Index[i]:=Index[i-1]+1;
:)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Четверг, 31 Май, 2007 23:51 

Зарегистрирован: Понедельник, 29 Январь, 2007 19:00
Сообщения: 370
Откуда: Украина, Запорожье
batyrmastyr писал(а):
Не знаете ли Вы как именно Scilab заполняет этот массив? уж не так ли:
Код:
Index[1]:=1;
....
Index[i]:=Index[i-1]+1;
:)

Точно не знаю, но другой вариант придумать сложно. Другой вопрос - зачем он это делает :?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 01 Июнь, 2007 10:31 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Ой, ну что вы к foreach пристали. В C# он является синтаксическим сахаром для упрощения перебора всех элементов в коллекции. Для этого он использует интерфейс: System.Collections.Generic.IEnumerable<T>. Способ реализации этого интерфейса определяет порядок обхода элементов коллекции. Можно генерировать элементы коллекции "на лету". Для встроенных типов интерфейс IEnumerable для оптимизации работы не используется поскольку там компилятору и так понятно как обходить элементы, скажем, массива.

Код:
using System.Collections;
using System.Collections.Generic;

namespace GenericIteratorExample
{
    public class Stack<T> : IEnumerable<T>
    {
        private T[] values = new T[100];
        private int top = 0;

        public void Push(T t) { values[top++] = t; }
        public T Pop() { return values[--top]; }

        // These make Stack<T> implement IEnumerable<T> allowing
        // a stack to be used in a foreach statement.
        public IEnumerator<T> GetEnumerator()
        {
            for (int i = top; --i >= 0; )
            {
                yield return values[i];
            }
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }

        // Iterate from top to bottom.
        public IEnumerable<T> TopToBottom
        {
            get
            {
                // Since we implement IEnumerable<T>
                // and the default iteration is top to bottom,
                // just return the object.
                return this;
            }
        }

        // Iterate from bottom to top.
        public IEnumerable<T> BottomToTop
        {
            get
            {
                for (int i = 0; i < top; i++)
                {
                    yield return values[i];
                }
            }
        }

        //A parameterized iterator that return n items from the top
        public IEnumerable<T> TopN(int n)
        {
            // in this example we return less than N if necessary
            int j = n >= top ? 0 : top - n;

            for (int i = top; --i >= j; )
            {
                yield return values[i];
            }
        }
    }

    //This code uses a stack and the TopToBottom and BottomToTop properties
    //to enumerate the elements of the stack.
    class Test
    {
        static void Main()
        {
            Stack<int> s = new Stack<int>();
            for (int i = 0; i < 10; i++)
            {
                s.Push(i);
            }

            // Prints: 9 8 7 6 5 4 3 2 1 0
            // Foreach legal since s implements IEnumerable<int>
            foreach (int n in s)
            {
                System.Console.Write("{0} ", n);
            }
            System.Console.WriteLine();

            // Prints: 9 8 7 6 5 4 3 2 1 0
            // Foreach legal since s.TopToBottom returns IEnumerable<int>
            foreach (int n in s.TopToBottom)
            {
                System.Console.Write("{0} ", n);
            }
            System.Console.WriteLine();

            // Prints: 0 1 2 3 4 5 6 7 8 9
            // Foreach legal since s.BottomToTop returns IEnumerable<int>
            foreach (int n in s.BottomToTop)
            {
                System.Console.Write("{0} ", n);
            }
            System.Console.WriteLine();

            // Prints: 9 8 7 6 5 4 3
            // Foreach legal since s.TopN returns IEnumerable<int>
            foreach (int n in s.TopN(7))
            {
                System.Console.Write("{0} ", n);
            }
            System.Console.WriteLine();
        }
    }
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 01 Июнь, 2007 10:33 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
batyrmastyr писал(а):
Попробую ответить за него.
1) (слабый аргумент, только в Си, Си++) break~goto (break с меткой, см. К&R описание Си). т.е.


Первый раз слышу про break с меткой. Каким он здесь боком и к чему этот аргумент?

batyrmastyr писал(а):
2) Умеет ли foreach бегать по структурам сложнее списка?. например, деревья, графы и циклические списки. while может.


foreach бегает по последовательностям. Если ты можешь представить дерево/граф/циклический список в виде последовательноси - то может.
Однака это все к делу не относится. В оригинале был линейный поиск в массиве, а не в какой-то страшной структуре данных.

batyrmastyr писал(а):
3) А кто сказал, что у нас уже есть структура, по которой мы можем пройтись?


По определению задачи - у нас есть массив. Или ты предлагаешь использовать WHILE только в силу его большей универсальности? А гвозди будешь забивать микроскопом, потому что им можно еще и на звезды смотреть?

batyrmastyr писал(а):
foreach придется съесть 65к памяти, влезает впритык (удвоить диапазон чисел до 4млрд. - и кранты foreach), да и работать будет медленнее, чем while вообще без хранения дерева.


foreach работает с последовательностями. Последовательности могут генерироваться на лету. Я ж говорю - кругозор надо расширять :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 01 Июнь, 2007 10:35 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
PGR писал(а):
Как-то подозрительно напоминает этот foreach. Наверное программисты, писавшие Scilab, тоже не знакомы с работами Дейкстры :?


Если Дейкстра не писал про ленивые вычисления и бесконечные списки, то это не значит, что таких понятий нет :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 01 Июнь, 2007 10:38 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Сергей Губанов писал(а):
Ой, ну что вы к foreach пристали. В C# он является синтаксическим сахаром для упрощения перебора всех элементов в коллекции.


Так вот, зачем этот сахар придумали, а не используют WHILE? Потому то не читали Дейкстры? :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 01 Июнь, 2007 10:51 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
Vlad писал(а):
Так вот, зачем этот сахар придумали, а не используют WHILE? Потому то не читали Дейкстры? :)

Чтобы продвинуться в понимании этого вопроса я попрошу Вас выразить свою точку зрения на следующий вопрос.
Как Вы думаете, зачем в структурном программировании существует конструкция WHILE, в чём её смысл?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 01 Июнь, 2007 11:33 
Аватара пользователя

Зарегистрирован: Вторник, 19 Сентябрь, 2006 21:54
Сообщения: 2461
Откуда: Россия, Томск
Vlad писал(а):
А гвозди будешь забивать микроскопом, потому что им можно еще и на звезды смотреть?

На микроскопические звезды.
: ))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 01 Июнь, 2007 11:51 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Сергей Губанов писал(а):

Как Вы думаете, зачем в структурном программировании существует конструкция WHILE, в чём её смысл?


Для организации цикла в заданном (заранее обозримом) блоке кода.

Встречный вопрос. В чем приципиальное отличие foreach от while/for, помимо всех неявных действий (и невозможности влиять на эти действия)?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 01 Июнь, 2007 11:58 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
Vlad писал(а):
Для организации цикла в заданном (заранее обозримом) блоке кода.

Какето? У нас что, код самомодифицирующийся или вы что-то другое имели в виду? :о)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 01 Июнь, 2007 12:33 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Wlad писал(а):
Vlad писал(а):
Для организации цикла в заданном (заранее обозримом) блоке кода.

Какето? У нас что, код самомодифицирующийся или вы что-то другое имели в виду? :о)


В случае использования if/goto для организации цикла, говорить об "обозримости" становится сложно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 01 Июнь, 2007 12:40 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
Vlad писал(а):
В случае использования if/goto для организации цикла, говорить об "обозримости" становится сложно.

Ну дык метку, куда собираетесь перейти, вы тоже не по наитию ставите... :о) А и WHILE может на 25000 строк растянуться. Сам видел. :о)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 01 Июнь, 2007 12:52 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Wlad писал(а):
Vlad писал(а):
В случае использования if/goto для организации цикла, говорить об "обозримости" становится сложно.

Ну дык метку, куда собираетесь перейти, вы тоже не по наитию ставите... :о) А и WHILE может на 25000 строк растянуться. Сам видел. :о)


Тем не менее, границы WHILE строго определены и не могут пересекаться другими структурными операторами.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 01 Июнь, 2007 12:53 

Зарегистрирован: Суббота, 26 Ноябрь, 2005 18:38
Сообщения: 1857
Vlad писал(а):
Тем не менее, границы WHILE строго определены и не могут пересекаться другими структурными операторами.


И break'ом в том числе.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пятница, 01 Июнь, 2007 13:39 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1693
Vlad писал(а):
Vlad писал(а):
Тем не менее, границы WHILE строго определены и не могут пересекаться другими структурными операторами.

И break'ом в том числе.

Мы "вообще" или "конкретно про" Обероны?


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

Часовой пояс: UTC + 3 часа


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

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


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

Найти:
cron
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2025, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB