Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
Setb
136 / 2 / 6
Регистрация: 04.07.2015
Сообщений: 122
1

Создать третий массив на основе двух заданных массивов по условию

10.09.2015, 10:11. Просмотров 1296. Ответов 20
Метки нет (Все метки)

Создать 2 динамических массива различной размерности, указанной пользователем. Далее создать третий массив, в который поместить элементы первого и второго массива в порядке - сначала отрицательные, потом нули, потом положительные числа. Сортировку нельзя использовать. Должна быть функция, которая берет значение из первого массива, потом из второго , потом опять из первого и т.п. Выделить память для первых двух массивов с помощью malloc, для третьего массива расширить память с помощью realloc
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.09.2015, 10:11
Ответы с готовыми решениями:

Создать третий массив, в котором нужно собрать общие элементы двух массивов
Даны два массива: A и B. Необходимо создать третий массив, в котором нужно собрать общие элементы...

Создать третий массив, в котором нужно собрать общие элементы двух массивов
Элементы, которые есть только в массиве А или только в массиве В, заполнить ими массив C. Всё...

Создать третий массив такого же размера каждый элемент которого равен сумме соответствующих элементов двух первых массивов
Даны два двумерных массива одинаковых размеров. а) Создать третий массив такого же размера каждый...

Сформировать третий массив на основе данных исходных массивов, который также упорядочен
В общем, задание следующее: 1. Даны два целочисленных массива 2. Реализуйте алгоритмы сортировок...

Из двух упорядоченных массивов составить третий упорядоченный массив
#include <iostream> #include <stdlib.h> #include <stdio.h> using namespace std; //...

20
MansMI
1452 / 1161 / 550
Регистрация: 08.01.2012
Сообщений: 4,509
10.09.2015, 12:50 2
что должно получиться от:
-7 -5 -1 0 3
8 0 4 -9 2
?
0
Setb
136 / 2 / 6
Регистрация: 04.07.2015
Сообщений: 122
10.09.2015, 13:18  [ТС] 3
Как я понимаю -7. -9. -5. -1. 0. 0. 3. 2. 8

Добавлено через 43 секунды
Поочередно берет значения из массивов.
0
IrineK
Заблокирован
10.09.2015, 13:56 4
Оптимальней предположить
-7, -5, -1, -9, 0, 0, 3, 8, 4, 2
0
10.09.2015, 13:56
Setb
136 / 2 / 6
Регистрация: 04.07.2015
Сообщений: 122
10.09.2015, 14:44  [ТС] 5
Возможно, но сортировку использовать нельзя. Если только найти минимальное значение в массиве и потом от него плясать с двумя массивамии

Добавлено через 46 минут
А реально не используя сортировку к такому виду привести третий массив? -7, -5, -1, -9, 0, 0, 3, 8, 4, 2
0
MansMI
1452 / 1161 / 550
Регистрация: 08.01.2012
Сообщений: 4,509
10.09.2015, 15:13 6
массивы А и В, массив А realloc'нуть на А+В(тогда под конец работы А попортится), или на 2А+В?
0
Setb
136 / 2 / 6
Регистрация: 04.07.2015
Сообщений: 122
10.09.2015, 15:22  [ТС] 7
Пускай портиться. Тут же необходим именно результирующий третий массив, первые два вообще можно удалять
0
MansMI
1452 / 1161 / 550
Регистрация: 08.01.2012
Сообщений: 4,509
10.09.2015, 15:30 8
зато 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
void prn_arr(int* arr,int sz)
{
    int i;
    printf("Массив: ");
    for(i=0; i<sz; i++) printf("%d ",arr[i]);
    printf("\n");
}
int element(int* arr, int *n, int sz, int i, int *e)
{ 
    for(; *n<sz; ++*n)
        if(!i && arr[*n]<0 || i==1 && !arr[*n] || i==2 && arr[*n]>0)
        {
            *e=arr[(*n)++];
            return 1;
        }
    return 0; 
}
void main(int argc,char* argv[])
{
    int *arr[2],sz[2];
    int i,j,n[2],e,all,*p;
 
    setlocale(LC_ALL,"Rus");
    //srand((unsigned)time(0));
    for(i=0; i<2; i++)
    {
        printf("Размер %d-го массива:",i+1);
        scanf("%d",sz+i);
        arr[i]=malloc(sz[i]*sizeof(int));
        for(j=0; j<sz[i]; j++) 
        {
            //arr[i][j]=(rand()%11-5)*(i?10:1);
            printf("%d-й элемент:",j+1);
            scanf("%d",&arr[i][j]);
        }
    }
    for(i=0; i<2; i++) prn_arr(arr[i],sz[i]);
    all=*sz+sz[1];
    *arr=realloc(*arr,(*sz+all)*sizeof(int));
    p=*arr+*sz;
    for(i=0; i<3; i++)
    {
        *n=n[1]=0;
        while(*n<*sz || n[1]<sz[1])
        for(j=0; j<2; j++)
        if(n[j]<sz[j] && element(arr[j],n+j,sz[j],i,&e)) *p++=e;
    }
    prn_arr(*arr+*sz,all);
    for(i=0; i<2; i++) free(arr[i]);
    system("pause");
}
0
Setb
136 / 2 / 6
Регистрация: 04.07.2015
Сообщений: 122
10.09.2015, 15:56  [ТС] 9
C
1
2
3
4
5
6
7
8
9
10
int element(int* arr, int *n, int sz, int i, int *e)
{ 
    for(; *n<sz; ++*n)
        if(!i && arr[*n]<0 || i==1 && !arr[*n] || i==2 && arr[*n]>0)
        {
            *e=arr[(*n)++];
            return 1;
        }
    return 0; 
}
А можете немного пояснить этот код?

