Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Tatsiana245
1 / 1 / 0
Регистрация: 03.01.2017
Сообщений: 95
1

Сформировать массив C[N+M], состоящий из элементов массивов А и В, упорядоченный по возрастанию

06.02.2017, 20:07. Просмотров 427. Ответов 14
Метки нет (Все метки)

Ввести в память ПЭВМ два массива целочисленных массива А[N] и B[M].
10<=N<=50, 10<=M<=50. Упорядочить их по возрастанию.
Сформировать массив C[N+M], состоящий из элементов массивов А и В,
упорядоченный по возрастанию.
1. Предусмотреть возможность ввода элементов массивов двумя способами:
с клавиатуры и генерацией случайных чисел.
2. Все операции с массивами выполнить через указатели.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.02.2017, 20:07
Ответы с готовыми решениями:

Сформируйте массив C, состоящий из элементов массивов А и В, упорядоченный по возрастанию
Даны два массива, упорядоченных по возрастанию: А и B. Сформируйте массив C, состоящий из элементов...

Сформируйте массив С, состоящий из элементов массивов А и В, упорядоченных по возрастанию
Задание : Даны два массива, упорядоченных по возрастанию: А и B. Сформируйте массив C, состоящий из...

Образовать из элементов двух массивов упорядоченный массив размерностью m*n
Заданы два одномерных упорядоченных массива размерно-стью m и n соответственно. Образовать из этих...

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

Упорядочить массив С(12), состоящий из элементов А, по возрастанию, найти минимальный по модулю элемент
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;math.h&gt; const int m=3,n=4;...

14
MortalChip
16 / 16 / 12
Регистрация: 20.11.2016
Сообщений: 63
07.02.2017, 06:21 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
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
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
 
#define N 50
#define M 50
#define ERRORCASE -1
 
int main()
{
    unsigned int size_of_A=0,size_of_B=0;
    printf("Введите размер массива А и сразу затем размер массива Б:\n");
    scanf(" %u %u",&size_of_A,&size_of_B);
    if(((size_of_A>0)&&(size_of_A<=N))&&((size_of_B>0)&&(size_of_B<=M)))
    {
        int *array_A=(int*)malloc(sizeof(int)*size_of_A);
        int *array_B=(int*)malloc(sizeof(int)*size_of_B);
    }
    else
    {
        printf("Размер как минимум одного из массивов не меньше 50 и больше 0.\n");
        return 1;
    }
    if((array_A==NULL)||(array_B==NULL))
    {
        printf("Houston we have a problem.\n")
        retunr 1;
    }
    int input_case=ERRORCASE;
    printf("Для заполнения массивов случайнными чиселами нажмите 1, для того чтоб ввести числа самостаятельно 0.\n");
    scanf(" %d",input_case);
    switch(input_case)
    {
    case 1:
    {
        //заполнения массивов случайнными чиселами
    }
    case 0:
    {
        for(int i=0; i<size_of_A; i++)
        {
            scanf(" %d",array_A+i);
        }
        for(int i=0; i<size_of_B; i++)
        {
            scanf(" %d",array_B+i);
        }
    }
    default:
    {
        printf("ERROR\n");
        return 1;
    }
    }
   merge_sort(int *array_A,int size_of_A);
 
 
 
    free(array_A);
    free(array_B);
    return 0;
}
 
 
 
void merge_sort(int *array, int size_of_array)
{
    int *tmp_array = malloc(sizeof(int) * size_of_array);
    internal_msort(array, size_of_array, tmp_array);
    free(tmp_array);
}
 
void internal_msort(int *array,int size_of_array,int *tmp_array)
{
    int left = size_of_array / 2, right = size_of_array – left;
    if (size_of_array < 2)
        return;
    internal_msort(array, left, tmp_array);
    internal_msort(array + left, right, tmp_array);
    merge(array, left, array + left, right, tmp_array);
    memcpy(array, tmp_array, size_of_array * sizeof(int));
}
 
void merge(int *array, int na, int b[], int nb, int *tmp_array)
{
    int ia, ib, ic;
    for(ia = ib = ic = 0; (ia < na) && (ib < nb); ic++)
    {
        if(a[ia] < b[ib])
        {
            c[ic] = a[ia];
            ia++;
        }
        else
        {
            c[ic] = b[ib];
            ib++;
        }
    }
    for(; ia < na; ia++, ic++) c[ic] = a[ia];
    for(; ib < nb; ib++, ic++) c[ic] = b[ib];
}
0
LFC
730 / 535 / 416
Регистрация: 17.09.2015
Сообщений: 1,598
07.02.2017, 13:03 3
Вопрос к коллегам:в моем варианте решения имеется какой-то странный косячок,не могу понять в чем он. А именно: при вызове в первый раз функции Manually(A , N) в строке 43,когда вводимые вручную значения синхронно выводятся в столбик,то выводится на одно значение больше чем указаный размер массива.В тоже время,при втором вызове той же самой функции в строке 44,всё выводится корректно. На конечный результат никакого влияния это не оказывает,код работает корректно, функция printArr(A, N) в строке 46 выводит правильное количество элементов,т.е. лишний элемент игнорирует,конечный результат тоже верный. Но что-то не дает мне покоя,хочу разобраться.
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int* memAll(int);//выделяет память под массив
int entSize (void);//вводит размер массива
void numGen(int* , int);//заполняет массив случайными значениями
void printArr(int* , int);//вывод на экран
void Manually(int* , int);//заполнение массива вручную
void mySort(int* , int);//сортировка выбором по возрастанию
void combine(int* , int* , int* , int, int, int);//объединение двух массивов в третий с соблюдением возрастания
int main()
{
    int N, M, *A, *B, *C, select;
    N = entSize();
    M = entSize();
    A = memAll(N);
    B = memAll(M);
    C = memAll(N + M);
    srand(time(NULL));
    puts("select the method of data input to the array:");
    puts("> Random number generator-press '1'");
    puts("> Manually-press '2'");
    while(1 != scanf("%d", &select) || (select != 1 && select != 2)){
        puts("Incorrect data entry!Try again.");
        while(getchar() != '\n');
    }
    if(select == 1){
        numGen(A, N);
        numGen(B, M);
        puts("Source array 'A'");
        printArr(A, N);
        puts("Source array 'B'");
        printArr(B, M);
    }
    if(select == 2){
        Manually(A , N);
        Manually(B , M);
        puts("Source array 'A'");
        printArr(A, N);
        puts("Source array 'B'");
        printArr(B, M);
    }
    mySort(A, N);
    mySort(B, M);
    puts("Sorted array 'A'");
    printArr(A, N);
    puts("Sorted array 'B'");
    printArr(B, M);
    combine(A, B, C, N, M, N + M);
    puts("Array 'C'");
    printArr(C, N + M);
    return 0;
}
int* memAll(int size)
{
    int* ptr = malloc(size * sizeof*ptr);
    if(!ptr){
        fprintf(stderr, "Memory allocation error!");
        exit(1);
    }
    return ptr;
}
int entSize (void)
{
    int size;
    puts("Enter array size > 9 and < 51:");
    while(1 != scanf("%d", &size) || size < 10 || size > 50){
        puts("Incorrect data entry!Try again.");
        while(getchar() != '\n');
    }
    return size;
}
void numGen(int* ptr, int size)
{
    int *a = ptr, *b = ptr + size;
    while(a <= b)
        *a++ = rand() % 180;
}
void printArr(int* ptr, int size)
{
    int *fin = ptr + size;
    while(ptr < fin)
        printf("%d ", *ptr++);
    putchar('\n');
}
void Manually(int* ptr, int size)
{
    int *fin = ptr + size;
    puts("Enter array elements:");
    while(ptr < fin){
        while(1 != scanf("%d ", ptr)){
            puts("Incorrect data entry!Try again.");
            while(getchar() != '\n');
        }
        ptr++;
    }
    putchar('\n');
}
void mySort(int* p, int size)
{
    int *q, *m, *last = p + size, temp;
    for(q = p + 1; q < last; q++){
        for(m = q; m > p && *(m - 1) > *m; m--){
            temp = *(m - 1);
            *(m - 1) = *m;
            *m = temp;
        }
    }
}
void combine(int* a, int* b, int* c, int sizeA, int sizeB, int sizeC)
{
    int *lastC = c + sizeC, *lastA = a + sizeA, *lastB = b + sizeB;
    while(a < lastA && b < lastB){
        //*a < *b ? *c = *a : *c = *b;
        if(*a < *b)
            *c = *a++;
        else
            *c = *b++;
        c++;
    }
    if(a >= lastA)
        while(c < lastC)
            *c++ = *b++;
    if(b >= lastB)
        while(c < lastC)
            *c++ = *a++;
}
Добавлено через 5 минут
ps только что протестировал еще раз,и лишний элемент из массива А записался в нулевой элемент массива В. в общем,неопределенное поведение
0
MortalChip
16 / 16 / 12
Регистрация: 20.11.2016
Сообщений: 63
07.02.2017, 13:22 4
LFC,
У тебя scanf принимает любые пробелы и табы, стоит поставить пробел перед %d и протестировать ещё раз
Затем можно убрать проверку после scanf

Добавлено через 6 минут
C
1
int *fin = ptr + size;
надо поменять на:
C
1
int *fin = ptr + size-1;
ты выходишь за рамки массива!!!

и
C
1
while(ptr < fin)
надо написать как:
C
1
while(ptr <= fin)
Так как первая ячейка памяти на ptr+0 а не на ptr+1.
1
LFC
730 / 535 / 416
Регистрация: 17.09.2015
Сообщений: 1,598
07.02.2017, 19:56 5
MortalChip,
C
1
2
int *fin = ptr + size-1;
while(ptr <= fin)
это то на то и выходит как было раньше;
C
1
2
int *fin = ptr + size;
while(ptr < fin)
цикл сделает такое же количество итераций,и указатель остановится в той же самой позиции
Я нашел ошибку.Это пробел в scanf после %d в строке 92.
Все,кто будет пользоваться этим кодом,удалите указанный пробел и код будет корректно работать.

Добавлено через 45 минут
и еще вопрос,если строки 114-121
C
1
2
3
4
5
6
7
 while(a < lastA && b < lastB){
        if(*a < *b)
            *c = *a++;
        else
            *c = *b++;
        c++;
    }
пытаюсь сделать через тернарный оператор,то компилятор выдает ошибку:
E:\\main.c|error: lvalue required as left operand of assignment|
C
1
2
while(a < lastA && b < lastB)
    *a < *b ? *c++ = *a++ : *c++ = *b++;
синтаксических ошибок не вижу,по смыслу то же самое что и в варианте с if else,че не нравится этой железяке?)))
0
Tatsiana245
1 / 1 / 0
Регистрация: 03.01.2017
Сообщений: 95
07.02.2017, 20:10  [ТС] 6
int* ptr = malloc(size * sizeof*ptr); строка 57, что за значение malloc?
0
LFC
730 / 535 / 416
Регистрация: 17.09.2015
Сообщений: 1,598
07.02.2017, 20:22 7
Цитата Сообщение от Tatsiana245 Посмотреть сообщение
что за значение malloc?
malloc это стандартная функция языка Си,обеспечивает динамическое выделение памяти под массив
0
Tatsiana245
1 / 1 / 0
Регистрация: 03.01.2017
Сообщений: 95
07.02.2017, 20:34  [ТС] 8
Указывает на ошибки в этой строке (57).
0
MortalChip
16 / 16 / 12
Регистрация: 20.11.2016
Сообщений: 63
08.02.2017, 00:33 9
Tatsiana245,
Ванга не программирует на Си, какую ошибку указывает?
0
LFC
730 / 535 / 416
Регистрация: 17.09.2015
Сообщений: 1,598
08.02.2017, 01:57 10
Tatsiana245, у вас поди VS?
0
MortalChip
16 / 16 / 12
Регистрация: 20.11.2016
Сообщений: 63
08.02.2017, 02:45 11
Цитата Сообщение от LFC Посмотреть сообщение
MortalChip,
C
1
2
int *fin = ptr + size-1;
while(ptr <= fin)
это то на то и выходит как было раньше;
C
1
2
int *fin = ptr + size;
while(ptr < fin)
цикл сделает такое же количество итераций,и указатель остановится в той же самой позиции
Количество итераций не имеет никакого значения сейчас вопрос в другом, пытается ли твоя программа выйти за рамки памяти которую получила от ОС или нет.
ptr + size может указывать на чёрт знает что в памяти, на каждой машине будет что-то свое, у тебя это первая ячейка другого массива в твоей же программе, а у меня может быть место где хранится переменная вебраузера или игры.
шутка
Как мой лектор говорит, одна из заповедей программиста на Си: "Не выходи за пределы памяти, ибо чёрт его знает что будет."

Не выходи за передел памяти которую получил
0
LFC
730 / 535 / 416
Регистрация: 17.09.2015
Сообщений: 1,598
08.02.2017, 03:03 12
MortalChip, так я и не выходил,ибо while(ptr < fin), указатель остановится там же где и в другом случае,т.е. в следующей ячейке после последнего элемента массива.Но цикл уже работать не будет,т.к. не соблюдено условие.
по памяти согласен,это краш.
по тернарному ничего не подскажете?
0
CoderHuligan
813 / 539 / 201
Регистрация: 30.06.2015
Сообщений: 2,997
Записей в блоге: 13
08.02.2017, 11:15 13
Цитата Сообщение от MortalChip Посмотреть сообщение
Не выходи за передел памяти которую получил
До сих пор в DOSе работаем? Ничего, что в современных ОС модель памяти позволят не обращать внимание на выделение памяти для сторонних программ? Устарел ваш препод... Однако, всё равно нужно следить за выделением памяти, так как в противном случае может покрашиться своя собственная...
0
MrGluck
Модератор
Эксперт CЭксперт С++
8113 / 4965 / 1436
Регистрация: 29.11.2010
Сообщений: 13,456
08.02.2017, 13:33 14
Цитата Сообщение от Tatsiana245 Посмотреть сообщение
Указывает на ошибки в этой строке (57).
Распространенные ошибки
0
LFC
730 / 535 / 416
Регистрация: 17.09.2015
Сообщений: 1,598
08.02.2017, 14:49 15
тупанул я с тернарным)))
C
1
2
while(a < lastA && b < lastB)
    *c++ = *a < *b ? *a++ : *b++;
исправленная рабочая версия
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
int* memAll(int);
int entSize (void);
void numGen(int* , int);
void printArr(int* , int);
void Manually(int* , int);
void mySort(int* , int);
void combine(int* , int* , int* , int, int, int);
int main()
{
    int N, M, *A, *B, *C, select;
    A = memAll(N = entSize());
    B = memAll(M = entSize());
    C = memAll(N + M);
    srand(time(NULL));
    puts("select the method of data input to the array:");
    puts("> Random number generator-press '1'");
    puts("> Manually-press '2'");
    while(1 != scanf("%d", &select) || (select != 1 && select != 2)){
        puts("Incorrect data entry!Try again.");
        while(getchar() != '\n');
    }
    if(select == 1){
        numGen(A, N);
        numGen(B, M);
        puts("Source array 'A'");
        printArr(A, N);
        puts("Source array 'B'");
        printArr(B, M);
    }
    if(select == 2){
        Manually(A , N);
        Manually(B , M);
        puts("Source array 'A'");
        printArr(A, N);
        puts("Source array 'B'");
        printArr(B, M);
    }
    mySort(A, N);
    mySort(B, M);
    puts("Sorted array 'A'");
    printArr(A, N);
    puts("Sorted array 'B'");
    printArr(B, M);
    combine(A, B, C, N, M, N + M);
    puts("Array 'C'");
    printArr(C, N + M);
    return 0;
}
int* memAll(int size)
{
    int* ptr = malloc(size * sizeof*ptr);
    if(!ptr){
        fprintf(stderr, "Memory allocation error!");
        exit(1);
    }
    return ptr;
}
int entSize (void)
{
    int size;
    puts("Enter array size > 9 and < 51:");
    while(1 != scanf("%d", &size) || size < 10 || size > 50){
        puts("Incorrect data entry!Try again.");
        while(getchar() != '\n');
    }
    return size;
}
void numGen(int* ptr, int size)
{
    int *b = ptr + size;
    while(ptr < b)
        *ptr++ = rand() % 180;
}
void printArr(int* ptr, int size)
{
    int *fin = ptr + size;
    while(ptr < fin)
        printf("%d ", *ptr++);
    putchar('\n');
}
void Manually(int* ptr, int size)
{
    int *fin = ptr + size;
    puts("Enter array elements:");
    while(ptr < fin){
        while(1 != scanf("%d", ptr)){
            puts("Incorrect data entry!Try again.");
            while(getchar() != '\n');
        }
        ptr++;
    }
    putchar('\n');
}
void mySort(int* p, int size)
{
    int *q, *m, *last = p + size, temp;
    for(q = p + 1; q < last; q++){
        for(m = q; m > p && *(m - 1) > *m; m--){
            temp = *(m - 1);
            *(m - 1) = *m;
            *m = temp;
        }
    }
}
void combine(int* a, int* b, int* c, int sizeA, int sizeB, int sizeC)
{
    int *lastC = c + sizeC, *lastA = a + sizeA, *lastB = b + sizeB;
    while(a < lastA && b < lastB)
        *c++ = *a < *b ? *a++ : *b++;
    if(a >= lastA)
        while(c < lastC)
            *c++ = *b++;
    if(b >= lastB)
        while(c < lastC)
            *c++ = *a++;
}
0
08.02.2017, 14:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.02.2017, 14:49

Сформируйте массив C[n+m], состоящий из элементов массивов А и В, упорядоченный по возрастанию
Хелп плиз) Даны два массива, упорядоченных по возрастанию: А и B. Сформируйте массив C,...

Массив: Сформируйте массив C[n+m], состоящий из элементов массивов А и В, упорядоченный по возрастанию.
написать программы! Вот задания! Я болел и просто не успею все зделать! 1)Дан массив целых чисел....

Сформировать массив, упорядоченный по возрастанию, из двух исходных массивов
Два одномерных массива, введенных с клавиатуры и упорядоченных по возрастанию вставить в третий...


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

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

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