版权所有,转载请注明出处!
写这篇博客并不是为了探讨算法效率的提升,而是尝试以一种更能够让人们读懂的方式进行书写程序,
这里我写了三个程序,分别使用三种编程方式进行书写,希望读者能够找到更加适合自己的方式。
1.直接按照一维数组的习惯操作:
#include <iostream>
#define N 3
using namespace std;
int main (int argc, const char * argv[])
{
int A[] = {1,2,3,4,5,6,7,8,9};
int B[] = {7,6,5,1,2,3,2,8,7};
int C[9]= {0};
memset(C, 0, sizeof(C));
for(int i =0; i < N; i ++)
for(int j = 0; j < N; j ++)
{
int ele = 0;
for(int k =0; k < N; k ++)
{
ele += A[i*N + k]*B[k*N + j];
}
C[i*N +j] = ele;
}
for(int p =0; p < N; p++){
for(int q = 0; q < N; q ++)
{
cout << C[p*N +q]<<" ";
}
cout<<endl;
}
return 0;
}
2.使用宏定义简化思维方式:
#include <iostream>
#define N 3
#define ELEMENT(A,i,j) A[i*N + j]
using namespace std;
int main (int argc, const char * argv[])
{
int A[] = {1,2,3,4,5,6,7,8,9};
int B[] = {7,6,5,1,2,3,2,8,7};
int C[9]= {0};
memset(C, 0, sizeof(C));
for(int i =0; i < N; i ++)
for(int j = 0; j < N; j ++)
{
int ele = 0;
for(int k =0; k < N; k ++)
{
ele += ELEMENT(A, i , k)*ELEMENT(B , k, j );
}
ELEMENT(C , i, j) = ele;
}
for(int p =0; p < N; p++){
for(int q = 0; q < N; q ++)
{
cout << ELEMENT(C, p , q )<<" ";
}
cout<<endl;
}
return 0;
}
3.使用内联函数简化思维方式:
#include <iostream>
#define N 3
using namespace std;
inline int element(int *A, size_t i, size_t j)//实现下标操作
{
return A[i*N + j];
}
inline void setElenent(int *A, size_t i, size_t j, int element)//设置指定的元素
{
A[i*N + j] = element;
}
int main (int argc, const char * argv[])
{
int A[] = {1,2,3,4,5,6,7,8,9};
int B[] = {7,6,5,1,2,3,2,8,7};
int C[9]= {0};
for(int i =0; i < N; i ++)
for(int j = 0; j < N; j ++)
{
int ele = 0;
for(int k =0; k < N; k ++)
{
ele += element(A, i, k)*element(B , k, j);
}
setElenent(C,i,j,ele);
}
for(int p =0; p < N; p++){
for(int q = 0; q < N; q ++)
{
cout << element(C, p , q )<<" ";
}
cout<<endl;
}
return 0;
}
从上面三个程序可以看出,他们使用的算法是完全一样的,仅仅是在书写的时候采用了不同的技巧,
第一个程序没有采用任何的技巧,直接进行操作,缺点就是容易思路混乱,而且很容易出错。
相比之下,第二和第三段程序采用了宏定义和内联函数来简化思维方式,使得我们能够像操作
二维数组一样对一维数组进行操作。