2016-07-08 5 views
0

このプログラムは、鞍点を見つけるために設計されています。 2次元配列の鞍点は、行の最大点を意味しますが、列の最小点を意味します。たとえば、最初の行1,2、2行目、3、4の場合、鞍点は2です。なぜこのプログラムは(4 * 4)(またはそれ以上)の配列の中点を見つけることができませんか?

このプログラムは3 * 3配列の鞍点を見つけることができますが、 * 4(またはそれ以上)の配列の鞍点。

例えば、

2, 3, 9, 5 
6, 7, 8, 3 
0, 5, 7, 5 
2, 1, 8, 3 

次にサドルポイントが3行3列、7であるが、プログラムを見つけることができません。

だから、問題は何か、論理問題ですか? 2 * 2または3 * 3配列の鞍点を見つけることができます。

+1

デバッガで実行し、コードをステップバイステップで実行しましたか? – abelenky

+0

'gdb'はあなたの友人です。それを学んで、それを生きて、それを呼吸しなさい。 –

+0

@abelenky私はプログラミングの初心者です...だから私はデバッガを使用していません... – Annndy

答えて

0

これは次のように実行できます:(a)連続して行をステップ実行する(b)最大の行メンバーが発生する)指定されたメンバーが最小であるかどうかをその列を検査する機能を持たせます。これらは、それ自体が「機能」である必要はありませんが、機能的な単位としてきちんと組織的に編成する必要があります。

この演習では、どの行または列にも重複する値がないことを暗黙的に前提としています。ただし、その重複が行/列の極値でないことが保証されている場合を除きます。

0

ループ内のmax値をリセットする必要があります。

これは、各列の中点を鞍点にします。

#include <stdio.h> 

int main(void){ 
    int n, m, i, j, k,max; 
    puts("Enter two numbers represents two dimensional array, N * M"); 
    puts("This program will find the saddle points"); 
    scanf("%d %d", &n, &m); 
    int ar[n][m]; 
    for (j = 0; j < n; j++)    
     for (i = 0; i < m; i++){ 
      puts("Enter the number in array"); 
      scanf("%d", &ar[j][i]);  //store the number form user 
      printf("Array accepted %d, and this number's location is [%d][%d]\n", ar[i][j], i, j); 
     } 

    for (j = 0; j < n; j++){ //print the two dimensional array 
     for (i = 0; i < m; i++) 
      printf("%3d", ar[j][i]); 
     putchar('\n'); 
    } 


    for (int i = 0; i < n; i++){ //for each row 
     max=0; 
     for (j = 1; j < m; j++) //find biggest in the row 
      if(ar[i][j] > ar[i][max])  
       max=j; 

     for (k=0; k < n; k++) // if there are bigger element than this in that column, break 
      if (ar[k][max] < ar[i][max])  
       break; 
     if(k==n) // if there were no bigger elements in the column 
      printf("The saddle point is (%d), location is [%d][%d]\n", ar[i][max], i+1, max+1);   
    } 
} 
関連する問題