Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для Baddhet
0 / 0 / 0
Регистрация: 09.03.2015
Сообщений: 27

Работа с массивом

07.09.2020, 22:19. Показов 578. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Решил поупражняться в С++, вроде как все предусмотрел, но визул студия подчеркивает 1 строчку зеленым цветом. В чем проблема подскажите пожалуйста.
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <iostream>
using namespace std;
 
void FillArray(int* const arr, int const SIZE)
{
    for (int i = 0; i < SIZE; i++)
    {
        arr[i] = rand() % 10;
    }
}
 
void ShowArray(int* const arr, int const SIZE)
{
    for (int i = 0; i < SIZE; i++)
    {
        cout << arr[i]<< "\t";
    }
    cout << endl;
}
 
void push_back(int *&arr ,int &SIZE , int value)
{
    int* newArr = new int[SIZE+1];
    for (int i = 0; i < SIZE; i++)
    {
        newArr[i] = arr[i];
    }
    newArr[SIZE++] = value;
    cout << "Адрес newArr\t" << newArr << endl;
    delete[]arr;
    arr = newArr;
    cout << "Адрес arr\t" << arr << endl;
}
 
void pop_back(int*& arr, int& SIZE)
{
    SIZE--;
    int* newArr = new int[SIZE];
    for (int i = 0; i < SIZE; i++)
    {
        newArr[i] = arr[i];
    }
    cout << "Адрес newArr\t" << newArr << endl;
    delete[]arr;
    arr = newArr;
    cout << "Адрес arr\t" << arr << endl;
}
 
void objeсt_del(int*& arr, int& SIZE)
{
    cout << "Удаление ячейки" << endl;
    SIZE--;
    int j = 0;
    int* newArr = new int[SIZE];
    for (int i = 0; i <= SIZE; i++)
    {
        if (i == 0)
        {
            continue;
        }
        else
        {
            newArr[j] = arr[i];
            //cout << newArr[j] << "\t";
            if (j <3)
                j++;
        }
    }
    delete[]arr;
    arr = newArr;
}
 
void main()
{
    setlocale(LC_ALL, "Rus");
    int SIZE = 5;
    int *arr = new int[SIZE];
    cout << "Адрес arr\t" << arr << endl;
    FillArray(arr, SIZE);
    ShowArray(arr, SIZE);
    push_back(arr, SIZE, 111);
    ShowArray(arr, SIZE);
    pop_back(arr, SIZE);
    ShowArray(arr, SIZE);
    objeсt_del(arr, SIZE);
    ShowArray(arr, SIZE);
    delete[]arr;
}
Проблемный участок
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void objeсt_del(int*& arr, int& SIZE)
{
    cout << "Удаление ячейки" << endl;
    SIZE--;
    int j = 0;
    int* newArr = new int[SIZE];
    for (int i = 0; i <= SIZE; i++)
    {
        if (i == 0)
        {
            continue;
        }
        else
        {
            newArr[j] = arr[i];
            //cout << newArr[j] << "\t";
            if (j <3)
                j++;
        }
    }
    delete[]arr;
    arr = newArr;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.09.2020, 22:19
Ответы с готовыми решениями:

Работа с массивом
9. Дан массив A(2*N). Постройте массивы с элементами, соответственно равными: а) a1 , aN+1 , a2, aN+2 , ... , aN , a2N ; ...

Работа с массивом.
найти количество элементов мвссива, которые больше 50. sos!!!! удалить из массива заданный элемент. сортировать массив по убыванию. ...

Работа с массивом
Есть массив books. Существует метод который добавляет имена книг в этот массив, но если при попытке добавить элемент выясняется, что...

15
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
07.09.2020, 22:28
Цитата Сообщение от Baddhet Посмотреть сообщение
Решил поупражняться в С++, вроде как все предусмотрел, но визул студия подчеркивает 1 строчку зеленым цветом. В чем проблема подскажите пожалуйста.
Забей.
Это она говорит, что SIZE неподходящего типа, int вместо size_t. Можно не обращать внимания.
0
 Аватар для Baddhet
0 / 0 / 0
Регистрация: 09.03.2015
Сообщений: 27
07.09.2020, 22:30  [ТС]
Цитата Сообщение от Baddhet Посмотреть сообщение
if (i == 2)
Совсем забыл, если установить тут цифру 2, newArr[j] = arr[i]; эта строчка подчеркивается.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
07.09.2020, 22:30
Цитата Сообщение от Baddhet Посмотреть сообщение
Проблемный участок
А что ты в этой objeсt_del вообще пытаешься сделать?
0
 Аватар для Baddhet
0 / 0 / 0
Регистрация: 09.03.2015
Сообщений: 27
07.09.2020, 22:35  [ТС]
Ругается на переполнение буфера
0
 Аватар для Baddhet
0 / 0 / 0
Регистрация: 09.03.2015
Сообщений: 27
07.09.2020, 22:39  [ТС]
Удаляю 1 ячейку массива, со сдвигом. То есть создаю новый массив на 4 ячейки и еопирую информацию из массива с 5ю ячейками. Но я явно указываю из какой ячейки не нужно брать информацию, что выйти за пределы массива. После чего меняю ссылку на массив который был раньше.
0
Заблокирован
07.09.2020, 22:44
походу objeсt_del должен уменьшать массив на 1 размер
но там явно выходит за пределы массива

