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

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

Войти
Регистрация
Восстановить пароль
 
doomer74
1 / 1 / 0
Регистрация: 01.12.2011
Сообщений: 51
#1

Объясните задачу. Квадратная матрица - C++

25.03.2012, 10:23. Просмотров 426. Ответов 8
Метки нет (Все метки)

Дaна дeйствительная квадрaтная матpица порядка N (N - констaнта). Вычислить сyммy тех из ee элемeнтов, расположенных на главной диагонали и выше нее, которые превосходят по величине все ее элементы, расположенные ниже главной диагонали. Если на главной диагонали и вышe нет элементов с укaзaнным свойством, то отвeтом дoлжнo слyжить сooбщение oб этoм.

Помогите мне, пожалуйста, разобраться с условие задачи. Мне здесь уже помогли с написанием кода программы, но я все равно не могу понять, как она работает.
Объясните мне на конкретном примере, очень буду благодарен!

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
#include <stdio.h>
#include <conio.h>
#include <clocale>
#define N 5 // задаем константу N, равную размерности матрицы
 
int main () 
{
    setlocale(LC_ALL, "Russian");
    
    int i, j ,k = 0, l = 0, A[N][N], sum = 0, flag; // i,j,k,l - счетчики; A[N][N] - массив; sum - сумма; flag - флаг
    
    printf(" Размерность матрицы = %d x %d \n",N,N); 
    printf(" Введите элементы матрицы a[i][j], где i - номер строки, j - номер столбца:\n\n");
 
    for (i=0; i<N; i++) 
    {
        for (j=0; j<N; j++) 
        {
            printf(" a [%d] [%d] = ",i+1,j+1);
            scanf ("%d",&A[i][j]);
        }
    } // циклы, в которых вводятся элементы массива
 
    printf("\n"); // отступ после ввода элементов перед выводом матрицы на экран
    
    for (i=0; i<N; i++) 
    {
        for (j=0; j<N; j++) 
            {
            printf ("%7d",A[i][j]);
            }
        printf ("\n\n");
    } // циклы, в которых выводится на экран введенная матрица
 
    for (k=0; k<N; k++) {
        for (l=k; l<N; l++) // два цикла, в которых значения счетчиков - номера элементов главной диагонали и выше
            for (i=1; i<N; i++) {
                for (j=1; j<i+1; j++) // два цикла, в которых значения счетчиков - номера элементов ниже главной диагонали
                    if (A[i][j]<A[k][l]) flag=1;
                       else {
                            flag=0; 
                            break;
                            } 
// Сравниваем элемент главной диагонали (или выше) с элементом ниже главной диагонали. Если он больше - то поднимаем флаг, если меньше - опускаем.
// В итоге мы сравним КАЖДЫЙ элемент главной диагонали и выше с КАЖДЫМ элементом ниже диагонали. 
// Если элемент главной диагонали будет больше,чем каждый элемент снизу, то флаг так и останется поднятым. Если же он будет меньше, то мы его опускаем, и прекращаем цикл по j.
            if (flag==0) break; // Если флаг опущен, то мы прекращаем цикл по i. Переходим к следующему элементу главной диагонали и выше.
            }
    if (flag) sum+=A[k][l]; // Если же флаг поднять, то мы прибавляем значение этого элемента к искомой сумме.
    }
    if (sum==0) // Если сумма равна нулю, то мы печатаем что таких элементов нет, ждём нажатия любой клавиши, и прекращаем программу соответственно.
    { 
               printf (" Матрица не содержит элементов с заданным свойством");
               getch();
               return 0;
    }
    printf ("Сумма = %d",sum); // Если же сумма отлична от нуля, то мы печатаем её и завершаем программу.
    getch();
    return 0; 
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.03.2012, 10:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Объясните задачу. Квадратная матрица (C++):

Объясните задачу - C++
Не могу понять задачку, объясните пожалуйста.

Объясните задачу пожалуйста - C++
#include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;string.h&gt; #include &lt;conio.h&gt; void main(void) { char str; int Word =...

Объясните пожалуйста задачу - C++
имеется задача: Разработать объектно-ориентированную программу для деления дроби на целое число. Оба операнда должны передаваться ей...

Указатели, объясните задачу - C++
Объясните 4 пункт, желательно с примером.

Объясните пожалуйста задачу (комментарии) - C++
Можно комментарии с того места, что ниже выделила. Просто не знаю как объяснить, помогите! void Vvod (char *p, int x, int y) ...

Объясните задачу с циклами плз. - C++
Добрый день. Недавно начал читать учебник по С++ Стенли Липпмана Вводный курс 4-е издание. И одно из заданий никак не получается сделать....

8
panicwassano
592 / 560 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
25.03.2012, 10:25 #2
у вас же в коментариях все написано, не?
0
doomer74
1 / 1 / 0
Регистрация: 01.12.2011
Сообщений: 51
25.03.2012, 10:55  [ТС] #3
В том-то и дело, что я не могу разобраться, что требуется. Ну например, ввожу такую матрицу:
6 7 8 9 4
3 2 5 6 4
1 2 3 7 6
5 4 3 6 7
2 3 4 5 6

Выводит значение суммы, равное двум. Почему? Объясните, пожалуйста на конкретном примере.

Добавлено через 22 минуты
6, 2, 3, 6, 6 - главная диагональ. значит, сравниваем элементы, которые находятся в ней и над ней с элементами ниже, но КАК это происходит и почему сумма равна двум, не могу понять.
0
Байт
Эксперт C
16134 / 10412 / 1549
Регистрация: 24.12.2010
Сообщений: 19,713
25.03.2012, 11:01 #4
doomer74, Алгоритм можно сильно упростить. Сначала найти максимальный элемент ниже диагонали. А потом икать и суммировать те элементы, которые больше этого максимума.
1
doomer74
1 / 1 / 0
Регистрация: 01.12.2011
Сообщений: 51
25.03.2012, 11:04  [ТС] #5
Спасибо. Точно ведь. Сколько я ни пытаюсь прорешать эту матрицу, никак не выходит сумма 2. Видимо, неправильно работает программа. Насчет максимума классно. Но я туплю жестоко, может кто-нибудь помочь с алгоритмом?
0
zss
Модератор
Эксперт С++
6400 / 5966 / 1943
Регистрация: 18.12.2011
Сообщений: 15,357
Завершенные тесты: 1
25.03.2012, 11:07 #6
Думаю, что задание не совсем правильно понято.
По условию задачи надо
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
44
45
46
47
48
49
50
#include <stdio.h>
#include <conio.h>
#include <clocale>
#define N 5 // задаем константу N, равную размерности матрицы
 
int main () 
{
    setlocale(LC_ALL, "Russian");
        
        int i, j ,k = 0, l = 0, A[N][N], sum = 0, flag; // i,j,k,l - счетчики; A[N][N] - массив; sum - сумма; flag - флаг
    
        printf(" Размерность матрицы = %d x %d \n",N,N); 
        printf(" Введите элементы матрицы a[i][j], где i - номер строки, j - номер столбца:\n\n");
 
    for (i=0; i<N; i++) 
    {
        for (j=0; j<N; j++) 
        {
            printf(" a [%d] [%d] = ",i+1,j+1);
                        scanf ("%d",&A[i][j]);
        }
    } // циклы, в которых вводятся элементы массива
 
    printf("\n"); // отступ после ввода элементов перед выводом матрицы на экран
    for (i=0; i<N; i++)
    { 
        for (j=0; j<N; j++) 
            printf ("%7d",A[i][j]);
        printf ("\n");
    } // циклы, в которых выводится на экран введенная матрица
    printf ("\n\n");
    int imax=A[1][0];
// два цикла, в которых значения счетчиков - номера элементов ниже главной диагонали для нахождения максимума
    for (i=1; i<N; i++) 
    for (j=1; j<i+1; j++) 
            if (A[i][j]>imax) imax=A[i][j];
    sum=0;
    for (k=0; k<N; k++)
        for (l=k; l<N; l++) // два цикла, в которых значения счетчиков - номера элементов главной диагонали и выше для вычисления суммы
              if (A[i][j]>imax) sum+=A[i][j];
      if (sum==0) // Если сумма равна нулю, то мы печатаем что таких элементов нет, ждём нажатия любой клавиши, и прекращаем программу соответственно.
        { 
               printf (" Матрица не содержит элементов с заданным свойством");
               getch();
               return 0;
    }
    printf ("Сумма = %d",sum); // Если же сумма отлична от нуля, то мы печатаем её и завершаем программу.
    getch();
    return 0; 
}
1
doomer74
1 / 1 / 0
Регистрация: 01.12.2011
Сообщений: 51
25.03.2012, 11:12  [ТС] #7
Спасибо! Но у меня в компиляторе выдает ошибку в 32 строке, что она значит:

3 IntelliSense: a value of type "int *" cannot be used to initialize an entity of type "int" c:\users\днс\documents\visual studio 2010\projects\semestrovaya\semestrovaya\main.cpp 32

С ошибкой разобрался, больше не выдает.
Но теперь при вводе, например, такой матрицы
6 7 8 9 4
3 2 5 6 4
1 2 3 7 6
5 4 3 6 7
2 3 4 5 6

Выдает, что таких элементов нет, хотя максимальный элемент под диагональю - это 5. а 6, 7, 8, 9 явно его превосходят...
0
Байт
Эксперт C
16134 / 10412 / 1549
Регистрация: 24.12.2010
Сообщений: 19,713
25.03.2012, 11:19 #8
C
1
2
3
4
Mx = A[1][0];
for(i=2; i<N;i++) for(j=0; j<i; j++) if (A[i][j] > Mx) Mx = A[i][j];
for(i=sum=0; i<N; i++) for(j=i; j<N; j++) if (A[i][j]>=Mx) sum+= A[i][j];
printf("Summa=%d\n", sum);
Добавлено через 3 минуты
Ах, да! Надо еще сообщить об отсутствии таких элементов. Тогда вместо строки 3
C
1
2
3
for(i=sum=flag=0; i<N; i++) for(j=i; j<N; j++) if (A[i][j]>=Mx) { sum+= A[i][j]; flag=1; }
if (flag==0) printf("Netu\n");
else printf("Summa=%d\n", sum);
1
doomer74
1 / 1 / 0
Регистрация: 01.12.2011
Сообщений: 51
25.03.2012, 11:21  [ТС] #9
Благодарю всех за ответы! c++ изучаю меньше двух месяцев, поэтому сильно туплю.
Большое спасибо!
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2012, 11:21
Привет! Вот еще темы с ответами:

объясните задачу, ничего не понял - C++
дали семестровую, тема объектно ориентированное программирование, классы, модульное программирование. задача: Для записи формул ...

не могу сообразить задачу, объясните её пожалуйста - C++
1.Определить все симметричные натуральные числа в промежутке от А до В (А и В вводятся с клавиатуры). Я пытался решить задачу...

Квадратная матрица - C++
Получить квадратную матрицу порядка n: 1 2 ... n-1 n n+1 n+2 ... 2n-1 ...

квадратная матрица - C++
Дана квадратная матрица порядка M. Обнулить элементы матрицы, лежащие одновременно выше главной диагонали и ниже побочной диагонали....


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

Или воспользуйтесь поиском по форуму:
9
Yandex
Объявления
25.03.2012, 11:21
Ответ Создать тему
Опции темы

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