Добавлено через 19 минут
int *arr[2],sz[2]; - и почему тут создаются массивы из 2-ух элементов
0
MansMI
1452 / 1161 / 550
Регистрация: 08.01.2012
Сообщений: 4,509
10.09.2015, 16:12 10
а массивов сколько?
0
Setb
136 / 2 / 6
Регистрация: 04.07.2015
Сообщений: 122
10.09.2015, 16:15  [ТС] 11
Массивов 2, но элементов может быть сколько угодно, а тут указано что из 2ух элементов состояит массив

Добавлено через 50 секунд
у меня вообще с этими указателями получилось запухнуть
0
smartpointer
70 / 64 / 39
Регистрация: 17.02.2014
Сообщений: 265
10.09.2015, 16:24 12
Использование бинарного дерева тоже будет считаться за сортировку ? А то может получится, что в 1-ом массиве будут 2-3 отрицательных а во втором 15 отрицательных.И тогда...
Цитата Сообщение от Setb Посмотреть сообщение
Далее создать третий массив, в который поместить элементы первого и второго массива в порядке - сначала отрицательные, потом нули, потом положительные числа.
Получится противоречие этому условию.
0
Setb
136 / 2 / 6
Регистрация: 04.07.2015
Сообщений: 122
10.09.2015, 20:02  [ТС] 13
Мы не проходили еще бинарное дерево, поэтому нельзя использовать

Добавлено через 3 часа 19 минут
Условие упростилось. Надо сначала все отрицательные из первого массива загнать в третий массив, потом все отрицательные из второго массива туда. Потом аналогично нули и положительные. Потому и сортировка отсутствует
0
IrineK
Заблокирован
11.09.2015, 04:31 14
Цитата Сообщение от Setb Посмотреть сообщение
Надо сначала все отрицательные из первого массива загнать в третий массив, потом все отрицательные из второго массива туда. Потом аналогично нули и положительные.
Ну, и я про то же (пост 4).
0
Setb
136 / 2 / 6
Регистрация: 04.07.2015
Сообщений: 122
11.09.2015, 09:28  [ТС] 15
и как это реализовать?
0
MansMI
1452 / 1161 / 550
Регистрация: 08.01.2012
Сообщений: 4,509
11.09.2015, 09:47 16
44-ю строку убрать, в 46-й if заменить на while
0
CoderHuligan
814 / 545 / 201
Регистрация: 30.06.2015
Сообщений: 3,015
Записей в блоге: 14
11.09.2015, 12:21 17
Цитата Сообщение от Setb Посмотреть сообщение
для третьего массива расширить память с помощью realloc
Это так преподу нужно или это самостоятельная придумка?
0
smartpointer
70 / 64 / 39
Регистрация: 17.02.2014
Сообщений: 265
11.09.2015, 12:46 18
Цитата Сообщение от Setb Посмотреть сообщение
и как это реализовать?
Сортировкой - пузырьком например, у вас в конечном итоге так и получится, если из каждого массива брать по одному самому наименьшему элементу вам придется прогонять каждый такой элемент в конец массива и смещать шаг на -1 элемент, чтобы исключить его в дальнейшем поиске других элементов - поскольку физически мы не можем удалить из массива ничего - это не связной список.
0
IrineK
Заблокирован
11.09.2015, 14:04 19
Цитата Сообщение от CoderHuligan Посмотреть сообщение
Это так преподу нужно или это самостоятельная придумка?
Угу,
исходя из здравого соображения
N3 = N1+N2
realloc здесь весьма нездрав )
0
Setb
136 / 2 / 6
Регистрация: 04.07.2015
Сообщений: 122
12.09.2015, 14:32  [ТС] 20
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "rus");
    srand(time(NULL));
 
        int *ptr1, x;
        printf("Введите размер первого массива:\n");
        scanf("%d", &x);
        ptr1 = (int*)malloc(x*sizeof(int));//создаем первый массив
        if (ptr1 == NULL)
        {
            printf("Память не выделена!\n");//если память не веделилась-сообщение
            return 0;
        }
 
        printf("Первый массив:\n");
        for (int i = 0; i < x; i++)//вывод массива
        {
            ptr1[i] = rand() % 20 - 10;
            printf("%d ", ptr1[i]);
        }
        printf("\n");
 
        int *ptr2, y;
        printf("Введите размер второго массива:\n");
        scanf("%d", &y);
 
        ptr2 = (int*)malloc(y*sizeof(int));//создаем второй массив
        if (ptr2 == NULL)
        {
            printf("Память не выделена!\n");//если память не веделилась-сообщение
            return 0;
        }
        printf("Второй массив:\n");
        for (int i = 0; i < y; i++)//вывод массива
        {
            ptr2[i] = rand() % 20 - 10;
            printf("%d ", ptr2[i]);
        }
        printf("\n");
 
        int new_size = x + y;//новый размер массива, сумма элементов первого и второго массива
 
        int *ptr3 = (int*)malloc(new_size*sizeof(int));//создание третьего массива
 
        int j = 0;
        for (int i = 0; i < x; i++)
        {
            if (ptr1[i] < 0)//если элементы первого массива меньше нуля, то записать их в третий массив
            {
                ptr3[j] = ptr1[i];
                j++;
            }
        }
        for (int i = 0; i < y; i++)
        {
            if (ptr2[i] < 0)//если элементы второго массива меньше нуля, то записать их в третий массив
            {
                ptr3[j] = ptr2[i];
                j++;
            }
        }
        for (int i = 0; i < x; i++)
        {
            if (ptr1[i] == 0)//если элементы первого массива равны нулю, то записать их в третий массив
            {
                ptr3[j] = ptr1[i];
                j++;
            }
        }
        for (int i = 0; i < y; i++)
        {
            if (ptr2[i] == 0)//если элементы второго массива равны нулю, то записать их в третий массив
            {
                ptr3[j] = ptr2[i];
                j++;
            }
        }
        for (int i = 0; i < x; i++)
        {
            if (ptr1[i] > 0)//если элементы первого массива больше нуля, то записать их в третий массив
            {
                ptr3[j] = ptr1[i];
                j++;
            }
        }
        for (int i = 0; i < y; i++)
        {
            if (ptr2[i] > 0)//если элементы второго массива больше нуля, то записать их в третий массив
            {
                ptr3[j] = ptr2[i];
                j++;
            }
        }
        printf("Результирующий массив:\n");
        for (int i = 0; i < x + y; i++)
        {
            printf("%d ", ptr3[i]);
        }
        printf("\n");
 
        return 0;
    }
Добавлено через 16 секунд
Вот как-то так)
0
12.09.2015, 14:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2015, 14:32

Создать третий массив из индексов повторяющихся элементов исходных массивов
Привет всем! Помогите пожалуйста, уже все перепробовал, ни как не получается сделать прогу. Задать...

Создать третий массив, в котором нужно собрать элементы двух заданных массивов
Даны два массива : А и B. Необходимо создать третий массив, в котором нужно собрать: Элементы...

Сформировать третий массив на основе двух заданных
Составьте блок-схемы алгоритмы и написать программу на Qbasic. Даны два массив:/1(5) и B{5)....


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

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

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