C语言 在矩阵中找到列中的最大元素同时也是行中的最小元素

iezvtpos  于 2023-01-08  发布在  其他
关注(0)|答案(1)|浏览(165)

编写一个程序,在大小为L*C的矩阵中输入整数(L:row和C:column),然后确定并显示所有元素的值和位置(i,j),这些元素在其行上既是最小值,在其列上又是最大值。如果不存在最小值-最大值,则显示以下消息“矩阵不包含任何最小值-最大值"。示例1:1 2 3 4 5 6 7 8 9 13 15 16制表符[4,1]=13示例二:17 11 3 4 5 6 7 8 9 15 10 16矩阵不包含最小值-最大值。我尝试了此代码,它不工作

int L , C , i , j ,maxc,minl ;
    int Tab[20][20];
printf("Introduire le nombre des lignes du matrice (MAX 20): ");
        scanf("%d",&L);
        printf("Introduire le nombre des colonnes du matrice (MAX 20): ");
        scanf("%d",&C);
        for(i=0; i<L; i++)
        {
            for(j=0; j<C; j++)
            {
            printf("Donner l'element (%d,%d): ",i+1,j+1);
            scanf("%d", &Tab[i][j]);
            }
        }

        for(j=0 ;j<C;j++)
        {
            maxc=Tab[0][j];
            for(i=0;i<L;i++)
            {
                minl=Tab[i][0];
               if(Tab[i][j]>maxc && Tab[i][j]<minl )
               {
                 printf("Tab[%d,%d]=%d ",i+1,j+1,Tab[i][j]);
               }
               else
               {
                   printf("La matrice ne contient aucun Min-Max.");
               }
            }
        }

    return 0;
}
cnjp1d6j

cnjp1d6j1#

我不知道为什么要创建一个大小为20 x20的矩阵,而您只需要L行和C列。

int Tab[L][C];

就在从scanf返回LC变量的值之后。
至于算法,它不起作用,因为当使用maxc=Tab[0][j]时,您将行索引固定为零(第一行):对于每一列,将maxc更新为存储在第一行中的相应行项目值。对于minl=Tab[i][0]也是如此:对于每一列和每一行,将maxc更新为存储在第一列中的行索引i的项,换句话说,maxc只能采用第一行的值,而minl只能采用第一列的值。
然后,当执行if(Tab[i][j]>maxc && Tab[i][j]<minl)时,maxcminl无法匹配:例如,在第一次迭代(j=0)时,maxc固定到项[0,0],而minl进入位置[0,0]、[1,0]、[2,0]、[3,0];那么,当j=0i=3(内循环第一次迭代的最后一步)时,您有maxc=[0,0]minl=[3,0]Tab[i][j]=[3][0]
相反,在更新maxcminl之前,您必须将最大值和最小值与行和列中的其他值进行比较:否则,它们可能只是随机匹配,这取决于矩阵结构本身,甚至当它们包含真实的的最小值和最大值时也不会匹配。此外,每次退出内循环时,都应该重置minlmaxc,以避免处理前一行的最小值和最大值。
至于下面的代码,它应该按预期工作,我只是做了相反的事情,搜索每行的最小值,并将其索引保存在a变量中(因为如果最小值不是最新值,您将丢失索引);然后,当你有了一个特定行的最小值时,你用索引a迭代该列,并搜索它是否存在一个更大的元素:如果它存在,则它更新maxc
我还建议避免反转ij索引,以避免混淆(在代码中,您使用j表示列,i表示行,但在向矩阵插入值时,您使用i表示列,j表示行)。

int L, C, min, max;

    printf("Introduire le nombre des lignes du matrice:\n");
    scanf("%d", &L);
    printf("Introduire le nombre des colonnes du matrice:\n");
    scanf("%d", &C);
        
    int Tab[L][C]; //Declare it here with the right size    
    int i; //Index for iterating over rows
    int j; //Index for iterating over columns
    int a; //Index of the column with the minimum value (for each row)
    int k; //Index for iterating the column that contains the min row value.
    bool found = false; 
    
    for(i=0; i<L; i++){
        for(j=0; j<C; j++){
            printf("Donner l'element (%d, %d): ", i, j);
            scanf("%d", &Tab[i][j]);
            
            if(j==0){
                min = max = Tab[i][j];
            } else {
                //Store the minimum and max values while user input them
                if(Tab[i][j]<min) min = Tab[i][j]; 
                if(Tab[i][j]>max) max = Tab[i][j];
            }
        }
    }
    
    for(i=0; i<L; i++){
        //You need to reset 'maxc' and 'minl' for every row, otherwise you will compare it with the minimum and maximum values of the previous rows
        int maxc = min-1;
        int minl = max+1;
        for(j=0; j<C; j++){ 
            if(Tab[i][j]<minl){
                minl = Tab[i][j];
                a = j;
            }
            if(j==C-1){ //Here 'a' contains the row index of the minimum element of the row 'i'
                for(k=0; k<L; k++){ //Iterating the column with 'a' index: we search for the maximum value in that column
                    if(Tab[k][a]>maxc) maxc = Tab[k][a];
                    if(k==L-1){ // Here 'a' contains the row index of the minimum element of the row 'i' (minl variable), and also here the maxc variable contains the maximum element of the row 'i'.
                        if(minl == maxc){
                            printf("Tab[%d,%d]=%d ", i, a, Tab[i][a]);
                            found = true;
                        }
                    }
                }
            }
        }
    }
    if(!found) printf("La matrice ne contient aucun Min-Max.");

相关问题