Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.72
Sasuke
1 / 1 / 2
Регистрация: 09.10.2009
Сообщений: 89
#1

Как поменять размерность массива? - C++

13.11.2009, 21:32. Просмотров 2300. Ответов 12
Метки нет (Все метки)

Здравствуйте! Я пытаюсь решить одну задачу, но у меня нет мыслей, как действовать... когда я дохожу к тому, что нужно поменять размерность массива. Вот, собственно говоря, условие задачи:
Удалить из массива:
а) все отрицательные элементы;
б) все элементы, большие данного числа n;
и изменить размерность массива

Я написал программу, но не затрогнул тему изменения размерности. Немогли бы вы мне помочь разобраться?


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
#include <iostream>
#include <stdlib.h>
#include <ctime>
using namespace std;
int main ()
{
    int *K;
    int i,j,k,x,x1;
    srand(time(NULL));
    cout<<">> Vvedite koli4estvo elementov massiva: ";
    cin>>x;
    if((K=(int*)malloc(x*sizeof(int)))==NULL) 
    { 
        cout<<"Ne dostato4no pamyati!\n"; 
        return 1;
    }
    for (i=0; i<x; i++)
    {
        *(K+i)=rand()%201-100;
    }
    cout<<">> Massiv:\n";
    for (i=0; i<x; i++)
    {
        cout<<*(K+i)<<" ";
    }
    //a)
    cout<<'\n'<<"\n>> New Massiv (1):\n";
    for (i=0,j=0,k=0; i<x; i++,j++)
    {
        if (*(K+i)>=0)
            {cout<<*(K+i)<<" ";
            *(K+i)=*(K+j);
            k++;}
    }
    //b)
    cout<<'\n'<<"\nVvedite nomer elementa massiva: ";
    cin>>x1;
    cout<<New Massiv (2): ";
    for (i=x1; i<x; i++)
    {
        cout<<*(K+i)<<" ";
    }
    cout<<'\n'<<'\n';
    free(K);
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.11.2009, 21:32
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как поменять размерность массива? (C++):

Как определить размерность массива
Есть такая задача : Найти общие элементы 2-х массивов и записать результат в...

Как хранить размерность массива?
Здравствуйте. Мне нужно решить задачу: template &lt; class T, size_t N&gt;...

Как увеличить размерность массива?
В процессе отладки программы появилась необходимость увеличить массивы,...

Как задать размерность одномерного массива
Подскажите, пожалуйста, как задать размерность одномерного массива, чтобы ее...

Как правильно задавать размерность массива?
Всем привет! Есть абстрактный класс Transport(его наследуют 3 класса). Есть...

размерность массива должна определяться динамически, это как?
Код исходного массива #include &lt;vcl.h&gt; #include &lt;stdio.h&gt; #pragma hdrstop...

12
M128K145
Эксперт JavaЭксперт С++
8320 / 3540 / 419
Регистрация: 03.07.2009
Сообщений: 10,708
13.11.2009, 21:42 #2
Логически изменить размерность можно, но это не будут изменения на уровне реальных изменений выделенной памяти. Сделай просто декремент х и "уменьшишь" размерность массива на 1. Но это только логически, а не физически. Физически изменять размер выделенной памяти нельзя
0
TheKnyazz
11 / 11 / 1
Регистрация: 27.04.2009
Сообщений: 30
13.11.2009, 21:46 #3
А почему бы не сделать просто 2 массив, в который копирнуть все элементы которые будут подходить по условию, не отрицательные, и еще 1 массив в который копирнуть элементы большие n?
0
Sasuke
1 / 1 / 2
Регистрация: 09.10.2009
Сообщений: 89
13.11.2009, 21:57  [ТС] #4
Цитата Сообщение от M128K145 Посмотреть сообщение
Логически изменить размерность можно, но это не будут изменения на уровне реальных изменений выделенной памяти. Сделай просто декремент х и "уменьшишь" размерность массива на 1. Но это только логически, а не физически. Физически изменять размер выделенной памяти нельзя
А как тогда можно сделать, если не использовать выдиление памяти? Может использовать вариант пользователя TheKnyazz? Но здесь я немного сомневаюсь, ведь задача построена так, что нужно изменить данный массив, с которым работаешь... Хотя условие весьма бедное, одни догадки... но это больше похоже на серьёзное задание..)
0
rangerx
1941 / 1550 / 478
Регистрация: 31.05.2009
Сообщений: 2,913
13.11.2009, 22:01 #5
Используй std::vector(или напиши свой с минимум функций ).
0
Sasuke
1 / 1 / 2
Регистрация: 09.10.2009
Сообщений: 89
13.11.2009, 22:07  [ТС] #6
rangerx, я понимаю, существуют различные источники в интернете, где можно узнать об std::vector, но я там всё равно ничего не пойму. Не мог ли бы вы мне разъяснить свойства этой функции? И если можно просто пример...
0
Андрейка
421 / 225 / 87
Регистрация: 25.03.2009
Сообщений: 744
13.11.2009, 22:27 #7
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
int main()
{
    int arr[] = {-1,-2,-3,1,2,3};
    std::vector<int>vec(arr,arr+sizeof(arr)/sizeof(*arr));
    std::copy(vec.begin(),std::remove_if(vec.begin(),vec.end(),std::bind2nd(std::less<int>(),0)),std::ostream_iterator<int>(std::cout," "));
    return 0;
}
Добавлено через 2 минуты
если хочешь удалить все больше заданного n то в моём коде вместо std::less<int>() поставь std::greater<int>() и вместо 0 своё заданное n
2
Sasuke
1 / 1 / 2
Регистрация: 09.10.2009
Сообщений: 89
14.11.2009, 00:26  [ТС] #8
Цитата Сообщение от Sasuke Посмотреть сообщение
if((K=(int*)malloc(x*sizeof(int)))==NULL)
{
cout<<"Ne dostato4no pamyati!\n";
return 1;
Вопрос_1: Я вот по аллегории сочинял эту программу. Скажите, то что я процитировал является выделением памяти?
Вопрос_2: Если я попытаюсь добавить еще два массива, тоже динамических, мне для каждого следует выделять память, ну и освобождать её, соответственно?
0
TheKnyazz
11 / 11 / 1
Регистрация: 27.04.2009
Сообщений: 30
14.11.2009, 08:52 #9
Угу, советую почитать о функции realloc. С ней ты будешь делать 2 массив и потихоньку расширять его по мере надобности, главное с указателями не запутаться. А можно по деревянному. Сначала посчитать количество элементов будущих 2 и 3 массивах, выделять память и копирнуть в них.
0
Sasuke
1 / 1 / 2
Регистрация: 09.10.2009
Сообщений: 89
14.11.2009, 20:06  [ТС] #10
TheKnyazz , а как это будет выглядеть? Я стараюсь пока не работать с функциями, которые толком не могу понять... realloc относится к ним.
А вот на счёт деревяного способа... Как это выглядит?
1) выделяю память под массив А;
2) заполняю А;
3) делаю вычисления, копирую некоторые объекты А;
4) выделяю память под массив Б, копирую в Б некоторые элементы А;
5) делаю вычисления, копирую некоторые объекты А;
6) выделяю память под массив В, копирую в В некоторые элементы А;
7) освобождаю память для всех массивов.

ТАК? А выделение памяти и освобождение можно слепить в едино?
0
TheKnyazz
11 / 11 / 1
Регистрация: 27.04.2009
Сообщений: 30
14.11.2009, 23:27 #11
1) выделяю память под массив А;
2) заполняю А;
3) делаю вычисления, считаешь количество неотрицательных элементов.
4) выделяешь память под массив b, копируешь в него неотрицательные элементы
5) считаешь количество всех элементов больших числа n
6)выделяешь память под массив c, копируешь в него Все элементы большие числа n
7)теперь у тебя есть 3 массива необходимые для задания, выводишь все поочереди, освобождаешь память, вот собственно и всё)
Слепить получится только освобождение памяти. Выделение никак, ибо ты не знаешь заранее сколько у тебя элементов окажется отрицательными, и сколько элементов больше числа n.Значит не знаешь, сколько надо памяти.
==>>а безразмерные массивы это уже vector и всё такое, предыдущий оратор показывал)
0
Sasuke
1 / 1 / 2
Регистрация: 09.10.2009
Сообщений: 89
15.11.2009, 00:30  [ТС] #12
Цитата Сообщение от Sasuke Посмотреть сообщение
if((K=(int*)malloc(x*sizeof(int)))==NULL)
{
cout<<"Ne dostato4no pamyati!\n";
return 1;
}
Выделение памяти совершать таким же образом как и впервый раз?
0
TheKnyazz
11 / 11 / 1
Регистрация: 27.04.2009
Сообщений: 30
15.11.2009, 10:10 #13
Угу, только х замени на количество элементов нового массива.
0
15.11.2009, 10:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2009, 10:10
Привет! Вот еще темы с решениями:

Как сделать так,чтобы размерность массива вводил пользователь и массив заполнялся случайными числами?
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;locale&gt; #include...

Считывание элементов массива из файла, где в первой строке можно задавать размерность массива
Разработать программу для работы с одномерным массивом. Ее функции: -...

Размерность массива в классе
Как нужно переписать массив в классе, чтобы пользователь мог задавать...


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

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

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