C 4x4矩阵的调试语句

C 4x4矩阵的调试语句,c,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"

我正在打印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] ) ;
}

超级奖金点预处理器 有没有一种与矩阵大小无关的方法?您必须重写5x5,6x6…nxn矩阵的整个方法。更好的方法?为什么不在所有行和列上嵌套循环呢?我绝对不会使用C风格的打印,因为我不想处理创建格式化字符串的问题。只要使用cout流


我还建议您要么传入要打印的矩阵,使其保持通用性,要么将其作为矩阵类的一个方法,以便它对其数据成员进行操作。你有一门矩阵课,是吗?如果我记得正确,C++是一种面向对象的语言。

< P>这是一个简单的方法,只需用<代码> Prtff<代码>替换<代码> CUT<代码>!虽然我更喜欢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);
}
#包括
#包括
样板
无效打印矩阵(双(&matrix)[行][列],int-dec)
{
std::cout怎么样:

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(" ");
        }
    }
}
void打印(整数小数=2)
{
int维=4;
对于(int i=0;i
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;
}
#包括
无效打印(双*m,整数decs){
int k;

对于(k=0;k基于预处理器的解决方案的超级奖励积分,(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);
}
#包括
#包括
#定义MADU(矩阵,小数,维数)({\
对于(int i=0;i

请注意,这并没有真正反映出我所说的好的解决方案。

预处理器?这听起来确实是一个挑战。想知道Boost.Preprocessor是否与C兼容,但我看不出有任何理由不兼容。警告,我不会为包含或“换行”标记而烦恼;)


有人帮你检查代码吗?

你不想要couts,你想要smart?听起来很矛盾。他不想要smart,他想要更聪明。你在哪里声明了m?为什么不编写一个以矩阵为参数的函数?为什么
300
?(您是否正在编写web服务器?如果是这样,您就错了:运行良好的web服务器不需要内置缓冲区溢出。)在C++中它是不工作的。C没有默认的参数。C++是一种多范例语言。它支持OOP构造。是的,我知道。我的观点是,如果你写的东西可以从对象和抽象中受益,比如一个矩阵,为什么你不想使用它?如果你用PrtTF替换CUT,STD::StEd精度是如何工作的?HHA为了找到一种方法,我不知道/使用printf风格的函数:)pfff…如果你要走这条路,你不应该停在那里,做printf(“%f%c”,小数,矩阵[I][j],(j==3)?“\n':”;:-)为什么如果(j==3)?!如果(j==dimension-1)!@EFraim你当然是对的。修复了。@fvu:走哪条路?
#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);
}
 // 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);
 }