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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.01.2013, 18:23   #1
N1kS
Новичок
Джуниор
 
Регистрация: 20.01.2013
Сообщений: 3
По умолчанию Удаление группы элементов из массива

Необходимо удалить из массива группу элементов, с(индекс) - по(индекс).
Код:
#include "stdafx.h"
#include <iostream>
#include <malloc.h>
using namespace std;

int n;

void udalenie(int *x, int s)
{
	for(; s<n; s++)
		x[s] = x[s+1];
	n--;
	x = (int *)malloc(n*sizeof(int));
}

int main()
{
	int *x, i, s, po;
	cout<<"Razmer massiva: "; cin>>n;
	x = (int *)malloc(n*sizeof(int));
	for(i=0; i<n; i++)
		{
			cout<<"X["<<i<<"]="; cin>>x[i];
		}
	cout<<"Ydalit' vse chisla massiva s: "; cin>>s; // вводишь индекс с какого
	cout<<"Ydalit' vse chisla massiva po: "; cin>>po; // вводишь индекс по какое
	for(; s<=po; s++)
		udalenie(x, s);
	cout<<"Massiv posle transformacii: ";
	for(i=0; i<n; i++)
		cout<<x[i]<<" ";
	cout<<endl;
	return 0;
}
N1kS вне форума Ответить с цитированием
Старый 20.01.2013, 18:57   #2
denrubun
Пользователь
 
Регистрация: 24.12.2012
Сообщений: 82
По умолчанию

если все работает не вижу проблем.
а если не работает ТО ЧТО ИМЕННО?
denrubun вне форума Ответить с цитированием
Старый 20.01.2013, 19:22   #3
N1kS
Новичок
Джуниор
 
Регистрация: 20.01.2013
Сообщений: 3
По умолчанию

Цитата:
Сообщение от denrubun Посмотреть сообщение
если все работает не вижу проблем.
а если не работает ТО ЧТО ИМЕННО?
Работает, но не корректно. Допустим - размер массива 4, удаляем 2 последних(2, 3) - все работает, отлично. Допустим хотим удалить 1(3) удаляется, все работает. Но если мне нужно удалить 2 первых или 2 средних - то не работает. Получается вот так:
ydal.jpg
Ну а должно быть: 1 4.

Последний раз редактировалось N1kS; 20.01.2013 в 19:25.
N1kS вне форума Ответить с цитированием
Старый 20.01.2013, 19:33   #4
denrubun
Пользователь
 
Регистрация: 24.12.2012
Сообщений: 82
По умолчанию

void udalenie(int *x, int s)
{
for(; s<n; s++)
x[s] = x[s+1];
n--;
x = (int *)malloc(n*sizeof(int));
}
память выделяется при удалении?? а возвращается она когда??
denrubun вне форума Ответить с цитированием
Старый 20.01.2013, 19:49   #5
N1kS
Новичок
Джуниор
 
Регистрация: 20.01.2013
Сообщений: 3
По умолчанию

Цитата:
Сообщение от denrubun Посмотреть сообщение
void udalenie(int *x, int s)
{
for(; s<n; s++)
x[s] = x[s+1];
n--;
x = (int *)malloc(n*sizeof(int));
}
память выделяется при удалении?? а возвращается она когда??
Честно говоря не сильно понял, но вроде бы с память все нормально, т.к кол-во элементов соответсвтует...
N1kS вне форума Ответить с цитированием
Старый 20.01.2013, 19:58   #6
denrubun
Пользователь
 
Регистрация: 24.12.2012
Сообщений: 82
По умолчанию

Код:
x = (int *)malloc(n*sizeof(int))
это динамическое выделение памяти. за ней, как за статической, никто следить не будет, ты её выделил, ты и верни.
память возвращается функцией free, и вообще держи читай http://www.sernam.ru/c_42.php

ты память только выделяешь) даже в функции удаления
denrubun вне форума Ответить с цитированием
Старый 20.01.2013, 23:20   #7
denrubun
Пользователь
 
Регистрация: 24.12.2012
Сообщений: 82
По умолчанию

вообще есть у меня соображение, что если нужно удалить несколько элементов массива подряд, нужна отдельная функция, а не вызов удаления одного элемента в цикле

Код:
#include <iostream>
using namespace std;
int n = 5;

int* del(int *x, int startInd, int endInd)
{
	for( ;endInd<n; ++startInd, ++endInd)
		x[startInd] = x[endInd];
	n = startInd;
	//если то, что элементы как бы удалены, но память с под них не освобождена
	//(в этом случае память возвратится вся разом при удаленни массива),
	//тебя не беспокоит, то следующие строчки не нужны
	//и возвращаемое значение тоже; заменить на void в этом случае
	int *new_x = new int[n];
	for(int i=0; i < startInd; ++i)
		new_x[i] = x[i];
	delete[] x;
	x = new_x;
	return new_x;
}

//если производительности не жалко, то можно переписать new_x обратно в х
//но имхо лучше оставить лишние элементы, чем переписывать массив дважды
//из приятного (в обоих случаях!)
//получишь что надо писаль del(x,1,3); а не x = del(x,1,3), что выглядит убого, даже абсурдно 
void del_with_double_rewrite(int *x, int startInd, int endInd) //медленно
{
	for( ;endInd<n; ++startInd, ++endInd)
		x[startInd] = x[endInd];
	n = startInd;
	int *new_x = new int[n];
	for(int i=0; i < n; ++i)
		new_x[i] = x[i];
	delete[] x;
	x = new int[n];
	for(int i=0; i < n; ++i)
		x[i] = new_x[i];
}

int main(){
	int *x = new int[n];
	
	for(short i=0; i<n; i++)
		cin >> x[i];
		
	x = del(x, 1, 3);//удаляет элементы с индексами от 1 до 3 (3 не удаляет!!)
	
	for(short i=0; i<n; i++)
		cout << x[i] << " ";
	cout << endl;
	
	system("pause");
	return 0;
};
denrubun вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление элементов массива. Маx Паскаль, Turbo Pascal, PascalABC.NET 4 20.09.2012 22:50
Удаление элементов массива LittleStudent Помощь студентам 0 10.04.2011 12:24
Удаление элементов массива и сдвиг Alex11223 Паскаль, Turbo Pascal, PascalABC.NET 1 12.01.2011 20:01
Удаление элементов из массива Jasper92 Общие вопросы C/C++ 3 06.03.2010 13:04
удаление одинаковых элементов из массива sauron99 Общие вопросы Delphi 6 15.04.2009 21:27