Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 21.11.2014
Сообщений: 9
1

Косячное удаление элементов из массива

11.02.2015, 07:03. Показов 1124. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте все, кто откликнулся на призыв о помощи. Вроде бы всё робит, но при удалении нечётных значений из массива ф-ей Parity_Array иногда удаляет не пойми как - остаются и чётные и нечётные, а иногда выдаёт какие-то запредельные шести-семизначные числа

Есть подозрения, что я, возможно, с типами данных накосячил что-то, только не могу понять где. Кто может объяснить в чём заключается ошибка?

З.Ы.: Здоровая критика в адрес сего быдлокода тоже приветствуется

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
#include <cstdlib>
#include <iostream>
#include <ctime>
using namespace std;
 
int Gen_Array(int, int);     //прототип ф-и
int Parity_Array(int*, int); //
 
    int arr_size = 0;                 //объявляем глобальные переменные
    int max_rand_value = 0;  //
    int par_arr_size = 0;
    int *rand_array = new int [arr_size];            //объявляем динамический массив
    int *par_array = new int [par_arr_size];
 
int main(){
 
    cout << "input number of array: ";
    cin >> arr_size;                                         //ввод размерности (далее раз-ть)
    cout << endl;
 
    cout << "input maximum of random value: ";
    cin >> max_rand_value;                              //ввод максимума для значения
    cout << endl;
 
    Gen_Array(arr_size, max_rand_value);         //вызов ф-и генерации рандомного массива
    Parity_Array(rand_array, arr_size);             //вызов ф-и удаления нечётных эл-тов
 
    system("pause");
    return 0;
 
}
 
int Gen_Array(int arr_size, int max_rand_value){     //тело ф-и генерации рандомного массива
 
    cout << "generated array:" << endl;
 
    srand(time(NULL));                                    //прописываем зависимость рандома от времени
    for (int i = 0; i < arr_size; i++){
        rand_array[i] = rand() % max_rand_value + 1;
        cout << rand_array[i] << endl;
    }
 
    return (*rand_array, arr_size);
    system("pause");
}
 
int Parity_Array(int *rand_array, int arr_size){
 
    par_arr_size = arr_size;                                   //раз-ть нового массива
    for (int i = 0; i < arr_size; i++){                        //
        if (rand_array[i] % 2 != 0) par_arr_size--;  //задаём раз-ть согласно количеству чётных эл-тов
    }
 
    int j = 0;
    for (int i = 0; i < arr_size; i++){                  //перемещаем чётные эл-ты в новый массив
        if (rand_array[i] % 2 == 0)                //
            j++;                                      //
            par_array[j] = rand_array[i];      //
    }
 
    cout << "parity array: " << endl;
    for (int i = 0; i < par_arr_size; i++){
        cout << par_array[i] << endl;
    }
 
    return (*par_array, par_arr_size);
    system("pause");
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.02.2015, 07:03
Ответы с готовыми решениями:

Удаление четных элементов массива,больших среднего арифметического всех элементов массива
Доброго времени суток! Помогите пожалуйста) Вот задание:Из массива удалить четные элементы,...

Удаление из одного массива элементов второго массива и запись результата в третий
Есть массив masA (длина lenA), есть массив masB (длина lenB). Необходимо из массива masA удалить...

Удаление элементов массива, которые равны сумме предыдущего и следующего элементов
Нужно написать подпрограмму которая удаляет элементы массива, которые равны сумме предыдущего и...

Удалить из массива A[N] вс отрицательные элементы.Удаление отрицательных элементов массива оформить в виде функции
Что исправить? #include &lt;stdio.h&gt; #define N 10 int udalenie(int A,int k ) { int i; ...

16
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
11.02.2015, 07:25 2
Сплошное UB. Памяти сколько выделяете? Правильно - полный ноль!!! Зато пытаетесь писать в эту память.
0
0 / 0 / 0
Регистрация: 21.11.2014
Сообщений: 9
11.02.2015, 07:47  [ТС] 3
Что значит UB? Не могли бы вы поподробнее объяснить?
0
86 / 86 / 6
Регистрация: 14.01.2011
Сообщений: 265
11.02.2015, 07:51 4
Строчки 56 - 58. Похоже там дополнительные фигурные скобки нужны. А так у вас всегда выполняется присваивание!
0
0 / 0 / 0
Регистрация: 21.11.2014
Сообщений: 9
11.02.2015, 08:08  [ТС] 5
Поставил скобки - та же ерунда. Чепуху пишет, единицы оставляет, числа во втором массиве вообще меняются иногда, не знаю даже откуда он их берёт
0
86 / 86 / 6
Регистрация: 14.01.2011
Сообщений: 265
11.02.2015, 08:51 6
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
#include <cstdlib>
#include <iostream>
#include <ctime>
using namespace std;
 
int Gen_Array(int, int);     //ïðîòîòèï ô-è
int Parity_Array(int*, int); //
 
    int arr_size = 0;                 //îáúÿâëÿåì ãëîáàëüíûå ïåðåìåííûå
    int max_rand_value = 0;  //
    int par_arr_size = 0;
    int *rand_array = new int [arr_size];            //îáúÿâëÿåì äèíàìè÷åñêèé ìàññèâ
    int *par_array = new int [par_arr_size];
 
int main(){
 
    cout << "input number of array: ";
    cin >> arr_size;                                         //ââîä ðàçìåðíîñòè (äàëåå ðàç-òü)
    cout << endl;
 
    cout << "input maximum of random value: ";
    cin >> max_rand_value;                              //ââîä ìàêñèìóìà äëÿ çíà÷åíèÿ
    cout << endl;
 
    Gen_Array(arr_size, max_rand_value);         //âûçîâ ô-è ãåíåðàöèè ðàíäîìíîãî ìàññèâà
    Parity_Array(rand_array, arr_size);             //âûçîâ ô-è óäàëåíèÿ íå÷¸òíûõ ýë-òîâ
 
    system("pause");
    return 0;
 
}
 
int Gen_Array(int arr_size, int max_rand_value){     //òåëî ô-è ãåíåðàöèè ðàíäîìíîãî ìàññèâà
 
    cout << "generated array:" << endl;
 
    srand(time(NULL));                                    //ïðîïèñûâàåì çàâèñèìîñòü ðàíäîìà îò âðåìåíè
    for (int i = 0; i < arr_size; i++){
        rand_array[i] = rand() % max_rand_value + 1;
        cout << rand_array[i] << endl;
    }
 
    return (*rand_array, arr_size);
    system("pause");
}
 
int Parity_Array(int *rand_array, int arr_size){
 
    par_arr_size = arr_size;                                   //ðàç-òü íîâîãî ìàññèâà
    for (int i = 0; i < arr_size; i++){                        //
        if (rand_array[i] % 2 != 0)
            par_arr_size--;  //çàäà¸ì ðàç-òü ñîãëàñíî êîëè÷åñòâó ÷¸òíûõ ýë-òîâ
    }
 
    int j = 0;
    for (int i = 0; i < arr_size; i++){                  //ïåðåìåùàåì ÷¸òíûå ýë-òû â íîâûé ìàññèâ
        if (rand_array[i] % 2 == 0)//
            {                                      //
            par_array[j] = rand_array[i];
            j++;}      //
    }
 
    cout << "parity array: " << endl;
    for (int i = 0; i < par_arr_size; i++){
        cout << par_array[i] << endl;
    }
 
    return (*par_array, par_arr_size);
    system("pause");
}
Вот так работает: J++ не в том месте стояла! В строчках 59-61. Сначала присваиваем элемент, а потом счетчик увеличиваем!
1
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
11.02.2015, 08:58 7
Цитата Сообщение от KKris1988 Посмотреть сообщение
Не могли бы вы поподробнее объяснить?
C++
1
2
3
4
5
    int arr_size = 0; //0
    int max_rand_value = 0; //0
    int par_arr_size = 0;
    int *rand_array = new int [arr_size]; // <--под сколько элементов память выделили?
    int *par_array = new int [par_arr_size];// <--а тут?
1
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,721
11.02.2015, 09:06 8
Лучший ответ Сообщение было отмечено KKris1988 как решение

Решение

Такое количество ошибок, что я затрудняюсь сказать, где их нет.
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
#include <cstdlib>
#include <iostream>
#include <ctime>
using namespace std;
 
void Gen_Array(int* rand_array,int arr_size, int max_rand_value);
int Parity_Array(int *rand_array, int* par_array,int arr_size);
void Print_array(int* array,int size)
{
    for (int i = 0; i < size; i++)
    {
        cout << array[i] << ' ';
    }
    cout<<endl;
}
 
int main()
{
 
    cout << "input arrays size: ";
    int arr_size;           
    cin >> arr_size;                                         //ввод размерности (далее раз-ть)
 
    cout << "input maximum of random value: ";
    int max_rand_value;
    cin >> max_rand_value;                              //ввод максимума для значения
    cout << endl;
 
    int *rand_array = new int [arr_size];            //объявляем динамический массив
    Gen_Array(rand_array,arr_size, max_rand_value);         //вызов ф-и генерации рандомного массива
    cout << "generated array:" << endl;
    Print_array(rand_array,arr_size);
    
    int *par_array = new int [arr_size];
    int par_array_size=Parity_Array(rand_array, par_array,arr_size); //вызов ф-и удаления нечётных эл-тов
    cout << "parity array: " << endl;
    Print_array(par_array,par_array_size);
    delete[] par_array;
    delete[] rand_array;
    
    system("pause");
    return 0;
 
}
 
void Gen_Array(int* rand_array,int arr_size, int max_rand_value)
{     
    //тело ф-и генерации рандомного массива
    srand((unsigned)time(NULL));
    for (int i = 0; i < arr_size; i++)
        rand_array[i] = rand() % max_rand_value + 1;
}
 
int Parity_Array(int *rand_array, int* par_array,int arr_size)
{
    int j = 0;
    for (int i = 0; i < arr_size; i++)
    {                  //перемещаем чётные эл-ты в новый массив
        if (rand_array[i] % 2 == 0)
            par_array[j++] = rand_array[i];
    }
    int par_arr_size=j;
 
    return par_arr_size;
}
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
11.02.2015, 09:07 9
да и сработает ли тут new ???
в глобальной области ???
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
11.02.2015, 09:11 10
Цитата Сообщение от ValeryS Посмотреть сообщение
в глобальной области ???
а почему нет? Прошу объяснений.
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
11.02.2015, 09:14 11
Цитата Сообщение от ITDeveloper Посмотреть сообщение
C++
1
2
3
4
5
par_arr_size = arr_size;                                   //раз-ть нового массива
    for (int i = 0; i < arr_size; i++){                        //
        if (rand_array[i] % 2 != 0)
            par_arr_size--;  //задаём раз-ть согласно количеству чётных эл-тов
    }
тоже самое можно сделать так
C++
1
2
3
  par_arr_size=0;
 for (int i = 0; i < arr_size; i++)
     par_arr_size+=(rand_array[i] % 2 == 0);
Добавлено через 2 минуты
Цитата Сообщение от Croessmah Посмотреть сообщение
а почему нет?
так я и спрашиваю
сработает или нет?
инициализация глобальных переменных исполняется в стартовом коде, который исполняется до функции майн
обычно это просто ассемблерная вставка поставляемая компилятором
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,737
Записей в блоге: 1
11.02.2015, 09:18 12
Цитата Сообщение от ValeryS Посмотреть сообщение
сработает или нет?
Сработает.
Цитата Сообщение от ValeryS Посмотреть сообщение
который исполняется до функции майн
обычно это просто ассемблерная вставка поставляемая компилятором
Ну до функции main много чего выполняется. Всё будет нормально, не переживайте.
0
86 / 86 / 6
Регистрация: 14.01.2011
Сообщений: 265
11.02.2015, 09:28 13
C++
1
2
3
4
5
par_arr_size = arr_size;                                   //раз-ть нового массива
    for (int i = 0; i < arr_size; i++){                        //
        if (rand_array[i] % 2 != 0)
            par_arr_size--;  //задаём раз-ть согласно количеству чётных эл-тов
    }
Это у ТС так было!
C++
1
2
3
  par_arr_size=0;
 for (int i = 0; i < arr_size; i++)
     par_arr_size+=(rand_array[i] % 2 == 0);
Конечо можно!
0
Модератор
Эксперт по электронике
8909 / 6678 / 918
Регистрация: 14.02.2011
Сообщений: 23,524
11.02.2015, 09:39 14
Цитата Сообщение от ITDeveloper Посмотреть сообщение
Это у ТС так было!
прошу пардону
не оттуда процитировал
0
86 / 86 / 6
Регистрация: 14.01.2011
Сообщений: 265
11.02.2015, 09:42 15
Цитата Сообщение от ValeryS Посмотреть сообщение
прошу пардону
)))
0
0 / 0 / 0
Регистрация: 21.11.2014
Сообщений: 9
11.02.2015, 10:58  [ТС] 16
ZSS большое спасибо. Я ещё в самом начале долгого пути, поэтому очень многое для меня загадка, ответ на которую для меня вовсе не очевиден в отличие от тех, кто имеет большой опыт. Скопировал, сижу разбираюсь почему ваш вариант работает как надо, а мой через Ж

Вопрос к остальным участникам:

1. Я объявлял массивы в глобальной области, т.к. при объявлении в main, либо при объявлении в своих функциях, другие ф-и, использующие тот или иной массив, ссылались на то, что я тот или иной массив не объявлял, и вообще "not declared in this scope". Таки дела. Почему они такие подлецы? Я думаю что всегда писать всё в глобальную область - не айс и в будущем может быть сопряжено с некоторого рода проблемами

2. Касательно самих ф-ций. Вот допустим две ф-ии работают с одной и той же переменной. Имеет ли вообще смысл делать простейшую ф-ию int Func1(x) и прописывать потом return(x) чтобы int Func2(x) могла работать потом с изменённым значением переменной x? Или можно тупо куячить void Func1(x) и не прописывать возврата значения?

Как это работает? В моём понимании, если ф-я берёт переменную и что-то с ней делает, то потом она должна эту переменную вернуть, чтобы другие могли попользоваться результатами её трудов. Если нет, то зачем нужен return()? Как правильно поступать?

Буду очень рад толковому объяснению или ссылке на таковое (в литературу или ещё куда, не суть важно)

Заранее спасибо
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,721
11.02.2015, 11:36 17
Цитата Сообщение от KKris1988 Посмотреть сообщение
и не прописывать возврата значения
Если результат работы функции - обработка массива переданного как параметр,
то возвращать ничего не надо, т.к. адрес массива передается через указатель.
Соответственно, изменения происходят непосредственно в массиве.
Таким массивом является массив par_array в функции
C++
1
int Parity_Array(int *rand_array, int* par_array,int arr_size);
Если появляется какой-то новый результат, то его естественно, надо передать.
Таким новым результатом является par_arr_size - размер нового массива.
Вот его мы и возвращаем из этой функции и передаем в функцию Print
для вывода нового массива.
0
11.02.2015, 11:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.02.2015, 11:36
Помогаю со студенческими работами здесь

Удаление элементов массива, совпадающих с элементами другого массива
Здравствуйте, помогите найти ошибку в коде; суть задачи такая: удалить элементы из 1 массива,...

Удаление элементов массива без буферного массива
Требуется удалить элементы из массива, при это длинна массива уменьшится, ВАЖНО буферный массив не...

Удаление элементов массива!
Дарова ребята, помогите написать прогу что удаляет элемент массива (что равет суме двух следующих...

Удаление элементов массива
Возможно ли в С удалять элементы массива? Например: 10, 14, 1, 2, 80 надо удалить 1 что бы...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru