1 #include <stdio.h>
2 /*
3 打印以对角线为界的半面的数据
4
5 int arr[5][5] = { 1, 2, 3, 4, 5,
6 6, 7, 8, 9,10,
7 11,12,13,14,15,
8 16,17,18,19,20,
9 21,22,23,24,25 };
10
11 1.打印主对角线上半面
12 2.打印主对角线下半面
13 3.打印次对角线上半面
14 4.打印次对角线下半面
15
16 */
17 #define M 5
18 #define N 5
19 int main(void)
20 {
21 int i,j;
22 int arr[M][N] = { 1, 2, 3, 4, 5,
23 6, 7, 8, 9,10,
24 11,12,13,14,15,
25 16,17,18,19,20,
26 21,22,23,24,25 };
27 //打印主对角线上半面
28 printf("------打印主对角线上半面------------\n");//斜线扫描,访问2->8->14->20->3->9->15->4->10->5 ;关键点:每次扫描下一个元素,行数和列数的都增加1。最后控制列越界的情况即可。
29 for(j = 1;j<=4;j -= 3)//列从第二列开始终止于第5列,
30 {
31 for(i = 0;i<=3;i++,j++)//行从第一行开始终止于第4行
32 {
33 if(j<=4)//j会出现越界的情况,将列始终控制在5列之内。
34 printf("%d\t",arr[i][j]);
35
36 }
37
38 putchar(10);
39 }
40
41 //打印主对角线下半面
42 printf("------打印主对角线下半面------------\n");//斜线扫描,访问6->12->18->24->11->17->23->16->22->21 ;关键点:每次扫描下一个元素,行数和列数的都增加1。最后控制行越界的情况即可。
43 for(i = 1;i<=4;i-=3)
44 {
45 for(j = 0;j<=3;i++,j++)
46 {
47 if(i<=4)
48 printf("%d\t",arr[i][j]);
49 }
50 putchar(10);
51 }
52 //打印次对角线上半面
53 printf("------打印次对角线上半面------------\n");//斜线扫描,访问4->8->12->16->3->7->11->2->6->1 ;关键点:每次扫描下一个元素,行数+1和列数-1。最后控制列越界的情况即可。
54 for(j = 3;j>=0;j += 3)
55 {
56 for(i = 0;i<=3;i++,j--)
57 {
58 if(j>=0)
59 printf("%d\t",arr[i][j]);
60
61 }
62
63 putchar(10);
64 }
65 //打印次对角线下半面
66 printf("------打印次对角线下半面------------\n");//斜线扫描,访问10->14->18->22->15->19->23->20->24->25 ;关键点:每次扫描下一个元素,行数+1和列数-1。最后控制行越界的情况即可。
67 for(i = 1;i <= 4;i-=3)
68 {
69 for(j = 4;j>=1;i++,j--)
70 {
71 if(i<=4)
72 printf("%d\t",arr[i][j]);
73 }
74 putchar(10);
75 }
76
77 return 0;
78 }
79
80 //总结,在斜线扫描的时候 1.打印对角线上半面的时候需要控制好列越界,打印对角线下半面的时候要控制好行越界
81 // 2. 造成越界的原因:内层循环在控制扫描走向的时候,行列同时在变动,但是内层循环的结束条件只控制了行或者列,而没有对行列的结束同时控制。
82 // 3.观察总结的1,2两条得到这样的结论:谁越界谁就是外层循环。例:列越界,就用列的下标做外层循环。行越界就用行的下标做外层循环。