Как нумеруются элементы массива
Перейти к содержимому

Как нумеруются элементы массива

  • автор:

нумерация массива

как изменить нумерацию элементов одномерного массива. чтобы первому элементу был присвоен номер 1, а не 0.

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Нумерация массива
Как провести нумерацию вектора и двумерного массива не с нуля а с единицы. Подскажите пожалуйста.

Нумерация элементов массива
Что сделать, чтобы в конце элементы массива были пронумерованы. .

Нумерация массива с произвольного числа
Возможно ли как — нибудь объяснить компилятору, что нумеровать новый массив надо не с нуля, а с.

Переставить соседние элементы массива: 1-й со 2-м, 3-й с 4-м и т.д. Нумерация элементов начинается с единицы
Входные данные Первая строка содержит размер массива N . Во второй строке через пробел задаются N.

3550 / 2655 / 327
Регистрация: 11.03.2009
Сообщений: 6,072
использовать размер масива на 1 элемент больше, и нулевой элемент игнорировать.
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
Пробежаться циклом с конца массива, присваивая правому элементу значение левого

1 2 3
int i,a[11]={1,2,3,4,5,6,7,8,9,10}; for (i = sizeof(a)/sizeof(a[0])-1; i >= 0; i--) a[i]=a[i-1]; for (i = 1; i  sizeof(a)/sizeof(a[0]); i++) cout  [i]  <" ";

sizeof(a)/sizeof(a[0])=количество элементов в массиве
Выведет:
1 2 3 4 5 6 7 8 9 10
В общем эта строчка

for (i = sizeof(a)/sizeof(a[0])-1; i >= 0; i--) a[i]=a[i-1];

сдвигает элементы массива на 1 вправо, при условии что есть место
3550 / 2655 / 327
Регистрация: 11.03.2009
Сообщений: 6,072

ЦитатаСообщение от diagon Посмотреть сообщение

Пробежаться циклом с конца массива, присваивая правому элементу значение левого
И что получится?
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
Сдвинется вправо. Ну имеется в виду не с последнего элемента, а с последующего после него.
Регистрация: 04.08.2010
Сообщений: 434
Описать свой класс — массив с 1-го элемента
Регистрация: 03.04.2011
Сообщений: 89
Создай ассоциатиавный массив STL
Регистрация: 19.01.2011
Сообщений: 46

ЦитатаСообщение от diagon Посмотреть сообщение

Пробежаться циклом с конца массива, присваивая правому элементу значение левого
спасибо за идею..но я сделала чуть по проще.
cout<<"number "<Эксперт PythonЭксперт JavaЭксперт CЭксперт С++

12243 / 7373 / 1734
Регистрация: 25.07.2009
Сообщений: 13,521

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
#include #define SIZE 5 int main(void){ int arr[SIZE] = { 10, 20, 30, 40, 50 }, * pArr, i; pArr = arr - 1; for ( i = 1; i  SIZE; ++i ) printf("%d ", pArr[i]); printf("\n"); return 0; }

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Нумерация не с 0, а с 1
Как начать индексацию не с 0, а с 1? хэдэр: #ifndef LIST_H #define LIST_H #include <iostream>.

Нумерация месяца
Доброго дня. Спорим с коллегой с какого числа начинать нумеровать месяца с 0 или с 1. Хотелось бы.

Нумерация фигур №/N
Добрый вечер) Помогите с нумерацией не просто нумерацией 1,2,3,4 и тд. А нужно сделать так.

Нумерация страниц
Для нумерации M страниц книги использовали N цифр. По заданному N вывести M или 0, если решения не.

Тип enum и нумерация
Всем здрасьте ! У меня есть тип enum, который описывает что-то: enum NUM < X1, X2, X3, . >.

Нумерация в ассоциативном массиве
Существует ли нумерация у ассоциативного массива <map>? Допустим есть некий массив mp, в котором.

Как нумеруются элементы массива

Оглавление книги Популярные страницы Скачать книгу Купить книгу

Эта книга поможет освоить интегрированную среду разработки VBA и научиться программировать в VBA с использование объектов, их свойств, методов и событий. Обсуждаемые приемы программирования иллюстрируются примерами, которые можно сразу же опробовать на практике. Полученные знания вы сможете применить как для настройки и усовершенствования популярный офисных приложений, включая приложения Office XP, так и для создания собственных приложений.

Книга рассчитана на тех, кто собирается быстро и без лишних усилий научиться программировать для Windows, используя VBA.

Книги автора: VBA для чайников

Книга: VBA для чайников

Нумерация элементов массива

Скрыть рекламу в статье

Нумерация элементов массива

Если вы не укажете иное, элементы массива индексируются (т.е. нумеруются) начиная с 0; говоря иначе, первым в массиве будет элемент с индексом 0. По этой причине значение, задающее размерность массива в объявлении, должно быть на единицу меньше числа элементов, которые предполагается иметь. Например, если предполагается создать массив из 10 элементов, для размера нужно указать значение 9.

Об этом не следует забывать, когда придется обращаться к элементам массива. Ссылка типа intMaccив (1) на самом деле означает обращение ко второму элементу в массиве.

Если же вам не нравится отсчет от 0, можно начать нумерацию элементов в любом массиве от другого числа — обычно от 1. Чтобы заставить VBA нумеровать все массивы от 1. поместите в раздел объявлений модуля (перед всеми процедурами) оператор

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

Можно задать схемы нумерации и для каждого из измерений в отдельности. Например:

Dim sngNumbers (55 То 75, 7 Тo 16, 99)

В этом примере объявляется трехмерный массив, в котором по первому измерению имеется 21 место, с началом нумерации от 55 до 75; по второму — 10 мест с началом нумерации с 7, а последнее измерение предполагает наличие 100 месте нумерацией от 0.

Если при объявлении массива указать значение для его размера, то размер массива останется фиксированным в ходе всего выполнения программы — программа не сможет сделать массив меньше или больше. Чтобы объявить массив фиксированного размера, укажите в скобках в его объявлении конкретные значения для каждого из измерений массива. Например, оператор

Dim strХорошиеМысли (9, 19) As String

объявляет двумерный массив, который всегда будет содержать 30 строк и 20 столбцов строковых данных (конечно, массив на самом деле не содержит данные в строках и столбцах, по мысленное представление массива в виде подобной таблицы очень удобно).

Фиксирование размера массива при его объявлении определенно можно рекомендовать, если точно известно, что изменение размера массива не потребуется.

Массивы

Часто возникает необходимость хранить не одну переменную, а набор однотипных переменных. Например, список учащихся класса – это набор данных строкового типа, координаты вершин многоугольника или коэффициенты многочлена – это набор числовых данных. Для хранения наборов данных используются структуры данных. Основная структура данных – это массив.

— это структура однотипных данных, занимающих непрерывную область памяти. Массив имеет размер — количество элементов в нем. Каждый элемент массива имеет свой номер (также называемый ), обращение к элементу массива осуществляется путем указания его индекса. В языке C++ элементы нумеруются, начиная с 0, поэтому последний элемент массива имеет номер на 1 меньше размера массива.

Массив в языке C++ задается следующим образом:

тип_элементов идентификатор [ размер ];

где тип_элементов — произвольный тип данных языка C++, который будут иметь элементы массива, например, int , double и т.д.; идентификатор — имя массива, размер — число элементов в нем.

К элементу массива можно обращаться, как идентификатор [ индекс ] . Например, если было сделано объявление

то таким образом создается 5 элементов массива типа double : A[0] , A[1] , A[2] , A[3] , A[4] .

Пример программы, которая создает массив типа int[] , заданного пользователем размера, считывает с клавиатуры его элементы, затем прибавляет к каждому элементу массива число 1 , затем выводит результат на экран:

#include
using namespace std;
int main()
int n; // Размер массива
int i; // Счетчик в циклах

int arr[n]; // Объявление массива (так делать нельзя), лучше вместо такого объявления массива использовать std::vector arr(n);

