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