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

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

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

Author24 — интернет-сервис помощи студентам
Вот моя программа, которая никак не хочет работать, помогите пожалуйста.
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.12.2011, 15:39
Ответы с готовыми решениями:

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

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

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

Заполнение динамического двумерного массива
Всем доброго времени суток! Остро нуждаюсь в помощи, тк сил моих больше нет бороться с этой...

17
155 / 155 / 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
1 / 1 / 1
Регистрация: 02.04.2011
Сообщений: 99
04.12.2011, 15:56  [ТС] 3
А как тогда сделать, чтобы массив В входил в функцию как массив.
а переменная Н не нужна, так на всякий случай где пригодиться.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
04.12.2011, 16:07 4
Цитата Сообщение от _Edith Посмотреть сообщение
А как тогда сделать, чтобы массив В входил в функцию как массив.
C
1
void fun (int * B);
1
1 / 1 / 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
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
04.12.2011, 16:15 6
Цитата Сообщение от _Edith Посмотреть сообщение
int *B = new int *[M];
C++
1
int *B = new int [M];
1
1 / 1 / 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
1 / 1 / 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
1 / 1 / 1
Регистрация: 02.04.2011
Сообщений: 99
04.12.2011, 17:37  [ТС] 13
согласен=) программа работает отлично, но многое для меня не понятно, зачем нужна строка "system("chcp 1251");"? А также что означает sewt(3)?

И создание массивов не обычное для меня.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
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/refer... tors/setw/
1
1 / 1 / 1
Регистрация: 02.04.2011
Сообщений: 99
04.12.2011, 18:13  [ТС] 16
А в visial studio 2010 это работает? а то у меня не работает.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
04.12.2011, 18:34 17
_Edith,
C
1
setlocale( LC_ALL,"Russian" );
1
1 / 1 / 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.12.2011, 19:25
Помогаю со студенческими работами здесь

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

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

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

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


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

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