Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1495065
  • 博文数量: 226
  • 博客积分: 3997
  • 博客等级: 少校
  • 技术积分: 2369
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-19 17:26
个人简介

Never save something for a special occasion. Every day in your life is a special occasion.

文章分类

全部博文(226)

文章存档

2018年(5)

2017年(11)

2016年(1)

2015年(17)

2014年(14)

2013年(30)

2012年(5)

2011年(52)

2010年(107)

分类: C/C++

2011-01-24 21:01:43

参数传递问题 Magic-数组型参数

  1. 魔方阵是中国人最先发现的,三阶魔方阵又称洛书,已有两、三千年的历史。古代的印度人很崇拜魔方阵,许多人在石头或金属上刻了魔方阵,作为护身符来避邪。魔方阵何时传入欧洲,没有人知道。十五世纪左右,欧洲的星相家把三到九阶魔方阵依次和土星、木星、火星、太阳、金星、水星、月亮对应。法国的学者最先对魔方阵作有系统的研究,贡献很大。

Magic方阵的定义:各行和=各列和=对角线和 的int方阵。

例如:

6  1  8
7  5  3
2  9  4
是3*3魔方阵。

7  2  6
1  5  9
4  8  3
不是魔方阵

请写一个函数,判断一个3*3的int数组是否魔方数组。

Code:

  1. bool IsMagic(int m[3][3])
  2. {
  3. int i, j;
  4. long sum, S;
  5. S = m[0][0]+m[0][1]+m[0][2]; // sum of row 0.

  6. // rows

  7. for(i=1; i<3; i++)
  8. {
  9.  sum = 0;
  10.  for(j=0; j<3; j++)
  11.   sum+=m[i][j];
  12.  if(S != sum)
  13.   return false;
  14. }
  15. // cols

  16. for(j=0; j<3; j++)
  17. {
  18.  sum = 0;
  19.  for(i=0; i<3; i++)
  20.   sum+=m[i][j];
  21.  if(S != sum)
  22.   return false;
  23. }
  24. // slash

  25. sum = m[0][0]+m[1][1]+m[2][2];
  26. if(S != sum)
  27.  return false;
  28. // backlash

  29. sum = m[2][0]+m[1][1]+m[0][2];
  30. if(S != sum)
  31.  return false;

  32. return true;
  33. }



学习:
1、C语言只有一维数组,数组的元素可以是任意类型——包括数组。
例如 int array[2][3] 是一个“二维数组”,实际上是一个有2个元素的一维数组,数组的元素是有3个int的“一维数组”,元素的类型是 int [3]。

2、函数参数列表中的数组已经转化为指向其元素类型的指针。
这里 “bool IsMagic(int m[3][3])” 中的 int m[3][3] 等价于 int (*m)[3]。所以函数中允许这样的句子“m++”,这表示 指向数组的下一个元素m[0+1][*] (元素类型 int [3])。而 sizeof(m)也不是测量数组的大小,而是指针的大小,值为4.
另外,“bool IsMagic(int m[3][3])” 可以写成 “bool IsMagic(int m[][3])” 也是同样的原因。

提问:
这里是“判断一个3*3的int数组是否魔方阵”,如果是“判断 n*n(n<5)的int数组是否魔方阵”又该如何定义函数?具体描述:
有3个数组,规模分别是3*3,4*4,5*5,请写一个函数分别判断它们是否魔方阵。

提示:
不能把接口定义为 “bool IsMagic(int m[][])”因为编译器可以不知道“数组”的大小,但不能不知道它的内存布局。

 

阅读(2262) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~