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

Ввод числа строк и столбцов в матрицах - C++

Восстановить пароль Регистрация
 
b0n4b
2 / 2 / 0
Регистрация: 16.11.2011
Сообщений: 100
18.11.2011, 11:36     Ввод числа строк и столбцов в матрицах #1
Вот наконец-то с вашей помощью дописал программу, которая перемножает 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
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
int main (void)
{
    const int n=3, m=3, k=3;
    int a[n][m];
    int b[m][k];
    int c[n][k]; 
    int i=0, j=0, z=0;
 
    printf ("BBeguTe Matrix A (BHuMAHuE! Pa3Mep Matrix A %dx%d):\n", n, m);
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
        scanf("%d", &a[i][j]);
    }       
    printf ("\nBBeguTe Matrix B (BHuMAHuE! Pa3Mep Matrix B %dx%d):\n", m, k);
    for(i=0; i<n; i++)
    {
        for(j=0; j<n; j++)
        scanf("%d", &b[i][j]);
    }       
    for (i=0; i<n; i++)
    {
        for (j=0; j<n; j++)
        { 
            c[i][j]=0;
            for (z=0; z<m; z++)
            c[i][j]+=a[i][z]*b[z][j];
        }
    }
    printf ("\nMatrix C:\n");
    for (i=0;i<n;i++)
    {
        for (j=0; j<k; j++)
        printf ("%d ", c[i][j]);
        printf ("\n");
    }
    getch ();
    return 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
#include <iostream>
#include <ctime>
#include <iomanip>
 
using namespace std;
 
int main()
{
            srand(static_cast<int>(time(NULL)));
        int **mat;
                int M,N;
                cout<<"Enter M -> ";
                cin>>M;
                mat=new int*[M];
                cout<<"Enter N -> ";
        cin>>N;
                cout<<endl<<"Matrix: "<<endl;
                  for(int i=0; i<M; i++)
                  {
                          mat[i]=new int[N];
                           for(int j=0; j<N; j++)
                           {
                              mat[i][j]=rand()%80;
                              cout<<setw(4)<<mat[i][j]<<setw(4);
                           }
             cout<<endl;
                  }
                  cout<<endl<<"Transposed matrix:"<<endl;
        for(int j=0; j<N; j++)
                  {
                           for(int i=0; i<M; i++)
                           {
                                cout<<setw(4)<<mat[i][j]<<setw(4);
                           }
             cout<<endl;
                  }
             system("pause");
                for(int i=0; i<M; i++)
                   delete mat[i]; 
                       delete [] mat;
             return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
amor1k
Студент
 Аватар для amor1k
147 / 147 / 24
Регистрация: 18.01.2011
Сообщений: 469
18.11.2011, 12:53     Ввод числа строк и столбцов в матрицах #2
так возьмите код с тем вводом и вставьте себе. Если какие то ошибки, пишите сюда
b0n4b
2 / 2 / 0
Регистрация: 16.11.2011
Сообщений: 100
18.11.2011, 21:17  [ТС]     Ввод числа строк и столбцов в матрицах #3
Мне не совсем понятно, что означают 10, 14 и 20 строки.
Я не в разумею что значит *mat, mat=new int*[M], mat[i]=new int[N]

А так же не совсем понятна строка
C++
1
using namespace std
Exeil
 Аватар для Exeil
5 / 5 / 1
Регистрация: 06.12.2010
Сообщений: 50
18.11.2011, 21:39     Ввод числа строк и столбцов в матрицах #4
Цитата Сообщение от b0n4b Посмотреть сообщение
Мне не совсем понятно, что означают 10, 14 и 20 строки.
Я не в разумею что значит *mat, mat=new int*[M], mat[i]=new int[N]
mat - просто указатель на адрес памяти а *mat - само значение этой области вот например
int a = 3; //переменная
int *b; //указатель

//сейчас указатель равен NULL
b = &a; //амперсент позволяет получить адрес, и в указателе b теперь адрес этой переменной
//а *b это уже само значение адреса то-есть три

а оператор new выделяет память под данные, типа задается после него.
mat=new int*[M] - выделяем динамически массив указателей, массив длины M
mat[i]=new int[N] - выделяем память под просто массив длины N


Цитата Сообщение от b0n4b Посмотреть сообщение
А так же не совсем понятна строка
C++
1
using namespace std
это позволяет не вводить все время именованную область std::
ну например тип строка std::String name; если вписать эту строку уже можно будит
объявить её так: String name;
а std это библиотека шаблонов
b0n4b
2 / 2 / 0
Регистрация: 16.11.2011
Сообщений: 100
18.11.2011, 21:40  [ТС]     Ввод числа строк и столбцов в матрицах #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
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
int main (void)
{
        const int n=2, m=2, k=2;
        printf ("BBeguTe n ");
        scanf ("%d", &n);
        printf ("BBeguTe m ");
        scanf ("%d", &m);
        printf ("BBeguTe k ");
        scanf ("%d", &k);
        new const int n, m, k;
        int a[n][m];
        int b[m][k];
        int c[n][k]; 
        int i=0, j=0, z=0;
 
        printf ("BBeguTe Matrix A (BHuMAHuE! Pa3Mep Matrix A %dx%d):\n", n, m);
        for(i=0; i<n; i++)
        {
                for(j=0; j<n; j++)
                scanf("%d", &a[i][j]);
        }       
        printf ("\nBBeguTe Matrix B (BHuMAHuE! Pa3Mep Matrix B %dx%d):\n", m, k);
        for(i=0; i<n; i++)
        {
                for(j=0; j<n; j++)
                scanf("%d", &b[i][j]);
        }       
        for (i=0; i<n; i++)
        {
                for (j=0; j<n; j++)
                { 
                        c[i][j]=0;
                        for (z=0; z<m; z++)
                        c[i][j]+=a[i][z]*b[z][j];
                }
        }
        printf ("\nMatrix C:\n");
        for (i=0;i<n;i++)
        {
                for (j=0; j<k; j++)
                printf ("%d ", c[i][j]);
                printf ("\n");
        }
        getch ();
        return 1;
}
Выдаёт какую-то ошибку... Ну знаю в чём ошибка =(
Exeil
 Аватар для Exeil
5 / 5 / 1
Регистрация: 06.12.2010
Сообщений: 50
18.11.2011, 21:45     Ввод числа строк и столбцов в матрицах #6
Цитата Сообщение от b0n4b Посмотреть сообщение
У меня получается вот такой код
C++
1
new const int n, m, k;
1. Это что такое, зачем тут new
этот оператор нужен только для выделения памяти
а здесь он лишний

2. а у вас уже определены такие переменные
-comrade-
355 / 356 / 42
Регистрация: 11.06.2010
Сообщений: 703
18.11.2011, 21:47     Ввод числа строк и столбцов в матрицах #7
b0n4b, зачем вам это?
C++
1
new const int n, m, k;
b0n4b
2 / 2 / 0
Регистрация: 16.11.2011
Сообщений: 100
18.11.2011, 21:49  [ТС]     Ввод числа строк и столбцов в матрицах #8
Вообще, даже не знаю как ещё пробовать... Без
C++
1
new
вылетает 6 ошибок...
Exeil
 Аватар для Exeil
5 / 5 / 1
Регистрация: 06.12.2010
Сообщений: 50
18.11.2011, 21:50     Ввод числа строк и столбцов в матрицах #9
Цитата Сообщение от b0n4b Посмотреть сообщение
Вообще, даже не знаю как ещё пробовать... Без
C++
1
new
вылетает 6 ошибок...
3. объявляя эти переменные как константы const вы не сможете больше их изменить, а вы в них пытаетесь записать

4. Нельзя статически определять размерность массива "int a[n][m];" почитайте про динамическое выделение памяти

как то так:
C++
1
2
3
4
int** a, i;
a = new int*[n]; //выделяем массив указателей
for(i = 0; i < n; i++)
        a[k] = new int[m]; //и в каждом указателе массива указателей создаем массив
b0n4b
2 / 2 / 0
Регистрация: 16.11.2011
Сообщений: 100
18.11.2011, 21:51  [ТС]     Ввод числа строк и столбцов в матрицах #10
Цитата Сообщение от Exeil Посмотреть сообщение
2. а у вас уже определены такие переменные
Мне их надо определить в работающей программе.
У меня не получается присвоить им новые значения

Добавлено через 1 минуту
Цитата Сообщение от Exeil Посмотреть сообщение
3. объявляя эти переменные как константы const вы не сможете больше их изменить, а вы в них пытаетесь записать
Без const программа отказывается работать
Exeil
 Аватар для Exeil
5 / 5 / 1
Регистрация: 06.12.2010
Сообщений: 50
18.11.2011, 22:16     Ввод числа строк и столбцов в матрицах #11
Цитата Сообщение от b0n4b Посмотреть сообщение
Мне их надо определить в работающей программе.
У меня не получается присвоить им новые значения

Добавлено через 1 минуту


Без const программа отказывается работать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        int n=2, m=2, k=2, i=0, j=0, z=0;
        printf ("BBeguTe n ");
                scanf ("%d", &n);
        printf ("BBeguTe m ");
                scanf ("%d", &m);
        printf ("BBeguTe k ");
                scanf ("%d", &k);
 
        int **a, **b, **c;
 
        //создаем массив указателей
        a = new int*[n];
        b = new int*[m];
        c = new int*[n];
 
        //выделяем память
        for(i = 0; i < n; i++)
            a[k] = new int[m]; 
        for(i = 0; i < m; i++)
            b[k] = new int[k]; 
        for(i = 0; i < n; i++)
            c[k] = new int[k];
попробуй так


C++
1
2
3
4
5
 for(i=0; i<n; i++) //у тебя массив не квадратный
        {
                for(j=0; j<n; j++) //так почему везде до n
                scanf("%d", &b[i][j]);
        }
у тебя еще и тут ошибки

Добавлено через 12 минут
Цитата Сообщение от Exeil Посмотреть сообщение
C++
1
2
3
4
5
6
for(i = 0; i < n; i++)
            a[k] = new int[m]; 
        for(i = 0; i < m; i++)
            b[k] = new int[k]; 
        for(i = 0; i < n; i++)
            c[k] = new int[k];
ой) немного не так тут

Цитата Сообщение от Exeil Посмотреть сообщение
C++
1
2
3
4
5
6
for(i = 0; i < n; i++)
            a[i] = new int[m]; 
        for(i = 0; i < m; i++)
            b[i] = new int[k]; 
        for(i = 0; i < n; i++)
            c[i] = new int[k];
b0n4b
2 / 2 / 0
Регистрация: 16.11.2011
Сообщений: 100
18.11.2011, 22:41  [ТС]     Ввод числа строк и столбцов в матрицах #12
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
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
int main (void)
{
        const int n=2, m=2, k=2;
        int a[n][m];
        int b[m][k];
        int c[n][k]; 
        int i=0, j=0, z=0;
 
        printf ("BBeguTe Matrix A (BHuMAHuE! Pa3Mep Matrix A %dx%d):\n", n, m);
        for(i=0; i<n; i++)
        {
                for(j=0; j<m; j++)
                scanf("%d", &a[i][j]);
        }       
        printf ("\nBBeguTe Matrix B (BHuMAHuE! Pa3Mep Matrix B %dx%d):\n", m, k);
        for(i=0; i<m; i++)
        {
                for(j=0; j<k; j++)
                scanf("%d", &b[i][j]);
        }       
        for (i=0; i<n; i++)
        {
                for (j=0; j<k; j++)
                { 
                        c[i][j]=0;
                        for (z=0; z<m; z++)
                        c[i][j]+=a[i][z]*b[z][j];
                }
        }
        printf ("\nMatrix C:\n");
        for (i=0;i<n;i++)
        {
                for (j=0; j<k; j++)
                printf ("%d ", c[i][j]);
                printf ("\n");
        }
        getch ();
        return 1;
}
Вот исправил ошибки.. Пробовал
Цитата Сообщение от Exeil Посмотреть сообщение
Код C++
int n=2, m=2, k=2, i=0, j=0, z=0;
printf ("BBeguTe n ");
scanf ("%d", &n);
printf ("BBeguTe m ");
scanf ("%d", &m);
printf ("BBeguTe k ");
scanf ("%d", &k);
int **a, **b, **c;
//создаем массив указателей
a = new int*[n];
b = new int*[m];
c = new int*[n];
//выделяем память
for(i = 0; i < n; i++)
a[k] = new int[m];
for(i = 0; i < m; i++)
b[k] = new int[k];
for(i = 0; i < n; i++)
c[k] = new int[k];
попробуй так
Всё равно вылетают ошибки

Добавлено через 3 минуты
Цитата Сообщение от Exeil Посмотреть сообщение
ой) немного не так тут
Цитата Сообщение от Exeil Посмотреть сообщение
Код C++
for(i = 0; i < n; i++)
a[i] = new int[m];
for(i = 0; i < m; i++)
b[i] = new int[k];
for(i = 0; i < n; i++)
c[i] = new int[k];
Спасибо Вам большое)) Заработало))
Очень благодарен))

Добавлено через 9 минут
Exeil, не могли бы объяснить некоторые моменты?))
C++
1
int **a, **b, **c;
Что означает эта строка?
C++
1
2
3
a = new int*[n];
b = new int*[m];
c = new int*[n];
Для чего создаётся этот массив?

C++
1
2
3
4
5
6
                for(i = 0; i < n; i++)
                        a[i] = new int[m]; 
                for(i = 0; i < m; i++)
                        b[i] = new int[k]; 
                for(i = 0; i < n; i++)
                        c[i] = new int[k];
Для чего он нужен и что он делает этот цикл?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2011, 08:02     Ввод числа строк и столбцов в матрицах
Еще ссылки по теме:

Ввод чисел через пробел до определеного числа,убрать оставшиеся числа C++
C++ Удаление строк и столбцов массива
Ввод неограниченного числа строк C++

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

Или воспользуйтесь поиском по форуму:
Exeil
 Аватар для Exeil
5 / 5 / 1
Регистрация: 06.12.2010
Сообщений: 50
19.11.2011, 08:02     Ввод числа строк и столбцов в матрицах #13
почитай про динамическую память, эти циклы выделяют массивы и записывают их адреса в указатели
Yandex
Объявления
19.11.2011, 08:02     Ввод числа строк и столбцов в матрицах
Ответ Создать тему
Опции темы

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