1 / 1 / 0
Регистрация: 18.11.2012
Сообщений: 37
1

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

31.03.2013, 14:32. Показов 1147. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.03.2013, 14:32
Ответы с готовыми решениями:

Как приравнять динамические одномерные массивы разных размеров друг к другу
Если у меня есть 2 массива разного размера arr1 и arr2. Предположим 3 случая: размер arr1 &lt; arr2,...

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

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

Структуры, массивы, указатели, динамические массивы структур
Помогите с решением задачи (прикрепляю условие). Заранее спасибо.

9
3944 / 2858 / 665
Регистрация: 08.06.2007
Сообщений: 9,662
Записей в блоге: 4
31.03.2013, 14:37 2
Вы через потоки читаете? Т. е. ifstream
0
96 / 96 / 21
Регистрация: 25.04.2012
Сообщений: 449
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
1 / 1 / 0
Регистрация: 18.11.2012
Сообщений: 37
03.04.2013, 04:59  [ТС] 4
Tiva, спасибо большое; то, что нужно. Почти.
Вопрос ещё в том, как узнать, сколько чисел в строке. Ну вот сгетлайнил, и мне нужно же создать массив определенного размера (k чисел) — как получить k?

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

Добавлено через 8 часов 49 минут
? [поднимаю]
0
4203 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
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
5494 / 4889 / 831
Регистрация: 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
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
5494 / 4889 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
09.04.2013, 15:17 8
Цитата Сообщение от Delmellor Посмотреть сообщение
Узнавать, сколько в строке чисел, потом "тут же, не считывая их", объявлять массив этого размера, а уже потом в него их заносить.
Это нужно делать для каждой строки в файле?

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

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

В принципе, не знаю и того, как "заново открыть файл" — ещё раз объявить переменную ifstream?
0
5494 / 4889 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
09.04.2013, 16:43 10
Цитата Сообщение от Delmellor Посмотреть сообщение
Как это сделать?
C++
1
2
fin.clear();
fin.seekg(0);
Добавлено через 3 минуты
Размер вектора с интами, будет равен количеству строк в файле, поэтому второй раз можно читать не до конца файла, а в цикле (так проще).
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.04.2013, 16:43
Помогаю со студенческими работами здесь

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

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

Динамические массивы
Дана целочисленная матрица размером N. Найти сумму наименьших элементов ее нечетных строк и...

Динамические массивы.
Дан одномерный массив, состоящий из 30 целых чисел. Создать другой массив, содержащий элементы...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru