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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.72
Vampire110
17 / 17 / 0
Регистрация: 18.05.2011
Сообщений: 33
#1

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

26.11.2011, 16:16. Просмотров 3671. Ответов 44
Метки нет (Все метки)

Задан массив размера N. Удалить из массива все отрицательные элементы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2011, 16:16
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Массив: Удалить из массива все отрицательные элементы. (C++):

если массив не является знакочередующимся,то удалить из массива все положительные числа,в противном случае-удалить отрицательные элементы.после удален - C++
задан массив Х целых чисел. если массив не является знакочередующимся,то удалить из массива все положительные числа,в противном...

Массив: Сформировать третий массив, в который включить все отрицательные элементы массива А и все максимальные элементы массива В. - C++
Даны массивы целых чисел A и B. Сформировать третий массив, в который включить все отрицательные элементы массива А и все максимальные...

Удалить из массива все отрицательные элементы - C++
Создать динамический массыв. Розмерность массыва ввести из клавиатуры. Задание: Удалить из массыва все отрицательные елементы.

Удалить все отрицательные элементы массива - C++
У меня есть динамический масив... Как удалить все отрицательние елементи? if(mass<0) а дальше?

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

Удалить из массива все отрицательные элементы - C++
удалить из массива все отрицательные элементы . под удалением элемента следует понимать : исключение этого элемента из массива путем...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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++
3586 / 1366 / 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++
4225 / 2199 / 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++
4225 / 2199 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.11.2011, 16:05 #38
Сыроежка, какая разница каким элементом будут заменены удаляемые элементы, задача же - удалить, значит просто переставить элементы в массиве. Если массив не динамический, то удалить (realloc) вы не сможете, поэтому здесь требуется просто произвести перестановку и все. Вы поймите, размер массива остается прежним, просто вводится новая переменная, отвечающая за количество элементов, не обладающих тем свойствам, которые надо было удалить.

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

Не по теме:

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

go
Эксперт C++
3586 / 1366 / 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;
}
Сыроежка
Заблокирован
27.11.2011, 16:26 #40
Цитата Сообщение от Thinker Посмотреть сообщение
Сыроежка, какая разница каким элементом будут заменены удаляемые элементы, задача же - удалить, значит просто переставить элементы в массиве. Если массив не динамический, то удалить (realloc) вы не сможете, поэтому здесь требуется просто произвести перестановку и все. Вы поймите, размер массива остается прежним, просто вводится новая переменная, отвечающая за количество элементов, не обладающих тем свойствам, которые надо было удалить.



Не по теме:

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

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

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

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

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

Я же не случайно привел пример массива из одного элемента int a[] = { -1 };. Допустим, кто-то к вам обратился за помощью удалить отрицательные элементы из этого массива. Вы ему говорите, что удалили. Заказчик распечатывает массив, и что он видет? Как был отрицательный элемент -1, так и остался! Он возмущенно бежит к вам и гневно заявляет, вы же ничего не сделали, верните деньги за работу! А вы ему в ответ, а ваш массив содержит 0 элементов! Клиент возмещенно, как 0 элементов? Массив не может иметь 0 элементов! Верните мой массив обратно! Но вам же не хочется возвращать назад деньги, и элемент массива вы ему вернуть не можете, поэтому вы пускаетесь в длинные рассвуждения и предлагаете клиенту некоторый костыль в виде дополнительной переменной, для которой клиент теперь должен выделить память и постоянно эту переменную таскать вместе со своим массивом!
Thinker
Эксперт C++
4225 / 2199 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.11.2011, 16:30 #41
go, сложность вашего алгоритма в среднем случае O(n^2). Сами посудите, это многовато. Представьте, что придется удалить все элементы, тогда сложность алгоритма будет примерно http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{n^2}{2}. При этом алгоритм можно в любом случае сделать таким, чтобы сложность была не более n

Добавлено через 2 минуты

Не по теме:

Сыроежка, хочется сказать вам пару "ласковых", да лучше нервные клетки поберечь. Не понимаю, как можно так тупить...
Очень кажется, что если провести голосование того, кто как понял эту задачу, то большинство поняло правильно

BRcr
27.11.2011, 16:35
  #42

Не по теме:

Цитата Сообщение от Thinker Посмотреть сообщение
Не по теме:
Сыроежка, хочется сказать вам пару "ласковых", да лучше нервные клетки поберечь. Не понимаю, как можно так тупить...
Имхо, правильно. Не надо тыкать тролля палкой, пусть лучше отдыхает.

Thinker
Эксперт C++
4225 / 2199 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.11.2011, 16:36 #43
Цитата Сообщение от Сыроежка Посмотреть сообщение
А если вы выберите значение, совпадающее с допусттимым значением для массива? Как вы разберетесь, где удаленный элемент, а где нет?!

Не по теме:

это особенно понравилось Если вам сказали удалить все нулевые элементы, как тут можно что-то перепутать

BRcr
4008 / 2297 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
27.11.2011, 16:38 #44
Цитата Сообщение от Thinker Посмотреть сообщение
сложность вашего алгоритма в среднем случае O(n^2)
Как это вы высчитали?
Thinker
Эксперт C++
4225 / 2199 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.11.2011, 16:43 #45
Цитата Сообщение от BRcr Посмотреть сообщение
Как это вы высчитали?
Ну смотрите. Рассмотрим худший случай, когда все элементы требуется удалить (например, все оказались отрицательными). При удалении a[0] все следующие передвигаются на одну позицию влево, то есть n-1 операций присвоения, затем n-2 и т.д., получаем
http://www.cyberforum.ru/cgi-bin/latex.cgi?n-1 + n-2 +...+1 = \frac{(n-1)n}{2} \sim \frac{n^2}{2}
Для среднего случая возникает коэффициент
http://www.cyberforum.ru/cgi-bin/latex.cgi?\frac{n^2}{m} =O(n^2)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2011, 16:43
Привет! Вот еще темы с ответами:

Из массива Х(N) все положительные элементы записать в массив У(К), а все отрицательные элементы – в массив Z(М)... - C++
Пожалуйста помогите решить задачку на си++, заранее спасибо Из массива Х(N) все положительные элементы записать в массив У(К), а все...

Из массива вещественных чисел удалить все отрицательные элементы - C++
Помогите пожалуйста с кодом для этой программы.(Только чтобы он был максимально простым и понятным для меня,и при использовании простых...

Из массива вещественных чисел удалить все отрицательные элементы - C++
Ребят проверьте пожалуйста мой код, почему то я не уверен,что он правильно работает,если что-то не так исправьте пожалуйста. Из...

Из массива вещественных чисел удалить все отрицательные элементы - C++
Помогите пожалуйста , очень срочно и если можно то попроще , что бы мог разобраться и прокомментировать Из массива вещественных чисел...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.11.2011, 16:43
Закрытая тема Создать тему
Опции темы

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