Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
0 / 0 / 1
Регистрация: 28.03.2018
Сообщений: 45
1

Выход за пределы массива, устранение

27.01.2019, 11:31. Просмотров 1371. Ответов 10
Метки нет (Все метки)

Всем, привет!

Дано задание: Определить последовательность элементов массива, возрастает, убывает или не возрастает и не убывает

Сама программа работает, однако сравнение элементов выходит за пределы массива, объясните почему так?

ПС: скрин прилагается, в желтой рамке самой программы, с каким числом сравнивается заданный элемент, а в желтой рамке в самом коде (i = 0), мне говорят, что там должна быть единица.

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include "stdafx.h" 
#include <iostream> 
#include <conio.h> 
#include <stdio.h> 
#include <cstdlib> 
 
using namespace std;
 
 
int main()
{
    setlocale(LC_ALL, "RUS");
 
    int n, i, *a, k_voz = 0, k_ub = 1;
 
    cout << "Введите количество элементов последовательности: ";
    cin >> n;
 
    a = new int[n];
    cout << "Введите элементы последовательности\n";
    for (i = 0; i < n; i++)
    {
        cin >> a[i];
                cout << "a[" << i - 1 << "]=" << a[i - 1] << ", a[" << i << "]=" << a[i] << "\n";
        if (a[i - 1] < a[i])
        {
            k_voz = k_voz + 1;
        }
        if (a[i - 1] > a[i])
        {
            k_ub = k_ub + 1;
        }
    }
    cout << "Заданная последовательность:\n";
    for (i = 0; i < n; i++)
    {
        cout << a[i] << " ";
    }
    if (k_voz == n)
    {
        cout << "\nПоследовательность возрастает\n";
    }
    else
    {
        if (k_ub == n)
            cout << "\nПоследовательность убывает\n";
        else
        {
            cout << "\nПоследовательность не возрастает и не убывает\n";
        }
    }
    system("pause");
    return 0;
}
0
Миниатюры
Выход за пределы массива, устранение  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.01.2019, 11:31
Ответы с готовыми решениями:

Выход за пределы массива
Столкнулся со следующей проблемой. Ввожу по формату: Мой код при выполнении выдаёт ошибку. Выход...

Выход за пределы массива
в одном из обучающих видео уроков наткнулся на ТАКОЕ. алгоритм sort получает в себя начало и...

Выход за пределы массива
#include &lt;assert.h&gt; #include &lt;assert.h&gt; #include &lt;string.h&gt; #include &lt;stdint.h&gt; #include...

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

10
499 / 340 / 129
Регистрация: 22.11.2017
Сообщений: 983
27.01.2019, 11:35 2
В массиве нет элемента с индексом -1.
0
Миниатюры
Выход за пределы массива, устранение  
0 / 0 / 1
Регистрация: 28.03.2018
Сообщений: 45
27.01.2019, 11:43  [ТС] 3
Всем, привет!

Дано задание: Определить последовательность элементов массива, убывает, возрастает или не убывает и не возрастает

Сам код работает как часы, однако первый элемент сравнивается с отрицательным числом, тем самым выходит за пределы массива, объясните почему так и как это исправить

Пс: скрин прилагается, в желтой рамке самого кода число с которым сравнивается первый заданный элемент массива, в самом коде в желтой рамке ( i = 0 ) мне говорят там должна быть единица.

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include "stdafx.h" 
#include <iostream> 
#include <conio.h> 
#include <stdio.h> 
#include <cstdlib> 
 
using namespace std;
 
 
int main()
{
    setlocale(LC_ALL, "RUS");
 
    int n, i, *a, k_voz = 0, k_ub = 1;
 
    cout << "Введите количество элементов последовательности: ";
    cin >> n;
 
    a = new int[n];
    cout << "Введите элементы последовательности\n";
    for (i = 0; i < n; i++)
    {
        cin >> a[i];
                cout << "a[" << i - 1 << "]=" << a[i - 1] << ", a[" << i << "]=" << a[i] << "\n";
        if (a[i - 1] < a[i])
        {
            k_voz = k_voz + 1;
        }
        if (a[i - 1] > a[i])
        {
            k_ub = k_ub + 1;
        }
    }
    cout << "Заданная последовательность:\n";
    for (i = 0; i < n; i++)
    {
        cout << a[i] << " ";
    }
    if (k_voz == n)
    {
        cout << "\nПоследовательность возрастает\n";
    }
    else
    {
        if (k_ub == n)
            cout << "\nПоследовательность убывает\n";
        else
        {
            cout << "\nПоследовательность не возрастает и не убывает\n";
        }
    }
    system("pause");
    return 0;
}

Заранее благодарен!
0
499 / 340 / 129
Регистрация: 22.11.2017
Сообщений: 983
27.01.2019, 11:48 4
EwgenYYY, вот моя версия решения.

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
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <windows.h>
 
using namespace std;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    system("color 0A");
 
    cout << "Укажите длину последовательности ";
    size_t n;
    cin >> n;
    auto a = new int[n];
    cout << "Введите значения элементов" << endl;
    for (size_t u = 0u; u < n; ++u)
    {
        cout << "a[" << u << "] = ";
        cin >> a[u];
    }
    auto up = true;
    auto down = true;
    for (size_t u = 1u; u < n; ++u)
    {
        up = a[u - 1] < a[u] && up;
        down = a[u - 1] > a[u] && down;
    }
    cout << "Последовательность является ";
    cout << (
        up ? "возрастающей" :
        down ? "убывающей" :
        "не возрастающей и не убывающей"
        ) << endl;
 
    system("pause");
    return 0;
}
0
4749 / 3232 / 1951
Регистрация: 18.12.2017
Сообщений: 10,319
27.01.2019, 11:54 5
Цитата Сообщение от EwgenYYY Посмотреть сообщение
мне говорят, что там должна быть единица
если поставите 1 не будет вводиться первый элемент или перед циклом сin >>a[0]; ставить. но лучше так:
C++
1
2
3
for (i = 0; i < n-1; i++)
if (a[i] < a[i+1])...
else ...
второй if не нужен применяйте else. не забывайте что ещё случай равенства. ставить строгое неравенство или нестрогое зависит от того, какую последовательность считать возрастающей (т.е. когда следующий больше предыдущего или больше или равен предыдущему)
k_voz = k_voz + 1; лучше так: up++;
и строку 24 уберите - не делайте вывод после cin
0
0 / 0 / 1
Регистрация: 28.03.2018
Сообщений: 45
27.01.2019, 11:56  [ТС] 6
А число отрицательное разве может быть, где a [i] = 0

И там указанная последовательность из 4 элементов, а я ввел 3
0
Миниатюры
Выход за пределы массива, устранение  
0 / 0 / 1
Регистрация: 28.03.2018
Сообщений: 45
27.01.2019, 12:01  [ТС] 7
24 строка нужна, т.к без нее преподаватель не примет работу (она сама ввела эту строку)
0
4749 / 3232 / 1951
Регистрация: 18.12.2017
Сообщений: 10,319
27.01.2019, 12:16 8
Цитата Сообщение от EwgenYYY Посмотреть сообщение
И там указанная последовательность из 4 элементов, а я ввел 3
Вы прочитали пост ? чтобы не путаться сделайте ввод и сравнение в разных циклах

насчёт неравенства только определитесь - строгое или не строгое

Добавлено через 4 минуты
Цитата Сообщение от EwgenYYY Посмотреть сообщение
без нее преподаватель не примет работу
нельзя вывести 2 элемента если введён один. и не делается вывод сразу после cin. если хотите что-то вывести на экран - делайте отдельный цикл (или организуйте ввод случайных значений)

EwgenYYY, напишите Ваше определение возрастающей последовательности
0
440 / 328 / 171
Регистрация: 01.07.2015
Сообщений: 1,162
27.01.2019, 12:18 9
Цитата Сообщение от EwgenYYY Посмотреть сообщение
i = 0;
Цитата Сообщение от EwgenYYY Посмотреть сообщение
a[i - 1]
К какому элементу получаете доступ?
0
0 / 0 / 1
Регистрация: 28.03.2018
Сообщений: 45
27.01.2019, 12:36  [ТС] 10
Последовательность возрастает, когда следующий элемент больше предыдущего элемента или больше или равен предыдущему
0
4749 / 3232 / 1951
Регистрация: 18.12.2017
Сообщений: 10,319
27.01.2019, 13:06 11
Цитата Сообщение от EwgenYYY Посмотреть сообщение
Последовательность возрастает, когда следующий элемент больше предыдущего элемента или больше или равен предыдущему
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
28
#include <iostream>
using namespace std;
 
int main()
{
    int n, up=0, down=0;
    cout <<"n="; cin >>n;
 
    double*a = new double[n];
 
    cout <<"Enter "<<n<<" elements:\n";
    for (int i = 0; i < n; i++)
      cin >>a[i];      
 
    for (int i = 0; i < n-1; i++)
      {
      if (a[i]<=a[i+1]) up++;
      if (a[i]>=a[i+1]) down++;
      }
    
    if (up==n-1 && down!=n-1) cout <<"UP\n";
    else if (down==n-1 && up!=n-1) cout <<"DOWN\n";
    else cout <<"No UP, No DOWN\n";
 
    delete[]a;
system("pause");
return 0;
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.01.2019, 13:06

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

Выход за пределы массива
По мойму нарушение границ массива в c++ не допускается. Это будет выход за пределы массива и...

Выход за пределы массива
Где-то здесь происходит выход за пределы массива puti, но я не могу его найти уже второй день....

Проверка на выход за пределы массива
Есть самый обычный массив int veg; вот так заполняется for (int i = 0; i &lt; 3; i++) { ...

Проверка на выход на пределы массива
Напишите пожалуста пример кода как этого можна добиться в отдельной функции


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.