C++
1
2
3
    int j = 0;
    int* newArr = new int[SIZE];
    for (int i = 0; i <= SIZE; i++)
должно быть i<SIZE

Добавлено через 1 минуту
индекс j указывает какой элемент не нужно копировать ?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
07.09.2020, 22:44
Цитата Сообщение от Baddhet Посмотреть сообщение
Удаляю 1 ячейку массива, со сдвигом.
Может лучше вот так
C++
1
2
3
4
5
6
7
8
9
10
11
12
void objeсt_del(int*& arr, int& SIZE)
{
    cout << "Удаление ячейки" << endl;
    
    int* newArr = new int[SIZE - 1];
    for (int i = 1; i < SIZE; i++)
        newArr[i - 1] = arr[i];
 
    delete[]arr;
    arr = newArr;
    --SIZE;
}
?
1
 Аватар для Baddhet
0 / 0 / 0
Регистрация: 09.03.2015
Сообщений: 27
07.09.2020, 22:49  [ТС]
oleg-m1973,
В таком случае цикл будет бежать не с нулевого объекта массива. И i<SIZE я пробовал, какая то дичь была, не помню, сейчас проверю.
Цитата Сообщение от SmallEvil Посмотреть сообщение
индекс j указывает какой элемент не нужно копировать ?
Верно.
0
 Аватар для Baddhet
0 / 0 / 0
Регистрация: 09.03.2015
Сообщений: 27
07.09.2020, 22:53  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
должно быть i<SIZE
Да последний элемент не записывает и инициализируется мусором.
Кликните здесь для просмотра всего текста
0
Заблокирован
07.09.2020, 23:05
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void objeсt_del(int*& arr, int &SIZE, int skip)
{
    cout << "Удаление ячейки" << endl;
    int* newArr = new int[SIZE-1];
    for (int i = 0, j=0; i < SIZE; ++i)
    {
            //cout << newArr[j] << "\t";
            if (i == skip)
               continue;
            newArr[j]=arr[i];
            ++j;
    }
    delete[]arr;
    --SIZE;
    arr = newArr;
}
Добавлено через 3 минуты
еще можно добавить проверку, входит ли пропускаемый елемент в размер массива.

Добавлено через 7 минут
вроде работает
Адрес arr 0x7a81e0
1 7 4 0 9
Адрес newArr 0x7a8200
Адрес arr 0x7a8200
1 7 4 0 9 111
Адрес newArr 0x7a81e0
Адрес arr 0x7a81e0
1 7 4 0 9
Удаление ячейки
1 7 4 0
1
 Аватар для Baddhet
0 / 0 / 0
Регистрация: 09.03.2015
Сообщений: 27
07.09.2020, 23:09  [ТС]
SmallEvil,
В чем магия? В своем коде перенес SIZE--; в самый низ и поменял знак на < и заработало как надо.
0
Заблокирован
07.09.2020, 23:18
Цитата Сообщение от Baddhet Посмотреть сообщение
В чем магия? В своем коде перенес SIZE--; в самый низ и поменял знак на < и заработало как надо.
в вашем коде ?
сильно сомневаюсь что оно заработало "как надо".

Попробуйте изменить размер массива .

Добавлено через 59 секунд
Допустим не 5, а 10.
int SIZE = 10;
0
 Аватар для Baddhet
0 / 0 / 0
Регистрация: 09.03.2015
Сообщений: 27
07.09.2020, 23:19  [ТС]
SmallEvil,
А ну да, if мешает, без ifа норм вроде. Не подумал что можно изменить размер массива.
0
Заблокирован
07.09.2020, 23:25
без "ифа" Вы просто пропускаете первый элемент, если так задумано, то норм все )))
или же воспользуйтесь функцией oleg-m1973,
у него тоже самое только без проверки, которая выполняется каждый цикл.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
08.09.2020, 05:01
Цитата Сообщение от SmallEvil Посмотреть сообщение
вроде работает
Если нужно удалить произвольный элемент из массива, то лучше сделать два цикла
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void objeсt_del(int*& arr, int &SIZE, int pos)
{
    cout << "Удаление ячейки" << endl;
    int* newArr = new int[SIZE - 1];
    for (int i = 0; i < pos; ++i)
        newArr[i] = arr[i];
 
    for (int i = pos + 1; i < SIZE; ++i)
        newArr[i - 1] = arr[i];
 
    delete[]arr;
    --SIZE;
    arr = newArr;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
08.09.2020, 05:01
Помогаю со студенческими работами здесь

Работа с массивом.
Делаю ассемблерную ставку в си. Должно, например, заменить нужный элемент массива на другую букву. Пересылаю массив в функцию через...

Работа с массивом
Добрый день! У меня возник вопрос. Есть выборка из БД занесенная в массив, в нем хранятся данные о студентах, среди данных есть строки...

Работа с массивом
Доброго дня всем ! Вообщем, у меня проблема: есть многомерный массив public int Massiv = new int; переменной Grid пприсваивается...

Работа с массивом
Здравствуйте. Имеется ассемблерная вставка для Си, которая в массив char name должна записать следующие значения: name='m'; name='k';...

работа с массивом
Определить имеются ли в массиве элементы со значениями, содержащими цифру &quot;1&quot; Помогите если не трудно!


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru