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

Сформировать массив C, который будет состоять из чисел, которые одновременно входят как в массив A, так и в массив B

26.10.2017, 14:29. Просмотров 407. Ответов 2
Метки нет (Все метки)

Есть задание :На основе исходных массивов A[n] и B[m] (n и m – рабочие размеры массивов) сформировать массив C, который будет состоять из чисел, которые одновременно входят как в массив A, так и в массив B. Упорядочить массив С по возрастанию, используя метод выбора. Вывести элементы массива С на экран.
Массивы A, B и C являются целочисленными. Значения m и n, а также значения элементов массива 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
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
 
 
int _tmain(int argc, _TCHAR * argv[])
{
    int *A, *B, *C, i,j,m,n,k=0,imin,min;
    printf("Input n=");
    scanf_s("%d",&n);
    printf("Input m=");
    scanf_s("%d",&m);
    A=(int*)malloc(n*sizeof(int)); /*При вызове функции malloc() выполняется расчет необходимой области памяти для хранения n-кол-ства элементов типа int. Для этого используется функция sizeof(), которая возвращает число байт, необходимых для хранения одного элемента типа int. Затем ее значение умножается на n-кол-ства элементов типа int и в результате получается объем для n-кол-ства элементов типа int элементов типа int.*/
    B=(int*)malloc(m*sizeof(int));  /*При вызове функции malloc() выполняется расчет необходимой области памяти для хранения n-кол-ства элементов типа int. Для этого используется функция sizeof(), которая возвращает число байт, необходимых для хранения одного элемента типа int. Затем ее значение умножается на n-кол-ства элементов типа int и в результате получается объем для n-кол-ства элементов типа int элементов типа int.*/
    if (n>=m) C=(int*)malloc(n*sizeof(int)); /*Находим какой массив больше А или В и генерируем массив С такойже по величине */
    else C=(int*)malloc(m*sizeof(int)); /*Находим какой массив больше А или В и генерируем массив С такойже по величине*/
    if(A==NULL || B==NULL || C==NULL) { /*В случаях, когда по каким-либо причинам не удается выделить указанный объем памяти, функция malloc() возвращает значение NULL.Если функция malloc() возвратила указатель на выделенную область памяти, т.е. не равный NULL, то выполняется цикл, где записываются значения для каждого элемента.*/
        printf("Memory allocation error.");
        return 1;
        }
    for(i=0; i<n; i++) {  /*Ета функция предназначена для ввода елементов массива А*/
        printf("A[%d]=",i);
        scanf_s("%d",&*(A+i));
        }
    for(j=0; j<m; j++) {  /*Ета функция предназначена для ввода елементов массива В*/
        printf("B[%d]=",j);
        scanf_s("%d",&*(B+j));
        }
    for(i=0; i<n; i++) /* цыкл for ,с помощю которого мы берем 0 елемент, 1 елемент...и т.д. массива А которые в дальнейшем будут сравниваться с елементами массива В*/
        for(j=0; j<m; j++) { /*цыкл for ,с помощю которого мы берем 0 елемент, 1 елемент...и т.д. массива B*/
            if (*(A+i)==*(B+j)) {   /*если массив А с 0 елементом равный массиву В с 0 елементом то цыкл выполняется*/         
                *(C+k)=*(A+i);      /*в таком случае ето значение присваиваеться массиву С ,так же с 0 елементом*/
                printf("C[%d]=%d; ",k,*(C+k));
                k++;
                }
        }
        /*цыкл for сортировки*/
    for(i=0; i<k; i++) { если 0 елемент массива С меньше
        min=*(C+i); imin=i;
        for(j=i+1; j<k; j++)
            if (*(C+j)<min) {
                min=*(C+j); imin=j; 
                }
        *(C+imin)=*(C+i);
        *(C+i)=min;
        }
    printf("\n");
    for(i=0; i<k; i++)
        printf("C[%d]=%d; ",i,*(C+i)); 
    printf("\n");
    free(A);
    free(B);
    free(C);
    return 0;
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2017, 14:29
Ответы с готовыми решениями:

Сформировать массив, который будет состоять из чисел, входящих как в массив A, так и в массив B
Задание: На основе исходных массивов A и B (n и m – рабочие размеры массивов) сформировать массив...

Построить массив d из элементов, которые входят как в массив a так и в массив b
Дан массив a и b состоящий из n элементов. Построить массив d из элементов, которые входят как в...

Заполнить третий массив теми буквами, которые входят и в первый и во второй массив
Заполнить двумерный массив размером 20 и 30 элементов случайным образом буквами латинского...

Получить новый массив, который будет содержать те элементы, которые входят в исходный массив более одного раза
2) Дан одномерный массив, который содержит не более 60 английских букв. Получить новый массив,...

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

2
Геомеханик
806 / 609 / 940
Регистрация: 26.06.2015
Сообщений: 1,409
27.10.2017, 08:28 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
103
#include <stdio.h>
#include <malloc.h>
#include <stdint.h>
void  ssort(int* a, int* b);
void* intersect(const void* arr1, size_t num1, const void* arr2, size_t num2, 
                size_t size, int (*cmp)(const void*, const void*), void* dst);
 
static int cmp(const void* a, const void* b){
    return *(int*)a - *(int*)b;
}
 
int main(void){
    int* A, *B, *C, *p, *e;
    int  i, n, m;
 
    printf("Enter size: ");
    scanf("%d", &n);
 
    if((A = (int*)malloc((size_t)n * sizeof(int))) == NULL)
        return 0;
    for(i = 0; i < n; ++i)
        scanf("%d", &A[i]);
 
    printf("Enter size: ");
    scanf("%d", &m);
 
    if((B = (int*)malloc((size_t)m * sizeof(int))) == NULL)
        return 0;
    for(i = 0; i < m; ++i)
        scanf("%d", &B[i]);
 
    if((C = (int*)malloc((size_t)(n + m) * sizeof(int))) == NULL)
        return 0;
 
    ssort(A, A + n);
    ssort(B, B + m);
 
    e = (int*)intersect(A, n, B, m, sizeof(int), &cmp, C);
    for(p = C; p != e; ++p)
        printf("%d ", *p);
 
    free(A);
    free(B);
    free(C);
    fflush(stdin);
    getchar();
    return 0;
}
 
//выборочная сортировка
void ssort(int* a, int* b){
    int* i, *p, t;
    for(; a != b; ++a){
        p = a;
        for(i = p + 1; i != b; ++i){
            if(*i < *p)
                p = i;
        }
 
        if(a != p){
            t  = *p;
            *p = *a;
            *a = t;
        }
    }
}
 
//пересечение
void* intersect(const void* arr1, size_t num1, const void* arr2, size_t num2, 
                size_t size, int (*cmp)(const void*, const void*), void* dst){
    const int8_t* p1, *p2, *e1, *e2;
    int8_t* p3, *e3;
    int     ret;
 
    p1 = (const int8_t*)arr1;
    e1 = p1 + (num1 * size);
 
    p2 = (const int8_t*)arr2;
    e2 = p2 + (num2 * size);
 
    p3 = (int8_t*)dst;
    while((p1 != e1) && (p2 != e2)){
        ret = (*cmp)(p1, p2);
        if(ret < 0)
            p1 += size;
        else if(ret > 0)
            p2 += size;
        else {
 
            if(size == sizeof(size_t)){
                *(size_t*)p3 = *(size_t*)p1;
                p3 += size;
                p1 += size;
            } else {
                e3 = p3 + size;
                while(p3 != e3)
                    *p3++ = *p1++;
            }
            p2 += size;
        }
    }
    return p3;
}
1
4yd0
0 / 0 / 1
Регистрация: 25.10.2017
Сообщений: 10
27.10.2017, 21:55  [ТС] 3
Спасибо огромное ,но ета програма выводит только ОДИНАКОВЫЕ ЕЛЕМЕНТЫ, т.е. если я введу кол-во елементов массив А = 2(например А[0]=1;А[1]=2) , и кол-во елементов массива B =4 (например В[0]=1, В[1]=2; B[2]=3; B=4 То вывод будет таким: 1 2 ( тоесть програма вывела только одинаковые елементы)
Проблема: мне нужно что бы она выводила ВСЕ елементы + их сортировку (методом выбору).

Добавлено через 3 минуты
я немного переделал програму, но проблема осталась : програма почему-то выводит не то что мне нужно..
Например (пример роботы програмы):
Input [n] elements of massive A = 2
A[0]=1
A[1]=2
Input [m] elements of massive B = 3
B[0]=4
B[1]=3
B[2]=7
C[0]=4; C[1]=1; C[2]=3; C[3]=1; C[4]=7; C[5]=1; C[6]=0; C[7]=1; C[8]=4; C[9]=2; C[10]=3; C[11]=2; C[12]=7; C[13]=2; C[14]=0; C[15]=2; C[16]=4; C[17]=-42147291; C[18]=3; C[19]=-42147291; C[20]=7; C[21]=-42147291; C[22]=0; C[23]=-42147291; C[24]=4; C[25]=-42147291; C[26]=3; C[27]=-42147291; C[28]=7; C[29]=-42147291; C[30]=0; C[31]=-42147291; и тут выдаеться сбой програмы..
Буду признателен если поможите розобраться.



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
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
 
int ssort(int* C, int* z);
 
int main(void)
{
    int *A, *B, *C, i,j,m,n,k=0, z; /*иницилизация переменных*/
    printf("Input [n] elements of massive A = ");
    scanf("%d",&n); /*скан n-кол-ства елементов массива А -  тоесть его ввод*/
    if((A = (int*)malloc((size_t)n * sizeof(int))) == NULL){/*При вызове функции malloc() выполняется расчет необходимой области памяти для хранения n-кол-ства элементов типа int. Для этого используется функция sizeof(), которая возвращает число байт, необходимых для хранения одного элемента типа int. Затем ее значение умножается на n-кол-ства элементов типа int и в результате получается объем для n-кол-ства элементов типа int элементов типа int.*/
        printf("Memory allocation error.");
        return 0; 
    }
    for(i=0; i<n; i++) {  /*Ета функция предназначена для ввода елементов массива А*/
        printf("A[%d]=",i);
        scanf("%d",&*(A+i));
        }
    printf("Input [m] elements of massive B = ");
    scanf("%d",&m);  /*скан m-кол-ства елементов массива В - тоесть его ввод*/
    if((B = (int*)malloc((size_t)m * sizeof(int))) == NULL){/*В случаях, когда по каким-либо причинам не удается выделить указанный объем памяти, функция malloc() возвращает значение NULL.Если функция malloc() возвратила указатель на выделенную область памяти, т.е. не равный NULL, то выполняется цикл, где записываются значения для каждого элемента.*/
        printf("Memory allocation error.");
        return 0; 
    }
    for(j=0; j<m; j++)  /*Ета функция предназначена для ввода елементов массива В*/
    {
        printf("B[%d]=",j);
        scanf("%d",&*(B+j));
    }
 
    z=n+m; /*чтобы легче было нам работать с массивом С мы его величину запишем одной перемонно вместо 2*/
    if((C = (int*)malloc((size_t)z* sizeof(int))) == NULL){
        printf("Memory allocation error.");
        return 0;
    }
    for(i=0; i<z-1; i++) /* цыкл for ,с помощю которого мы берем 0 елемент,  массива А */
    {
        for(j=0; j<z-1; j++)  /*цыкл for ,с помощю которого мы берем 0 елемент массива B*/
        {    
                *(C+k)=*(B+j);    /*присваиваем значение 0 елемента массива А , 0 елементу массива С*/         
                printf("C[%d]=%d; ",k,*(C+k));
                k++; /*етим действием мы увеличиваем значение елемента массива С на 1*/ 
                *(C+k)=*(A+i);      /*присваиваем значение 0 елемента массива А , уже 1 !!! елементу массива С*/
                printf("C[%d]=%d; ",k,*(C+k));
                k++; /* опятьже етим действием мы увеличиваем значение елемента массива С на 1*/ 
        }
    } /*после оканчания внутришнего цыкла for проделываем опятьже тоже самое только увеличиваеться значение елементов массива А и В*/
        
        /*вызов цыкла for сортировки*/
    int ssort(int* C, int* z);
 
    free(A); /* После освобождения памяти, хорошей практикой является сброс указателя в нуль, то есть присвоить А = 0. Если указателю присвоить 0, указатель становится нулевым, другими словами, он уже никуда не указывает.*/
    free(B); 
    free(C);     
    
    return 0;
}
 
int ssort(int* C, int* z)
{
    int i,j,imin,min;
    for(i=0; i<z-1; i++)  /* i - номер  текущего елемента с коротого начинаеться проверка т.е. = нулевой елемент*/
    {   
        min=*(C+i); 
        imin=i; /*присваивание текущего і- елемента как самого мін*/
        for(j=i+1; j<z-1; j++) /*цикл выбора наименьшего элемента т.е. так как 0  елемент массива С = k, то мы провераем каждый елемента массива С и сравниваем с первым (j=i+1; j<k; j++), способо добавления 1 к j=i+1; значение переменной j увеличиваеться на 1 в конце каждово цыкла чтобы сверить каждый елемент с 0 елем. массива */
        {
            if (*(C+j)<min)  /*и если массив С с первым елементом будет меньше мін і переменного которого мы присвоили во внешнем цыкле for (min=*(C+i); imin=i;)*/ /*только для чего добавлять 1 к j она веть всеровно потом увеличиваеться после каждово цыкла*/
            {
                min=*(C+j); 
                imin=j; /*то мы назначаем новою мін*/
            }   
        *(C+imin)=*(C+i); /*ну а тут - если мы так и не найшли елемента меньше i то у него и остаеться мін значение*/
        *(C+i)=min;
        printf("C[%d]=%d; ", i+1, min);
        printf("\n");
        }
    }  /*после завершение внутрешнего цыкла начинаеться новый (опятже внешний цыкл for) НО уже для последуещего елемента после 0 т.е. 1 елемента*/
    return 0;
}
0
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2017, 21:55

Массив: Получить новый массив P, состоящую из чисел в интервале (a,b), которые не входят в массив H...
Помогите с заданием, пожалуйста :Написать программу, которая формирует новую последовательность P,...

Задан массив целых чисел. Напечатать числа, которые входят в массив более одного раза
Здравствуйте! Задан массив целых чисел размера N. Напечатать числа, которые входят в массив более...

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


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

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

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