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

Динамический массив и файлы - C++

Восстановить пароль Регистрация
 
s-partizan
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 34
06.05.2013, 00:19     Динамический массив и файлы #1
Здравствуйте, дали мне такое задание....
----
Выполнить задание, используя динамическое выделение памяти для одномерного массива. Дано (в текстовом файле) n≥10^9 натуральных чисел (каждое число ≤10^4). Получить массив в котором все числа исходного файла расположены по возрастанию значений;
----
Но вот с какой проблемой я столкнулся: 10 в 9 степени чисел это огромное число которое не может пройти через память...Для более меньших последовательностей моя программа работает...
Как сделать так чтобы не была задействована память в полном объёме(я примерно понимаю что при действия она должна очищаться, но как это сделать я не представляю)
Вот то что я набросал:
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
#include <iostream>
#include <windows.h>
#include <conio.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <math.h>
using namespace std;
int main()
{
 int *n=new int (pow(10,3)); //ставим степень(нужна 9)
 ofstream f;
 f.open("enter.txt");
 int a;
 int *b=new int[*n];
 srand(static_cast<unsigned int>(time(NULL))); 
 for(int i=0;i<*n;i++)
 {
    a=rand()%10;
    f<<a<<" ";
 }
 f.close();
 ifstream F;
 ofstream g;
 int temp=0;
 g.open("finish.txt");
 F.open("enter.txt");
 for(int i=0;i<*n;i++)
 {
     F>>b[i];
 }
 for(int i=0;i<*n-1;i++)
 for (int k = 0; k < *n - 1; k++)
 {
    if (b[k]>b[k+1])
    {
    temp=b[k];
    b[k]=b[k+1];
    b[k+1]=temp;
    }
 
 }
  for(int i=0;i<*n;i++)
  {
    g<<" "<<b[i];
  }
  F.close();
  g.close();
  delete n;
  delete []b;
return 0;
}
Помогите разрешить проблему...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.05.2013, 00:19     Динамический массив и файлы
Посмотрите здесь:

C++ статический массив ----> динамический массив
Массив: передать динамический массив в функцию и записать в каждый элемент строку из файла C++
C++ Динамический массив
динамический массив (Целое число разложить на массив простых множителей) C++
Создать динамический массив (Если чётных чисел больше, то массив должен быть укорочен на 2 элемента) C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Belfegor
Ghost
 Аватар для Belfegor
172 / 172 / 6
Регистрация: 16.09.2012
Сообщений: 524
06.05.2013, 00:30     Динамический массив и файлы #2
10^9 это 1 000 000 000 всего лишь....
s-partizan
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 34
06.05.2013, 00:45  [ТС]     Динамический массив и файлы #3
Цитата Сообщение от Belfegor Посмотреть сообщение
10^9 это 1 000 000 000 всего лишь....
Ну это я знаю...Вы запустите и посмотрите что выдаёт
Динамический массив и файлы
Bend3r
 Аватар для Bend3r
142 / 129 / 17
Регистрация: 29.07.2012
Сообщений: 681
06.05.2013, 00:54     Динамический массив и файлы #4
В C++ есть такой оператор
C++
1
delete
delete[] a; если А - массив.
delete a;
s-partizan
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 34
06.05.2013, 00:58  [ТС]     Динамический массив и файлы #5
Цитата Сообщение от Bend3r Посмотреть сообщение
В C++ есть такой оператор
C++
1
delete
delete[] a; если А - массив.
delete a;
Я его использую в конце моей программы.А вот между действия я его вставить не могу т.к. мне нужно передать массив несколько раз.
Bend3r
 Аватар для Bend3r
142 / 129 / 17
Регистрация: 29.07.2012
Сообщений: 681
06.05.2013, 01:00     Динамический массив и файлы #6
Цитата Сообщение от s-partizan Посмотреть сообщение
Я его использую в конце моей программы.А вот между действия я его вставить не могу т.к. мне нужно передать массив несколько раз.
Так вам необходимо удалить конкретный элемент в массиве, либо полностью массив?
s-partizan
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 34
06.05.2013, 01:14  [ТС]     Динамический массив и файлы #7
Цитата Сообщение от Bend3r Посмотреть сообщение
Так вам необходимо удалить конкретный элемент в массиве, либо полностью массив?
Мне нужно сделать так, чтобы эта программа работала при 10^9 степени чисел, а что мне для этого нужно я сам толком не знаю...
Bend3r
 Аватар для Bend3r
