C 4x4矩阵的调试语句
我正在打印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"
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);
}