Форум программистов, компьютерный форум CyberForum.ru

Массив: Удалить из массива все отрицательные элементы. - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.72
Vampire110
17 / 17 / 0
Регистрация: 18.05.2011
Сообщений: 33
26.11.2011, 16:16     Массив: Удалить из массива все отрицательные элементы. #1
Задан массив размера N. Удалить из массива все отрицательные элементы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2011, 16:16     Массив: Удалить из массива все отрицательные элементы.
Посмотрите здесь:

Удалить из массива все отрицательные элементы C++
C++ Удалить все отрицательные элементы массива
C++ если массив не является знакочередующимся,то удалить из массива все положительные числа,в противном случае-удалить отрицательные элементы.после удален
Удалить из массива все отрицательные элементы C++
C++ Массив: Сформировать третий массив, в который включить все отрицательные элементы массива А и все максимальные элементы массива В.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vampire110
17 / 17 / 0
Регистрация: 18.05.2011
Сообщений: 33
26.11.2011, 22:49  [ТС]     Массив: Удалить из массива все отрицательные элементы. #21
Cпасибо, но не могли бы вы перевести прогу на Pellec C а то так не совсем понятно
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
BRcr
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
26.11.2011, 22:59     Массив: Удалить из массива все отрицательные элементы. #22
Цитата Сообщение от Vampire110 Посмотреть сообщение
не могли бы вы перевести прогу на Pellec C
А что, в Pellec'e какой-то другой язык Си используется? Просто позаменяйте все cin, cout на printf, scanf и будет вам Си'шная версия.
Vampire110
17 / 17 / 0
Регистрация: 18.05.2011
Сообщений: 33
26.11.2011, 23:23  [ТС]     Массив: Удалить из массива все отрицательные элементы. #23
могу лишнего поудалять и работать не будет. не всю прогу а ту часть где удаление
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
26.11.2011, 23:26     Массив: Удалить из массива все отрицательные элементы. #24
Столько алгоритмов удаления, а про самый быстрый метод удаления элементов забыли:
http://www.cyberforum.ru/showthread.php?p=2132969
BRcr
26.11.2011, 23:36
  #25

Не по теме:

Цитата Сообщение от Thinker Посмотреть сообщение
Столько алгоритмов удаления, а про самый быстрый метод удаления элементов забыли:
Он поди что уже патентом защищен! Цитировать-то его хоть можно?

Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
26.11.2011, 23:44     Массив: Удалить из массива все отрицательные элементы. #26
Цитата Сообщение от BRcr Посмотреть сообщение

Не по теме:


Он поди что уже патентом защищен! Цитировать-то его хоть можно?

Не по теме:

Не стал патентовать, все для людей, пользуйтесь на здоровье А если без шуток, то правда алгоритм минимальной сложности, это очень важно

BRcr
 Аватар для BRcr
4003 / 2292 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
26.11.2011, 23:47     Массив: Удалить из массива все отрицательные элементы. #27
Мои пять копеек:
C++
1
2
3
4
5
6
7
8
        int size_of_M = sizeof( M ) / sizeof( M[0] );
 
        for ( int i = 0; i < size_of_M; i++ ) {
                if ( M[i] < 0 ) {
                        for ( int j = i; j < size_of_M - 1; j++ ) { M[j] = M[j + 1]; }
                        M[size_of_M - 1] = 0;
                }
        }
Тут еще и последний элемент массива не забыт
Mustik
56 / 56 / 2
Регистрация: 10.07.2011
Сообщений: 229
27.11.2011, 01:01     Массив: Удалить из массива все отрицательные элементы. #28
Цитата Сообщение от BRcr Посмотреть сообщение
Мои пять копеек:
C++
1
2
3
4
5
6
7
8
        int size_of_M = sizeof( M ) / sizeof( M[0] );
 
        for ( int i = 0; i < size_of_M; i++ ) {
                if ( M[i] < 0 ) {
                        for ( int j = i; j < size_of_M - 1; j++ ) { M[j] = M[j + 1]; }
                        M[size_of_M - 1] = 0;
                }
        }
Тут еще и последний элемент массива не забыт
В моей версии тоже не забыт
Сыроежка
Заблокирован
27.11.2011, 08:16     Массив: Удалить из массива все отрицательные элементы. #29
Цитата Сообщение от go Посмотреть сообщение
С чего бы это?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const int N=5;
    int M[N]={1,-2,3,-4,5};
    int i,j,count=N;
 
    for (i=0;i<count;i++)
        if (M[i]<0)
        {
            for (j=i;j<count-1;j++)
                M[j]=M[j+1];
            count--;
            i--;
        }
        //cout << count<<endl;
        for (i=0;i<count;i++)
            cout << M[i]<<" ";
Проблема в том, что вы не внимательно читаете то, что я пишу. А вам, в силу вашей невысокой квалификации, следует внимательно читать, что я пишу. Это вам пойдет на пользу. Я уже раньше привел пример массива, когда это выполнить нельзя. Специально для вас привожу еще более простой пример int a[] = { -1 };. Догадайтесь с трех раз, удаляет ли ваш код отрицательный элемент?!
Но даже без этого примитивного примера прежде, чем бросаться писать код, задумайтесь над чем, что значит "удалить" отрицательный элемент в массиве? Это означает, что надо заменить его значение каким-то другим значением, так как удалять элементы в массиве нельзя! Массив имеет фиксированный размер!

Если что-то не понятно, то не стеснейтись, обращайтесь, я вам разъясню. Мне это не трудно сделать и в четвертый раз!

Добавлено через 5 минут
Цитата Сообщение от Mustik Посмотреть сообщение
Удалить - значит убрать этот элемент из массива, а остальные данные сдвинуть.
Если вы не поняли задачу, не надо показывать какой вы "острый" и умный.
Это вы не понимаете, что происходит! Специально для таких "продвинутых", как вы, повторяю простейший пример. Попробуйте удалить отрицательный элемент в массиве int a[] = { -1 };. Когда удалите, то сообщите мне! Мне будет очень любопытно особенно посмотреть, как вы будете сдвигать элементы массива! Флаг вам в руки и удачи!
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
27.11.2011, 11:09     Массив: Удалить из массива все отрицательные элементы. #30
Сыроежка, для начала откройте глаза
в связи с вашей некомпетентностью в массивах, привожу скриншот работы моего кода, на вашем примере.
Как видите, отработало корректно, и в следующий раз прежде чем писать огромный пост на форуме, разберитесь в коде
Миниатюры
Массив: Удалить из массива все отрицательные элементы.  
go
27.11.2011, 11:10
  #31

Не по теме:

Цитата Сообщение от Сыроежка Посмотреть сообщение
Догадайтесь с трех раз, удаляет ли ваш код отрицательный элемент?!
Не ну точно читайте книги о массивах

Mustik
56 / 56 / 2
Регистрация: 10.07.2011
Сообщений: 229
27.11.2011, 13:09     Массив: Удалить из массива все отрицательные элементы. #32
Цитата Сообщение от Сыроежка Посмотреть сообщение
Это вы не понимаете, что происходит! Специально для таких "продвинутых", как вы, повторяю простейший пример. Попробуйте удалить отрицательный элемент в массиве int a[] = { -1 };. Когда удалите, то сообщите мне! Мне будет очень любопытно особенно посмотреть, как вы будете сдвигать элементы массива! Флаг вам в руки и удачи!
Вы еще не поняли? Автор топика никоим образом не выдумывал задание сам, а, почти на 100% уверен, что переписал задание из методички или какого-либо учебника. "Удалить", в таких случаях, значит - просто не выводить в консоль. В случае int a[] = { -1 }; и вовсе не нужно удалять это значение, достаточно просто вывести, хотя бы, сообщение, что, после удаления отрицательных элементов, массив пуст.
И хватит умничать перед автором, мы все прекрасно понимаем, что нельзя удалить элемент массива, можно создать новый массив размерностью на n-элементов меньше существующего.
Vampire110
17 / 17 / 0
Регистрация: 18.05.2011
Сообщений: 33
27.11.2011, 15:08  [ТС]     Массив: Удалить из массива все отрицательные элементы. #33
Mustik ++

Тем не менее кто-нибудь покажет эту прогу на Pellec C . Спасибо.
Сыроежка
Заблокирован
27.11.2011, 15:36     Массив: Удалить из массива все отрицательные элементы. #34
Цитата Сообщение от go Посмотреть сообщение
Сыроежка, для начала откройте глаза
в связи с вашей некомпетентностью в массивах, привожу скриншот работы моего кода, на вашем примере.
Как видите, отработало корректно, и в следующий раз прежде чем писать огромный пост на форуме, разберитесь в коде
Тяжелый случай, но, надеюсь, это изличимо!

Итак по порядку рассматриваем ваш код для массива M[1] = { -1 };, так как вы самостоятельно не можете разобраться даже в своем коде!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const int N=1;
        int M[N]={ -1 };
        int i,j,count=N;
 
        for (i=0;i<count;i++)
                if (M[i]<0)
                {
                        for (j=i;j<count-1;j++)
                                M[j]=M[j+1];
                        count--;
                        i--;
                }
                //cout << count<<endl;
                for (i=0;i<count;i++)
                        cout << M[i]<<" ";
Во внешнем цикле i устанавливается равной 0. Это меньше значения count, который равен 1. Дейстивтельно M[0] < 0, так как M[0] == -1.
Во внутреннем цикле j устанавливается равной i, то есть 0. Но j не меньше count -1, так как последнее выражение равно 0, а 0 не является меньше по значению самого себя, то есть 0.
Что это означает? Это означает, что внутреннийй цикл ни разу не выполнится!
Но зато при этом значение перменной count уменьшится на 1 и станет равным 0. В свою очередь значение переменной i также уменьшится на единицу и станет равным -1. (Это кто же вас научил управляющую переменную цикла изменять внутри тела цикла?! Ха-ха-ха!).
Внутри предложения цикла значение переменной i снова увеличивается на единицу и становится равным 0. После чего сравнивается с count, которая также равно 0. Ву а ля, как говорят франчузы, работа цикла на этом заканчивается!
Далее вы пытаетесь вывести массив на печать и устраиваете цикл

C++
1
                for (i=0;i<count;i++)
Так как значение count равно 0, то вы ничего не выводите! Массив как содержал элемент -1, так и продолжает его содержать!

Что же вы такой "продвинутый", что даже с пятого раза не понимаете, что вам пишут?! Хуже того, вы даже не понимаете, что делает написанная вами собой программа!
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
27.11.2011, 15:44     Массив: Удалить из массива все отрицательные элементы. #35
Цитата Сообщение от Сыроежка Посмотреть сообщение
(Это кто же вас научил управляющую переменную цикла изменять внутри тела цикла?! Ха-ха-ха!).


Цитата Сообщение от Сыроежка Посмотреть сообщение
Так как значение count равно 0, то вы ничего не выводите! Массив как содержал элемент -1, так и продолжает его содержать!
А когда вы не используете дин. массивов, и выделяете МаксСайз для него
C++
1
2
3
4
5
6
7
8
int Arr[1000];
int size;
 
cout << "Enter size ";
cin >> size;
 
for (int i=0; i<size;i++)
...
Да и чего я спорю, поищите в поиске удалить строку\столбец матрицы
И если вас это успокоит
C++
1
2
if (!count)
           cout << "Массив пуст";

Цитата Сообщение от Сыроежка Посмотреть сообщение
Итак по порядку рассматриваем ваш код для
Что только вникли, какой я гениальный код придумал

Добавлено через 1 минуту
P.S. Прекращаю этот спор, и на ваши посты больше не отвечаю. Все изложено выше, и подтверждено не только мной...
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.11.2011, 15:50     Массив: Удалить из массива все отрицательные элементы. #36
Часто под словом удалить элементы в массиве, обладающих некоторым свойством (например, все нули т.п.) понимают переставить элементы таким образом, чтобы сначала следовали все элементы, не обладающие данным свойством (причем порядок следования должен остаться прежним), а в переменную записать сколько таких элементов. Размер массива при этом остается прежним, но будет переменная, которая хранит "новый" размер массива в том плане, что в ней хранится количество неудаленных элементов. Поэтому можно работать не совсем массивом, а лишь с первыми m элементами, не обладающих изначальным свойством.
Сыроежка
Заблокирован
27.11.2011, 15:56     Массив: Удалить из массива все отрицательные элементы. #37
Цитата Сообщение от Thinker Посмотреть сообщение
Часто под словом удалить элементы в массиве, обладающих некоторым свойством (например, все нули т.п.) понимают переставить элементы таким образом, чтобы сначала следовали все элементы, не обладающие данным свойством (причем порядок следования должен остаться прежним), а в переменную записать сколько таких элементов. Размер массива при этом остается прежним, но будет переменная, которая хранит "новый" размер массива в том плане, что в ней хранится количество неудаленных элементов. Поэтому можно работать не совсем массивом, а лиши с первыми m элементами, не обладающих изначальным свойством.
Еще один умник нашелся! У массива есть его размер! Чтобы "удалить" элементы, надо определиться с тем, каким значением будут заменены удаляемые эоементы, так как в общем случае у массивов за исключением символьных массивов, нет завершающего элемента типа 0 для символьных массивов.
Поэтому чтобы решить задачу, нужно тполучить информацию, каким значением заменять удаленные элементы. И что никак не может из себя выдавить автор вопроса.

А ваши разглагольствованичя по поводу "нового размера" некорректны, так как массив не может иметь нулевого размера! Это еще можно было бы с вами согласиться, если бы ресь шла о контейнере, реализованном на базе массива. как, например, стек. Но в задаче об этом речь не идет, а говорится именно о массиве.
Thinker
Эксперт C++
 Аватар для Thinker
4215 / 2189 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.11.2011, 16:05     Массив: Удалить из массива все отрицательные элементы. #38
Сыроежка, какая разница каким элементом будут заменены удаляемые элементы, задача же - удалить, значит просто переставить элементы в массиве. Если массив не динамический, то удалить (realloc) вы не сможете, поэтому здесь требуется просто произвести перестановку и все. Вы поймите, размер массива остается прежним, просто вводится новая переменная, отвечающая за количество элементов, не обладающих тем свойствам, которые надо было удалить.

Цитата Сообщение от Сыроежка Посмотреть сообщение
Еще один умник нашелся!

Не по теме:

И почему вы так резко реагируете, непонятно, на вас же никто не нападал, просто спокойно обсуждаем задачу

go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
27.11.2011, 16:19     Массив: Удалить из массива все отрицательные элементы. #39
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 "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
 
 
 
 
 
int main(int argc, char* argv[])
{
    int i,j;
    int *arr;
    int count;
 
    while (!fflush (stdin) && printf ("Enter size ") && !scanf ("%d", &count) )
        ;
 
    if ( !  ( arr = (int *) malloc ( count * sizeof (int) )  ) )
    {
        printf ("ERORR\n");
        system ("pause");
        return -1;
    }
 
    for (i=0;i<count;i++)
        while ( ! fflush (stdin) && printf ("Arr[%d]= ", i+1) && ! scanf ("%d", &arr[i]) )
            ;
 
    printf ("Array ");
    for (i=0; i<count ; i++ )
        printf ("%5d", arr[i]);
 
 
    for (i=0;i<count;i++)
        if (arr[i]<0)
        {
            for (j=i;j<count-1;j++)
                arr[j]=arr[j+1];
            count--;
            i--;
        }
 
 
        arr = (int *) realloc (arr,count * sizeof (int) )  ;
 
 
 
 
        if (!count)
            printf ("\nMassiv pust \n");
        else
        {
            printf ("\n Array ");
 
            for (i=0; i<count ; i++ )
                printf ("%5d", arr[i]);
        }
 
 
 
        printf ("\n");
 
        free (arr);
 
        system ("pause");
        return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2011, 16:26     Массив: Удалить из массива все отрицательные элементы.
Еще ссылки по теме:

Удалить из массива все отрицательные элементы; C++
C++ Из массива Х(N) все положительные элементы записать в массив У(К), а все отрицательные элементы – в массив Z(М)...
C++ Из массива вещественных чисел удалить все отрицательные элементы

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

Или воспользуйтесь поиском по форуму:
Сыроежка
Заблокирован
27.11.2011, 16:26     Массив: Удалить из массива все отрицательные элементы. #40
Цитата Сообщение от Thinker Посмотреть сообщение
Сыроежка, какая разница каким элементом будут заменены удаляемые элементы, задача же - удалить, значит просто переставить элементы в массиве. Если массив не динамический, то удалить (realloc) вы не сможете, поэтому здесь требуется просто произвести перестановку и все. Вы поймите, размер массива остается прежним, просто вводится новая переменная, отвечающая за количество элементов, не обладающих тем свойствам, которые надо было удалить.



Не по теме:

И почему вы так резко реагируете, непонятно, на вас же никто не нападал, просто спокойно обсуждаем задачу

Как это - какая разница?! Вы вообще-то отдаете себе отчет, что вы говорите?! А если вы выберите значение, совпадающее с допусттимым значением для массива? Как вы разберетесь, где удаленный элемент, а где нет?!
И кто вам сказал, что требуется сделать перестановку элементов? Задачи по перестановке элементов формулируются совершенно по-другому! Не надо фантазировать! В условиях задачи ничего про перестановку не говорится. Сказано только, что нужно удалить отрицательные элементы. Без дополнительной инофрмации о том, каким значением заменять отрицательные элементы массива, задачу не решить.

Теперь по поводу вашего очередного безграмотного заявления по поводу ввода "новой переменной". Не пониамаете, почему оно безграмотно? Три минуты вам на размышления, а уж потом читайте мой ответ, если сами не додумаетесь! (Увы, для меня лично очевидно, что вы не додумаетесь, если вам даже дать несколько часов!)

Итак, что у нас на входе? Массив! Что мы должны получить на выходе? Массив! Когда же вы вводите дополнительный объект, то это уже не массив! Это уже некий контейнер, состоящий из двух объектов, связанных между собой: самого массива и некоторо1 дополнительной переменной. То есть если вам нужно будет далее работать с тем, что вы получили после решения задачи, то вам постоянно надо будет работать с этими двумя объектами.
Почему вектор не является массивом, хотя все его элементы располагаются на непрерывном участке памяти точно также, как массив? Да потому что у него как раз и есть дополнительные переменные, которые контролирует его организацию, как, например, значение, возвращаемое size()? или значение, возвращаемое capacity().
Понимаете, о чем я говорю? Или не доходит? Так и в вашем решении вы на входе имеете массив, а на выходе строите некоторый упрощенный контейнер, который уже массивом не является, хотя и строится на основе массива. Ваш контейнер содержит два члена: это сам исходный массив и, на самом деле, еще две переменные, как у вектора, которые можно условно назвать size и capacity.

Поэтому не надо ничего изобретать! Надо было с самого начала не бежать писать безграмотный код, а спросить у автора исходного вопроса, каким значением заменять отрицательные элементы. А дураки сначала бегут писать код, а лишь потом, если им повезет и найдется тот, кто им укажет на их оплошность, начинают задумываться, а что они сделали?! Да и то только в том случае, если есть чем задумываться.

Я же не случайно привел пример массива из одного элемента int a[] = { -1 };. Допустим, кто-то к вам обратился за помощью удалить отрицательные элементы из этого массива. Вы ему говорите, что удалили. Заказчик распечатывает массив, и что он видет? Как был отрицательный элемент -1, так и остался! Он возмущенно бежит к вам и гневно заявляет, вы же ничего не сделали, верните деньги за работу! А вы ему в ответ, а ваш массив содержит 0 элементов! Клиент возмещенно, как 0 элементов? Массив не может иметь 0 элементов! Верните мой массив обратно! Но вам же не хочется возвращать назад деньги, и элемент массива вы ему вернуть не можете, поэтому вы пускаетесь в длинные рассвуждения и предлагаете клиенту некоторый костыль в виде дополнительной переменной, для которой клиент теперь должен выделить память и постоянно эту переменную таскать вместе со своим массивом!
Yandex
Объявления
27.11.2011, 16:26     Массив: Удалить из массива все отрицательные элементы.
Закрытая тема Создать тему
Опции темы

Текущее время: 01:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru