n = int(input())
x=[]
a={}
def f(x):
return x+1
for i in range(n):
x.append(int(input()))
if x[i] not in a.keys():
a.update({x[i]:f(x[i])})
print(a[i])
else:
print(a[i])
задан 21 июн 2020 в 11:40
Проблема в том, что у вас в a[i] i — это не значение введенное юзером, а его индекс в списке x.
Например на первой итерации я введу число 10, оно попадет на 0 индекс в списке x.
Потом вы кладете число на индексе 0 в ваш словарь, тем самым имеем {10: ...}.
Как видите ключ у нас 10 а не 0, а вы пытаетесь вытащить 0.
Решение: замените a[i] на a[x[i]].
ответ дан 21 июн 2020 в 12:31
Pavel DurmanovPavel Durmanov
5,6683 золотых знака21 серебряный знак44 бронзовых знака
Перемудрил сильно в for:
Можно сделать так:
for i in range(n):
x.append(int(input()))
if x[i] not in a.keys():
a[i] = f(x[i])
print(a[i])
ответ дан 21 июн 2020 в 11:47
kepichkepich
997 бронзовых знаков
1
У словаря a нет ключа i, поэтому и возникает эта ошибка.
Если вводить последовательно 0, 1, 2, ...,n-1, то ошибок не будет.
ответ дан 21 июн 2020 в 11:46
васявася
1412 серебряных знака23 бронзовых знака
When an error occurs, code immediately jumps out.
In your code, you’re doing things which would cause errors under certain conditions (such as if the array variable is pointing at nothing (is null), or if it is an empty array), and THEN you check for these conditions, which is pointless.
It’s like crossing the road first, and THEN checking if there’s a car coming. You’re either already roadkill before you check for traffic, or if you’ve made it safely across the street, checking is now pointless.
So, switch it around.
Specifically, this code: int min = values[0];
Will throw a NullPointerException if values is null, and will throw an ArrayIndexOutOfBoundsException if values is an empty array.
More generally, this:
catch (Exception e) {
e.printStackTrace();
}
is incredibly bad code. For starters this means code will continue after the error and thus generally your log will be filled with tons of error messages even when 1 thing goes wrong, and more importantly, an exception contains 5 useful bits of information: Its type, its message, its stack trace, its causal chain, and the batch of suppressed exceptions attached to it.
That last one is usually not particularly interesting, but the other 4 are quite useful. You’re tossing out 3 of the 4 useful things and printing only the stack trace. In addition to that, you’re repeating code EVERYWHERE with this kind of style.
So don’t.
Do not ever write code that catches an exception merely to log it or print it. Just.. don’t catch it, let the top level exception handler (which prints ALL useful information and then closes the thread, which is a pretty good default) handle it. If it’s a checked exception, add throws X to the method signature, where X is the checked exception. For example:
good code:
public void deleteFile(String fileName) throws IOException {
Files.delete(Paths.get(fileName));
}
bad code:
public void deleteFile(String fileName) {
try {
Files.delete(Paths.get(fileName));
} catch (IOException e) {
System.err.println("Something went wrong deleting file!");
e.printStackTrace();
}
}
That second bit of code:
- prints useless info (‘something went wrong’, yeah I know that, I’m looking at an exception)
- uses bad style; exclamation marks are not useful in error messages.
- code silently continues, so any code that calls this method cannot tell the deletion failed to occur. Also likely more errors will follow
- throws away a ton of information; that IOException may have a message such as ‘file is marked read-only’ which you’ve now thrown out.
- is much longer
and that’s just a sampling of what’s wrong with it.
Вопрос:
Я сделал программу типа тасования, которая получает от cases[]; и упорядочивает их в произвольном порядке.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void deal(void);
int cases[22] = {1,2,3,4,5,6,8,10,15,20,25,35,50,65,85,100,105,135,165,200,250};
int main()
{
srand(time(NULL));
int a = 0;
deal();
for(a = 0 ; a < 22 ; a++)
printf("%d n", cases[a]);
return 0;
}
void deal(void){
int loop;
int temp;
int x;
int y;
for(loop = 0; loop < 50; loop++){
x = rand() % 22;
y = rand() % 22;
temp = cases[x];
cases[x] = cases[y];
cases[y] = temp;
}
}
Однако, когда я запускаю код, он поставляется с случайно размещенным 0. Откуда он и почему он там?
Пример вывода:
6
15
0 //I don't want that
20
5
50
10
3
165
65
135
105
8
1
200
25
100
85
2
250
4
Лучший ответ:
Вы объявляете свой массив как:
int cases[22] = {1,2,3,4,5,6,8,10,15,20,25,35,50,65,85,100,105,135,165,200,250};
Если вы не знаете этого, в этом массиве есть только 21 элемент. Таким образом, в стандартных компиляторах C неинициализированное значение будет установлено как ноль. Чтобы исправить это, добавьте еще один элемент в массив.
int cases[22] = {1,2,3,4,5,6,8,10,15,20,25,35,50,65,85,100,105,135,165,200,250, 500}; // add 500
И все будет хорошо.
Во всяком случае, для этой инициализации я рекомендую поместить элементы в несколько строк (скажем, каждые 10 элементов):
int cases[22] = {1, 2, 3, 4, 5, 6, 8, 10, 15, 20,
25, 35, 50, 65, 85, 100,105,135,165,200,
250, 500}; // add 500
И добавьте хороший формат, чтобы избежать такой ошибки.
Ответ №1
Вы объявили int cases[22], но инициализировали только 21 целое число в этот массив, и поэтому последний элемент будет 0, если не инициализирован. Попробуйте добавить другое целое число в конце массива
Ответ №2
Это одна ошибка: Ferico Samuel отвечает правильно
Это дополнение:
Вместо жесткого кодирования 22 в качестве количества случаев вы должны написать свою программу следующим образом:
// no explicit declaration of the size here. The compiler automatically
// puts the correct size depending on the number of elements that follow.
int cases[] = {1,2,3,4,5,6,8,10,15,20,25,35,50,65,85,100,105,135,165,200,250};
...
for(a = 0 ; a < sizeof(cases) / sizeof(cases[0]); a++)
...
sizeof(cases) – размер вашего массива cases в байтах
sizeof(cases[0]) – это размер одного элемента массива cases
таким образом, sizeof(cases) / sizeof(cases[0]) – количество элементов массива.
Таким образом вы можете добавить больше элементов в массив cases без необходимости изменять размер массива в другом месте вашей программы.
Ответ №3
У вас есть неправильное количество элементов в массиве. C немного тупо, потому что он сконструирован таким образом, что компилятор может только обнаруживать, что в массиве слишком много элементов, но никогда, если их слишком мало.
Чтобы обеспечить точное количество элементов, вы можете объявить массивы следующим образом:
#define ARRAY_ITEMS(arr) (sizeof(arr) / sizeof(*arr))
#define CASES_ITEMS 22
int cases[] = {1,2,3,4,5,6,8,10,15,20,25,35,50,65,85,100,105,135,165,200,250};
_Static_assert(ARRAY_ITEMS(cases) == CASES_ITEMS, "Wrong array size: cases");
Одна из самых распространенных ошибок при работе с массивами в программах на языках программирования — это индекс, который находится за границами массива. Такая ошибка может привести к непредсказуемым результатам программы, прерыванию ее работы или даже к краху всего приложения.
Причины возникновения этой ошибки могут быть разнообразными: неправильное выделение памяти при создании массива, неправильное использование операторов индексации массива, ошибка в логике программы, неожиданное изменение размеров массива во время выполнения программы и т.д.
В данной статье мы рассмотрим, какие причины могут привести к возникновению ошибки «индекс находится за границами массива», как ее можно предотвратить и как правильно обрабатывать ошибки при работе с массивами в программах.
Содержание
- Что такое индекс в массиве?
- Как возникает ошибка «индекс за границей массива»?
- Последствия ошибки «индекс за границей массива»
- Как исправить ошибку «индекс за границей массива»?
- Практические рекомендации по работе с индексами в массивах
- Общие советы по работе с массивами в программировании
- Вопрос-ответ
Что такое индекс в массиве?
Массив — это структура данных, которая позволяет хранить множество элементов одного типа. Каждый элемент в массиве имеет индекс. Индекс — это число, которое указывает на конкретный элемент в массиве.
Индексы в массиве начинаются с нуля. Это означает, что первый элемент в массиве имеет индекс 0, второй — 1, третий — 2 и т.д. Индексы могут быть целочисленными значениями или строками.
Когда мы обращаемся к конкретному элементу в массиве, используя его индекс, компьютер находит ячейку памяти, которая содержит нужное нам значение. Если мы используем индекс, который находится за пределами массива, то возникает ошибка «индекс находится за границами массива».
Важно помнить, что в большинстве языков программирования нет автоматической проверки границ массива. Поэтому разработчикам нужно самостоятельно следить за тем, чтобы индексы не выходили за границы массива.
Для того, чтобы избежать ошибок в работе с индексами в массиве, необходимо проверять следующее:
- Индекс имеет неотрицательное значение;
- Индекс меньше, чем длина массива;
- Индекс не равен null или undefined.
Обращение к элементам массива, используя индексы, является одним из самых частых действий в программировании. Поэтому необходимо тщательно следить за тем, чтобы индексы оставались в пределах границ массива.
Как возникает ошибка «индекс за границей массива»?
Ошибка «индекс за границей массива» возникает, когда программа пытается получить доступ к элементу массива, который находится за его границами. Такое может произойти, если программист указал неверный индекс, либо не учел, что массивы в разных языках программирования начинаются с нулевого или единичного индекса.
Например, если массив содержит 5 элементов, то верные индексы для него будут 0, 1, 2, 3 и 4. Если программист попытается обратиться к пятому элементу, используя индекс 5, то это вызовет ошибку «индекс за границей массива».
Ошибки с индексом массива могут возникать не только при обращении к элементу с неверным индексом. Также могут возникать ошибки, если в ходе выполнения программы массив изменяется и его размер становится меньше, чем ранее. В этом случае попытка обратиться к элементу с большим индексом также приведет к ошибке.
Чтобы избежать ошибок «индекс за границей массива», необходимо внимательно следить за значениями индексов, которые используются при работе с массивами. Также следует проверять размер массива перед обращением к его элементам.
- Убедитесь, что используете верный диапазон индексов, начиная с 0 или 1 в зависимости от языка программирования.
- Добавьте проверку размера массива перед обращением к его элементам. Не забудьте учитывать возможность изменения размера массива в ходе выполнения программы.
Последствия ошибки «индекс за границей массива»
Ошибка «индекс за границей массива» является распространенной ошибкой при программировании на различных языках программирования, таких как Java, C++, Python и другие. Эта ошибка возникает, когда производится обращение к элементу массива, которого не существует.
Последствия этой ошибки могут быть катастрофическими. Если при выполнении программы вы получаете ошибку «индекс за границей массива», то вам следует незамедлительно обратить на нее внимание. В противном случае, программа может работать некорректно, что может привести к сбоям и краху приложения.
В качестве примера можно рассмотреть ситуацию, когда программа пытается обратиться к элементу массива, которого не существует. Например, попытка получить доступ к элементу с индексом 10 в массиве, который содержит только 9 элементов, может вызвать ошибку «индекс за границей массива». В этом случае, программа может выдать непредсказуемый результат, и вы не сможете исправить эту ошибку, пока не найдете причину ее возникновения.
Как правило, для избежания данной ошибки, следует тщательно проверять длину массива и диапазон индексов при работе с элементами массива. Если же ошибка все же возникла, то ее можно исправить путем изменения длины массива или переписывания кода таким образом, чтобы в дальнейшем избежать подобных ошибок.
Как исправить ошибку «индекс за границей массива»?
Ошибка «индекс за границей массива» может возникать при попытке получить доступ к элементу массива по индексу, который находится за пределами массива или отрицательный. Эта ошибка приводит к сбою программы и может остановить ее работу.
Чтобы исправить ошибку «индекс за границей массива», нужно проверить правильность индексации массива. В случае отрицательного индекса пересмотрите логику программы, возможно, у вас опечатка при написании индекса или ошибка в алгоритме.
Если вы работаете с многомерным массивом, необходимо убедиться, что каждый из индексов в диапазоне от 0 до размерности массива минус один. В этом случае нужно проверять каждый индекс в отдельности и использовать методы, которые обеспечивают безопасное извлечение данных из массивов.
Рекомендуется использовать защитные механизмы при работе с массивами, а также отлаживать программу на каждом этапе разработки. Чаще всего, ошибка «индекс за границей массива» возникает из-за невнимательности программиста или неправильной логики программы.
В целом, исправить ошибку «индекс за границей массива» несложно, если подойти к проблеме внимательно и проверять правильность индексации массивов при каждом их использовании в программе.
Практические рекомендации по работе с индексами в массивах
1. Правильно задавайте длину массива: перед началом работы с массивами всегда проверяйте их длину. Не забывайте, что индексация начинается с нуля, поэтому количество элементов должно быть точно на единицу больше максимального индекса.
2. Избегайте жестких ограничений: не стоит задавать жесткие ограничения на количество элементов в массиве. Лучше использовать динамические структуры данных, такие как списки или связные списки.
3. Проверяйте границы массива: при доступе к элементам массива всегда проверяйте, что индекс находится внутри границ массива. Иначе вы получите ошибку «индекс находится за границами массива».
4. Не забывайте про отрицательные индексы: если индекс отрицательный, то он отсчитывается с конца массива. Например, индекс -1 соответствует последнему элементу массива, индекс -2 — предпоследнему и т.д.
5. Используйте циклы с ограничениями: при работе с массивами лучше всего использовать циклы for или while, где заданы ограничения на индексы. Это позволяет избежать ошибок в индексировании.
6. Используйте функции проверки границ массива: в некоторых языках программирования есть встроенные функции, которые позволяют проверить корректность индексов. Например, в Python есть функция len(), которая возвращает длину массива. В C++ можно использовать функцию size().
7. Обрабатывайте исключения: если при работе с массивами произошла ошибка, то лучше всего обработать ее в блоке try-catch и вывести соответствующее сообщение. Так вы избежите краха программы и пользователь сможет понять, что произошло.
8. Не забывайте удалять элементы массива: если вы удаляете элемент из массива, то необходимо убедиться, что массив корректно перемещается и все индексы переопределены.
9. Используйте специальные библиотеки: в некоторых языках программирования есть специальные библиотеки, которые позволяют работать с массивами более эффективно и безопасно. Используйте их, если они доступны.
10. Практикуйтесь: чтобы успешно работать с массивами, нужно много практиковаться. Не бойтесь экспериментировать и проверять работу вашего кода.
Общие советы по работе с массивами в программировании
1. Проверяйте границы массива перед использованием индекса. Одна из наиболее распространенных ошибок при работе с массивами — обращение к элементам с неправильным индексом. Обязательно проверяйте, что индекс находится в пределах допустимых значений перед тем, как обращаться к элементам массива.
2. Используйте функции работы с массивами. Современные языки программирования предоставляют множество функций для работы с массивами. Например, функции для поиска элементов, сортировки, фильтрации и т.д. Использование таких функций позволит ускорить выполнение программы и увеличить ее надежность.
3. Не забывайте про динамические массивы. В некоторых языках программирования массивы имеют фиксированный размер. Однако, в большинстве языков можно использовать динамические массивы, которые позволяют изменять их размер по мере необходимости. Использование динамических массивов снижает вероятность ошибок связанных с превышением границ массива и упрощает код программы.
4. Используйте итераторы для перебора элементов массива. В некоторых языках программирования, например, в Python, можно использовать итераторы для перебора элементов массива. Такой подход упрощает код и позволяет избежать ошибок, связанных с выходом за границы массива.
5. Документируйте свой код. Не забывайте описывать свой код, включая работу с массивами. Это позволит сэкономить время при последующей работе с программой и уменьшит вероятность ошибок.
Вопрос-ответ
|
YozUP 3 / 3 / 0 Регистрация: 03.10.2013 Сообщений: 85 |
||||||||||||
|
1 |
||||||||||||
|
07.07.2015, 04:44. Показов 1991. Ответов 16 Метки нет (Все метки)
Доброе утро, все массивы берутся с API youtuba Пишет на одном — Undefined offset: 0 Вытаскиваю так Но ключ такой есть… Вот:
Если пишу так:
То выдает ошибку — Undefined offset: 0 Но Массив и ключ такой есть! Если пишу так
То ошибки нет… Ругается на items с ключом ноль… Что за?
0 |
|
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
07.07.2015, 04:44 |
|
Ответы с готовыми решениями: Выбрасывает исключение, что в словаре уже есть такой ключ OleDbDataReader — вылетает ошибка, что такой столбец не найден, но имя такое есть
Notice: Undefined offset: Что он хочет?! 16 |
|
Leshak 261 / 236 / 161 Регистрация: 10.12.2011 Сообщений: 513 |
||||
|
07.07.2015, 08:34 |
2 |
|||
|
Посмотрите внимательно на выводы функции print_r. Кликните здесь для просмотра всего текста
Сразу намекну что Вы с объектом работаете.
0 |
|
YozUP 3 / 3 / 0 Регистрация: 03.10.2013 Сообщений: 85 |
||||
|
07.07.2015, 08:47 [ТС] |
3 |
|||
|
[QUOTE=Leshak;7845579]Посмотрите внимательно на выводы функции print_r. Кликните здесь для просмотра всего текста
Сразу намекну что Вы с объектом работаете. Не понимаю… Что тут смотреть? В объекте items является массивом — Он декодируется и получается —
Если я вывожу через принт или ечо [‘items’][‘0’][‘statistics’][‘videoCount’] то выводит правильно — 429 Но ошибка говорит что ключ ноль не определен… Что тут не так?
0 |
|
Leshak 261 / 236 / 161 Регистрация: 10.12.2011 Сообщений: 513 |
||||
|
07.07.2015, 08:49 |
4 |
|||
|
Уважаемый, Вы код внимательно смотрели? Я понимаю что мозги включать лень, равно как и глаза. Но готовое решение вашей проблемы уже дано.
0 |
|
14 / 14 / 13 Регистрация: 03.07.2015 Сообщений: 130 |
|
|
07.07.2015, 09:18 |
5 |
|
Автор, а попробуй-ка нолик не брать в кавычки
0 |
|
Laroux 172 / 167 / 75 Регистрация: 21.11.2014 Сообщений: 1,490 |
||||
|
07.07.2015, 09:27 |
6 |
|||
|
Автор, а попробуй-ка нолик не брать в кавычки +1
0 |
|
YozUP 3 / 3 / 0 Регистрация: 03.10.2013 Сообщений: 85 |
||||
|
07.07.2015, 10:35 [ТС] |
7 |
|||
|
+1
Все равно ошибку пишет. Я это сразу попробовал. Дело в том, что все объекты получаю через API Youtube v3 Так и странно, что если выводить значение массива [‘items’][0][‘statistics’][‘videoCount’] то оно есть и выводиться. А почему ошибка не понятно.
0 |
|
4845 / 3857 / 1599 Регистрация: 24.04.2014 Сообщений: 11,317 |
|
|
07.07.2015, 10:42 |
8 |
|
Я понимаю что мозги включать лень, равно как и глаза. Но готовое решение вашей проблемы уже дано. вместо того, что бы обвинять других лучше за собой следи.
Сразу намекну что Вы с объектом работаете. https://secure.php.net/manual/… decode.php
Автор, а попробуй-ка нолик не брать в кавычки не имеет значения YozUP, покажи сам json. Если он такой:
«items»:[{«kind»:»youtube#channel»,»statistics»:{«viewCount»:45265617,»commentCount»:29,» subscriberCount»:183369,»hiddenSubscriberCount»:21,»videoCount»:429}}] то в нем ошибка, не хватает фигурных скобок.
0 |
|
3 / 3 / 0 Регистрация: 03.10.2013 Сообщений: 85 |
|
|
07.07.2015, 10:48 [ТС] |
9 |
|
…
0 |
|
14 / 14 / 13 Регистрация: 03.07.2015 Сообщений: 130 |
|
|
07.07.2015, 10:55 |
10 |
|
то в нем ошибка, не хватает фигурных скобок. Тогда бы функция не смогла декодировать строку
0 |
|
YozUP 3 / 3 / 0 Регистрация: 03.10.2013 Сообщений: 85 |
||||
|
07.07.2015, 11:12 [ТС] |
11 |
|||
|
вместо того, что бы обвинять других лучше за собой следи. https://secure.php.net/manual/… decode.php не имеет значения YozUP, покажи сам json. Если он такой: то в нем ошибка, не хватает фигурных скобок. Это я для примера обрезал строку, полный json большой, вот пример взял, наугад. Повторюсь, это ютубовские и все одинаковые. Но через тысячу запросов появилась эта ошибка: Кликните здесь для просмотра всего текста { «kind»: «youtube#channelListResponse», «etag»: «»Y3xTLFF3RLtHXX85JBgzzgp2Enw/F6SGH2AnpJpEyQRlsjPgDE0Gx9Y»», «pageInfo»: { «totalResults»: 1, «resultsPerPage»: 1 }, «items»: [ { «kind»: «youtube#channel», «etag»: «»Y3xTLFF3RLtHXX85JBgzzgp2Enw/u2yoJ1GcG6dwmTfX7ETfvpA05dg»», «id»: «UCvEOz_viTMwTFzmtLBTY3hA», «statistics»: { «viewCount»: «13751907», «commentCount»: «7», «subscriberCount»: «152919», «hiddenSubscriberCount»: false, «videoCount»: «1086» } } ] } А уважаемый Leshak видимо не прочитал вопрос прежде чем решил поумничать. В вопросе я ясно написал что декодировал строку в массив функцией json_decode с параметром $assoc в true Добавлено через 6 минут
То все выводиться, в том то и дело. Выводиться реальное значение, но тут же останавливается скрипт с ошибкой на эту строку.
0 |
|
14 / 14 / 13 Регистрация: 03.07.2015 Сообщений: 130 |
|
|
07.07.2015, 11:14 |
12 |
|
В смысле останавливается? Это ж не фатальная ошибка
0 |
|
YozUP 3 / 3 / 0 Регистрация: 03.10.2013 Сообщений: 85 |
||||
|
07.07.2015, 11:57 [ТС] |
13 |
|||
|
В смысле останавливается? Это ж не фатальная ошибка Это потому что я включил режим отладки. Скрипт запускаю через крон. Но смысл то в том, что значение есть, и в консоль перед ошибкой выдается значение:
Так почему получается что ноль не определен, если по факту он там есть и конечное значение videoCount выводиться?
0 |
|
4845 / 3857 / 1599 Регистрация: 24.04.2014 Сообщений: 11,317 |
|
|
07.07.2015, 12:35 |
14 |
|
Так почему получается что ноль не определен, если по факту он там есть и конечное значение videoCount выводиться? значит ошибка где-то еще. Может channels_inf меняется, и тогда 0 уже нет.
0 |
|
YozUP 3 / 3 / 0 Регистрация: 03.10.2013 Сообщений: 85 |
||||
|
07.07.2015, 13:04 [ТС] |
15 |
|||
|
значит ошибка где-то еще. Может channels_inf меняется, и тогда 0 уже нет. Нет не меняется. Вот пример, вывожу например в 20-й строке и например в массиве videoCount равен 250 20-я строка
В консоле получаю: 250
0 |
|
4845 / 3857 / 1599 Регистрация: 24.04.2014 Сообщений: 11,317 |
|
|
07.07.2015, 13:19 |
16 |
|
YozUP, это все случайно не в цикле происходит?
0 |
|
3 / 3 / 0 Регистрация: 03.10.2013 Сообщений: 85 |
|
|
07.07.2015, 13:28 [ТС] |
17 |
|
YozUP, это все случайно не в цикле происходит? Все верно в цикле foreach
0 |

Есть папка с файлами, происхождение аля что-то microsoft, не могу понять что это такое
