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

Написать программу для объединения массивов - C++

Восстановить пароль Регистрация
 
sonik_20014
0 / 0 / 0
Регистрация: 08.01.2014
Сообщений: 9
08.01.2014, 00:38     Написать программу для объединения массивов #1
Написать программу для объединения массивов, n - количество массивов, подлежащих объединению, а - массив указателей на массивы, подлежащих объединению; массив size - содержит размер массивов, подлежащих объединению. Память под массивы выделить динамично; totar - результирующий массив.

И это все нужно сделать на языке С + + без malloc (), calloc () ... и т.д.
Буду очень благодарен!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
08.01.2014, 04:58     Написать программу для объединения массивов #2
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
54
55
#include <iostream>
#include <ctime>
using namespace std;
 
int main()
{
    setlocale(LC_ALL,"Russian");
    
    srand(time(0));
    
    int  n; // количество массивов, подлежащих объединению
    cout << "Введиете количество массивов, подлежащих объединению: ";
    (cin >> n).get();
    int* size = new int[n]; // размеры массивов, подлежащих объединению 
    int** a = new int*[n]; // массив указателей на массивы, подлежащих объединению
    int* torar; // результирующий массив
 
    for (int i = 0; i < n; ++i)   // заполнение массива размеров случайными значениями от 1 до 10
        size[i] = rand() % 10 + 1;
 
    for (int i = 0; i < n; ++i) // заполнение массивов случайными значениями от 0 до 20
    {
        a[i] = new int[size[i]];
        for (int j = 0; j < size[i]; ++j)
            a[i][j] = rand() % 21;
    }
    
    cout << "Массивы:" << endl;
    for (int i = 0; i < n; ++i) // вывод созданных массивов
    {
        for (int j = 0; j < size[i]; ++j)
            cout << a[i][j] << ' ';
        cout << endl;
    }
    cout << endl;
    
    int size_torar = 0;
    for (int i = 0; i < n; ++i) // вычисление размера результирующего массива
        size_torar += size[i];
 
    torar = new int[size_torar];
    int i = 0;
    for (int j = 0; j < n; ++j) // объединение массивов
        for (int k = 0; k < size[j]; ++k)
            torar[i++] = a[j][k];
           
    cout << "Результирующий массив:" << endl;
    for (int i = 0; i < size_torar; ++i) // вывод результирующего массива
        cout << torar[i] << ' ';
    cout << endl;
 
    cout << "Для выхода нажмите любую клавишу";
    cin.get();
    return 0;
}
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4922 / 2665 / 243
Регистрация: 29.11.2010
Сообщений: 7,420
08.01.2014, 06:05     Написать программу для объединения массивов #3
Только ГСЧ и динам. массивы
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
54
55
56
57
#include <iostream>
#include <random>
 
int main()
{
    const int M = 10;  // максимальное количество массивов для объединения
    const int N = 20;  // верхняя граница диапазона размера массива
    const int K = 100; // верхняя граница диапазона СЧ
    std::uniform_int_distribution<int> dist1(1, M); // количество массивов
    std::uniform_int_distribution<int> dist2(1, N); // размера массива
    std::uniform_int_distribution<int> dist3(0, K); // СЧ - элементы массива
    std::mt19937 gen {std::random_device()() };
    int **A;    // массив массивов для объединения
    int *B;     // результирующий массив
    int *sizes; // массив размеров массивов
 
    // вычисляем количество массивов и выделяем память под них
    const int amount = dist1(gen);
    A = new int*[amount];
    sizes = new int[amount];
 
    // задаем случайный размер массивов, заполняем их, подсчитываем общий размер
    int sizeB = 0;
    for (int i=0; i < amount; i++)
    {
        const int sizeArr = dist2(gen);
        A[i] = new int[sizeArr];
        std::cout << "A[" << i << "]: ";
        for (int j=0; j < sizeArr; j++)
        {
            A[i][j] = dist3(gen);
            std::cout << A[i][j] << " ";
        }
        std::cout << std::endl;
        sizes[i] = sizeArr;
        sizeB += sizeArr;
    }
 
    // выделяем память под результир. массив, копируем в него элементы массивов
    B = new int[sizeB];
    std::cout << "\nB(" << sizeB << "): ";
    int index = 0;
    for (int i=0; i < amount; i++)
    {
        for (int j=0; j < sizes[i]; j++)
        {
            B[index] = A[i][j];
            std::cout << B[index++] << " ";
        }
        delete[] A[i]; // освобождаем память, выделенную под массив A[i]
    }
 
    // освобождаем память под массив A, B и sizes
    delete[] A;
    delete[] B;
    delete[] sizes;
}
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
08.01.2014, 11:59     Написать программу для объединения массивов #4
MrGluck,
Кликните здесь для просмотра всего текста
помоги добить до конца так сказать:
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
#include <iostream>
#include <algorithm>
 
template<typename T, int N>
T* join(T **&arrays, int sizes[N])
{
    int capasity = std::accumulate(sizes, sizes + N, 0);
    T *res = new T[capasity];
 
    for (int i = 0, pos = 0; i < N;)
    {
        std::copy(arrays[i], arrays[i] + sizes[i], res + pos);
        pos += sizes[i++];
    }
 
    return res;
}
 
