С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Delmellor
1 / 1 / 0
Регистрация: 18.11.2012
Сообщений: 37
#1

Динамические массивы разных размеров - C++

31.03.2013, 14:32. Просмотров 510. Ответов 9
Метки нет (Все метки)

Дан файл вида, например, такого:
9
7
5 -5 7 3 -6 9 2
1 13 6 2 -4
42 -13 3 0 5 8 -11
4 -11 3 8 -5 2 3
5 -3 9
3 5 -2 1 0 0 23
6 9 9 5 17 -13
5 3 -4 21 4 3 15
-20 5 3 -6

7 — это N — сколько координат может быть у вектора. Векторы вида x=(X1, X2, …, Xk), k<=N.
9 — это количество имеющихся векторов.
Т.е. в первой строке количество векторов, во второй — сколько может быть максимум координат, а дальше пошли сами векторы.

Мне нужно в динамический массив V размером 9 записать эти векторы; а размер каждого из субмассивов (координаты каждого вектора) равен k, где k — кол-во координат текущего вектора.
Хочу считывать строки, потом ячейке массива V присваивать массив размера = кол-ву координат.

Проблема в том, что не знаю, как объяснить, что у нас строка закончилась. Пробовал метод get у входного потока (типа while read.get()!="\n") — не подходит, т.к. у нас числа, а этот get знак минуса отдельно хавает.

Добавлено через 11 минут
В принципе, сколько векторов — неважно... напишу while (!read.eof()) и всё. Главное — чтобы можно было при переходе на следующую строку:
1) узнать, сколько в ней чисел (k штук)
2) ячейке массива векторов присвоить динамический массив размера k.
3) и заполнить его числами этими (координатами).

Нельзя использовать vector, set и т.п... реализовать нужно всё строго через динам. массивы (просто само задание на ссылочный тип данных).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2013, 14:32
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Динамические массивы разных размеров (C++):

Динамические массивы и функции. Динамические массивы. - C++
Дана матрица 6х8 целого типа. Создать одномерный массив, содержащий элементы матрицы, кратные числу, введенному с клавиатуры.

Указатели и массивы. Индексация с помощью указателей. Передача массивов в функции. Динамические массивы (обработка матриц) - C++
Для каждого элемента , bij, i= 1,...,n , j=1,...,n определяется свой многоугольник местонахождением соответствующего элемента aij (см....

Массив указателей на std::array разных размеров - C++
Привет форум, нужно создать двухмерный массив pair Так как все const, то решил занести в глобальные переменные потом видно будет ...

Динамические массивы - C++
помогите выполнить задание #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;math.h&gt; #include &lt;time.h&gt; void main() { int...

Динамические массивы - C++
Добрый вечер! Проблема такая,плохо понимаю,как изменить в моей программе обычные массивы на динамические. Надеюсь,кто-то поможет и...

Динамические массивы: - C++
Найти максимальный элемент матрицы.

9
palva
2690 / 1917 / 288
Регистрация: 08.06.2007
Сообщений: 7,055
Записей в блоге: 4
31.03.2013, 14:37 #2
Вы через потоки читаете? Т. е. ifstream
0
Tiva
94 / 94 / 1
Регистрация: 25.04.2012
Сообщений: 429
31.03.2013, 14:39 #3
считывать числа построчно
C++
1
getline(ifst,str);
разбивать строки на составляющие цифры через istringstream например
C++
1
2
3
4
5
6
7
8
9
#include <sstream>
istringstream iss(str)
while(iss)
{
 
    int temp;
    iss >> temp;
    //добавить в i-ый элемент вытащенное число temp
}
1
Delmellor
1 / 1 / 0
Регистрация: 18.11.2012
Сообщений: 37
03.04.2013, 04:59  [ТС] #4
Tiva, спасибо большое; то, что нужно. Почти.
Вопрос ещё в том, как узнать, сколько чисел в строке. Ну вот сгетлайнил, и мне нужно же создать массив определенного размера (k чисел) — как получить k?

Добавлено через 4 часа 28 минут
Есть способ?

Добавлено через 8 часов 49 минут
? [поднимаю]
0
taras atavin
3570 / 1754 / 91
Регистрация: 24.11.2009
Сообщений: 27,567
03.04.2013, 05:20 #5
Цитата Сообщение от Delmellor Посмотреть сообщение
Динамические массивы разных размеров
А зачем размер упомянут? Динамический массив по определению есть массив, не определяющий своего размера в момент декларации и получающий его в рантайме по потребности. А потребность в размерах нескольких массивов в общем случае может не совпадать. Или в данном случае речь о неравенстве верхней планки, типа один массив имеет
C++
1
uint8_t count;
, у второго
C++
1
uint16_t count;
, у третьего
C++
1
uint32_t count;
, а у четвёртого
C++
1
size_t count;
?
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.04.2013, 06:51 #6
Как вариант. Выведет количество чисел, расположенных через пробел, в каждой строке файла:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
ifstream fin("2.txt");
int N = 0;
while (fin.peek() != EOF)
{
    int temp;
    fin >> temp;
    ++N;
    if (fin.peek() == '\n' || fin.peek() == EOF)
    {
        cout << N << endl;
        N = 0;
    }
}
Добавлено через 12 минут
Или способом, который предложил Tiva, но с подсчётом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
while (!fin.eof())
{
    string str;
    getline(fin, str);
    istringstream iss(str);
        
    int N = 0;
    while(iss)
    {
        int temp;
        iss >> temp;
        if (iss)
        ++N;
    }
    cout << N << endl;
}
1
Delmellor
1 / 1 / 0
Регистрация: 18.11.2012
Сообщений: 37
09.04.2013, 15:09  [ТС] #7
Эх...
Мне нужно вот что:
Узнавать, сколько в строке чисел, потом "тут же, не считывая их", объявлять массив этого размера, а уже потом в него их заносить. Т.е. чтобы можно было написать цикл for (i=0; i<K; i++) fin>>А[i] ;; у А размер K, который мы уже узнали.
Т.е. всё сводится к тому, чтобы как-то "вернуться назад" после подсчёта количества чисел в строке.
И в массиве этом созданном должно быть ровно K элементов — ни больше, ни меньше.

Добавлено через 12 минут
Цитата Сообщение от taras atavin Посмотреть сообщение
А зачем размер упомянут? Динамический массив по определению есть массив, не определяющий своего размера в момент декларации и получающий его в рантайме по потребности. А потребность в размерах нескольких массивов в общем случае может не совпадать. Или в данном случае речь о неравенстве верхней планки
Да, речь о неравенстве верхней планки.
Цитата Сообщение от taras atavin Посмотреть сообщение
получающий его в рантайме по потребности
Именно так всё и должно произойти — узнаём верхнюю планку, создаём массив длины K, заполняем его значениями из строки с K значениями.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.04.2013, 15:17 #8
Цитата Сообщение от Delmellor Посмотреть сообщение
Узнавать, сколько в строке чисел, потом "тут же, не считывая их", объявлять массив этого размера, а уже потом в него их заносить.
Это нужно делать для каждой строки в файле?

Добавлено через 6 минут
Если да, то файл всё равно придётся два раза проходить. Поэтому, создаёте вектор интов, проходите файл, как описано выше, количество чисел в каждой строке помещаете в вектор, закрываете файл (или перемещаете курсор в начало), снова открываете, берёте последовательно числа из вектора, создаёте массивы нужного размера, читаете туда числа из строк (сколько из в каждой строке уже будете знать).
1
Delmellor
1 / 1 / 0
Регистрация: 18.11.2012
Сообщений: 37
09.04.2013, 15:27  [ТС] #9
Спасибо, то, что нужно.

Добавлено через 2 минуты
Цитата Сообщение от alsav22 Посмотреть сообщение
или перемещаете курсор в начало
Как это сделать?

В принципе, не знаю и того, как "заново открыть файл" — ещё раз объявить переменную ifstream?
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
09.04.2013, 16:43 #10
Цитата Сообщение от Delmellor Посмотреть сообщение
Как это сделать?
C++
1
2
fin.clear();
fin.seekg(0);
Добавлено через 3 минуты
Размер вектора с интами, будет равен количеству строк в файле, поэтому второй раз можно читать не до конца файла, а в цикле (так проще).
1
09.04.2013, 16:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.04.2013, 16:43
Привет! Вот еще темы с ответами:

Динамические массивы - C++
Если у меня есть 2 двумерных динамических массива один х1 размерностью m*n, а другой х2 размерностью m*(n+1), то что происходит с ними...

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

Динамические массивы - C++
Помогите пожалуйста решить. Только матрицы надо обязательно через динамические массивы задавать( я ничего в этом не понимаю(

Динамические Массивы - C++
Есть массив с неизвестным количеством ячеек (или их нет пока). И когда пользователь вводит число - массив будет увеличиваться на 1 ячейку....


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

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

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