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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.72
Sasuke
1 / 1 / 0
Регистрация: 09.10.2009
Сообщений: 89
#1

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

13.11.2009, 21:32. Просмотров 2252. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.11.2009, 21:32     Как поменять размерность массива?
Посмотрите здесь:

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

Как хранить размерность массива? - C++
Здравствуйте. Мне нужно решить задачу: template &lt; class T, size_t N&gt; std::size_t length(const T (&amp;)) { return N; }; ...

Как увеличить размерность массива? - C++
В процессе отладки программы появилась необходимость увеличить массивы, объявленные ниже, на 4 элемента. Можно ли это сделать в первом и...

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
M128K145
Эксперт С++
8283 / 3502 / 143
Регистрация: 03.07.2009
Сообщений: 10,706
13.11.2009, 21:42     Как поменять размерность массива? #2
Логически изменить размерность можно, но это не будут изменения на уровне реальных изменений выделенной памяти. Сделай просто декремент х и "уменьшишь" размерность массива на 1. Но это только логически, а не физически. Физически изменять размер выделенной памяти нельзя
TheKnyazz
10 / 10 / 1
Регистрация: 27.04.2009
Сообщений: 30
13.11.2009, 21:46     Как поменять размерность массива? #3
А почему бы не сделать просто 2 массив, в который копирнуть все элементы которые будут подходить по условию, не отрицательные, и еще 1 массив в который копирнуть элементы большие n?
Sasuke
1 / 1 / 0
Регистрация: 09.10.2009
Сообщений: 89
13.11.2009, 21:57  [ТС]     Как поменять размерность массива? #4
Цитата Сообщение от M128K145 Посмотреть сообщение
Логически изменить размерность можно, но это не будут изменения на уровне реальных изменений выделенной памяти. Сделай просто декремент х и "уменьшишь" размерность массива на 1. Но это только логически, а не физически. Физически изменять размер выделенной памяти нельзя
А как тогда можно сделать, если не использовать выдиление памяти? Может использовать вариант пользователя TheKnyazz? Но здесь я немного сомневаюсь, ведь задача построена так, что нужно изменить данный массив, с которым работаешь... Хотя условие весьма бедное, одни догадки... но это больше похоже на серьёзное задание..)
rangerx
1932 / 1541 / 141
Регистрация: 31.05.2009
Сообщений: 2,909
13.11.2009, 22:01     Как поменять размерность массива? #5
Используй std::vector(или напиши свой с минимум функций ).
Sasuke
1 / 1 / 0
Регистрация: 09.10.2009
Сообщений: 89
13.11.2009, 22:07  [ТС]     Как поменять размерность массива? #6
rangerx, я понимаю, существуют различные источники в интернете, где можно узнать об std::vector, но я там всё равно ничего не пойму. Не мог ли бы вы мне разъяснить свойства этой функции? И если можно просто пример...
Андрейка
419 / 223 / 27
Регистрация: 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
Sasuke
1 / 1 / 0
Регистрация: 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: Если я попытаюсь добавить еще два массива, тоже динамических, мне для каждого следует выделять память, ну и освобождать её, соответственно?
TheKnyazz
10 / 10 / 1
Регистрация: 27.04.2009
Сообщений: 30
14.11.2009, 08:52     Как поменять размерность массива? #9
Угу, советую почитать о функции realloc. С ней ты будешь делать 2 массив и потихоньку расширять его по мере надобности, главное с указателями не запутаться. А можно по деревянному. Сначала посчитать количество элементов будущих 2 и 3 массивах, выделять память и копирнуть в них.
Sasuke
1 / 1 / 0
Регистрация: 09.10.2009
Сообщений: 89
14.11.2009, 20:06  [ТС]     Как поменять размерность массива? #10
TheKnyazz , а как это будет выглядеть? Я стараюсь пока не работать с функциями, которые толком не могу понять... realloc относится к ним.
А вот на счёт деревяного способа... Как это выглядит?
1) выделяю память под массив А;
2) заполняю А;
3) делаю вычисления, копирую некоторые объекты А;
4) выделяю память под массив Б, копирую в Б некоторые элементы А;
5) делаю вычисления, копирую некоторые объекты А;
6) выделяю память под массив В, копирую в В некоторые элементы А;
7) освобождаю память для всех массивов.

ТАК? А выделение памяти и освобождение можно слепить в едино?
TheKnyazz
10 / 10 / 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 и всё такое, предыдущий оратор показывал)
Sasuke
1 / 1 / 0
Регистрация: 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;
}
Выделение памяти совершать таким же образом как и впервый раз?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2009, 10:10     Как поменять размерность массива?
Еще ссылки по теме:

Увеличить размерность массива - C++
Короче такая проблема, есть массив с данными, нужно увеличить его размерность, вроде написал всё правильно, но выскакивает ошибка Debag...

Размерность массива в классе - C++
Как нужно переписать массив в классе, чтобы пользователь мог задавать размерность этого массива вместо фиксированных D и MAX, которые...

Правильно задать размерность массива - C++
unsigned char phrase = &quot;XАXАXАXАX&quot;; unsigned char to_display; В массиве phrase буква А - русские в utf-8. по два байта на...

В с++ нельзя изменять размерность массива? - C++
Читаю книжку по с++, тут написано что у массивов в отличии от векторов нельзя менять размерность... Я в VisualBasic'е точно знаю можно...

Максимальная размерность статического массива - C++
Добрый день! У меня появилась проблема. Мне по ходу курсового проекта нужно заводить двумерные массивы большой размерности (например,...


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

Или воспользуйтесь поиском по форуму:
TheKnyazz
10 / 10 / 1
Регистрация: 27.04.2009
Сообщений: 30
15.11.2009, 10:10     Как поменять размерность массива? #13
Угу, только х замени на количество элементов нового массива.
Yandex
Объявления
15.11.2009, 10:10     Как поменять размерность массива?
Ответ Создать тему
Опции темы

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