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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
brenor01
2 / 2 / 1
Регистрация: 15.01.2010
Сообщений: 98
#1

Матрица - C++

23.06.2010, 21:32. Просмотров 557. Ответов 10
Метки нет (Все метки)

Найти произведение отрицательных нечетных чисел побочной диагонали матрицы.
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 <vcl.h>
#include <conio.h>
#include <iostream.h>
#include <stdlib.h>
#pragma hdrstop
 
//---------------------------------------------------------------------------
 
#pragma argsused
int main(int argc, char* argv[])
{clrscr();
const n=5;
int a[n][n],s1=0,s2=0,max,k=0; int i,j;
cout <<"\n Massiv A:";
randomize;
for (i=0;i<n;i++)
{for (j=0;j<n;j++)
{a[i][j]=random (80)-20;
cout <<a[i][j];
}
cout<<"\n";
}
if (i==j && a[i][j]>0) k+=a[i][j];
cout<<"\n k="<<k;
getch();
        return 0;
}
//---------------------------------------------------------------------------

Что неправильно... Должно находить : Найти количество положительных четных чисел главной диагонали матрицы.

Добавлено через 1 час 20 минут
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
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include <conio.h>
#include <iostream.h>
#include <stdlib.h>
#pragma hdrstop
 
//---------------------------------------------------------------------------
 
#pragma argsused
int main(int argc, char* argv[])
{
clrscr();
const n=5;
int a[n][n],P=1;
int i,j;
cout <<"\n Massiv A:\n";
randomize;
for (i=0;i<n;i++)
{
    for (j=0;j<n;j++)
        {
        a[i][j]=random (80)-20;
        cout<<" "<<a[i][j];
                if (i+j==n-1 && a[i][j]<0 && a[i][j]%2!=0) P*=a[i][j];
 
                }
    cout<<"\n";
 
 
}
 
cout<<"\n P="<<P;
getch();
        return 0;
}
решил другую задачу... вроед решает правильно, но матрица постоянно одинакова... Разбберитесь
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.06.2010, 21:32     Матрица
Посмотрите здесь:

матрица с++ C++
Матрица C++
C++ Матрица
C++ Матрица
матрица C++
матрица А+В C++
C++ С++ МАТРИЦА
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
24.06.2010, 05:21     Матрица #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
44
45
46
47
48
49
50
//---------------------------------------------------------------------------
#include <iostream>
#include <ctime>
#include <vcl>
#pragma hdrstop
 
using namespace std;
//---------------------------------------------------------------------------
 
#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
    int **A, m, n, p=1, Num=0;
    cout <<"Rows: ";
    cin >>m;
    cout <<"Cols: ";
    cin >>n;
    cout <<endl;
    A=new int*[m];
    for (int i=0; i<m; i++) A[i]=new int[n];
 
    //Случайные целые числа в диапазоне [-100, 100].
    srand (time(NULL));
    for (int i=0; i<m; i++) {
        for (int j=0; j<n; j++) {
            A[i][j]=(rand()%401-200);
            cout <<A[i][j]<<'\t';
      }
        cout <<endl;
    }
 
 
    for (int i=0, j=n-1; j!=-1; i++, j--) {
        if (A[i][j]<0 && A[i][j]%2!=0) p=p*A[i][j];
    }
 
    cout <<"\nP="<<p<<endl;
 
    //Расчет количества целых положительных на главной диагонали.
    for (int i=0, j=0; i<m || j<n; i++, j++) {
        if (A[i][j]>0 && A[i][j]%2==0) Num++;
    }
    cout <<"Num="<<Num<<endl;
 
    for (int j=0; j<n; j++) delete []A[j];
    delete []A;
    system ("pause");
    return 0;
}
//---------------------------------------------------------------------------
Попытался сделать, матрица заполнялась случайными числами. С расчетом количества положительных четных на главной диагонали получилось, а вот с отрицательными нечетными на побочной нет. Долго мучился, но увы. Он, проклятый, упорно оставляет мне p==1. Если найдете ошибку вы или кто-то другой, то я буду только рад. Но сам уже и так и эдак. Нужен свежий глаз.
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
24.06.2010, 09:42     Матрица #3
"он, проклятый, упорно оставляет мне p==1. Если найдете ошибку вы или кто-то другой, то я буду только рад. Но сам уже и так и эдак. Нужен свежий глаз"
Просто у вас изначально p при инициализации присваивается 1, и если не будет отрицательных нечетных чисел, значение p у вас не изменится (выведет равное 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
#include <iostream>
#include <ctime>
//#include <vcl>
#pragma hdrstop
 
using namespace std;
//---------------------------------------------------------------------------
 
#pragma argsused
int main()
{
    int **A, m, n, p=1, Num=0, i, j;
    bool flag=false;
    cout <<"Rows: ";
    cin >>m;
    cout <<"Cols: ";
    cin >>n;
    cout <<endl;
    A=new int*[m];
    for (int i=0; i<m; i++) A[i]=new int[n];
 
    //Случайные целые числа в диапазоне [-100, 100].
    srand (time(NULL));
    for (int i=0; i<m; i++) {
        for (int j=0; j<n; j++) {
            A[i][j]=(rand()%401-200);
            cout <<A[i][j]<<'\t';
      }
        cout <<endl;
    }
    //произведение отрицательных нечетных чисел побочной диагонали матрицы.
    for (i=0, j=n-1; i<m && j>=0; i++, j--)
    {
        if (A[i][j]<0 && A[i][j]%2!=0)
        {
            flag=true;
            p*=A[i][j];
        }
    }
    if (!flag)
        p=0;
 
    cout <<"\nP="<<p<<endl;
 
    //Расчет количества целых положительных на главной диагонали.
    for (i=0, j=0; i<m && j<n; i++, j++) 
    {
        if (A[i][j]>0 && A[i][j]%2==0)
            Num++;
    }
    cout <<"Num="<<Num<<endl;
 
    for (j=0; j<m; j++)
        delete []A[j];
    delete []A;
    system ("pause");
    return 0;
}
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
24.06.2010, 17:33     Матрица #4
NNN777, мы с вами не учли, что матрица-то квадратная. Так что переменная m не нужна в принципе. И произведение элементов тоже без ошибок у меня, сейчас проверял.

brenor01, держите код.
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
//---------------------------------------------------------------------------
#include <iostream>
#include <ctime>
#include <vcl>
#pragma hdrstop
 
using namespace std;
//---------------------------------------------------------------------------
 
#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
    int **A, n, p=1, Num=0;
    cout <<"Dimension: ";
    cin >>n;
    cout <<endl;
    A=new int*[n];
    for (int i=0; i<n; i++) A[i]=new int[n];
 
    //Случайные целые числа в диапазоне [-100, 100].
 
    srand (time(NULL));
    for (int i=0; i<n; i++) {
        for (int j=0; j<n; j++) {
        A[i][j]=(rand()%401-200);
        cout <<A[i][j]<<'\t';
      }
    cout <<endl;
    }
 
    for (int i=0, j=n-1; j!=-1; i++, j--) {
        if (A[i][j]<0 && A[i][j]%2!=0) p=p*A[i][j];
    }
 
    cout <<"\nP="<<p<<endl;
 
    //Расчет количества целых положительных на главной диагонали.
    for (int i=0, j=0; i<n || j<n; i++, j++) {
        if (A[i][j]>0 && A[i][j]%2==0) Num++;
    }
    cout <<"Num="<<Num<<endl;
 
    for (int j=0; j<n; j++) delete []A[j];
    delete []A;
    system ("pause");
    return 0;
}
//---------------------------------------------------------------------------
NNN777
299 / 157 / 19
Регистрация: 27.02.2010
Сообщений: 317
24.06.2010, 17:45     Матрица #5
Red Planet, в задании не написано, что матрица квадратная, только в программе
brenor01 можно это рассмотреть)). Но суть-то не в этом, в вашей программе, если не будет ни одного отрицательного нечетного числа побочной диагонали матрицы, то произведение все равно будет равно 1, хотя оно, по идее, должно быть равно 0. А если будут такаие числа, то все правильно считает, хотя не понятно, почему граница j!=-1... не все выходы из цикла продуманы.
это
C++
1
i<n || j<n
тоже смущает, оба эти условия должны строго выполняться
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
24.06.2010, 18:47     Матрица #6
Цитата Сообщение от NNN777 Посмотреть сообщение
Red Planet, в задании не написано, что матрица квадратная
Если логически подумать, то главную диагональ можно провести лишь у квадратной матрицы. Как вы проведете у матрицы произвольной размерности?

Цитата Сообщение от NNN777 Посмотреть сообщение
если не будет ни одного отрицательного нечетного числа побочной диагонали матрицы, то произведение все равно будет равно 1, хотя оно, по идее, должно быть равно 0
Тоже думал над этим, но, мне кажется, это чисто философский вопрос, чему оно должно быть равно изначально: единице ли, нулю ли или еще Бог знает чему.

Цитата Сообщение от NNN777 Посмотреть сообщение
почему граница j!=-1... не все выходы из цикла продуманы.
В случае с квадратной матрицей все выходы продуманы: конец будет тогда, когда достигнем j==0 (левый столбец) или же тогда, когда достигнем последней строки. А эти два события произойдут в случае квадратной матрицы одновременно. Так что можно выбрать любое условие из этих двух.

Цитата Сообщение от NNN777 Посмотреть сообщение
i<n || j<n
тоже смущает, оба эти условия должны строго выполняться
То же самое, что и в предыдущем случае: конец по строкам и конец по столбцам достигаются одновременно. Поэтому еще лучше будет так.
C++
1
2
3
for (int i=0, j=0; i<n; i++, j++) {
        if (A[i][j]>0 && A[i][j]%2==0) Num++;
    }
Scythian
58 / 58 / 8
Регистрация: 01.01.2010
Сообщений: 222
24.06.2010, 21:09     Матрица #7
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 <iostream.h>
#include <conio.h>
#include <vcl>
#pragma hdrstop
 
using namespace std;
//---------------------------------------------------------------------------
 
#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
    int **A, m, n, p=1, Num=0;
    cout <<"Rows: ";
    cin >>m;
    cout <<"Cols: ";
    cin >>n;
    cout <<endl;
    A=new int*[m];
    for (int i=0; i<m; i++)
     A[i]=new int[n];
 
    //Случайные целые числа в диапазоне [-100, 100].
    srand (time(NULL));
    for (int i=0; i<m; i++)
    {
        for (int j=0; j<n; j++)
        {
            A[i][j]=(rand()%401-200);
            cout <<A[i][j]<<'\t';
        }
        cout <<endl;
    }
 
 
    for (int i=0;i<m ;i++)
        if (A[i][(m-1)-i]<0 && A[i][(m-1)-i]%2!=0)
                p*=A[i][(m-1)-i];
    cout<<"\nP= "<<p<<endl;
   getch();
    return 0;
}
//---------------------------------------------------------------------------
Вот вроде бы работает
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
25.06.2010, 11:35     Матрица #8
brenor01, вам теперь даже выбрать можно между моей программой и программой Scythian'а. На ваше усмотрение.
Хохол
Эксперт C++
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
25.06.2010, 11:40     Матрица #9
Цитата Сообщение от Red Planet Посмотреть сообщение
Цитата Сообщение от NNN777 Посмотреть сообщение
если не будет ни одного отрицательного нечетного числа побочной диагонали матрицы, то произведение все равно будет равно 1, хотя оно, по идее, должно быть равно 0
Тоже думал над этим, но, мне кажется, это чисто философский вопрос, чему оно должно быть равно изначально: единице ли, нулю ли или еще Бог знает чему.

Общепринято, что произведение нулевого количества множителей есть единица, так же как сумма нулевого количества слагаемых - ноль.
Red Planet
49 / 10 / 2
Регистрация: 20.09.2009
Сообщений: 263
25.06.2010, 13:09     Матрица #10
Хохол, значит и менять мне в программе ничего не нужно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2010, 13:15     Матрица
Еще ссылки по теме:

матрица C++
C++ Матрица
Матрица N*N C++
C++ Матрица
Матрица C++

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

Или воспользуйтесь поиском по форуму:
Хохол
Эксперт C++
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
25.06.2010, 13:15     Матрица #11
Именно.
Yandex
Объявления
25.06.2010, 13:15     Матрица
Ответ Создать тему
Опции темы

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