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

Определить произведение элементов в тех строках, которые не содержат отрицательных элементов; - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 42, средняя оценка - 4.67
instagib
122 / 85 / 3
Регистрация: 14.02.2011
Сообщений: 341
03.10.2011, 16:01     Определить произведение элементов в тех строках, которые не содержат отрицательных элементов; #1
Добрый день, уважаемые форумчане!

Не могу составить алгоритм с 2 частью задания.
Помогите советами или кодом. буду признателен. Заранее спасибо.

Вариант 4
Дана целочисленная квадратная матрица. Определить:
1) произведение элементов в тех строках, которые не содержат отрицательных элементов;
2) максимум среди сумм элементов диагоналей, параллельных главной диагонали матрицы.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.10.2011, 16:01     Определить произведение элементов в тех строках, которые не содержат отрицательных элементов;
Посмотрите здесь:

произведение элементов в тех строках, которые не содержат отрицательных элементов C++
C++ Дана целочисленная прямоугольная матрица. Определить произведение элементов в тех строках, которые не содержат отрицательных элементов
Произведение элементов в тех строках, которые не содержат отрицательных элементов C++
Определить произведение элементов в тех строках, которые не содержат отрицательных элементов C++
Двумерные массивы. Определить произведение элементов в тех строках, которые не содержат отрицательных элементов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
03.10.2011, 17:03     Определить произведение элементов в тех строках, которые не содержат отрицательных элементов; #2
Цитата Сообщение от instagib Посмотреть сообщение
Не могу составить алгоритм с 2 частью задания.
Помогите советами или кодом. буду признателен. Заранее спасибо.
Вот 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
51
52
53
54
55
56
57
#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <time.h>
 
using namespace std;
 
int main()
{
    int i,j,m,**arr;
    long mult = 1;
    long summ = 0;
    bool isNegative = false;//Флаг указывающий есть ли в строке отр элементы
    bool isAnyPosit = false;//Флаг указывающий на то что матрица содержит
                            //хотябы 1 - у строку в которой нет отрицательных
    do
    {
        mult = 1;//Произведение 1
        summ = 0;//Обнулили сумму
        srand(time(NULL));//Чтобі от итерации к итерации случ числа не повторялись
        std::cout<<"Enter num of elements : ";
        std::cin>>m;
        std::cout<<"\tInput matrix\r\n";
        arr = new int *[m];//Память под массив указателей под строки arr
        for(i = 0; i < m; i++)
        {
            isNegative = false;
            arr[i] = new int [m];
            for(j = 0; j < m; j++)
            {
                std::cout<<(arr[i][j] = rand()%100 - 50)<<" ";
                if(arr[i][j] <= 0)
                    isNegative = true;
            }
            if(!isNegative)
            {
                for(j = 0; j < m; j++)
                    mult *= arr[i][j];
                isAnyPosit = true;
            }
            std::cout<<"\r\n";
        }
        //Находим сумму элементов побочных диагоналей
        for(i = 0; i < m; i++)
        //Главную диагональ не учитываем
        for(j = i + 1; j < m - ((i == 0) ? 1 : 0); j++)
            summ += (arr[i][j] + arr[j][i]);
        if(isAnyPosit)
            std::cout<<"mult : "<<mult<<"\r\n";
        else
            std::cout<<"Matrix isn't contain Rows with all positive elements\r\n";
        std::cout<<"summ : "<<summ<<"\r\n";
        std::cout<<"Press Y for new input\r\n";
    }
    while(toupper(getch()) == 'Y');
    return 0;
}
Миниатюры
Определить произведение элементов в тех строках, которые не содержат отрицательных элементов;  
-=ЮрА=-
Заблокирован
Автор FAQ
03.10.2011, 17:12     Определить произведение элементов в тех строках, которые не содержат отрицательных элементов; #3
Поясню выбор элементов побочных диагоналей на примере матрицы 4х4
11 12 13 14
21 22 23 24
31 32 33 34
41 42 43 44

Элементы побочных диагоналей 12, 13, 23, 24, 34 и их зеркала т.е если i = j + 1 нам нужны все элементы кроме 14 (в первой строке -1), в єтих двух циклах и реализована указанная логика
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
//Находим сумму элементов побочных диагоналей
* * * * * * * * for(i = 0; i < m; i++)
* * * * * * * * //Главную диагональ не учитываем
* * * * * * * * for(j = i + 1; j < m - ((i == 0) ? 1 : 0); j++)
* * * * * * * * * * * * summ += (arr[i][j] + arr[j][i]);
instagib
122 / 85 / 3
Регистрация: 14.02.2011
Сообщений: 341
03.10.2011, 17:46  [ТС]     Определить произведение элементов в тех строках, которые не содержат отрицательных элементов; #4
-=ЮрА=-, благодарен за Ваше внимание, но Вы не внимательно прочитали условие 2 задания.
Нужно вывести не сумму(чего я и сам могу сделать) а МАКСИМУМ из сумм диагоналей.
т.е. найти сумму элементов одной диагонали, потом сравнить с другой суммой.и вывести диагональ у которой сумма элементов максимальна.

Добавлено через 2 минуты
-=ЮрА=-,

Не по теме:

к тому же параллельных к ГЛАВНОЙ диагонали...

-=ЮрА=-
03.10.2011, 17:51
  #5

Не по теме:

Цитата Сообщение от instagib Посмотреть сообщение
Не по теме:
к тому же параллельных к ГЛАВНОЙ диагонали...
- а я что делал?!Ну раз так тогда отписался от топика, не люблю когда помагаеь а тебе ещё язвят не разобравшись...

instagib
122 / 85 / 3
Регистрация: 14.02.2011
Сообщений: 341
03.10.2011, 20:24  [ТС]     Определить произведение элементов в тех строках, которые не содержат отрицательных элементов; #6
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Поясню выбор элементов побочных диагоналей на примере матрицы 4х4
11 12 13 14
21 22 23 24
31 32 33 34
41 42 43 44
диагонали парралельные главной называются:
12,23,34
21,32,43 -
и т.п.

Добавлено через 59 секунд
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Элементы побочных диагоналей 12, 13, 23, 24, 34 и их зеркала т.е если i = j + 1 нам нужны все элементы кроме 14 (в первой строке -1), в єтих двух циклах и реализована указанная логика
а это неверно.
Вот Вам пример:
матрица 3/3

2 5 -7
4 0 9
-2 7 10

в данном случае максимальной суммой элементов будет обладать диагональ 12,23 - 14; а не 21,32 - 11;

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

Не по теме:

topic up



Добавлено через 31 минуту
UP может кто-нить поможет...
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
03.10.2011, 21:18     Определить произведение элементов в тех строках, которые не содержат отрицательных элементов; #7
ответ на п.2
считаются диагонали от короткой к длинной. т.е. сначала 2 самых коротких, 2 диагонали на 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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE    5
 
int main(){
    int matr[SIZE][SIZE], i, k, max = -1000000, sum = 0, iter, tmp_size;
 
    srand(time(NULL));
 
    for (i = 0; i < SIZE; ++i)
        for (k = 0; k < SIZE; ++k)
            matr[i][k] = rand() % SIZE + 1;
 
    printf("\n\n");
    for (i = 0; i < SIZE; ++i){
        for (k = 0; k < SIZE; ++k)
            printf(" %d", matr[i][k]);
        printf("\n");
    }
 
    tmp_size = 2;
    iter = SIZE - 2;
    printf("\n");
 
    while(iter){
 
        for(i = 0, k = iter; i < tmp_size; ++i, ++k)
            sum += matr[i][k];
        if (max < sum) max = sum;
        printf(" %d", sum);
 
        sum = 0;
 
        for(i = 0, k = iter; i < tmp_size; ++i, ++k)
            sum += matr[k][i];
        if (max < sum) max = sum;
        printf(" %d", sum);
 
        sum = 0;
 
        ++tmp_size; --iter;
        printf("\n");
    }
    printf("maximum =  %d\n", max);
    return 0;
}
консоль
3 3 3 1 5
2 4 3 1 4
5 4 5 1 5
4 1 4 3 2
1 5 1 2 3

5 9
9 7
9 12
maximum = 12
instagib
122 / 85 / 3
Регистрация: 14.02.2011
Сообщений: 341
03.10.2011, 21:48  [ТС]     Определить произведение элементов в тех строках, которые не содержат отрицательных элементов; #8
alkagolik, На Отлично! Огромное спасибо..сейчас буду разбирать!!!!

Добавлено через 8 минут
Цитата Сообщение от alkagolik Посмотреть сообщение
tmp_size = 2;
* * iter = SIZE - 2;
Цитата Сообщение от alkagolik Посмотреть сообщение
while(iter){
for(i = 0, k = iter; i < tmp_size; ++i, ++k)
* * * * * * sum += matr[i][k];
* * * * if (max < sum) max = sum;
* * * * printf(" %d", sum);
sum = 0;
for(i = 0, k = iter; i < tmp_size; ++i, ++k)
* * * * * * sum += matr[k][i];
* * * * if (max < sum) max = sum;
* * * * printf(" %d", sum);
sum = 0;
++tmp_size; --iter;
* * * * printf("\n");
* * }
если объясните в вкратце для чего 2 переменные и что происходит в цикле - Цены вам нет.
просто списать можно..но в башке пусто будет
alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
03.10.2011, 22:28     Определить произведение элементов в тех строках, которые не содержат отрицательных элементов; #9
Цитата Сообщение от instagib Посмотреть сообщение
если объясните в вкратце для чего 2 переменные и что происходит в цикле - Цены вам нет.
просто списать можно..но в башке пусто будет
переменные
tmp_size - длина самой короткой побочной диагонали. изначально равна 2 как самая короткая для любой матрицы "больше" чем 2х2. с каждым проходом цикла while() увеличивается на 1.
iter = SIZE - 2 номер "стартового" (для подсчета) столбца нулевой строки в первом цикле for() и "стартовой" строки для нулевого столбца во втором цикле for(). уменьшается на 1 в цикле while для захвата элементов более длинных диагоналей
цикл
Код
for(i = 0, k = iter; i < tmp_size; ++i, ++k)
тут все просто первым идет элемент матрицы arr[0][iter]. с помощью инкремента сразу двух индексов ("i" и "k") мы перемещаемся на элемент строки + 1 и элемент столбца + 1. т.е. прямо по диагонали до тех пор, пока не исчерпана длина диагонали tmp_size.
Точно так же и во втором цикле for() за исключением того, что индексы строк и столбцов заменены между собой. Таким образом после каждого прохода по циклу for() мы проверяем значение sum с имеющимся маскимумом... тут думаю все понятно.
Дальше мы увеличиваем размер диагонали на 1, а "стартовый" индекс iter уменьшаем на 1 и так до тех пор, пока iter не равен 0.
Вам будет еще проще разобрать, если нарисуете матрицу 4х4 и пошагово с ручкой и тетрадкой разберете код программы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.10.2011, 15:11     Определить произведение элементов в тех строках, которые не содержат отрицательных элементов;
Еще ссылки по теме:

C++ Опередить произведение элементов в тех строках матрицы, которые не содержат отрицательных элементов
C++ Найти произведение элементов в тех строках матрицы, которые не содержат отрицательных элементов

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

Или воспользуйтесь поиском по форуму:
instagib
122 / 85 / 3
Регистрация: 14.02.2011
Сообщений: 341
04.10.2011, 15:11  [ТС]     Определить произведение элементов в тех строках, которые не содержат отрицательных элементов; #10
alkagolik, огромное спасибо. зачет я все понял
Yandex
Объявления
04.10.2011, 15:11     Определить произведение элементов в тех строках, которые не содержат отрицательных элементов;
Ответ Создать тему
Опции темы

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