2017-06-02 10 views
-1

行列の要素の和を主対角に平行に求めるプログラムを作る必要があります。私はどのように主要な対角線に平行な要素を見つけるか分かりません。 i == jは、主対角線に対してのみ機能します。行列の主対角に平行な要素を見つける

22 5 6 4 
32 45 7 9 
1 21 43 6 
7 5 9 11 

私は別々に合計を見つける必要があります。 6 + 9; 5 + 7 + 6; 22 + 45 + 43 + 11; 32 + 21 + 9; 1 + 5; 7

After the changes the code become like this: 
#include <stdio.h> 
#include <cmath> 
#include <cstdlib> 
#define N 50 
void enter_matrix (float m[N][N],int n){ 
    int i,j; 
    for(i=0;i<n;i++){ 
     for(j=0;j<n;j++){ 
      printf("Enter %d %d element of the matrix: ",i+1,j+1); 
      scanf("%f",&m[i][j]); 
     } 
    } 
} 
void show_matrix(float m[N][N],int n){ 
    int i,j; 
    for(i=0;i<n;i++){ 
     for(j=0;j<n;j++){ 
      printf("%.2f\t",m[i][j]); 
     } 
     printf("\n"); 
    } 
} 

int find_sums(float m[N][N],float sum[100],int n){ 
    int j=0; 
    for(int offset = -n+1; offset < n; ++offset) { 
    float sum1 = 0; 
    for(int i = 0; i < n-fabs(offset); ++i) { 
     if(offset <= 0) { 
      sum1 += m[i][i-offset]; 
     } 
     else { 
      sum1 += m[i+offset][i]; 
     } 
     sum[j]=sum1;j++;printf("%.2f \n",sum1); 
    } 
    } 
    return j; 
} 

int find_max(float sum, int j){ 
    int i,maxn;float *s,max=0;s=&sum; 
    for(i=0;i<j;i++){ 
     if(*(s+1)>max){ 
      max=*(s+1); 
      maxn=i; 
     } 
    } 
    return maxn; 
} 

int find_min(float sum, int j){ 
    int i,minn; 
    float *s; 
    s=&sum;float min=*(s+0); 
    for(i=0;i<j;i++){ 
     if(*(s+1)<min){ 
      min=*(s+1); 
      minn=i; 
     } 
    } 
    return minn; 
} 

void main(){ 
    float matrix [N][N], sum[100],*s; 
    int n,j,maxn,minn; 
    s=sum; 

    do{ 
     printf("Enter matrix dimension (between 1 and 50):"); 
     scanf("%d",&n); 
    } 
    while(n<=0||n>50); 
    enter_matrix(matrix,n); 
    show_matrix(matrix,n); 
    j=find_sums(matrix,sum,n); 
    maxn=find_max(sum[100],j); 
    minn=find_min(sum[100],j); 
    printf("Maximum sum is equal to %.2f, at line %d\n",sum[maxn],maxn+1); 
    printf("Minimum sum is equal to %.2f, at line %d\n",sum[minn],minn+1); 
} 

は、出力はこのようなものです:

Enter matrix dimension (between 1 and 50):3 
Enter 1 1 element of the matrix: 1 
Enter 1 2 element of the matrix: 2 
Enter 1 3 element of the matrix: 3 
Enter 2 1 element of the matrix: 4 
Enter 2 2 element of the matrix: 5 
Enter 2 3 element of the matrix: 6 
Enter 3 1 element of the matrix: 7 
Enter 3 2 element of the matrix: 8 
Enter 3 3 element of the matrix: 9 
1.00 2.00 3.00 
4.00 5.00 6.00 
7.00 8.00 9.00 
3.00 
2.00 
8.00 
1.00 
6.00 
15.00 
4.00 
12.00 
7.00 
Maximum sum is equal to 3.00, at line 1 
Minimum sum is equal to 3.00, at line 1 
Press any key to continue 

は、それはいくつかの追加の合計だけでなく、完全なラインを作っています。助言がありますか?未テストと私の頭の上から

+0

あなたは[close](https://ideone.com/5HhRQQ)でしたが、とりわけ 'sum [j] = ... 'は内側のループの外側にある必要があります。 [Cプログラム](https://ideone.com/06058d)をC++とタグ付けしたのはなぜですか? –

答えて

0

:これは、上部平行対角線の和を出力し、正の低級平行対角の和をオフセット負のオフセットについて

int n; 
double A[n][n] 

for(int offset = -n+1; offset < n; ++offset) { 
    double sum = 0; 
    for(int i = 0; i < n-std::abs(offset); ++i) { 
     if(offset <= 0) { 
      sum += A[i][i-offset]; 
     else { 
      sum += A[i+offset][i]; 
     } 
    } 
    std::cout << sum << std::endl; 
} 

。最初のループは簡単に並列化でき、print文は唯一の重要な部分です。

+0

ありがとう、私は別々の配列に格納できるので、私は別々にすべての行の合計が必要です。たとえば、sum [1]の6 + 9、sum [2]の5 + 7 + 6など – user3058396

+0

@ user3058396このコードを変更して配列を追加することはできません( 'double d [2n-1]; )、変数( 'int j = 0'?)と内部ループ終了後の2つのステートメント(' a [j] = sum; ++ j; ')? ;) –

+0

それは私の心に浮かんでいませんでした。ありがとうございます。私は試してみます – user3058396

0

これらの対角線については、対角に応じてzがz = i + zであることを保持し、 - (高さ-1)から(幅-1)に達する。

これは、次のアルゴリズムで結果(解の配列は負のインデックスを処理することができることを - あなたには、いくつかのことで相殺することを変更する必要があり):

Array<R> diagonalSums (Matrix<R> m) 

    initialize Array<R> solution in according size with all entries initialized to zero 

    for each cell i,j in m: 
     find z so that j = i + z (z = j - i) 
     solution[z] += m(i,j) 

    return solution 

私はあなたがあなたのオフセットでそのような何かを行うことを考えますあなたはzからそのzに属する合計に行く方法を見つけようとしますが、少なくともあなたはすべての合計をとにかく計算したいときには、不必要に混乱するだけです(合計が1つだけ必要な場合はあなたの方が良い)。私のアプローチは、単にすべての細胞を調べて、それに応じてそれを追加します。

負のインデックスを持つ配列を使用していましたが、読みやすさを高めるために、そうすることができるクラスを作成することをお勧めします。

関連する問題