Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.06.2013, 23:47   #1
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию Удаление элемента из массива

Добрый день. Нужен совет опытных людей.
Ничего толкового в голову не идет...
Нудна функция удаления элемента (по значению) одномерного массива (например из 2 1 3 4 3 6 3 2) исключить 2.
Пытался создать вспомогательный массив для хранения, сдвигать значения в массиве.... какая-то бредятина, даже код не буду выкладывать...
Даже не предполагал, что этот вопрос станет для меня актуальным...
Алгоритм, кусок кода. Буду признателен за любую помощь
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 17.06.2013, 00:04   #2
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Привет!

Вот мой мини набросок.
Код:
bool deleteValues(int *mas, int value, int &n) {
	bool b = false;
	int i = 0, j;

	while (i < n)
		if (mas[i] == value) {
			b = true;
			for (j = i; j < n - 1; j++)
				mas[j] = mas[j + 1];
			mas[j] = 0;
			n--;
		} 
		else
		    i++;

	if (b) 
	    return true;
	else
	    return false;
}
Функция возвращает true если в массиве найдены соотв. элементы и они были удалены, иначе false.
Имитируем удаление тупо сдвигом и изменением перемнной которая содержит количество элементов в массиве - самый примитивный способ


P.S. Или нужно именно с динамическим перераспределнием?

Последний раз редактировалось Базиля; 17.06.2013 в 00:25.
Базиля вне форума Ответить с цитированием
Старый 17.06.2013, 01:27   #3
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Модифицировал вариант Базили.
Код:
bool
deleteValues(int *mas, int value, int &n)
{
    int j = 0;
    for (int i = 0; i < n; ++i) {
        mas[j] = mas[i];
        j += (mas[i] != value);
    }
    bool b = (n != j);
    n = j;
    return b;
}
Возвращает true, если массив изменен.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.06.2013, 02:40   #4
Базиля
Участник клуба
 
Аватар для Базиля
 
Регистрация: 03.12.2009
Сообщений: 1,013
По умолчанию

Идея по преобразованию кода хороша !
Спасибо за изменения!
Позвольте немного прокомментирую.

Дело в том, что если мы произведем смещение, то начнем отставать на 1 элемент, что в дальнейшем нам не даст сместить элемент корректно (к примеру последовательность - 1 2 3 3 2 3. Предпоследняя 2 будет удалена, замена произойдет 3 на 3, но не 3 на 2 ). И например последний элемент остается не тронутым при любых обстоятельствах (если он к примеру равен искомому значению).
Конечно значение n изменится и мы не позволим себе тем самым обратиться к тем элементам, но сама задача, как таковая, не совсем до конца будет выполнена
Ну это то что бросилось сейчас сразу в глаза.
Спасибо!

P.S.
Код:
if (b) 
	    return true;
	else
	    return false;
Как же меня раздражает вот этот свой кусок кода И ведь никак все себя отучить от этого не могу))

Последний раз редактировалось Базиля; 17.06.2013 в 02:43.
Базиля вне форума Ответить с цитированием
Старый 17.06.2013, 05:01   #5
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

Цитата:
Сообщение от Базиля Посмотреть сообщение


P.S. Или нужно именно с динамическим перераспределнием?
Вообще хотелось бы конечно.... И вообще хотелось бы еще сделать перегрузку данной функции, если есть варианты, тоже не откажусь
А вообще мне оба Ваши варианта нравятся...
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!

Последний раз редактировалось Bugrimov; 17.06.2013 в 05:14.
Bugrimov вне форума Ответить с цитированием
Старый 17.06.2013, 09:17   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
//#include <stdlib.h>
#include <algorithm>

bool
deleteValues(int **mas, int value, int &n)
{
    int j = 0;
    for (int i = 0; i < n; ++i) {
        *mas[j] = *mas[i];
        j += (*mas[i] != value);
    }
    bool b = (n != j);
    if (b) {
        n = j;
        //*mas = (int *) realloc(*mas, n * sizeof(*mas[0]));
        int *temp = new int[n];
        std::copy(*mas, *mas + n, temp);
        delete [] *mas;
        *mas = temp;
    }
    return b;
}
Если ничего не перепутал (закомментирован сишный вариант).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.06.2013, 09:21   #7
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

BDA это именно то что нужно, а по поводу перегрузки сможете что-нибудь подсказать....
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 17.06.2013, 15:16   #8
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Чтобы перегрузить, нужно придумать, что перегружать.
Можно написать шаблон, чтобы функция работала для массивов, состоящих из любых типов.
Код:
template <typename T> 
bool deleteValues(T **mas, T value, int &n)
{
    int j = 0;
    for (int i = 0; i < n; ++i) {
        *mas[j] = *mas[i];
        j += (*mas[i] != value);
    }
    bool b = (n != j);
    if (b) {
        n = j;
        T *temp = new T[n];
        std::copy(*mas, *mas + n, temp);
        delete [] *mas;
        *mas = temp;
    }
    return b;
}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 17.06.2013, 15:32   #9
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию Удаление элемента

BDA
Может передавать количество удаляемых элементов.
Например удалять все 2 из массива и все 3. Как это можно реализовать? На сколько я понимаю перегрузка - это в общих чертах изменение количества параметров например или изменение возвращяемого значения (я имею в виду его тип). Поправьте меня если я ошибаюсь...
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 17.06.2013, 16:42   #10
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Код:
bool
deleteValues(int **mas, int &n, int count, int *vals)
{
    int j = 0;
    for (int i = 0; i < n; ++i) {
        *mas[j] = *mas[i];
        j += (!binary_search(vals, vals + count, *mas[i]));
    }
    bool b = (n != j);
    if (b) {
        n = j;
        int *temp = new int[n];
        std::copy(*mas, *mas + n, temp);
        delete [] *mas;
        *mas = temp;
    }
    return b;
}
3 параметр - количество элементов в vals
4 параметр - упорядоченные по возрастанию значения, которые нужно удалить из массива
Цитата:
Сообщение от Википедия
Для того, чтобы иметь возможность использовать несколько вариантов подпрограммы с одним и тем же именем, но с разным числом аргументов или другими типами аргументов (то есть с разной сигнатурой) и вводится перегрузка подпрограмм. Такая перегрузка возможна в рамках процедурной парадигмы, без применения объектно-ориентированного программирования.
При трансляции происходит контроль одноимённых процедур и функций, чтобы они различались по сигнатуре, так как в этом случае транслятор может однозначно определить вызов нужной подпрограммы.
Тип возвращаемого значения не является перегрузкой.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление элемента из массива, C#. umpik Помощь студентам 0 31.05.2013 02:14
Удаление элемента массива LiuLiuJons Общие вопросы C/C++ 6 07.03.2012 23:38
удаление элемента массива Studentka_iz_ZP Общие вопросы C/C++ 2 02.10.2010 13:55
Удаление элемента из массива prostac Помощь студентам 2 30.09.2010 11:14
Удаление элемента из массива Ozerich PHP 10 14.02.2009 02:21