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

На основе исходной матрицы сформировать новую, состоящую из нулей и единиц, руководствуясь заданным правилом - C++

17.06.2017, 18:54. Просмотров 382. Ответов 22
Метки нет (Все метки)

всем доброго вечера, недавно дали задание "Дан целочисленный массив A[N][N]. Нужно сформировать массив B[N], состоящий из нулей и единиц, руководствуясь следующим правилом: если i-я строка массива A содержит хотя бы один элемент, то B[i]=1, в противном случае B[i]=0" как мне сказали программу надо написать с использованием индексации к элементам динамических массивов. Буду честен, в программирование я пока плохо разбираюсь, не могли бы как нибудь помочь мне?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.06.2017, 18:54
Я подобрал для вас темы с готовыми решениями и ответами на вопрос На основе исходной матрицы сформировать новую, состоящую из нулей и единиц, руководствуясь заданным правилом (C++):

На основе исходной матрицы сформировать новую, состоящую из нулей и единиц
Всем привет! Смотрел примеры для данного задания от данной темы...

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

Сформировать новую строку, состоящую из символов цифр исходной строки
Вводится строка. Сформировать новую строку, состоящую из символов цифр исходной...

В матрице из нулей и единиц найти квадрат заданного размера, состоящую целиком из нулей
В матрице A (m, n), которая состоит из нулей и единиц, найти квадрат заданного...

В заданной матрице состоящей из нулей и единиц найти квадратную подматрицу, состоящую целиком из нулей
Черный квадрат. В матрице состоящей из 0 и 1 найти квадрат заданного...

На основе исходной сформировать новую строку, в которой самое длинное слово поставить в начало
Приветствую всех пользователей форума) Собственно вот сама задача: Дана...

22
Даценд
Модератор
Эксперт .NET
4045 / 3885 / 2573
Регистрация: 20.04.2015
Сообщений: 7,060
17.06.2017, 19:17 #2
Цитата Сообщение от inhuman6 Посмотреть сообщение
если i-я строка массива A содержит хотя бы один элемент, то B[i]=1
Если читать, как "если i-я строка массива A содержит хотя бы один элемент, равный 1, то B[i]=1", то
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 <iostream>
#include <cstdlib>
#include <ctime>
int main()
{
    srand(time(nullptr));
    std::size_t N;
    std::cout << "Enter N:";
    std::cin >> N;
    int** A = new int*[N];
    int* B = new int[N];
    std::cout << "Array A:" << std::endl;
    for(std::size_t i=0; i<N; i++)
    {
        A[i] = new int[N];
        B[i]=0;
        for(std::size_t j=0; j<N; j++)
        {
            A[i][j]=rand()%5 / 4; //чтобы увеличить вероятность 0 до 75%
            std::cout << A[i][j] << " ";
            B[i]|=A[i][j];
        }
        std::cout << std::endl;
    }
    std::cout << std::endl << std::endl << "Array B:" << std::endl;
    for(std::size_t i=0; i<N; i++)
        std::cout << B[i] << " ";
    std::cout << std::endl;
    return 0;
}
0
inhuman6
0 / 0 / 1
Регистрация: 17.06.2017
Сообщений: 17
17.06.2017, 19:22  [ТС] #3
Цитата Сообщение от Даценд Посмотреть сообщение
Если читать, как "если i-я строка массива A содержит хотя бы один элемент, равный 1, то B[i]=1", то
блин, при написании не не увидел одно слово, выглядит предложение так
Цитата Сообщение от inhuman6 Посмотреть сообщение
Нужно сформировать массив B[N], состоящий из нулей и единиц, руководствуясь следующим правилом: если i-я строка массива A содержит хотя бы один отрицательный элемент, то B[i]=1, в противном случае B[i]=0
0
Даценд
Модератор
Эксперт .NET
4045 / 3885 / 2573
Регистрация: 20.04.2015
Сообщений: 7,060
17.06.2017, 19:38 #4
Цитата Сообщение от inhuman6 Посмотреть сообщение
хотя бы один отрицательный элемент
Это сильно меняет дело:
C#
21
B[i] = (A[i][j] < 0) | B[i];
0
inhuman6
0 / 0 / 1
Регистрация: 17.06.2017
Сообщений: 17
17.06.2017, 19:47  [ТС] #5
Даценд, спасибо
0
ValeryS
Модератор
7131 / 5399 / 669
Регистрация: 14.02.2011
Сообщений: 18,221
17.06.2017, 19:48 #6
примерно так

C++
1
2
3
4
5
6
7
8
9
for(int i=0;i<N;i++)
{
 int tmp=0;
 for(int j=0;j<N;j++)
   {
    tmp |=A[i][j];
   }
B[i]=tmp<0; 
}
0
inhuman6
17.06.2017, 20:03  [ТС]
  #7

Не по теме:

ValeryS, спасибо , сейчас смотрю как в целом работает код, чтобы полностью все понять

0
inhuman6
0 / 0 / 1
Регистрация: 17.06.2017
Сообщений: 17
18.06.2017, 19:30  [ТС] #8
всем доброго вечера, вчера мне помогли сделать задание "Дан целочисленный массив A[N][N]. Нужно сформировать массив B[N], состоящий из нулей и единиц, руководствуясь следующим правилом: если i-я строка массива A содержит хотя бы один отрицательный элемент, то B[i]=1, в противном случае B[i]=0" как мне сказали программу надо написать с использованием индексации к элементам динамических массивов, но как мне сказали, надо сделать второй вариант, без индексации, кто может сказать, как это можно сделать?
код программы :
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
//с индексацией 
#include "stdafx.h"
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
    setlocale(LC_ALL, "Russian");   
    srand(time(nullptr));
    size_t N;
    cout << "Введите N:";
    cin >> N;
    int** A = new int*[N];
    int* B = new int[N];
    cout << "Массив A:" << endl;
    for (size_t i = 0; i<N; i++)
    {
        A[i] = new int[N];
        B[i] = 0;
        for (size_t j = 0; j<N; j++)
        {
            A[i][j] = rand() % 5 / 4;
            B[i] = (A[i][j] < 0) | B[i];
            B[i] |= A[i][j];
 
        }
        cout << endl;
    }
    cout << "Массив B:" << endl;
    for (size_t i = 0; i<N; i++)
        cout << B[i] << " ";
    cout << endl;
    return 0;
}
0
henix
3 / 3 / 9
Регистрация: 15.05.2017
Сообщений: 17
19.06.2017, 12:19 #9
Стучись через указатели для одномерного массива A[i] = *(A + i)
для двумерного A[i][j] = *(*(A + i) + j);
0
Даценд
Модератор
Эксперт .NET
4045 / 3885 / 2573
Регистрация: 20.04.2015
Сообщений: 7,060
19.06.2017, 14:26 #10
Цитата Сообщение от inhuman6 Посмотреть сообщение
второй вариант, без индексации
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <algorithm>
int main()
{
    setlocale(LC_ALL, "Russian");
    srand(time(nullptr));
    int N;
    std::cout << "Введите N:";
    std::cin >> N;
    int** A = new int*[N];
    std::for_each(A, A+N, [N](int* &R){R = new int[N];});
    int* B = new int[N];
    std::cout << "Массив A:" << std::endl;
    std::for_each(A, A+N, [N](int *R){ std::transform(R, R+N, R, [](int x){return rand() % 5 - 1;});});
    std::for_each(A, A+N, [N](int *R){ std::for_each(R, R+N, [](int &a){ std::cout << a << " ";}); std::cout << std::endl;});
    std::transform(B, B+N, B, [A, B, N](int &b){return std::count_if(*(A+(&b-B)), *(A+(&b-B))+N, [](int &x){return x<0;})>0?1:0;});
    std::cout << "Массив B:" << std::endl;
    std::for_each(B, B+N, [](int &b){ std::cout << b << " ";});
    std::cout << std::endl;
    return 0;
}
0
MrGluck
19.06.2017, 14:55
  #11
 Комментарий модератора 
inhuman6, запрещено дублировать темы.
0
Fixer_84
827 / 637 / 645
Регистрация: 30.04.2016
Сообщений: 2,115
19.06.2017, 16:01 #12
inhuman6, здравствуйте! Вот еще вариант:

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
#include <iostream>
 
using namespace std;
 
int main()
{
    int N, k;
    cout << "Введите размерность матрицы" << endl;
    cout << "N = ";
    cin >> N;
    int** A = new int*[N];
    for (int i = 0; i < N; i++)
    {
        A[i] = new int[N];
    }
    int* B = new int[N];
    cout << "Введите матрицу:" << endl;
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            cin >> A[i][j];
        }
    }
    for (int i = 0; i < N; i++)
    {
        k = 0;
        for (int j = 0; j < N; j++)
        {
            if (A[i][j] < 0)
                k++;
        }
        if (k)
            B[i] = 1;
        else
            B[i] = 0;
    }
    cout << "Искомый массив: " << endl;
    for (int i = 0; i < N; i++)
    {
        cout << B[i] << " ";
    }
    for (int i = 0; i < N; i++)
    {
        delete [] A[i];
    }
    delete [] A;
    delete [] B;
    cin.get();
    return 0;
}
0
inhuman6
0 / 0 / 1
Регистрация: 17.06.2017
Сообщений: 17
19.06.2017, 16:07  [ТС] #13
Цитата Сообщение от Fixer_84 Посмотреть сообщение
inhuman6, здравствуйте! Вот еще вариант:
здравствуете, как я понял, это с использованием индексов, просто я не до конца еще разобрался в различиях?
0
Fixer_84
827 / 637 / 645
Регистрация: 30.04.2016
Сообщений: 2,115
19.06.2017, 16:17 #14
inhuman6, да. Можно также использовать указатели. Тогда, название массива будет указывать на первый элемент.
0
inhuman6
0 / 0 / 1
Регистрация: 17.06.2017
Сообщений: 17
19.06.2017, 16:24  [ТС] #15
Цитата Сообщение от Fixer_84 Посмотреть сообщение
inhuman6, да. Можно также использовать указатели. Тогда, название массива будет указывать на первый элемент.
ок, спасибо по изучаю вашу программу, а вот эта программка мне, мягко говоря не понятна
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <algorithm>
int main()
{
    setlocale(LC_ALL, "Russian");
    srand(time(nullptr));
    int N;
    std::cout << "Введите N:";
    std::cin >> N;
    int** A = new int*[N];
    std::for_each(A, A+N, [N](int* &R){R = new int[N];});
    int* B = new int[N];
    std::cout << "Массив A:" << std::endl;
    std::for_each(A, A+N, [N](int *R){ std::transform(R, R+N, R, [](int x){return rand() % 5 - 1;});});
    std::for_each(A, A+N, [N](int *R){ std::for_each(R, R+N, [](int &a){ std::cout << a << " ";}); std::cout << std::endl;});
    std::transform(B, B+N, B, [A, B, N](int &b){return std::count_if(*(A+(&b-B)), *(A+(&b-B))+N, [](int &x){return x<0;})>0?1:0;});
    std::cout << "Массив B:" << std::endl;
    std::for_each(B, B+N, [](int &b){ std::cout << b << " ";});
    std::cout << std::endl;
    return 0;
}
0
Fixer_84
827 / 637 / 645
Регистрация: 30.04.2016
Сообщений: 2,115
19.06.2017, 16:28 #16
Цитата Сообщение от inhuman6 Посмотреть сообщение
ок, спасибо по изучаю вашу программу, а вот эта программка мне, мягко говоря не понятна
Это, фактически, то же самое. Просто используются встроенные функции. Кстати, насколько я знаю, встроенные функции (built-in fucntions) работают значительно быстрее. Они, также, надежнее, на мой взгляд, так как не допускают возможную оплошность программиста.
0
inhuman6
0 / 0 / 1
Регистрация: 17.06.2017
Сообщений: 17
19.06.2017, 16:41  [ТС] #17
Цитата Сообщение от Fixer_84 Посмотреть сообщение
Можно также использовать указатели. Тогда, название массива будет указывать на первый элемент.
а как это будет выглядеть, мне просто интересно, и да как видно, все то что касается массивов и их решений, пока мне не до конца ясны, особенно все то, что связано с индексацией и без индексации
0
Fixer_84
827 / 637 / 645
Регистрация: 30.04.2016
Сообщений: 2,115
19.06.2017, 17:51 #18
inhuman6, приблизительно так. Но я не уверен насчет объявления и удаления массивов. Поправьте меня, пожалуйста, кто знает...Или не поправляйте, если все правильно

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 <windows.h> //Шрифт консоли - Lucida Console
 
using namespace std;
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int N, k;
    cout << "Введите размерность матрицы" << endl;
    cout << "N = ";
    cin >> N;
    int** A = new int*[N];
    for (int i = 0; i < N; i++)
    {
        *(A + i) = new int[N];
    }
    int* B = new int[N];
    cout << "Введите матрицу:" << endl;
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < N; j++)
        {
            cin >> *(*(A + i) + j);
        }
    }
    for (int i = 0; i < N; i++)
    {
        k = 0;
        for (int j = 0; j < N; j++)
        {
            if (*(*(A + i) + j) < 0)
                k++;
        }
        if (k)
            *(B + i) = 1;
        else
            *(B + i) = 0;
    }
    cout << "Искомый массив: " << endl;
    for (int i = 0; i < N; i++)
    {
        cout << *(B + i) << " ";
    }
    //Удаление массивов указателей
    for (int i = 0; i < N; i++)
    {
        delete *(A + i);
    }
    delete A;
    delete B;
    system("pause");
    return 0;
}
0
marat_miaki
149 / 138 / 87
Регистрация: 08.04.2013
Сообщений: 554
19.06.2017, 21:33 #19
вариант если не перемудрил
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
#include <iostream>
#include <cstdlib>
#include <iomanip>
 
using namespace std;
 
void print(int *, int n);
int main()
{
    setlocale(LC_ALL, "Russian");
    int n;
    cout<<"Введите N : ";
    cin>>n;
 
    int **masA = new int * [n];
    int * masB = new int [n]{};
    int *pB =&masB[0];
    for (int i=0; i<n; i++)
        masA[i] = new int [n];
 
    int *pA = &masA[0][0];
 
    for (int i = 0; i < n*n; ++i)
    {
        *(pA + i) = (rand ()%10-1);  // указатель не двигается (высчитываем)
        //*p++ = (rand ()%10-1);    //двигаем указатель
        // p = &mas[0][0];          //сброс указателя на начало
        if (*(pA + i) < 0 ) *pB = 1;
        if((!(i%n))&& (i>0)) *pB++;
    }
    print( pA, n);
    cout << endl << endl;
    pB =&masB[0];                   //сброс указателя на начало
    for (int i = 0; i < n; ++i)
    cout << setw(3) <<  *pB++;
 
    for(int i=0; i<n; i++)
    delete [] masA[i];
    delete []masA;
    delete []masB;
 
  return 0;
}
void print (int *p, int n) {
   int N = n*n;
   for (int i = 0; i < N; i++)
    {
        if(!(i%n)) cout <<endl;
        cout << setw (3) << *(p + i);
    }
}
0
inhuman6
0 / 0 / 1
Регистрация: 17.06.2017
Сообщений: 17
20.06.2017, 14:32  [ТС] #20
Цитата Сообщение от marat_miaki Посмотреть сообщение
вариант если не перемудрил
при вводе N консоль выдает во это:
Название: 14484717m.jpg
Просмотров: 9

Размер: 10.0 Кб
как это можно исправить ?

 Комментарий модератора 
Картинки загружайте на форум
0
20.06.2017, 14:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.06.2017, 14:32
Привет! Вот еще темы с решениями:

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

Сформировать массив на основе исходной матрицы согласно условию
Задана матрица размером NxM. Получить массив B, присвоив его k-му элементу...

Создать новую строку, состоящую из символов исходной, расположенных в обратном порядке
1 Дана строка S. Создать новую строку, состоящую из символов S, распо-...

Массив состоит из нулей и единиц. Сформировать массив,состоящий из нулей и подсчитать их количество
Массив А состоит из 0-й и 1-ц.сформировать одномерный массив В(К),состоящий из...


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

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

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