Форум программистов, компьютерный форум CyberForum.ru

Динамическая матрица, заполнение динамического массива. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.87
_Edith
 Аватар для _Edith
0 / 0 / 0
Регистрация: 02.04.2011
Сообщений: 99
04.12.2011, 15:39     Динамическая матрица, заполнение динамического массива. #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
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
#include "iostream"
#include <cstdlib>
#include <conio.h>
#include <locale.h>
 
using namespace std;
 
void plus(int x, int M, int B)
{
    for(int i = 0; i < M; i++)
    {
        if (B[i] != 0)
            B[i] = x;
    }
}
 
int main()
{
    int N, M, H;
    int i, j, k;
    int *A;
    int *B;
    int sv;
 
    setlocale(0, "");
 
    cout << "Введите длинну массива." << endl;
    cin >> M;
 
    cout << "Введите кол. столбцов матрицы" << endl << endl;
    cin >> N;
 
    int *B = new int* [M];
 
    int **A = new int *[N];    
    for(i = 0; i < N; i++)
        A[i] = new int [M];
 
    cout << "Матрица заполнена" << endl;
 
    for(i = 0; i < N; i++)
    {
        for(j = 0; i < M; i++)
        {
            A[i][j] = rand() % 10;
            cout << A[i][j] << " ";
        }
        cout << endl;
    }
 
    for(i = 0; i < N; i++)
    {
        for(j = 0; j < M; j++)
        {
            if (j != M - 1)
            {
                if(A[j][i] > A[j + 1][i])
                    sv = A[j][i];
                else 
                    sv = A[j + 1][i];
            }
            plus(sv, M, B);
        }
    }
 
    B[1] = k;
    B[1] = B[M];
    B[M] = k;
 
    cout << "Полученный массив" << endl;
 
    for(i = 0; i < M; i++)
        cout << B[i] << " ";
 
    getch();
 
    return 0;
}
Она выводит следующие ошибки: Ошибка для индекса требуется массив или указатель.
Значение типа "int **" нельзя использовать для инициализации сущности типа "int *".
Значение типа "int *" нельзя присвоить сущности типа "int".
Выражение должно иметь тип указателя на объект.

ну и все они многократно повторяются.

Вот исходное задание:
Сформировать одномерный массив B [ M ] из максимальных элементов столбцов прямоугольной матрицы A [ N ][ M ]. В массиве B поменять местами первый отрицательный и последний положительный элементы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.12.2011, 15:39     Динамическая матрица, заполнение динамического массива.
Посмотрите здесь:

C++ Заполнение динамического массива случайными числами
Заполнение динамического массива числами от -50 до 50! C++
C++ заполнение динамического двумерного массива
C++ Матрица динамическая. 1. максимальный элемент массива; 2. сумму элементов массива, расположенных до последнего положительного элемента
C++ Доделать заполнение динамического массива вручную
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Roof
 Аватар для Roof
154 / 154 / 10
Регистрация: 03.11.2010
Сообщений: 393
04.12.2011, 15:53     Динамическая матрица, заполнение динамического массива. #2
1) В функции
C++
1
void plus(int x, int M, int B)
входной параметр B является переменной типа int, а в теле функции применяется индексация - так нельзя.

2)
C++
1
2
3
4
5
6
...
int *A;
int *B;
...
int *B = new int* [M];
int **A = new int *[N];
A и B многократно объявлены - так тоже нельзя.

3) Зачем нужна переменная H?
_Edith
 Аватар для _Edith
0 / 0 / 0
Регистрация: 02.04.2011
Сообщений: 99
04.12.2011, 15:56  [ТС]     Динамическая матрица, заполнение динамического массива. #3
А как тогда сделать, чтобы массив В входил в функцию как массив.
а переменная Н не нужна, так на всякий случай где пригодиться.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
04.12.2011, 16:07     Динамическая матрица, заполнение динамического массива. #4
Цитата Сообщение от _Edith Посмотреть сообщение
А как тогда сделать, чтобы массив В входил в функцию как массив.
C
1
void fun (int * B);
_Edith
 Аватар для _Edith
0 / 0 / 0
Регистрация: 02.04.2011
Сообщений: 99
04.12.2011, 16:11  [ТС]     Динамическая матрица, заполнение динамического массива. #5
Остались две ошибки в этом коде:
C++
1
2
3
4
5
int *B = new int *[M];
 
    int **A = new int *[N];    
    for(i = 0; i < N; i++)
        A[i] = new int [M];
error C2440: инициализация: невозможно преобразовать "int **" в "int *"
значение типа "int **" нельзя использовать для инициализации сущности типа "int *"
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
04.12.2011, 16:15     Динамическая матрица, заполнение динамического массива. #6
Цитата Сообщение от _Edith Посмотреть сообщение
int *B = new int *[M];
C++
1
int *B = new int [M];
_Edith
 Аватар для _Edith
0 / 0 / 0
Регистрация: 02.04.2011
Сообщений: 99
04.12.2011, 16:26  [ТС]     Динамическая матрица, заполнение динамического массива. #7
теперь компилируется, но код не работает.
C++
1
2
3
B[1] = k;
    B[1] = B[M];
    B[M] = k
-=ЮрА=-
Заблокирован
Автор FAQ
04.12.2011, 16:37     Динамическая матрица, заполнение динамического массива. #8
_Edith, очень много ошибок, ниж код который работает и хотя бы заполняет массивы и что-то там по вашим формулам считает
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
#include <iostream>
#include <cstdlib> //srand rand
#include <ctime>   //time
using namespace std;
 
void plus(int x, int M, int *B)
{
    for(int i = 0; i < M; i++)
        if (B[i] != 0)
            B[i] = x;
}
 
int main()
{
    int N, M, H;
    int i, j, k;
    int **A;
    int *B;
    int sv;
 
    system("chcp 1251");
    cout << "Введите длинну массива : ";cin >> M;
    A = new int*[M];//Память под указатели на строки матрицы А 
    B = new int [M];//Память под ветор
 
    cout << "Введите кол. столбцов матрицы : ";cin >> N;
    cout << "Заполнение матрицы" << endl;
 
    srand(time(0));//Обязательно для генерации хоть каких-то псевдослучайных последовательностей
    for(i = 0; i < M; i++)
    {
        B[i] = rand() % 10;//Не видел чтобы В генерировали, откуда єлементам в нём взяться
        A[i] = new int[N];//Память под строку матрицы А
        for(j = 0; j < N; j++)
        {
            A[i][j] = rand() % 10;
            cout << A[i][j] << " ";
        }
        cout << endl;
    }
    for(i = 0; i < M; i++)
    {
        for(j = 0; j < N; j++)
        {
            if (j < N - 2)
            {
                if(A[j][i] > A[j + 1][i])
                    sv = A[j][i];
                else 
                    sv = A[j + 1][i];
            }
            plus(sv, M, B);
        }
    }
 
    //Чё єто за х*ень ни k нет
    //ни индекс 1 ни к селу ни к городу!
 /*   B[1] = k;
    B[1] = B[M];
    B[M] = k;*/
    cout << "Полученный массив" << endl;
    for(i = 0; i < M; i++)
        cout << B[i] << " ";
    cout<<endl;
    system("pause");
    return 0;
}
Миниатюры
Динамическая матрица, заполнение динамического массива.  
-=ЮрА=-
Заблокирован
Автор FAQ
04.12.2011, 16:43     Динамическая матрица, заполнение динамического массива. #9
Ошибки:
Цитата Сообщение от _Edith Посмотреть сообщение
for(i = 0; i < N; i++)
- i - подразумевает строки а условие окончание N - число столбцов

Цитата Сообщение от _Edith Посмотреть сообщение
for(j = 0; i < M; i++)
- j - подразумевает столбцы а условие окончание М - число строк,
ещё ошибка, цикл по j , а проверям что???i < M - ужас!
Цитата Сообщение от _Edith Посмотреть сообщение
for(j = 0; i < M; i++)
Добавлено через 46 секунд
Цитата Сообщение от _Edith Посмотреть сообщение
plus(sv, M, B);
- В вообще посчитан, как можно плючовать если В даже не генерировали, хотя бы так написал
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
B[i] = rand() % 10;
Добавлено через 1 минуту
Цитата Сообщение от _Edith Посмотреть сообщение
B[1] = k;
* * * * B[1] = B[M];
* * * * B[M] = k;
- что это за ф**ня???1-ца это не индекс первого элемента, индекс первого элемента 0!Далее B[M] - выход за пределы памяти нужно B[M - 1] - это будет последним элементом!
k - мы к вводили - нет, так как же мы хотим посчитать B[1] = k???

Добавлено через 1 минуту
_Edith, что алгоритм вообще должен делать, не в обиду реализация ужасненькая предложена
_Edith
 Аватар для _Edith
0 / 0 / 0
Регистрация: 02.04.2011
Сообщений: 99
04.12.2011, 16:51  [ТС]     Динамическая матрица, заполнение динамического массива. #10
Цитата Сообщение от _Edith[/b
, что алгоритм вообще должен делать, не в обиду реализация ужасненькая предложена
там задание есть, в самой теме.
-=ЮрА=-
Заблокирован
Автор FAQ
04.12.2011, 16:57     Динамическая матрица, заполнение динамического массива. #11
Цитата Сообщение от _Edith Посмотреть сообщение
Вот исходное задание:
Сформировать одномерный массив B [ M ] из максимальных элементов столбцов прямоугольной матрицы A [ N ][ M ]. В массиве B поменять местами первый отрицательный и последний положительный элементы.
- нашёл, сейчас будет. Не надо обижаться я лишь указал на очень грубые ошибки - теперь вы их запомнили!
-=ЮрА=-
Заблокирован
Автор FAQ
04.12.2011, 17:15     Динамическая матрица, заполнение динамического массива. #12
_Edith, вот если просто
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 <iostream>
#include <iomanip>
#include <cstdlib> //srand rand
#include <ctime>   //time
using namespace std;
 
int main()
{
    int N, M;
    int i, j;
    int **A;
    int *B;
 
    system("chcp 1251");
    cout << "Введите длинну массива : ";cin >> M;
    A = new int*[M];//Память под указатели на строки матрицы А 
    B = new int [M];//Память под ветор
 
    cout << "Введите кол. столбцов матрицы : ";cin >> N;
    cout << "Заполнение матрицы" << endl;
 
    srand(time(0));//Обязательно для генерации хоть каких-то псевдослучайных последовательностей
    for(i = 0; i < M; i++)
    {
        A[i] = new int[N];//Память под строку матрицы А
        for(j = 0; j < N; j++)
        {
            A[i][j] = rand() % 10 - 8;//-5 чтобы и отр появлялись
            cout <<setw(3)<< A[i][j] << " ";
        }
        cout << endl;
    }
    //В - будет состоять из макс элментов столбцов А
    int jotr = -1;
    int jpol = -1;
    for(j = 0; j < N; j++)
    {
        B[j] = A[0][j];
        for(i = 1; i < M; i++)
        {
            if(B[j] < A[i][j])
                B[j] = A[i][j];
        }
        //При первом отрицательном в jotr будет его индекс
        if(B[j] < 0 && jotr < 0)
            jotr = j;
    }
    //Находим первый положительный от конца
    for(j = N - 1; 0 <= j && jpol < 0; j--)
    {
        if(0 <= B[j] && jpol < 0)
            jpol = j;
    }
    int buf;
    if(jpol < 0)
        cout<<"В матрице А нет макс положительных элементов\n";
    else
    if(jotr < 0)
        cout<<"В матрице А нет макс отрицательных элементов\n";
    else
    {
        buf = B[jotr];
        B[jotr] = B[jpol];
        B[jpol] = buf;
    }
 
    cout << "Полученный массив" << endl;
    for(j = 0; j < N; j++)
        cout << B[j] << " ";
    cout<<endl;
    system("pause");
    return 0;
}
Миниатюры
Динамическая матрица, заполнение динамического массива.  
_Edith
 Аватар для _Edith
0 / 0 / 0
Регистрация: 02.04.2011
Сообщений: 99
04.12.2011, 17:37  [ТС]     Динамическая матрица, заполнение динамического массива. #13
согласен=) программа работает отлично, но многое для меня не понятно, зачем нужна строка "system("chcp 1251");"? А также что означает sewt(3)?

И создание массивов не обычное для меня.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
04.12.2011, 17:53     Динамическая матрица, заполнение динамического массива. #14
Цитата Сообщение от _Edith Посмотреть сообщение
sewt(3)?
для вывода данных раздельно

Цитата Сообщение от _Edith Посмотреть сообщение
"system("chcp 1251");"?
русский язык в кансоли
-=ЮрА=-
Заблокирован
Автор FAQ
04.12.2011, 17:54     Динамическая матрица, заполнение динамического массива. #15
Цитата Сообщение от _Edith Посмотреть сообщение
зачем нужна строка "system("chcp 1251");"
- руссификация не через локаль.
Цитата Сообщение от _Edith Посмотреть сообщение
sewt(3)
- посмотри за манипуляторы из iomanip http://www.cplusplus.com/reference/i...pulators/setw/
_Edith
 Аватар для _Edith
0 / 0 / 0
Регистрация: 02.04.2011
Сообщений: 99
04.12.2011, 18:13  [ТС]     Динамическая матрица, заполнение динамического массива. #16
А в visial studio 2010 это работает? а то у меня не работает.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
04.12.2011, 18:34     Динамическая матрица, заполнение динамического массива. #17
_Edith,
C
1
setlocale( LC_ALL,"Russian" );
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2011, 19:25     Динамическая матрица, заполнение динамического массива.
Еще ссылки по теме:

Заполнение динамического массива через указатели C++
C++ Заполнение двумерного динамического массива числами из диапазона от -10 до 10
C++ Динамическая память и заполнение массива

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

Или воспользуйтесь поиском по форуму:
_Edith
 Аватар для _Edith
0 / 0 / 0
Регистрация: 02.04.2011
Сообщений: 99
04.12.2011, 19:25  [ТС]     Динамическая матрица, заполнение динамического массива. #18
Цитата Сообщение от go Посмотреть сообщение
_Edith,
C
1
setlocale( LC_ALL,"Russian" );
ну так тоже можно=)

Добавлено через 49 минут
спасибо всем огромное люди=) все кто принял участие +1=))))
Yandex
Объявления
04.12.2011, 19:25     Динамическая матрица, заполнение динамического массива.
Ответ Создать тему
Опции темы

Текущее время: 08:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru