4x4矩阵的调试语句

时间:2009-10-04 12:59:32

标签: c

我正在为4x4矩阵打印调试语句。有没有人知道更好的方法,而不使用cout

// num decimal places to show
void print( int decimals )
{
    char fmtString[ 300 ] ;

    // I'm thinking this should be able to get smaller.
    sprintf(fmtString,
            "%%.%df %%.%df %%.%df %%.%df\n"
            "%%.%df %%.%df %%.%df %%.%df\n"
            "%%.%df %%.%df %%.%df %%.%df\n"
            "%%.%df %%.%df %%.%df %%.%df",
            decimals, decimals, decimals, decimals, 
            decimals, decimals, decimals, decimals, 
            decimals, decimals, decimals, decimals, 
            decimals, decimals, decimals, decimals ) ;

    printf(fmtString,
           m[0][0], m[0][1], m[0][2], m[0][3],
           m[1][0], m[1][1], m[1][2], m[1][3],
           m[2][0], m[2][1], m[2][2], m[2][3],
           m[3][0], m[3][1], m[3][2], m[3][3] ) ;
}

预处理器的超级奖励积分!

6 个答案:

答案 0 :(得分:4)

怎么样:

void print( int decimals = 2 )
{
    int dimension = 4;
    for(int i = 0; i < dimension; i++) {
        for(int j = 0; j < dimension; j++) {
            printf("%.*f", decimals, matrix[i][j]);
            if(j == dimension - 1) printf("\n");
            else                   printf(" ");
        }
    }
}

答案 1 :(得分:3)

基于预处理器的解决方案的超级奖励积分(wo)男人说。在此,我们非常感谢所有帮助我实现这一目标的人。

#include <stdlib.h>
#include <stdio.h>

#define MADU(matrix,decimals,dimension) ({ \
    for(int i = 0; i < dimension; i++) { \
        for(int j = 0; j < dimension; j++) { \
            printf("%.*f%c", decimals, matrix[i][j],(j==dimension-1)?'\n':' '); \
        } \
    } \
})

/*
 * 
 */
int main(int argc, char** argv) {
    double a[4][4];

    MADU(a,2,4);

    return (EXIT_SUCCESS);
}

请注意,这并不能真正反映出我称之为好的解决方案。

答案 2 :(得分:2)

这是一种简单的方法,只需将cout替换为printf!虽然我更喜欢C ++流,因为它们更优雅IMO:

#include <iostream>
#include <iomanip>

template <std::size_t rows, std::size_t columns>
void printMatrix(double (&matrix)[rows][columns], int dec)
{
    std::cout << std::fixed << std::setprecision(dec);
    for(std::size_t r = 0; r < rows; r++)
    {
        for(std::size_t c = 0; c < columns; c++)
        {
            std::cout << matrix[r][c] << '\t';
        }
        std::cout << '\n';
    }
}

int main()
{
    double matrix[4][4];

    printMatrix(matrix, 2);
}

答案 3 :(得分:1)

如何做一个与矩阵大小无关的方法呢?您必须为5x5,6x6 ... nxn矩阵重写整个方法。更好的方法?为什么不在所有行和列上嵌套循环?我肯定不会使用C风格的打印,因为我不想处理创建格式化字符串。只需使用cout流。

我还建议您传入要打印的矩阵,保持通用,或者将其作为Matrix类的方法,以便对其数据成员进行操作。你有一个矩阵类,不是吗?如果我没记错的话,C ++是一种面向对象的语言。

答案 4 :(得分:1)

C 中,没有默认参数。我也不喜欢全局变量,因此我将m作为参数。

#include <stdio.h>
void print(double *m, int decs) {
  int k;
  for (k=0; k<16; k++) {
    printf("%.*f", decs, *m++);
    if (k%4 == 3) puts("");
    else putchar(' ');
  }
}

int main(void) {
  double m[4][4] = {{1/5,1/6,1/9,-1/4}, {0,1/4,-1/7,1/16},
                    {1/2,-1/2,1/3,-1/3}, {1/1,1/2,1/3,1/4}};
  print(&m[0][0], 2);
  return 0;
}

编辑:参数传递的大小

#include <stdio.h>
void print(double *m, int cols, int rows, int decs) {
  int k, s = cols*rows;
  for (k = 0; k < s; k++) {
    printf("%.*f", decs, *m++);
    if ((k + 1) % cols) putchar(' ');
    else                puts("");
  }
}

int main(void) {
  double m[4][4] = {{1/5,1/6,1/9,-1/4}, {0,1/4,-1/7,1/16},
                    {1/2,-1/2,1/3,-1/3}, {1/1,1/2,1/3,1/4}};
  print(&m[0][0], 4, 4, 2);
  return 0;
}

答案 5 :(得分:1)

预处理器?这实际上听起来像是一个挑战。不知道Boost.Preprocessor是否与C兼容,但我没有看到任何理由不应该。警告,我不会打扰包含或'换行'标记;)

 // The formatting of sprintf
 #define PRINT_FORMAT_ELEM(z,n,data) // data is the nbColumns (or -1)
   BOOST_PP_EXPR_IF(
     BOOST_PP_EQUAL(
       BOOST_PP_ADD(n, 1),
       data
     ),
     "%%.%%df\n",
     "%%.%%df "
   )

 #define PRINT_FORMAT_LINE(z,n,data) // data is (nbRows, nbColumns)
   BOOST_PP_REPEAT(
     data,
     PRINT_FORMAT_ELEM,
     BOOST_PP_EXPR_IF(
       BOOST_PP_EQUAL(
         BOOST_PP_ADD(n, 1),
         BOOST_PP_TUPLE_ELEM(2,0,data)
       ),
       -1, // no \n on the last line
       BOOST_PP_TUPLE_ELEM(2,1,data)
     )
   )


 #define PRINT_FORMAT(nbRows, nbColumns)
   BOOST_PP_REPEAT(
     nbRows,
     PRINT_FORMAT_LINE,
     (nbRows, nbColumns)
   )


 // The decimals
 #define PRINT_MATRIX_ELEM(z,n,data) // data is (decimals, notLastRow, nbColumns)
   BOOST_PP_ELEM(3, 0, data)
   BOOST_PP_COMMA_IF(
     BOOST_PP_AND(
       BOOST_PP_TUPLE_ELEM(3, 1, data),
       BOOST_PP_NOT_EQUAL(
         BOOST_PP_ADD(n,1),
         BOOST_PP_TUPLE_ELEM(3, 2, data)
       )
     )
   )

 #define PRINT_DECIMAL_LINE(z, n, data) // data is (decimals, nbRows, nbColumns)
   BOOST_PP_REPEAT(
     BOOST_PP_TUPLE_ELEM(3, 2, data),
     PRINT_MATRIX_ELEM,
     (
       BOOST_PP_TUPLE_ELEM(3, 0, data),
       BOOST_PP_NOT_EQUAL(
         BOOST_PP_ADD(n,1),
         BOOST_PP_TUPLE_ELEM(3, 1, data)
       ),
       BOOST_PP_TUPLE_ELEM(3, 2, data)
     )
   )

 #define PRINT_DECIMALS(decimals, nbRows, nbColumns)
   BOOST_PP_REPEAT(
     nbRows,
     PRINT_DECIMAL_LINE,
     (decimals, nbRows, nbColumns)
   )


 // The matrix itself
 #define PRINT_MATRIX_LINE(z, n, data) // data is (name, nbRows, nbColumns)
   BOOST_PP_REPEAT(
     BOOST_PP_TUPLE_ELEM(3, 2, data),
     PRINT_MATRIX_ELEM,
     (
       BOOST_PP_TUPLE_ELEM(3, 0, data)[n],
       BOOST_PP_NOT_EQUAL(
         BOOST_PP_ADD(n,1),
         BOOST_PP_TUPLE_ELEM(3, 1, data)
       ),
       BOOST_PP_TUPLE_ELEM(3, 2, data)
     )
   )

 #define PRINT_MATRIX_IMPL(name, nbRows, nbColumns)
    BOOST_PP_REPEAT(
      nbRows,
      PRINT_MATRIX_LINE,
      (name, nbRows, nbColumns)
    )


 // And the whole thing
 #define PRINT_MATRIX(string, decimals, name, nbRows, nbColumns)
   sprintf(string,
     PRINT_FORMAT(nbRows, nbColumns),
     PRINT_DECIMALS(decimals, nbRows, nbColumns)
   );

   printf(string,
          PRINT_MATRIX_IMPL(name, nbRows, nbColumns)
   )


 // And now your code:
 void print(int decimals)
 {
   char fmtString[300];

   PRINT_MATRIX(fmtString, decimals, m, 4, 4);
 }

任何人都有帮助进行代码审查;)?