我正在为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] ) ;
}
答案 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);
}
任何人都有帮助进行代码审查;)?