【问题标题】:How to declare doubles inside a matrix (2d arrays) in C?如何在 C 中的矩阵(二维数组)内声明双精度数?
【发布时间】:2019-01-13 01:11:23
【问题描述】:

我正在自学(几天前开始),找不到葡萄牙语(我的母语)的可靠信息。 在太头疼之后,我放弃了,来到这里寻求帮助。 我不知道如何制作双精度数组/二维数组,只有整数。 以下代码按预期工作:

int main(void){    
int matriz[5][2] =  {{1,2},  // DECLARATION OF MATRIX COMPOSED OF INTERGERS
                     {3,4},
                     {5,6},
                     {7,8},
                     {9,10}};
int maior = matriz[0][0];   // BIGGEST NUMBER INSIDE MATRIX, STARTED AS FIRST POSITION
int soma = 0;               // SUM OF NUMBERS START WITH ZERO
int lin = 0;                // INDICATION OF LINE
int col = 0;                // INDICATION OF COLUMN
for (lin = 0; lin < 5; lin++){
    for (col = 0; col < 2; col++){
    if (maior < matriz[lin][col]) {maior = matriz[lin][col];}
    soma += matriz[lin][col];
    }   
}
printf("A soma dos numeros eh %d e o maior numero eh %d\n", soma, maior); 
// THE SUM OF NUMBERS IS %D AND THE BIGGEST NUMBER IS %D
// I COPIED THE FOLLOWING CODE FROM ELSEWHERE TO SEE WHAT WAS GOING ON
    int i, j;
    for ( i = 0; i < 5; i++ ) {
          for ( j = 0; j < 2; j++ ) {
         printf("a[%d][%d] = %d\n", i,j, matriz[i][j] );
      }
   }
return 0;} 

输出如预期:

A soma dos numeros eh 55 e o maior numero eh 10
a[0][0] = 1 
a[0][1] = 2 
a[1][0] = 3 
a[1][1] = 4 
a[2][0] = 5 
a[2][1] = 6 
a[3][0] = 7 
a[3][1] = 8
a[4][0] = 9
a[4][1] = 10

**

但是,以下代码的任何更改总是错误的:

**

int main(void){
double matriz2[5][2] = {{10000,1000},
                        {100,10},
                        {1,0.1},
                        {0.01,0.001},
                        {0.0001,0.00001}};
double maior2 = matriz2[0][0];
double soma2 = 0;
int lin2 = 0;
int col2 = 0;
for (lin2 = 0; lin2 < 5; lin2++){
    for (col2 = 0; col2 < 2; col2++){
    if (maior2 < matriz2[lin2][col2]) {maior2 = matriz2[lin2][col2];}
    soma2 += matriz2[lin2][col2];
    }   
}
printf("A soma dos numeros eh %d e o maior numero eh %d\n", soma2, maior2);

for ( i = 0; i < 5; i++ ) {
      for ( j = 0; j < 2; j++ ) {
         printf("a[%d][%d] = %d\n", i,j, matriz2[i][j] );
      }
   }
return 0;} 

输出总是错误的,因为我一直在更改它。 我声明了长双打、双打、整数和双打等。每次代码输出错误的答案。 一些组合输出负数。其他人只是到处输出零。两个例子:

A soma dos numeros eh 0 e o maior numero eh 0
a[0][0] = 10000
a[0][1] = 1000
a[1][0] = 100
a[1][1] = 10
a[2][0] = 1
a[2][1] = 0
a[3][0] = 0
a[3][1] = 0
a[4][0] = 0
a[4][1] = 0

A soma dos numeros eh 953826337 e o maior numero eh 0
a[0][0] = 0
a[0][1] = 0
a[1][0] = 0
a[1][1] = 0
a[2][0] = 0
a[2][1] = -1717986918
a[3][0] = 1202590843
a[3][1] = -755914244
a[4][0] = -350469331
a[4][1] = -1998362383

我根本找不到在矩阵中声明或放入双数的方法。 我该怎么做?

【问题讨论】:

  • 这不是数组中的数字错误。它的打印方式是错误的。
  • 请说明您使用的是 C 还是 C++,即使您不使用 C++ 特定的东西也会有所不同。例如,如果您使用 C++,我们会告诉您将 std::cout&lt;&lt; 运算符一起使用,这样您就不必乱用 printf 格式说明符并遇到此类问题。
  • 下次请尝试发minimal reproducible example。在这种情况下,您的问题是由于您在 printf 中使用了不正确的格式说明符引起的,与二维数组无关。例如,您可以尝试打印出单个双精度而不是双精度数组,这会缩小问题范围并可能允许您自己解决问题,因为您不会相信问题与数组。
  • 我不确定你是否会在Stack Overflow em Português 上做得更好——你可以使用葡萄牙语,但你的英语水平似乎足够好,可以在这里提问。

标签: c matrix declaration


【解决方案1】:

printf%d 格式说明符需要int 参数,但您传递的是double。然后,您的程序会表现出未定义的行为。请参阅您最喜欢的 C 或 C++ 教科书,了解如何输出 double 类型的值。

【讨论】:

  • 这是一个包含所有格式说明符的页面en.cppreference.com/w/cpp/io/c/fprintf
  • Sooo 它与矩阵无关,并且 90% 的问题代码是无关紧要的。为什么没有人再做 MCVE 了:(
  • @LightnessRacesinOrbit 如果提问者知道这是因为 printf,他一开始就不需要提问
  • How to debug small programs 在调试器中查看值会显示它们是正确的。
  • @ChrisRollins 发现问题实际上是产生 MCVE 的常见副作用。这就是它们如此有用的原因之一。
【解决方案2】:

您同时标记了CC++,您应该选择其中一个。我会给出两种语言的答案。


如果在将 2D 数组从 int 更改为 double 时使用 Cprintf(),计算似乎没问题,这里的错误是您的输出与 printf()。您正在使用%d,它需要int,但您将其传递给double,这会导致未定义的行为。当使用floatdouble 时,将其更改为%f%g


如果使用C++,请尽量不要使用printf()。相反,您应该包含iostream。然后您的输出将类似于:

// printf("A soma dos numeros eh %d e o maior numero eh %d\n", soma2, maior2);
std::cout << "A soma dos numerous eh " << soma2 << " e o maior numero eh << maior2 << '\n';

for ( i = 0; i < 5; i++ ) {
    for ( j = 0; j < 2; j++ ) {
        // printf("a[%d][%d] = %d\n", i,j, matriz2[i][j] );
        std::cout << "a[" << i << "][" << j "] = " << matriz2[i][j] << '\n';
    }
}

【讨论】:

    猜你喜欢
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 1970-01-01
    相关资源
    最近更新 更多