17 / 17 / 0
Регистрация: 18.05.2011
Сообщений: 33
1

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

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

Author24 — интернет-сервис помощи студентам
Задан массив размера N. Удалить из массива все отрицательные элементы.
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.11.2011, 16:16
Ответы с готовыми решениями:

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

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

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

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

44
17 / 17 / 0
Регистрация: 18.05.2011
Сообщений: 33
26.11.2011, 22:49  [ТС] 21
Author24 — интернет-сервис помощи студентам
Cпасибо, но не могли бы вы перевести прогу на Pellec C а то так не совсем понятно
1
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
26.11.2011, 22:59 22
Цитата Сообщение от Vampire110 Посмотреть сообщение
не могли бы вы перевести прогу на Pellec C
А что, в Pellec'e какой-то другой язык Си используется? Просто позаменяйте все cin, cout на printf, scanf и будет вам Си'шная версия.
0
17 / 17 / 0
Регистрация: 18.05.2011
Сообщений: 33
26.11.2011, 23:23  [ТС] 23
могу лишнего поудалять и работать не будет. не всю прогу а ту часть где удаление
1
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
26.11.2011, 23:26 24
Столько алгоритмов удаления, а про самый быстрый метод удаления элементов забыли:
https://www.cyberforum.ru/showthread.php?p=2132969
0
BRcr
26.11.2011, 23:36
  #25

Не по теме:

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

0
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
26.11.2011, 23:44 26
Цитата Сообщение от BRcr Посмотреть сообщение

Не по теме:


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

Не по теме:

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

0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 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;
                }
        }
Тут еще и последний элемент массива не забыт
0
58 / 58 / 6
Регистрация: 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;
                }
        }
Тут еще и последний элемент массива не забыт
В моей версии тоже не забыт
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 };. Когда удалите, то сообщите мне! Мне будет очень любопытно особенно посмотреть, как вы будете сдвигать элементы массива! Флаг вам в руки и удачи!
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
27.11.2011, 11:09 30
Сыроежка, для начала откройте глаза
в связи с вашей некомпетентностью в массивах, привожу скриншот работы моего кода, на вашем примере.
Как видите, отработало корректно, и в следующий раз прежде чем писать огромный пост на форуме, разберитесь в коде
Миниатюры
Массив: Удалить из массива все отрицательные элементы.  
0
go
27.11.2011, 11:10
  #31

Не по теме:

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

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

Тем не менее кто-нибудь покажет эту прогу на Pellec C . Спасибо.
1
Заблокирован
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, так и продолжает его содержать!

Что же вы такой "продвинутый", что даже с пятого раза не понимаете, что вам пишут?! Хуже того, вы даже не понимаете, что делает написанная вами собой программа!
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
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. Прекращаю этот спор, и на ваши посты больше не отвечаю. Все изложено выше, и подтверждено не только мной...
0
Эксперт С++
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
27.11.2011, 15:50 36
Часто под словом удалить элементы в массиве, обладающих некоторым свойством (например, все нули т.п.) понимают переставить элементы таким образом, чтобы сначала следовали все элементы, не обладающие данным свойством (причем порядок следования должен остаться прежним), а в переменную записать сколько таких элементов. Размер массива при этом остается прежним, но будет переменная, которая хранит "новый" размер массива в том плане, что в ней хранится количество неудаленных элементов. Поэтому можно работать не совсем массивом, а лишь с первыми m элементами, не обладающих изначальным свойством.
1
Заблокирован
27.11.2011, 15:56 37
Цитата Сообщение от Thinker Посмотреть сообщение
Часто под словом удалить элементы в массиве, обладающих некоторым свойством (например, все нули т.п.) понимают переставить элементы таким образом, чтобы сначала следовали все элементы, не обладающие данным свойством (причем порядок следования должен остаться прежним), а в переменную записать сколько таких элементов. Размер массива при этом остается прежним, но будет переменная, которая хранит "новый" размер массива в том плане, что в ней хранится количество неудаленных элементов. Поэтому можно работать не совсем массивом, а лиши с первыми m элементами, не обладающих изначальным свойством.
Еще один умник нашелся! У массива есть его размер! Чтобы "удалить" элементы, надо определиться с тем, каким значением будут заменены удаляемые эоементы, так как в общем случае у массивов за исключением символьных массивов, нет завершающего элемента типа 0 для символьных массивов.
Поэтому чтобы решить задачу, нужно тполучить информацию, каким значением заменять удаленные элементы. И что никак не может из себя выдавить автор вопроса.

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

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

Не по теме:

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

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



Не по теме:

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

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

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

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

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

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

Удалить из массива все отрицательные элементы
удалить из массива все отрицательные элементы . под удалением элемента следует понимать :...

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

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

Массив: Заменить все отрицательные элементы массива их квадратами и упорядочить элементы массива по возрастанию.
Сформировать массив 20 целых случайных чисел в диапазоне от минус 30 до 30. Напечатать его....


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

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

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