142 / 129 / 17
Регистрация: 29.07.2012
Сообщений: 681
06.05.2013, 01:26     Динамический массив и файлы #8
Вообщем если просто хотите менять местами елементы в массиве тогда:
C++
1
2
3
tmp = matrix[i];
matrix[i] = matrix[j+1];
matrix[j+1] = tmp;
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,340
06.05.2013, 01:31     Динамический массив и файлы #9
s-partizan, в куче спокойно можно выделить массив в 10^9 элементов, главное чтобы пкамяти хватило.
Не выделяй в начале сразу массив на все элементы. Сначало например посчитай скока элементов в файле лежит, а затем выдели массив с нужным размером и запихай туда числа.
Или сделай динамически расширяемый массив. Т.е. создал массив на 100 элементов и читаешь туда, заполнил весь, тогда выдели массив на 200 элементов, скопируй туда 100 из первого, а первый удали. И т.д. и т.п.

Добавлено через 2 минуты
Цитата Сообщение от s-partizan Посмотреть сообщение
(каждое число ≤10^4)
Так вообще можно завести массив только на 10^4+1 элемент. И с помощью него просто подсчитать, сколько у нас раз встретились 0, 1, 2, ..., 10^4. Короче - обычная упрощенная сортировка подсчетом.
s-partizan
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 34
06.05.2013, 01:39  [ТС]     Динамический массив и файлы #10
Вот она моя сортировка и она работает прекрасно...
C++
1
2
3
4
5
6
7
8
9
10
11
12
 
for(int i=0;i<*n-1;i++)
 for (int k = 0; k < *n - 1; k++)
 {
    if (b[k]>b[k+1])
    {
    temp=b[k];
    b[k]=b[k+1];
    b[k+1]=temp;
    }
 
 }
Но дело то совсем не в ней...
Ошибка будет вылетать уже на этой строке
C++
1
2
3
4
5
 
for(int i=0;i<*n;i++)
 {
     F>>b[i];
 }
А именно где я пытаюсь передать цифры из файла в память (напоминаю, что этих цифер там 1000000000)

Добавлено через 5 минут
Цитата Сообщение от nonedark2008 Посмотреть сообщение
s-partizan, в куче спокойно можно выделить массив в 10^9 элементов, главное чтобы пкамяти хватило.
Не выделяй в начале сразу массив на все элементы. Сначало например посчитай скока элементов в файле лежит, а затем выдели массив с нужным размером и запихай туда числа.
Или сделай динамически расширяемый массив. Т.е. создал массив на 100 элементов и читаешь туда, заполнил весь, тогда выдели массив на 200 элементов, скопируй туда 100 из первого, а первый удали. И т.д. и т.п.

Добавлено через 2 минуты

Так вообще можно завести массив только на 10^4+1 элемент. И с помощью него просто подсчитать, сколько у нас раз встретились 0, 1, 2, ..., 10^4. Короче - обычная упрощенная сортировка подсчетом.
Но мне же не нужно считать сколько там элементов это уже известно их там 10^9.
Мне нужно работать с этой кучей всей сразу...
Может я чего-то не понял...
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,340
06.05.2013, 01:48     Динамический массив и файлы #11
Цитата Сообщение от s-partizan Посмотреть сообщение
n≥10^9
По этой цитате их там может быть еще больше...

Добавлено через 1 минуту
s-partizan, как я уже писал, самым оптимальным способом будет использование сортировки подсчетом.
s-partizan
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 34
07.05.2013, 01:05  [ТС]     Динамический массив и файлы #12
Цитата Сообщение от nonedark2008 Посмотреть сообщение
По этой цитате их там может быть еще больше...

Добавлено через 1 минуту
s-partizan, как я уже писал, самым оптимальным способом будет использование сортировки подсчетом.
это тупик, я никак не пойму как это сделать применительно для моей задаче...
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,340
07.05.2013, 01:49     Динамический массив и файлы #13
s-partizan, что-то типа такого:
UINT mas[10000] = {0};

цикл пока в файле есть числа
Пусть i <- текущее считанное число.
mas[i] += 1; // Увеличиваем счетчик
После этого в каждой ячеке массива mas[x] будет находиться сколько раз число x встретилось в файле.
Вывести в отсортированном порядке уже очень просто.
Правда я не понимаю, как тут можно использовать динамические массивы, но что-то можно ведь придумать?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.05.2013, 15:02     Динамический массив и файлы
Еще ссылки по теме:

C++ Переделать динамический массив на статический массив
C++ Массив и память. Как создать динамический массив?
C++ Динамический массив

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

Или воспользуйтесь поиском по форуму:
s-partizan
0 / 0 / 0
Регистрация: 09.11.2012
Сообщений: 34
07.05.2013, 15:02  [ТС]     Динамический массив и файлы #14
Что-нибудь придумаю...Я понял, что мне хотели сказать...Дальше дело техники
Yandex
Объявления
07.05.2013, 15:02     Динамический массив и файлы
Ответ Создать тему
Опции темы

Текущее время: 22:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru