Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 20.02.2014
Сообщений: 3

Цикл немного выходит за массив

20.02.2014, 21:09. Показов 958. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые форумчане!

Изучаю Си, в данный момент времени - массивы.
Вот собственно простенькая программа для поиска значения в массиве (без проверки на ввод и тд).
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
 
int main(int argc, const char * argv[])
{
    int i, x;
    int a[] = {5, 9, 6, 3, 5, 7, 1, 9, 2, 4};
    const int n = sizeof a / sizeof a[0];
    
    
    // печать массива
    for (i = 0; i < n; ++i)
        printf("%d ", a[i]);
    printf("\n");
    
    printf("Введите искомое значение: ");
    scanf("%d", &x);
    
    // линейный поиск
    for (i = 0; i < n && a[i] != x; ++i)
        ;
    
    if (i < n)
        printf("a[%d] = %d\n",i, x);
    else
        printf("%d не найдено\n", x);
    
}
Преподаватель говорит, что можно поставить "барьер" х в массив и тогда можно исключить из условия цикла проверку не вышла ли программа за границы массива.
Вот так:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
 
int main(int argc, const char * argv[])
{
    int i, x;
    int a[] = {5, 9, 6, 3, 5, 7, 1, 9, 2, 4, x};
    const int n = sizeof a / sizeof a[0];
    
    
    // печать массива
    for (i = 0; i < n; ++i)
        printf("%d ", a[i]);
    printf("\n");
    
    printf("Введите искомое значение: ");
    scanf("%d", &x);
    
    // линейный поиск
    for (i = 0; a[i] != x; ++i)
        ;
    
    if (i < n)
        printf("a[%d] = %d\n",i, x);
    else
        printf("%d не найдено\n", x);
    
}
Тут у меня возникает первый вопрос
А почему введенное мною число (например 15), не записывается в массив?

Вопрос второй.
Я поигрался с программой, удалил "барьер" и оставил цикл без проверки на границы массива.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
 
int main(int argc, const char * argv[])
{
    int i, x;
    int a[] = {5, 9, 6, 3, 5, 7, 1, 9, 2, 4};
    const int n = sizeof a / sizeof a[0];
    
    
    // печать массива
    for (i = 0; i < n; ++i)
        printf("%d ", a[i]);
    printf("\n");
    
    printf("Введите искомое значение: ");
    scanf("%d", &x);
    
    // линейный поиск
    for (i = 0; a[i] != x; ++i)
        printf("%d - %d\n",i, a[i]);;
    
    if (i < n)
        printf("a[%d] = %d\n",i, x);
    else
        printf("%d не найдено\n", x);
    
}
Я хотел понаблюдать за работой цикла, когда он выйдет за пределы массива и что произойдет дальше. Но к своему удивлению обнаружил, что программа работает боле менее корректно.
Вот какой ответ получил я:
5 9 6 3 5 7 1 9 2 4
Введите искомое значение: 15
0 - 5
1 - 9
2 - 6
3 - 3
4 - 5
5 - 7
6 - 1
7 - 9
8 - 2
9 - 4
10 - 0
11 - 0
15 не найдено

И тут я был сильно озадачен. Почему программа выходит из цикла, раз условие все еще истинно? Почему берутся итерации 10 и 11, но нет 12, 13 и тд?

PS Если что, сильно не ругайтесь, только учусь

Добавлено через 7 минут
PPS У меня Mac OS, я ведь не ошибся разделом?)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.02.2014, 21:09
Ответы с готовыми решениями:

Цикл выходит за рамки строки
Сия функция выдает ошибку subscript out of range. Никак не могу понять, где оно выходит за рамки? bool ismailvalid(string mail) { ...

и еще немного про объединение ячеек (или цикл в цикле 5 раз?)
Доброго времени. Коротко предыстория: Не найдя ни одного нормального конвертера ПДФ в ексель, решил решить проблему конвертации...

Как проверить выходит ли цикл за размер массива
Давно мучает такая проблема допустим есть массив int x={0}; и цикл for(int i=0; i&lt;11; i++){x=0;} цикл выходит за размер...

2
Псевдослучайный
1946 / 1146 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
20.02.2014, 21:14
Цитата Сообщение от Johnnie_Junuh Посмотреть сообщение
А почему введенное мною число (например 15), не записывается в массив?
Потому, что ввод производится уже после того, как некое начальное значение x(мусор из стека) было записано в массив.
Цитата Сообщение от Johnnie_Junuh Посмотреть сообщение
Почему программа выходит из цикла, раз условие все еще истинно?
Значит, уже не истинно. Где-то за массивом оказалось искомое значение, это может быть даже сама переменная x.
Впрочем, рассчитывать, что при сборке другим компилятором/с другими параметрами или даже просто при следующем запуске результат окажется таким же нельзя.
1
0 / 0 / 0
Регистрация: 20.02.2014
Сообщений: 3
20.02.2014, 21:47  [ТС]
Про выход понял, спасибо

Но вот с "барьером" вообще не понятно.
Предположим я х = 0 в самом начале. Тогда массив инициализируется как int a[] = {5, 9, 6, 3, 5, 7, 1, 9, 2, 4, 0};
Потом я введу 15 и х перезапишется как 15. Но ведь 0 != 15, так почему цикл закончится?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.02.2014, 21:47
Помогаю со студенческими работами здесь

Цикл который проходил один раз и выходит
Здравствуйте! Есть такой код для записи в бд циклом foreach: foreach (Works works in ListWorks) { ...

Цикл в цикле, подстановка значений, не выходит из внутреннего цикла
К артикулам из колонки 2 (часто повторяющихся), подставить в 3 колонку города из колонки 5. В колонке 4 находятся нужные артикулы для...

Бесконечный цикл с выходом при условии ,не выходит даже после return
private void start() { testboi(); } private void testboi() { ...

Цикл должен прекращаться после пробела, но программа не реагирует и не выходит из цикла
#include &lt;stdio.h&gt; int main() { char num; FILE *file; if ((file = fopen(&quot;1.txt&quot;, &quot;w&quot;)) == NULL) printf(&quot;File can not open...

Можно ли создать бесконечный цикл, из которого выходит при нажатии любой клавиши?
Можно ли создать бесконечный цикл, из которого выходит при нажатии любой клавиши на клавиатуре? Типо вот этого в обычном паскале: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru