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

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

04.12.2011, 15:39. Просмотров 2266. Ответов 17
Метки нет (Все метки)

Вот моя программа, которая никак не хочет работать, помогите пожалуйста.
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 поменять местами первый отрицательный и последний положительный элементы.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.12.2011, 15:39
Ответы с готовыми решениями:

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

Заполнение динамического массива
Функция для записи и хранения имён текстовых файлов из папки (использование...

Заполнение динамического массива числами от -50 до 50!
Плиз помогите Заполненить динамический массив числами от -50 до 50!буду очень...

Заполнение двумерного динамического массива
Объявить и заполнить двумерный динамический массив случайными числами от 10 до...

Заполнение двумерного динамического массива
int **Create(int size1, int size2) { int **Arr = new int*; for (int i = 0;...

17
Roof
154 / 154 / 44
Регистрация: 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?
1
_Edith
0 / 0 / 1
Регистрация: 02.04.2011
Сообщений: 99
04.12.2011, 15:56  [ТС] #3
А как тогда сделать, чтобы массив В входил в функцию как массив.
а переменная Н не нужна, так на всякий случай где пригодиться.
0
go
Эксперт С++
3637 / 1369 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
04.12.2011, 16:07 #4
Цитата Сообщение от _Edith Посмотреть сообщение
А как тогда сделать, чтобы массив В входил в функцию как массив.
C
1
void fun (int * B);
1
_Edith
0 / 0 / 1
Регистрация: 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 *"
0
go
Эксперт С++
3637 / 1369 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
04.12.2011, 16:15 #6
Цитата Сообщение от _Edith Посмотреть сообщение
int *B = new int *[M];
C++
1
int *B = new int [M];
1
_Edith
0 / 0 / 1
Регистрация: 02.04.2011
Сообщений: 99
04.12.2011, 16:26  [ТС] #7
теперь компилируется, но код не работает.
C++
1
2
3
B[1] = k;
    B[1] = B[M];
    B[M] = k
0
-=ЮрА=-
Заблокирован
Автор 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;
}
1
Миниатюры
Динамическая матрица, заполнение динамического массива.  
-=ЮрА=-
Заблокирован
Автор 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, что алгоритм вообще должен делать, не в обиду реализация ужасненькая предложена
1
_Edith
0 / 0 / 1
Регистрация: 02.04.2011
Сообщений: 99
04.12.2011, 16:51  [ТС] #10
Цитата Сообщение от _Edith[/b
, что алгоритм вообще должен делать, не в обиду реализация ужасненькая предложена
там задание есть, в самой теме.
0
-=ЮрА=-
Заблокирован
Автор FAQ
04.12.2011, 16:57 #11
Цитата Сообщение от _Edith Посмотреть сообщение
Вот исходное задание:
Сформировать одномерный массив B [ M ] из максимальных элементов столбцов прямоугольной матрицы A [ N ][ M ]. В массиве B поменять местами первый отрицательный и последний положительный элементы.
- нашёл, сейчас будет. Не надо обижаться я лишь указал на очень грубые ошибки - теперь вы их запомнили!
0
-=ЮрА=-
Заблокирован
Автор 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;
}
1
Миниатюры
Динамическая матрица, заполнение динамического массива.  
_Edith
0 / 0 / 1
Регистрация: 02.04.2011
Сообщений: 99
04.12.2011, 17:37  [ТС] #13
согласен=) программа работает отлично, но многое для меня не понятно, зачем нужна строка "system("chcp 1251");"? А также что означает sewt(3)?

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

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

Добавлено через 49 минут
спасибо всем огромное люди=) все кто принял участие +1=))))
0
04.12.2011, 19:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.12.2011, 19:25

Заполнение двумерного динамического массива
Доброго времени суток! Уважаемые коллеги! Второй день пытаюсь разобраться с...

Рандомное заполнение динамического двумерного массива
Здравствуйте не получается корректно заполнить динамический двумерный массив....

Доделать заполнение динамического массива вручную
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;string&gt; using namespace...


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

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

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