Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 0
Регистрация: 02.04.2016
Сообщений: 79
1

Сформировать массив C из элементов массива А, содержащихся в массиве В ровно 2 раза

29.11.2016, 21:30. Показов 2858. Ответов 41
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый.
У меня задание: "Даны массивы целых чисел: A[n] и B[m]. Сформировать массив C из элементов массива А, содержащихся в массиве В ровно 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
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#include <math.h>
#include <stdlib.h>
#include <conio.h>
using namespace std;
int NA,NB,NC;
 
 
int main()
{
NC=0;
cout << "razmer masiva A = "; cin >> NA;    if(NA<1){cout<< "erro";} else {
 int *A =new int[NA];
 for (int q = 0; q < NA; q++) {
 cin >> A[q]; 
 } 
 }
 cout << "razmer masiva B = "; cin >> NB;    if(NB<1){cout<< "erro";} else {
 int *B =new int[NB];
 for (int i = 0; i < NB; i++) {
 cin >> B[i]; 
 } 
 }
 
 
getch(); 
return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.11.2016, 21:30
Ответы с готовыми решениями:

Даны массивы целых чисел: A[n] и B[m]. Сформировать массив C из элементов массива B, содержащихся в массиве A
Добрый. Даны массивы целых чисел: A и B. Сформировать массив C из элементов массива B,...

Сформировать массив из элементов, содержащихся как в массиве a, так и в массиве b
Условие:Даны три одномерных массива a, b и c разного размера. Сформировать массив из элементов,...

Подсчитать сумму элементов массива А(N), встречающихся в массиве B(N) ровно два раза
Составьте программу вычисления суммы элементов одномерного массива А(N), встречающихся в массиве...

Вычисление суммы элементов одномерного массива А, встречающихся в массиве B ровно два раза
Составьте программу вычисления суммы элементов одномерного массива А(N), встречающихся в массиве...

41
0 / 0 / 0
Регистрация: 02.04.2016
Сообщений: 79
10.12.2016, 19:15  [ТС] 21
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Fixer_84 Посмотреть сообщение
mishutkinson, у вас подключена библиотека <algorithm>? Если по-прежнему не работает, отсортируйте массив как вы делайте это обычно (по возрастанию). Например, методом Пузырька.
Заработало.
Прошу пояснить значение этих строк:
C++
1
2
a_i = f_i + (l_i - f_i) / 2; //Меняем индекс среднего значения
        s_v <= A[a_i] ? l_i = a_i : f_i = a_i + 1; //Найден ключевой элемент или нет
Предположим, у нас массив из 5 элементов.
Правильно я понимаю, что a_i= 0+(4-0)/2; Какой смысл в нулях?
Вторую строчку я вообще не понял.
0
805 / 532 / 158
Регистрация: 27.01.2015
Сообщений: 3,017
Записей в блоге: 1
10.12.2016, 19:20 22
mishutkinson,
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
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
int main()
{
    vector<signed> A
    {
        1, 2, 3
    }, B
    {
        1, 2, 2, 3, 3, 3
    }, C;
 
    for (const auto& i : A)
        if (count(B.cbegin(), B.cend(), i) == 2)
            C.push_back(i);
 
    for (const auto& i : C)
        cout << i << endl;
 
    system("pause");
}
0
0 / 0 / 0
Регистрация: 02.04.2016
Сообщений: 79
10.12.2016, 20:07  [ТС] 23
Цитата Сообщение от Ferrari F1 Посмотреть сообщение
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
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
 
int main()
{
    vector<signed> A
    {
        1, 2, 3
    }, B
    {
        1, 2, 2, 3, 3, 3
    }, C;
 
    for (const auto& i : A)
        if (count(B.cbegin(), B.cend(), i) == 2)
            C.push_back(i);
 
    for (const auto& i : C)
        cout << i << endl;
 
    system("pause");
}
Благодарю, но это задание мне уже помогли сделать.
У меня второе есть: "Даны массивы целых чисел: A[n] и B[m]. Сформировать массив C из элементов массива B, содержащихся в массиве A."
Это нужно с делать с помощью двоичного поиска.
Возможно вы знаете как? Выше, в этой теме мне помогли но у меня есть вопросы по строчкам.
0
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
11.12.2016, 19:44 24
Лучший ответ Сообщение было отмечено mishutkinson как решение

Решение

mishutkinson, здравствуйте! Я не хотел бы вдаваться в подробности работы двоичного поиска. Я просто сделал программу, которая, возможно, подойдет вам. Там есть небольшой недочет (смотреть комментарии к программе), но его можно исправить. А так, программа работает. Отпишитесь, пожалуйста.

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 <iostream>
#include <algorithm>
 
using namespace std;
 
int N, M;
 
int CheckQuantity(int* A, int s_v) //Функция двоичного поиска
{
    int a_i, f_i, l_i, k;
    a_i = f_i = 0;
    l_i = N;
    while (f_i < l_i)
    {
        a_i = f_i + (l_i - f_i) / 2;
        s_v <= A[a_i] ? l_i = a_i : f_i = a_i + 1;
    }
    k = 0;
    for (int i = 0; i < N; i++)
    {
        s_v = A[i];
        if (A[l_i] == s_v)
            k++;
    }
    return k;
}
 
int main()
{
    int p, x, y;
    cout << "Введите размерность массива A:" << endl;
    cout << "N = ";
    cin >> N;
    int* A = new int[N];
    cout << "Введите размерность массива B:" << endl;
    cout << "M = ";
    cin >> M;
    int* B = new int[M];
    int* C = new int[M];
    cout << "Введите массив A:" << endl;
    for (int i = 0; i < N; i++)
    {
        cin >> A[i];
    }
    cout << "Введите массив B:" << endl;
    for (int j = 0; j < M; j++)
    {
        cin >> B[j];
    }
    // sort(A, A + N); //Так как это двоичный поиск массив A должен быть отсортирован
    sort(B, B + M); // Я, также, сортирую массив B для правильной работы программы
    x = y = p = 0; // Но (про массив B) эта сортировка нарушает порядок следования элементов
    for (int j = y; j < M; j++) //Если вам важен порядок, я переделаю...
    {
        if (B[j] == B[j+1])
        {
            x++;
        }
        else
        {
            y = x;
            x = 0;
            if (CheckQuantity(A, B[j]) >= 1) //Применяем функцию двоичного поиска
            {
                C[p] = B[j];
                p++;
            }
        }
    }
    cout << "Искомый массив:" << endl;
    for (int i = 0; i < p; i++)
    {
        cout << C[i] << " "; //Выводим искомый массив
    }
    cout << endl;
    delete[] A;
    delete[] B;
    delete[] C;
    system("pause");
    return 0;
}
Добавлено через 50 минут
mishutkinson, строчку 62 можно убрать (мой недосмотр)...
1
0 / 0 / 0
Регистрация: 02.04.2016
Сообщений: 79
11.12.2016, 21:14  [ТС] 25
Цитата Сообщение от Fixer_84 Посмотреть сообщение
Отпишитесь, пожалуйста.
Добрый! Благодарю вас, вы мне снова помогли.
Запускается, но я sort(A, A + N); раскомментировал так как у меня не получалось определённый массив, не выводил все элементы.
Я добавил отображение упорядочивания массивов из прошлого. Упорядочивание прошло успешно, но я зокомментирвал:
C++
1
2
3
4
5
6
7
8
9
 {
        if (B[j] == B[j+1])
        {
            x++;
        }
        else
        {
            y = x;
            x = 0;
и }} это можно сделать?
0
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
11.12.2016, 22:07 26
mishutkinson, я рад, что что-то получилось. Я закомментировал sort(A, A + N) имея ввиду, что массив A при вводе должен быть упорядочен (так как двоичный поиск работает только с упорядоченными массивами). Если ваш массив при вводе не упорядочен, вам нужно раскомментировать 50 строчку. Далее идет ввод массива B. Его я упорядочил для того, чтобы код между строк 52 и 69 работал правильно. То есть, если вы, например, введете массив B как 2 1 3 2 1 2 3, то он будет преобразован к виду 1 1 2 2 2 3 3 и я из него вытаскиваю элементы 1 2 3 и проверяю с помощью двоичного поиска содержатся ли они в A. Однако, при этом порядок их следования в B нарушается (то есть должно было быть 2 1 3, а стало 1 2 3). И в массив C они поэтому будут помещены в отсортированном порядке. Если вас это не устраивает, я перепишу код для B не сортируя его, чтобы сохранить порядок следования элементов. Я с ваших слов не совсем понял, что бы вам хотелось добавить к программе и какие еще ошибки возникают?
0
0 / 0 / 0
Регистрация: 02.04.2016
Сообщений: 79
11.12.2016, 22:15  [ТС] 27
Цитата Сообщение от Fixer_84 Посмотреть сообщение
mishutkinson, я рад, что что-то получилось. Я закомментировал sort(A, A + N) имея ввиду, что массив A при вводе должен быть упорядочен (так как двоичный поиск работает только с упорядоченными массивами). Если ваш массив при вводе не упорядочен, вам нужно раскомментировать 50 строчку. Далее идет ввод массива B. Его я упорядочил для того, чтобы код между строк 52 и 69 работал правильно. То есть, если вы, например, введете массив B как 2 1 3 2 1 2 3, то он будет преобразован к виду 1 1 2 2 2 3 3 и я из него вытаскиваю элементы 1 2 3 и проверяю с помощью двоичного поиска содержатся ли они в A. Однако, при этом порядок их следования в B нарушается (то есть должно было быть 2 1 3, а стало 1 2 3). И в массив C они поэтому будут помещены в отсортированном порядке. Если вас это не устраивает, я перепишу код для B не сортируя его, чтобы сохранить порядок следования элементов. Я с ваших слов не совсем понял, что бы вам хотелось добавить к программе и какие еще ошибки возникают?
Нет, вы что, всё прекрасно работает,я лишь котел узнать нужен ли этот кусок, если массив упорядочен?
Цитата Сообщение от mishutkinson Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
{
        if (B[j] == B[j+1])
        {
            x++;
        }
        else
        {
            y = x;
            x = 0;
0
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
11.12.2016, 22:21 28
mishutkinson, этот код (код между строками 52 и 69) не будет работать если массив B не упорядочен. Поэтому я предложил вам получить повторяющиеся элементы B не упорядочивая его, чтобы сохранить порядок следования элементов в B (а значит и в С). Если вам не важно в каком порядке элементы из B попадают в C, то можно оставить так
1
0 / 0 / 0
Регистрация: 02.04.2016
Сообщений: 79
11.12.2016, 22:32  [ТС] 29
Цитата Сообщение от Fixer_84 Посмотреть сообщение
mishutkinson, этот код (код между строками 52 и 69) не будет работать если массив B не упорядочен. Поэтому я предложил вам получить повторяющиеся элементы B не упорядочивая его, чтобы сохранить порядок следования элементов в B (а значит и в С). Если вам не важно в каком порядке элементы из B попадают в C, то можно оставить так
Благодарю вас.
У меня осталось последнее задание, если вы поможете буду очень признателен:
Задание:Дана прямоугольная матрица. Найти произведение элементов в тех строках, которые не содержат нулей. Если таких строк нет - вывести сообщение.
Использовать динамические одномерные и двумерные массивы.
0
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
11.12.2016, 22:48 30
mishutkinson, конечно, помогу. Подождите минут 10.

Добавлено через 10 минут
mishutkinson, у меня вопрос. Для чего использовать одномерный массив? Для обработки строк?

Добавлено через 1 минуту
mishutkinson, у меня есnь программа без одномерного массива. Обязательно ли использовать одномерный?
0
0 / 0 / 0
Регистрация: 02.04.2016
Сообщений: 79
11.12.2016, 22:51  [ТС] 31
Цитата Сообщение от Fixer_84 Посмотреть сообщение
у меня есnь программа без одномерного массива. Обязательно ли использовать одномерный?
Если можно, то да.
Если я правильно понимаю, да, для обработки, поиска.
0
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
12.12.2016, 00:07 32
mishutkinson, тогда придется немного подождать. Я давно таких не решал, но думаю справлюсь.

Добавлено через 34 минуты
mishutkinson, сейчас будет код, но я в смятении...

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

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>
 
using namespace std;
 
int main()
{
    int N, M, p, k, t;
    cout << "Введите размерность массива:" << endl;
    cout << "N = ";
    cin >> N;
    cout << "M = ";
    cin >> M;
    int* B = new int[N];
    int** A = new int*[N];
    for (int i = 0; i < N; i++)
    {
        A[i] = new int[M];
    }
    cout << "Введите матрицу:" << endl;
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
        {
            cin >> A[i][j];
        }
    }
    k = t = 0;
    for (int i = 0; i < N; i++)
    {
        p = 1;
        for (int j = 0; j < M; j++)
        {
            p *= A[i][j];
        }
        if (p != 0)
        {
            B[k] = p; //Здесь необязательно помещать p в массив...можно просто вывести
            k++;
        }
        else
            t++;
    }
    cout << "Произведения в строках, которые не содержат нулей:" << endl;
    for (int i = 0; i < k; i++)
    {
        cout << B[i] << " ";
    }
    if (t == N)
        cout << "Cтрок без нулей нет!" << endl;
    for (int i = 0; i < N; i++)
    {
        delete[] A[i];
    }
    delete[] B;
    system("pause");
    return 0;
}
Добавлено через 1 минуту
mishutkinson, без одномерного массива (массива B) даже лучше, так как можно получить номера строк...

Добавлено через 59 секунд
mishutkinson, Отпишитесь, пожалуйста.

Добавлено через 17 минут
mishutkinson, вот более оптимальный вариант кода:

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
#include <iostream>
 
using namespace std;
 
int main()
{
    int N, M, p, k;
    cout << "Введите размерность массива:" << endl;
    cout << "N = ";
    cin >> N;
    cout << "M = ";
    cin >> M;
    int* B = new int[N];
    int** A = new int*[N];
    for (int i = 0; i < N; i++)
    {
        A[i] = new int[M];
    }
    cout << "Введите матрицу:" << endl;
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
        {
            cin >> A[i][j];
        }
    }
    k = 0;
    for (int i = 0; i < N; i++)
    {
        p = 1;
        for (int j = 0; j < M; j++)
        {
            p *= A[i][j];
        }
        if (p != 0)
        {
            B[k] = p; //Здесь необязательно помещать p в массив...можно просто вывести
            k++;
        }
    }
    if (k == 0)
        cout << "Таких строк нет!" << endl;
    else
    {
        cout << "Произведения в строках, которые не содержат нулей:" << endl;
        for (int i = 0; i < k; i++)
        {
            cout << B[i] << " ";
        }
    }
    cout << endl;
    for (int i = 0; i < N; i++)
    {
        delete[] A[i];
    }
    delete[] B;
    system("pause");
    return 0;
}
Добавлено через 10 минут
mishutkinson, вот вариант без одномерного массива и, по-моему, он лучше

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
#include <iostream>
 
using namespace std;
 
int main()
{
    int N, M, p, k, t;
    cout << "Введите размерность массива:" << endl;
    cout << "N = ";
    cin >> N;
    cout << "M = ";
    cin >> M;
    int** A = new int*[N];
    for (int i = 0; i < N; i++)
    {
        A[i] = new int[M];
    }
    cout << "Введите матрицу:" << endl;
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
        {
            cin >> A[i][j];
        }
    }
    k = t = 0;
    for (int i = 0; i < N; i++)
    {
        p = 1;
        for (int j = 0; j < M; j++)
        {
            p *= A[i][j];
        }
        if (p != 0)
        {
            cout << "Произведение в строке " << i + 1 << ": " << p << endl;
        }
        else t++;
    }
    if (t == N) cout << "Таких строк нет!" << endl;
    for (int i = 0; i < N; i++)
    {
        delete[] A[i];
    }
    system("pause");
    return 0;
}
0
0 / 0 / 0
Регистрация: 02.04.2016
Сообщений: 79
12.12.2016, 00:21  [ТС] 33
Цитата Сообщение от Fixer_84 Посмотреть сообщение
mishutkinson, без одномерного массива (массива B) даже лучше, так как можно получить номера строк...
Правильно ли я понимаю, что
C++
1
2
3
4
5
6
7
8
9
10
11
12
 p = 1;
        for (int j = 0; j < M; j++)
        {
            p *= A[i][j];
        }
        if (p != 0)
        {
            B[k] = p; //Здесь необязательно помещать p в массив...можно просто вывести
            k++;
        }
        else
            t++;
Здесь происходит умножение?
0
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
12.12.2016, 17:53 34
mishutkinson, здравствуйте. Да, для каждой строки мы находим произведение и если оно не равно нулю выводим. Вместо t можно использовать логическое условие (для вывода сообщения "Таких строк нет!").

Добавлено через 1 минуту
mishutkinson, Если вам нужно что-то другое, обязательно напишите и я исправлю
0
0 / 0 / 0
Регистрация: 02.04.2016
Сообщений: 79
13.12.2016, 20:18  [ТС] 35
Цитата Сообщение от Fixer_84 Посмотреть сообщение
mishutkinson, Если вам нужно что-то другое, обязательно напишите и я исправлю
Добрый! Fixer_84, у меня есть код: "ввести 5 целых чисел, записать их в список, вывести этот список на экран.":
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
#include "stdafx.h"
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
 
struct item
{
   int a;
   item *next;
};
 
item *NewEl(int b)
{
   item *el;
   el=(item*)malloc(sizeof(item));
   if(el==NULL)
   {
      return NULL;
   }
   el->next=NULL;
   el->a=b;
   return el;
 
}
 
item *AddEl(item *head,int b)
{
   if (head==NULL)
   {
      head=NewEl(b);
   }
   else
   {
      item *i;
      for(i=head;i->next!=NULL;i=i->next){}
      i->next=NewEl(b);
   }
   return head;
}
 
void DelSp(item *head)
{
   item *i,*del;
   i=head;
   while(i!=NULL)
   {
      del=i;
      i=i->next;
      free(del);
   }
}
 
void PrintSp(item *head)
{
   item *i;
   for(i=head;i!=NULL;i=i->next)
       printf("%d\n",i->a);
}
 
void main()
{
    item *Sp1=NULL;
    int i,a;
    for(i=0;i<5;i++)
    {
        printf("Enter element "); scanf("%d",&a);
        Sp1=AddEl(Sp1,a);
    }
    printf("Elementy spisca:\n");
    PrintSp(Sp1);
    DelSp(Sp1);
    getch();    
}
Мне нужно: "ввести с клавиатуры N целых чисел; записать эти числа в список; вывести получившийся список на экран; вывести на экран только отрицательные элементы списка."
0
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
13.12.2016, 20:32 36
mishutkinson, здравствуйте! Я со списком еще не работал Не могу помочь...
0
0 / 0 / 0
Регистрация: 02.04.2016
Сообщений: 79
13.12.2016, 20:49  [ТС] 37
Цитата Сообщение от Fixer_84 Посмотреть сообщение
mishutkinson, здравствуйте! Я со списком еще не работал Не могу помочь...
Скажите, пожалуйста, а со стеками и очередями?
0
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
13.12.2016, 20:53 38
mishutkinson, со стеками о очередями тоже нет. Но я планирую работу с классами.
0
0 / 0 / 0
Регистрация: 02.04.2016
Сообщений: 79
13.12.2016, 20:56  [ТС] 39
Цитата Сообщение от Fixer_84 Посмотреть сообщение
mishutkinson, со стеками о очередями тоже нет. Но я планирую работу с классами.
Я вам очень благодарен, за проделанную вами работу, вы мне очень помогли. Я искренне желаю, что бы у вас было всё в порядке!
0
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
13.12.2016, 21:01 40
mishutkinson, Спасибо
0
13.12.2016, 21:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.12.2016, 21:01
Помогаю со студенческими работами здесь

Составьте программу вычисления суммы элементов одномерного массива А(N), встречающихся в массиве B(N) ровно два раза.
Составьте программу вычисления суммы элементов одномерного массива А(N), встречающихся в массиве...

Дан двумерный массив целых чисел. Вычислить количество четных чисел среди элементов, встречающихся в массиве ровно 3 раза
Кто может, помогите пожалуйста:)

Cкопировать в массив только те элементы, который в первом массиве встретились ровно 2 раза
Программа должна создавать динамический массив из 20 случайных элементов их диапазона и вывести...

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru