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

помогите исправить ошибки - C++

Восстановить пароль Регистрация
 
Fenita
0 / 0 / 0
Регистрация: 16.10.2011
Сообщений: 28
10.11.2011, 11:52     помогите исправить ошибки #1
Соседями элемента А с индексом ij в матрице назовем элементы A с индексом kl c i - 1 <= k <= i+1, j-1<=l<=j+1, (k,l) не =(i,j). Операция сглаживания матрицы дает новую матрицу того же размера, каждый элемент который получается как среднее арифметическое имеющихся соседей соответствующего элемента исходной матрицы. Построить результат сглаживания заданной вещественной матрицы размером 10 на 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
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
#include <conio.h>
#include <stdio.h>
#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
int main()
{
float A[10][10],B[10][10],s=0,s1,s2,s3,s4;
int n,i,j,a=1,b=1,c=1,d=1,k=4;
srand(time(NULL));
printf(" n = "); scanf("%d",&n);
printf("\n");
printf("OLD MATRIX:\n");
printf("\n");
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
A[i][j]=(float)(rand()%(10+11)-10);
printf("%6.1f",A[i][j]);
}
printf("\n");
}
printf("\n");
printf("NEW MATRIX:\n");
printf("\n");
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{
k=4; s=0; a=1; b=1; c=1; d=1;
if(i==0) {a=0; k--;}
if(i==n-1) {b=0; k--;}
if(j==0) {c=0; k--;}
if(j==n-1) {d=0; k--;}
s=(b*A[i+1][j]+a*A[i-1][j]+c*A[i][j-1]+d*A[i][j+1])/k;
s1=d*A[i+1][j];
s2=c*A[i-1][j];
s3=b*A[i][j-1];
s4=a*A[i][j+1];
B[i][j]=s; printf("%6.1f",B[i][j]);
}
printf("\n");
} float sum=0;
for (i=0; i<n; i++)
{
for (j=0; j<n; j++)
{ if(i==j)sum=sum+ fabs(B[i][j]);
 
}}
cout<<sum;
getch();
return 0;
}
такая проблема, если n=2, то сумма считается правельно, а если n >2, то сумма меньше действительности на 0.5, не знаю где ошибка, возможно даже в составлении второго массива, помогите найти
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2011, 11:52     помогите исправить ошибки
Посмотрите здесь:

C++ Помогите исправить ошибки
Помогите исправить ошибки C++
C++ помогите исправить ошибки
Помогите исправить ошибки в классе C++
Помогите исправить ошибки в классе C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dar101
 Аватар для Dar101
40 / 40 / 1
Регистрация: 12.05.2011
Сообщений: 109
10.11.2011, 16:01     помогите исправить ошибки #2
Тестировал вашу программу, вроде нормально.
1)
n = 3
OLD MATRIX:
2.0 -10.0 10.0
10.0 -8.0 -10.0
-1.0 -2.0 7.0

NEW MATRIX:
0.0 1.3 -10.0
-2.3 -3.0 3.0
4.0 -0.7 -6.0
9

2)
n = 3
OLD MATRIX:
-3.0 4.0 1.0
2.0 -7.0 1.0
-7.0 5.0 -10.0

NEW MATRIX:
3.0 -3.0 2.5
-5.7 3.0 -5.3
3.5 -8.0 3.0
9

3) n = 4

OLD MATRIX:
2.0 8.0 -6.0 10.0
4.0 -3.0 -7.0 -8.0
8.0 -8.0 -8.0 -9.0
3.0 8.0 -2.0 8.0

NEW MATRIX:
6.0 -2.3 3.7 -7.0
2.3 -0.8 -6.3 -2.0
-0.3 1.3 -6.5 -2.7
8.0 -2.3 2.7 -5.5
18.75

*Важно помнить, что в отображении матрицы стоит округление в один знак, это объясняет третий пример:
6+0.8+6.5+5.5=18.8->18.75

Попробуйте этот код, мне кажется он более понятный:

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
#include <conio.h>
#include <stdio.h>
#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <math.h>
using namespace std;
int main()
{
    float A[10][10],B[10][10];
    int n = 0;
    srand(time(NULL));
    printf(" n = "); scanf("%d",&n);
    printf("\nOLD MATRIX:\n\n");
    for (int i=0; i<n; i++)
    {
        for (int j=0; j<n; j++)
        {
            A[i][j]=(float)(rand()%(10+11)-10);
            printf("%6.1f",A[i][j]);
        }
        printf("\n");
    }
    printf("\nNEW MATRIX:\n\n");
    for (int i=0; i<n; i++)
    {
        for (int j=0; j<n; j++)
        {
            int k = 0;                  //число соседей                     
            float sum = 0;                      
            if (i!=n-1) {sum += A[i+1][j];k++;}
            if (j!=0)   {sum += A[i][j-1];k++;}
            if (j!=n-1) {sum += A[i][j+1];k++;}
            B[i][j] = sum/k;
            printf("%6.1f",B[i][j]);
        }
        printf("\n");
    }
 
    float sum = 0;
    for (int i=0; i<n; i++) //Для перебора главной диагонали достаточно одного цикла
    {
        sum += fabs(B[i][i]);
    }
    cout<<sum;
 
    getch();
    return 0;
}
Fenita
0 / 0 / 0
Регистрация: 16.10.2011
Сообщений: 28
10.11.2011, 18:58  [ТС]     помогите исправить ошибки #3
спасибо, разобрался с округлением
C++
1
sum=ceil(sum*10)/10.0;
теперь все правельно получается
Zumreg
Сообщений: n/a
12.04.2012, 22:21     помогите исправить ошибки #4
Добавлено через 4 минуты
Цитата Сообщение от Dar101 Посмотреть сообщение
Тестировал вашу программу, вроде нормально.

}

float sum = 0;
for (int i=0; i<n; i++) //Для перебора главной диагонали достаточно одного цикла
{
sum += fabs(B[i][i]);
}
cout<<sum;

getch();
return 0;
}[/CPP]
Будьте добры! у меня такое же задание но "...В сглаженной матрице найти сумму модулей элементов, расположенных ниже главной диагонали."
Yandex
Объявления
12.04.2012, 22:21     помогите исправить ошибки
Ответ Создать тему
Опции темы

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