现在的位置: 首页 > 综合 > 正文

数值计算中使用C宏简化循环代码的书写

2013年10月21日 ⁄ 综合 ⁄ 共 2668字 ⁄ 字号 评论关闭
#if 0

在编写C程序或者C++程序的时候经常会用到多重循环,而我们经常为了代码的可读性
在每一个子循环的开头都给出一个<Tab>跳格键的缩进,但是当循环嵌套的比较多的时候,
将会出现前导的大量空白,这在编写数值计算程序的时候经常会遇到,这些前导的大量空
白和大量的循环代码将真正的算法代码淹没了,导致编写数值计算程序的过程非常烦杂,
而通过本文所介绍的采用C宏展开的方式就可以很好的解决循环框架代码远远多于算法代码
而导致的混乱。因为是宏展开,所以和手工编写的多重循环是一回事,也就是说经过宏处
理器之后的代码和手工直接编码产生的循环是一摸一样的,所以效率上没有任何的损失的。

#endif
#include <iostream>
#include <iterator>
#include <algorithm>
using namespace std;
//一重for循环的的宏定义
#define BEGIN_FOR1(v1,v1b,v1e) for(long v1=v1b;v1<v1e;++v1) {
#define END_FOR1() }

//二重for循环的的宏定义
#define BEGIN_FOR2(v1,v1b,v1e,v2,v2b,v2e) /
BEGIN_FOR1(v1,v1b,v1e) /
BEGIN_FOR1(v2,v2b,v2e)
#define END_FOR2() /
END_FOR1() /
END_FOR1()

//三重for循环的的宏定义
#define BEGIN_FOR3(v1,v1b,v1e,v2,v2b,v2e,v3,v3b,v3e)/
BEGIN_FOR1(v1,v1b,v1e)/
BEGIN_FOR2(v2,v2b,v2e,v3,v3b,v3e)
#define END_FOR3() /
END_FOR1() /
END_FOR2()

////////////////////////////////////////////////////////////////////////////////
//在下面的测试代码中分别给出了宏书写的循环代码和手工直接书写的循环代码,从中可
//以看出采用宏的方式书写的循环代码,循环框架代码比较少,代码看起来非常简洁,同
//时编码过程中也不容易出错。这样编写数值程序的人就可以比较专注于算法的实现,而
//不是在循环框架代码里面奋力挣扎:)
////////////////////////////////////////////////////////////////////////////////

int main()
{
//////////////////////////////////////////////////
//一重for循环宏的使用
BEGIN_FOR1(i,0,3);
cout << "(" << i << ",[" << i << "]) " ;
END_FOR1();
/*-----*/ cout << endl; /*-----*/
//相应的手工循环如下:
for(long i=0;i<3;++i){
cout << "(" << i << ",[" << i << "]) " ;
}
//////////////////////////////////////////////////
cout << endl;
//////////////////////////////////////////////////
//二重for循环宏的使用
BEGIN_FOR2(i,0,3,j,i,3);
cout << "(" << i << "," << j << ",[" << i*2+j << "]) " ;
END_FOR2();
/*-----*/ cout << endl; /*-----*/
//相应的手工循环如下:
for(long i=0;i<3;++i){
for(long j=i;j<3;++j){
cout << "(" << i << "," << j << ",[" << i*2+j << "]) " ;
}
}
//////////////////////////////////////////////////
cout << endl;
//////////////////////////////////////////////////
//三重for循环宏的使用
BEGIN_FOR3(i,0,2,j,i,2,k,0,2);
cout << "(" << i << "," << j << "," << k << ",[" << i*2+j*k << "]) " ;
END_FOR3();
/*-----*/ cout << endl; /*-----*/
//相应的手工循环如下:
for(long i=0;i<2;++i){
for(long j=i;j<2;++j){
for(long k=0;k<2;++k){
cout << "(" << i << "," << j << "," << k << ",[" << i*2+j*k << "]) " ;
}
}
}
//////////////////////////////////////////////////
return 0;
}
////////////////////////////////////////////////////////////////////////////////
//该程序的运行结果如下:
/*******************************************************************************
(0,[0]) (1,[1]) (2,[2])
(0,[0]) (1,[1]) (2,[2])
(0,0,[0]) (0,1,[1]) (0,2,[2]) (1,1,[3]) (1,2,[4]) (2,2,[6])
(0,0,[0]) (0,1,[1]) (0,2,[2]) (1,1,[3]) (1,2,[4]) (2,2,[6])
(0,0,0,[0]) (0,0,1,[0]) (0,1,0,[0]) (0,1,1,[1]) (1,1,0,[2]) (1,1,1,[3])
(0,0,0,[0]) (0,0,1,[0]) (0,1,0,[0]) (0,1,1,[1]) (1,1,0,[2]) (1,1,1,[3])
*******************************************************************************/
////////////////////////////////////////////////////////////////////////////////
//注意上面的代码在g++和vc8编译器下均能够编译通过

抱歉!评论已关闭.