int main()
{
    int **arrays = new int*[3]
    {
        new int[2]{1,2},
        new int[1]{3},
        new int[3]{4,5,6}
    },
    sizes[] = {2,1,3},
    *res = join(arrays, sizes);
}
Bash
1
2
3
4
5
6
7
8
9
10
11
D:\Projects\c++\help\help\main.cpp:28:30: error: no matching function for call to 'join(int**&, int [3])'
     *res = join(arrays, sizes);
                              ^
D:\Projects\c++\help\help\main.cpp:28:30: note: candidate is:
D:\Projects\c++\help\help\main.cpp:5:4: note: template<class T, int N> T* join(T**&, int*)
 T* join(T **&arrays, int sizes[N])
    ^
D:\Projects\c++\help\help\main.cpp:5:4: note:   template argument deduction/substitution failed:
D:\Projects\c++\help\help\main.cpp:28:30: note:   couldn't deduce template parameter 'N'
     *res = join(arrays, sizes);
                              ^
Не могу понять как функцию template<class T, int N> T* join(T**&, int*) привести к виду join(int**&, int [3]), разница во втором параметре, причем я явно указываю массив а не указатель на инт, но это все равно не помогает (я эту тему не очень шарю, буду рад полезным ссылкам)

Добавлено через 4 минуты
Да, шаблон использовался для двух вещей:
- собственно шаблон
- определение размера массива

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

Не догнал почему, но если передать массив по ссылке, то шаблон успешно определяет его размер:
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
#include <iostream>
#include <algorithm>
#include <iterator>
 
template<typename T, size_t N>
T* join(T **&arrays, const int (&sizes)[N])
{
    int capasity = std::accumulate(sizes, sizes + N, 0);
    T *res = new T[capasity];
 
    for (int i = 0, pos = 0; i < N;)
    {
        std::copy(arrays[i], arrays[i] + sizes[i], res + pos);
        pos += sizes[i++];
    }
 
    return res;
}
 
int main()
{
    int **arrays = new int*[3]
    {
        new int[2]{1,2},
        new int[1]{3},
        new int[3]{4,5,6}
    },
    sizes[] = {2,1,3},
    *res = join(arrays, sizes);
    std::copy(res, res + 6, std::ostream_iterator<int>(std::cout, " "));
}
Bash
1
1 2 3 4 5 6
sonik_20014
0 / 0 / 0
Регистрация: 08.01.2014
Сообщений: 9
08.01.2014, 16:50  [ТС]     Написать программу для объединения массивов #5
Cпасибо ребята очень помогли))
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4922 / 2665 / 243
Регистрация: 29.11.2010
Сообщений: 7,420
08.01.2014, 18:13     Написать программу для объединения массивов #6
outoftime, могу лишь предположить.
Когда массив sizes передается в функцию, то он имеет вид int*. Если мы сначала берем ссылку от этого int *, то получаем int, далее в N идет количество этих int, получаем массив int[N].
Если использовать первый вариант, то мне кажется, компилятор просто не может определить количество - N т.к. просто передает массив как один объект.
Все это построено лишь на домыслах, я с такими извращениями обычно не работаю)
Хоть и интересно.
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
08.01.2014, 20:58     Написать программу для объединения массивов #7
MrGluck, Я хотел использовать N еще для определения первого измерения массива arrays, что-бы компилятор не пропускал заранее различные размерности. Пожалуй подниму отдельный топик с этим вопросом.

Добавлено через 1 час 34 минуты
MrGluck, sonik_20014, вот что у меня получилось в результате:
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
#include <iostream>
#include <algorithm>
#include <iterator>
 
template<typename T, std::size_t N>
T* join(T *(&arrays)[N], const int (&sizes)[N])
{
    int capasity = std::accumulate(sizes, sizes + N, 0);
    T *res = new T[capasity];
 
    for (int i = 0, pos = 0; i < N;)
    {
        std::copy(arrays[i], arrays[i] + sizes[i], res + pos);
        pos += sizes[i++];
    }
 
    return res;
}
 
int main()
{
    int* arrays[] =
    {
        new int[2]{1,2},
        new int[1]{3},
        new int[3]{4,5,6}
    },
    sizes[] = {2,1,3},
    *res = join(arrays, sizes);
    std::copy(res, res + 6, std::ostream_iterator<int>(std::cout, " "));
}
В данном случае компилятор не пропустит код в котором размерности массивов не совпадают.
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4922 / 2665 / 243
Регистрация: 29.11.2010
Сообщений: 7,420
08.01.2014, 22:35     Написать программу для объединения массивов #8
outoftime, зачем так извращаться если есть std::array?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2014, 01:14     Написать программу для объединения массивов
Еще ссылки по теме:

Написать программу для вычисления СЛАУ методом простой итерации с использованием динамических массивов C++
Написать программу. Сортировка двумерных массивов C++
Написать программу , которая для двух одномерных массивов целых чисел выводит только те элементы C++

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

Или воспользуйтесь поиском по форуму:
outoftime
║XLR8║
 Аватар для outoftime
505 / 427 / 33
Регистрация: 25.07.2009
Сообщений: 2,297
09.01.2014, 01:14     Написать программу для объединения массивов #9
MrGluck, потому что топик такой - изобретение велосипеда на костылях.
Yandex
Объявления
09.01.2014, 01:14     Написать программу для объединения массивов
Ответ Создать тему
Опции темы

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