OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Четверг, 22 Август, 2019 22:56

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




Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу 1, 2  След.
Автор Сообщение
СообщениеДобавлено: Суббота, 24 Апрель, 2010 11:25 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Отделено: viewtopic.php?p=46413#p46413
Geniepro писал(а):
igor писал(а):
Казус, однако, состоит в том, что число 0 не входит в множество натуральных чисел.
Есть две школы математики, одна из которых (французкая/немецкая, например) включает ноль в множество натуральных чисел, а другая (в частности, русская) -- не включает.
Вопрос терминологии.

http://ru.wikipedia.org/wiki/Натуральное_число
Цитата:
Существуют два подхода к определению натуральных чисел — числа, используемые при:

* перечислении (нумеровании) предметов (первый, второй, третий…) — подход, общепринятый в большинстве стран мира (в том числе и в России);

* обозначении количества предметов (нет предметов, один предмет, два предмета…). Принят в трудах Бурбаки, где натуральные числа определяются как мощности конечных множеств.

Отрицательные и нецелые числа натуральными числами не являются.


Кто бы объяснил, зачем элементы массивов нумеруются с нуля? Это ведь так неудобно. Приходится делать в программе лишние вычисления. Могут возникать ошибки. Тлетворное влияние немцев и французов?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 24 Апрель, 2010 12:04 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8169
Откуда: Троицк, Москва
Сергей Прохоренко писал(а):
Кто бы объяснил, зачем элементы массивов нумеруются с нуля?
Давайте это в отдельную тему. То ли для начинающих, то ли Опять 25.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 24 Апрель, 2010 12:09 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Сергей Прохоренко писал(а):
Кто бы объяснил, зачем элементы массивов нумеруются с нуля? Это ведь так неудобно. Приходится делать в программе лишние вычисления.
Когда элементы массива нумеруются с нуля, то вычисление относительных адресов этих элементов производися очень просто и естественно. :wink:


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Суббота, 24 Апрель, 2010 22:40 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3061
Откуда: Астрахань
Сергей Прохоренко писал(а):
Кто бы объяснил, зачем элементы массивов нумеруются с нуля? Это ведь так неудобно. Приходится делать в программе лишние вычисления. Могут возникать ошибки. Тлетворное влияние немцев и французов?

Нет. Тлетворное влияние организации оперативной памяти... :)
Элементы памяти имеют адрес. Этот адрес - смещение элемента от начала. Естественно, есть элемент с нулевым смещением.
Массивы С/С++ (а за ними и остальные) пошли по этому пути. Это не номер элемента, а его смещение относительно начала массива.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 25 Апрель, 2010 08:05 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8169
Откуда: Троицк, Москва
Теорию штудируйте. Дейкстру. Там написано про нумерацию с нуля и почему нужно именно так.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 25 Апрель, 2010 12:04 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Столько слов написали, только чтобы не дать ответ. Наверное, еще сами не разобрались. :D


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 25 Апрель, 2010 15:49 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Пусть дан массив элементов, который размещён в памяти начиная с некоторого адреса base.
Тогда адрес памяти, по которому расположен N-тый элемент массива, вычисляется по формуле:
address := base + (N - 1) * size, где: size - размер элемента массива в байтах.

Так вот, выражение N - 1 - это и есть индекс. Если индексы массива определить именно таким образом, то есть на единицу меньше, чем номер, то при доступе к массиву не надо будет каждый раз делать декремент. Эта операция очень быстрая, но использоваться она может очень часто.

Уверен, что Вы ответите что-то типа: "Не, ну это-то понятно, это я и сам знаю, а ... (дальше Ваш выход) ...".
Буду рад, если я ошибаюсь. :)

PS: Штудируйте режимы адресации КР1810ВМ86 :D :D :D . ТИАСУР for ever


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 25 Апрель, 2010 16:40 

Зарегистрирован: Воскресенье, 03 Февраль, 2008 12:50
Сообщения: 245
Edsger W. Dijkstra, Why numbering should start at zero.
Если я правильно понял:
  • У записей a) и b) есть то преимущество, что разность между границами - есть количество элементов. Однако этот критерий не отдаёт предпочтения какому-то конкретному варианту. Надо смотреть другие критерии.
  • Если рассмотреть возрастающую последовательность, включающую минимальное натуральное число (пусть будет 1), то получим
    a) 1 ≤ i
    b) 0 < i
    c) 1 ≤ i
    d) 0 < i
    Для вариантов b) и d) индекс нижней границы выходит за пределы множества натуральных чисел. Это неприятно. Поэтому для нижней границы лучше использовать нестрогое неравенство, ≤.
  • Если последовательность окажется пустой, то
    a) i < 1
    b) i ≤ 0
    c) i ≤ 1
    d) i < 0
    теперь уже для верхней границы индекс может выйти за пределы множества натуральных чисел. В случае если использовать нестрогое неравенство ≤. Поэтому лучше использовать строгое, <.
  • Остались варианты a) и с). Выбор за a) в силу первого пункта.

Теперь, разобравшись с предпочтительной формой неравенств, перейдём, вслед за Дейкстрой, к выбору схемы нумерации индексов.

Для последовательности из N элементов (с учётом уже выбранной формы неравенств) есть два варианта:
  • 1 ≤ i < N+1;
  • 0 ≤ i < N.

Дейкстра считает, что второй диапазон лучше. Т.к. индекс элемента непосредственно равен количеству элементов, предшествующих ему.


Последний раз редактировалось kemiisto Воскресенье, 25 Апрель, 2010 18:38, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 25 Апрель, 2010 16:44 

Зарегистрирован: Воскресенье, 03 Февраль, 2008 12:50
Сообщения: 245
igor писал(а):
Так вот, выражение N - 1 - это и есть индекс. Если индексы массива определить именно таким образом, то есть на единицу меньше, чем номер, то при доступе к массиву не надо будет каждый раз делать декремент. Эта операция очень быстрая, но использоваться она может очень часто.

Что-то мне подсказывает, что дело тут не в скорости операции вычитания. А в том, что если за индекс взять N, а не N - 1, то, скажем, для представления 64 индексов нужно будет уже 7 бит (от 1 до 64) с неплохим перерасходом. А если брать N - 1 то хватить 6 бит (от 0 до 63). Хотя...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 25 Апрель, 2010 16:48 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
И это тоже.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 25 Апрель, 2010 17:32 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Я где-то уже писал на этом форуме, но чувствую, что имеет смысл повторить.

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

Массивы очень полезно себе представлять как нагруженные множества. А именно: упорядоченное множество индексов и их нагрузки (сами данные). Здесь, с одной стороны не возникает никаких противоречий с математическим понятием множества; а с другой стороны, массив как бы является расширением уже введённого в язык понятия множества SET.

Последнюю мысль поясню. То есть массив, как и SET, тоже является как бы множеством целых чисел от 0 до N-1 (индексов). Только, во-первых, N здесь может быть произвольным; во-вторых, массив является нагруженным множеством.

PS: Про нагруженные множества можно почитать, например, у Борисенко: http://www.intuit.ru/department/se/pbmsu/12/2.html.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Воскресенье, 25 Апрель, 2010 18:04 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3061
Откуда: Астрахань
Еще можно посмотреть со стороны линейного поиска. Если нумерация с нуля, то a[N] - это элемент-барьер.
Аналогично сделано в stl для итераторов: элемент v.end() - это "адрес" фиктивного элемента за последним реальным элементом контейнера v.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Понедельник, 26 Апрель, 2010 22:32 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1381
Сергей Прохоренко писал(а):
Кто бы объяснил, зачем элементы массивов нумеруются с нуля? Это ведь так неудобно. Приходится делать в программе лишние вычисления. Могут возникать ошибки. Тлетворное влияние немцев и французов?

Просто традиция.
В плохом языке Бэйсик (во многих его реализациях), для преодоления этого "неудобства", был специальный оператор (функция?), который устанавливал индекс первого элемента массива - 0 или 1. Естественно, что в реализации нечто в выражениях вычисления смещения (внутри интерпретатора) всё равно вычиталось... но пользователи оставались довольными и внутренние противоречия их не терзали.
В принципе, никто не мешает в компилирующих языках просто подставлять другие куски кода в кодогенерирующих частях компилятора. А начальный номер индекса в массивах определять через опции компилятора (в комментариях, например или - в командной строке).
Хотя, в тех же Паскале и Модуле-2 и этой проблемы не существовало - там границы массивов при их объявлении задавались...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Вторник, 27 Апрель, 2010 21:58 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Wlad2 писал(а):
Сергей Прохоренко писал(а):
Кто бы объяснил, зачем элементы массивов нумеруются с нуля? Это ведь так неудобно. Приходится делать в программе лишние вычисления. Могут возникать ошибки. Тлетворное влияние немцев и французов?

Просто традиция.
В плохом языке Бэйсик (во многих его реализациях), для преодоления этого "неудобства", был специальный оператор (функция?), который устанавливал индекс первого элемента массива - 0 или 1. Естественно, что в реализации нечто в выражениях вычисления смещения (внутри интерпретатора) всё равно вычиталось... но пользователи оставались довольными и внутренние противоречия их не терзали.
В принципе, никто не мешает в компилирующих языках просто подставлять другие куски кода в кодогенерирующих частях компилятора. А начальный номер индекса в массивах определять через опции компилятора (в комментариях, например или - в командной строке).
Хотя, в тех же Паскале и Модуле-2 и этой проблемы не существовало - там границы массивов при их объявлении задавались...


Спасибо, Wlad2! Я, наконец, понял, что это просто идиотская традиция, которую обязаны любить все крутые программеры. Мы ведь должны сделать приятное компилятору, чтобы тот, бедняга, не перетрудился, и для этого каждый раз должны свихивать свои мозги (типа, кроме индекса нужно держать в голове номер) и рисковать наделать ошибок.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 28 Апрель, 2010 05:36 

Зарегистрирован: Вторник, 13 Ноябрь, 2007 20:38
Сообщения: 1056
Сергей Прохоренко писал(а):
Спасибо, Wlad2! Я, наконец, понял, что это просто идиотская традиция, которую обязаны любить все крутые программеры.
Сказано было много, но Вы услышали только то, что хотели услышать.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 28 Апрель, 2010 06:52 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3061
Откуда: Астрахань
Сергей Прохоренко писал(а):
Спасибо, Wlad2! Я, наконец, понял, что это просто идиотская традиция, которую обязаны любить все крутые программеры. Мы ведь должны сделать приятное компилятору, чтобы тот, бедняга, не перетрудился, и для этого каждый раз должны свихивать свои мозги (типа, кроме индекса нужно держать в голове номер) и рисковать наделать ошибок.

Не... Я сам и некоторые мои знакомые программисты частенько делали ошибки, вычисляя количество элементов массива. Там же +1 надо обязательно. О которой частенько забываешь. У меня при переходе на С такие ошибки исчезли просто. Мне кажется, еще до Дейкстры создатели С интуитивно поступили правильно. И Вирт, обратите внимание, тоже в конце концов сделал то же самое.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 28 Апрель, 2010 06:58 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8169
Откуда: Троицк, Москва
Массивы не *нумеруются* с нуля.
Указывается их позиция в массиве, измеряемая смещением -- числом элементов etc.
И нефик время тратить.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 28 Апрель, 2010 19:30 

Зарегистрирован: Воскресенье, 28 Май, 2006 22:12
Сообщения: 1381
Валерий Лаптев писал(а):
Сергей Прохоренко писал(а):
Там же +1 надо обязательно. О которой частенько забываешь. У меня при переходе на С такие ошибки исчезли просто.

Какие ошибки исчезли "при переходе на Си"? применительно к обязательности "+1"...
Какие могут быть ошибки, если обязательно есть оператор (функция), возвращающий(-ая), длину по заданной размерности массива?

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

хотя, конечно, можно и кипятком писать по поводу
#define LEN(a) ( sizeof (a) / sizeof ((a)[0]) )
... однако кипяточек резко заканчивается после ухода со статически объявляемых массивов...


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 28 Апрель, 2010 20:44 
Аватара пользователя

Зарегистрирован: Воскресенье, 08 Июль, 2007 00:38
Сообщения: 778
Откуда: Москва
Валерий Лаптев писал(а):
Мне кажется, еще до Дейкстры создатели С интуитивно поступили правильно. И Вирт, обратите внимание, тоже в конце концов сделал то же самое.


Я обратил внимание, но мотивы Вирта мне не известны. Может быть, он просто решил не выделяться" - и так все вокруг обвиняли его в отрыве от мэйнстрима.

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

У меня есть четкая позиция: компилятор (и язык) для программиста, а не программист для компилятора. Несколько лет люди в вузах изучают линейную алгебру, где элементы матриц нумеруются с единицы, все математические модели используют нумерацию элементов с единицы. И вот вдруг ни с того ни с сего при программировании этих самых матмоделей требуют сдвинуть систему координат! Чего ради? Ради "сишных" программистов, которые скорее уйдут на пенсию, чем перейдут на новый язык?

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: Среда, 28 Апрель, 2010 21:10 

Зарегистрирован: Суббота, 07 Март, 2009 15:39
Сообщения: 3061
Откуда: Астрахань
Сергей Прохоренко писал(а):
Валерий Лаптев писал(а):
Мне кажется, еще до Дейкстры создатели С интуитивно поступили правильно. И Вирт, обратите внимание, тоже в конце концов сделал то же самое.


Я обратил внимание, но мотивы Вирта мне не известны. Может быть, он просто решил не выделяться" - и так все вокруг обвиняли его в отрыве от мэйнстрима.

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

У меня есть четкая позиция: компилятор (и язык) для программиста, а не программист для компилятора. Несколько лет люди в вузах изучают линейную алгебру, где элементы матриц нумеруются с единицы, все математические модели используют нумерацию элементов с единицы. И вот вдруг ни с того ни с сего при программировании этих самых матмоделей требуют сдвинуть систему координат! Чего ради? Ради "сишных" программистов, которые скорее уйдут на пенсию, чем перейдут на новый язык?

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

1. Математические модели и их реализация - это "две большие разницы". Просто поищите ПОДХОДЯЩИЙ вам инструмент. С задаваемыми границами массивов.
2. В то время, когда создавался С, только Дейкстра (и, может быть, еще пара-тройка человек) задумывался о том, что такое программы. И для чего они: для компьютера или для человека.

Остальные в большинстве своем просто лабали проги. В С индекс элемента массива означает именно не номер, а смещение от начала - это естественно устройство адресуемой памяти.

Хотя, например, в системе команд 8086 есть команда bound, с помощью которой можно проверить, попадает ли указанное целое в заданный интервал. Правда, пользоваться не очень удобно - прерывание надо обрабатывать.
Аналог механизма исключений в языках высокого уровня...


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

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


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

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


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

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