// Прибавляем по 1 к каждому элементу
for(i=0;i arr[i]+=1;

// Выводим массив на экран
for(i=0;i cout // Переведем курсор на новую строку
cout return 0;
>

В этом примере при помощи // обозначается начало комментария, весь текст после начала комментария и до конца строки компилятором игнорируется. Второй способ объявления комментария: в начале комментария поставить знаки /* , а в конце – */ . Это позволяет делать комментарии, занимающие несколько строк. В языке C допустимы только такие комментарии. ::min()>@w< >— минимальное значение типа @code —> ::max()>@w< >— максимальное значение типа @code. —>

Упражнения

  1. (A) Выведите на экран все элементы массива с четными индексами (то есть A[0] , A[2] , A[4] , . ).
  2. (B) Выведите на экран все четные элементы массива (то есть те элементы, которые являются четными числами).
  3. (C) Найдите количество положительных элементов в массиве. Программа должна считать массив и вывести единственное число – количество положительных элементов в массиве.
  4. (D) Дан массив. Найдите количество элементов массива, которые больше предыдущего элемента в этом массиве.
  5. (E) Массив содержит только ненулевые числа. Определите, есть ли в данном массиве два соседних элемента с одинаковыми знаками. Программа должна вывести YES , если есть два числа с одинаковыми знаками и NO иначе.
  6. (F) Дан массив. Определите, сколько в этом массиве элементов, которые строго больше обоих своих соседей.
  7. (G) Дан массив. Переставьте элементы массива в обратном порядке без использования дополнительного массива. Программа должна считать массив, поменять порядок его элементов, вывести результат на экран (просто вывести элементы массива в обратном порядке – недостаточно!).
  8. (H) Переставьте соседние элементы массива (0-й элемент поменять с 1-м, 2-й с 3-м и т.д. Если элементов нечетное число, то последний элемент остается на своем месте)
  9. (I) Циклически сдвиньте элементы массива вправо (0-й элемент становится 1-м, 1-й становится 2-м, . последний становится 0-м, то есть массив превращается в массив ).
  10. (J) Найдите значение наибольшего элемента в массиве.
  11. (K) Дан массив, отсортированный по возрастанию (каждый элемент массива не меньше предыдущего элемента, например, ). Найдите количество различных чисел в этом массиве. 2 ,x ^2>+. +@code@formula,x n-1 ,x^(n-1)>.> —>

Почему массивы начинаются с нуля

Самое очевидное объяснение: индекс — это смещение относительно начала массива. Так элементы массива легче адресовать в памяти.

Проверим это на C.

#include int main() < int data[3] = ; int i = 0; printf("Array address: %p\n", data); do < printf("Array[%u] = %p\n", i, (void *)(&data[i])); i++; >while(i

Array address: 0x7ffd7c514a6c
Array[0] = 0x7ffd7c514a6c
Array[1] = 0x7ffd7c514a70
Array[2] = 0x7ffd7c514a74

Как первый (нулевой) элемент, так и сам массив находятся по одному и тому же адресу, поскольку 0-й элемент удалён на 0 элементов от начала. Эта связь между указателями и массивами в C настолько тесная, что их даже можно рассматривать вместе.

Однако это ответ на вопрос «зачем», а не «почему». Нумеровать массивы с нуля стали не сразу. Удивительно, но развитие такого простого вопроса не умещается в предложении или абзаце.

Потому что так удобнее

К началу 1960-х годов сформировалось три подхода к организации структуры, которую сегодня мы называем статическим массивом:

    Исчисление с 0. Нижняя граница массива начинается с нуля.

Непривычно для обывателя, если это не житель Германии, свыкшийся с нумерацией этажей в зданиях. Последний элемент массива из, скажем, 8 элементов имеет номер 7.

Не всё так однозначно. Единообразия даже у самых первых языков программирования не существовало:

  1. Нумерация с нуля: LISP 1.5, APL (допускает выбор при запуске программы).
  2. Нумерация с единицы: APL, Бейсик, ранний Фортран.
  3. Произвольные границы: Алгол-60, затем Фортран, CPL, SIMULA, CLU, PL/1, Кобол, Паскаль, Алгол-68, JOVIAL.

Конечно, это не самый сильный аргумент. Часто языки снабжались синтаксическим сахаром для нумерации с 1. К примеру, в Алголе массив V[0:3] начинается с 0, а массив V[3] — с 1.

Создатель языка APL Кеннет Айверсон в книге «A Programming Language» объясняет, почему далее по тексту он будет пользоваться нумерацией элементов массива с нуля. При этом язык допускает отсчёт как с единицы, так и с нуля. Айверсон приводит уже описанный выше аргумент о сдвигах в позиционной нумерации.

Тем не менее и в эпоху до C звучали предложения выбирать нумерацию с 0. Логично предположить, что это была историческая неизбежность, до которой оставалось несколько лет.

Потому что парусные регаты мешали вычислениям

В 1967 году Мартин Ричардс впервые реализует компилятор своего детища — BCPL (Basic Combined Programming Language). Этот язык программирования был призван исправить проблемы созданного в начале шестидесятых языка CPL путём отказа от технологий, затрудняющих компиляцию.

Первый компилятор BCPL был написан для операционной системы CTSS машины IBM 7094 Массачусетского технологического института. На тот момент компьютеры — это уже не целые комнаты и электронные лампы, но всё ещё огромные шкафы с транзисторами и консоли управления без экранов. Ресурсов серии 7090 хватило, чтобы запустить американца в космос. Но мощность измерялась в тысячах машинных слов, микросекундах тактов и килофлопсах, а цена — в миллионах долларов.

В пятидесятых и шестидесятых IBM выдавала институту щедрые скидки на свои научные компьютеры или даже предоставляла их бесплатно. В 1963 году в МТИ поставили IBM 7094. На компьютер уговор был такой: 8 часов в сутки получают специалисты института, 8 часов — другие колледжи и университеты Новой Англии, а третью смену отдавали самой IBM для личных нужд.

На этом особенности не кончались. Несколько раз в год IBM обсчитывала регаты: президент IBM соревновался в заплыве на больших яхтах в проливе Лонг-Айленд, и каждое из судов получало очки гандикапа по специальной сложной формуле. Когда в вычислительный центр приходило задание, операторам полагалось всё бросить и запустить вычисления этих очков.

Машинный зал с установленным компьютером IBM 7094 в Колумбийском университете США. Фотоархив

Вообще, и без этого был шанс не получить результат вычислений. Изначально 7094 работал в режиме пакетной обработки. Вспомогательная система на IBM 1401 загружала пакет задач с перфокарт на ленту, а затем запускала задачи одну за другой и записывала результаты для последующей печати. Для каждой задачи приводилась оценка времени. Если задача выходила за пределы отпущенного, её принудительно прерывали.

В итоге компиляция в BCPL была оптимизирована по максимуму. То есть и указатели на элементы массива должны максимально близко походить на машинный код, без необходимости вычитать единицу при указании на элемент массива. Хотя во время выполнения программы не играет роли схема организации массивов, нумерация с нуля могла появиться для оптимизации времени компиляции.

Впрочем, конкретно эта версия — лишь гипотеза Майка Хойе. Ей нет никаких подтверждений от собствено Ричардса или хотя бы упоминаний в литературе. Мартин Ричардс в переписке с Хойе лишь приводит общие соображения о том, что он хотел достичь близости к машинному коду, поэтому указатель p и p + 0 — это одна и та же переменная. Ни на какие яхты Ричардс не жалуется.

К тому же на момент появления первого компилятора BCPL уже была готова операционка Compatible Time-Sharing System. В ней на одной машине с разделением времени компьютер выполняет одну задачу за один раз, но с оптимизацией ввода и вывода, чтобы паузы одного пользователя заполнялись работой других. Это уже не былая пакетная обработка задач.

Точно известно, что в дальнейшем BCPL значительно повлиял на все современные языки программирования.

В 1969 году Кен Томпсон урезал функциональность BCPL до языка B. В дальнейшем, для развития операционной системы Unix, Деннис Ритчи улучшил B добавлением функций PDP-11, в результате чего и получился C. Полвека спустя список языков, на которые оказал влияние C, занимает в «Википедии» целую страницу.

В языке BCPL v!5 и 5!v совпадают, поскольку являются указателем на !(v+5) или !(5+v) . Аналогично в C v[5] эквивалентно 5[v] .

Потому что так предложил Дейкстра

В 1982 году Эдсгер Дейкстра опубликовал статью «Почему нумерация должна начинаться с нуля». В ней он низверг как нумерацию с единицы, так и произвольные границы индексов. Очевидно, что Дейкстра — не человек, который легко поддаётся влиянию C, но также он раскритиковал Алгол-60, своё собственное детище, и Паскаль.

Известно, что Дейкстра ближе к концу жизни всё больше писал от руки, а не набирал тексты на машинке. Архив рукописей Эдсгера Вибе Дейкстры

Если необходимо записать интервал натуральных чисел 2, 3, …, 12 без опухоли из точек, возможны четыре варианта:

Затем автор замечает, что для нижней границы предпочтителен знак «⩽», поскольку наименьшее натуральное число существует. В противном случае, если последовательность начинается с наименьшего натурального числа, нижняя граница не будет натуральным числом.

Затем статья делает вывод, что из соображений простоты для последовательности из N членов предпочтительнее диапазон 0 ⩽ i < N , а не 1 ⩽ i < N+1 .

Куда менее известный документ — это полушуточная техническая заметка от 1 апреля 1980 года IEN 137 под названием «О священных войнах и призыв к миру» [On Holy Wars and a Plea for Peace].

В заметке Дэнни Коэн приводит интересный аргумент: в системе счисления с основанием b при отсчёте с нуля первые b ^ N неотрицательных чисел представляются ровно N цифрами. Например, если речь про двоичную запись, то 2 ^ 3 = 8 , и восьмой элемент массива будет иметь номер 1112, а не 10002. Понятно, что с такими преобразованиями легко бы мог справиться компилятор.

Потому что так более элегантно

Это объяснение может раздражать субъективностью. Соображения о красоте у каждого свои и совпадать не обязаны. Но авторы языков программирования — тоже люди со своими предпочтениями.

В конце восьмидесятых Гвидо ван Россум при создании Python как учёл свой предыдущий опыт с языком ABC, так и задумал привлечь аудиторию хакеров от мира Unix и C.

С 1983 года Гвидо работал в Центре математики и информатики в Амстердаме над реализацией языка ABC. Проект ставил целью создать язык программирования, пригодный для обычных людей, но не настолько ужасно реализованный, как Бейсик. Нумерация массивов в ABC начиналась с единицы. Такой же схемы придерживались другие знакомые Россуму языки — Алгол, Фортран и Паскаль.

Однако в вышедшем в 1991 году Python нумерация начинается с нуля, а не единицы. Получилось так в результате долгих размышлений.

Одна из причин — слайсы. Чаще всего при создании слайса используются операции «получить первые n элементов» и «начиная с i, получить следующие n элементов». При этом первый случай эквивалентен i == первый индекс . Гвидо посчитал, что лучше, если обе операции возможны без лишней головной боли в виде коррекции +1 и −1.

Если первый элемент имеет номер 1, то возможно указывать первый элемент и число элементов, которые нужно получить. Россум уже был знаком с подобным по ABC и вполне мог бы положиться на этот опыт.

Тем не менее автора Python очаровал синтаксис слайсов полуоткрытого интервала, если нумерация начинается с нуля: a[:n] (или a[0:n] ) и a[i:i+n] . К примеру, строку a легко разбить на три части a[:i] , a[i:j] и a[j:] .

Заметим, что в воспоминаниях Гвидо не приводит ни призывы гениев информатики, ни практики других языков, ни принципы, заложенные мастодонтами компьютерных вычислений шестидесятых. Зато слово «элегантность» в пяти абзацах его объяснения встречается 3 раза.

Почему же массивы начинаются с нуля?

Так исторически сложилось.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *