资源描述
宿 城 区 职 教 中 心 活 页 教 案
课题
矩阵的旋转编程
授课时间
2012年3月19日星期一
教学目标
知识目标
了解二维数组旋转相关知识
能力目标
培养二维数组程序设计能力
情感目标
通过编程的过程享受编程的成就感,增加自我肯定的意识
教学重难点
重点
旋转前后数组的关系
难点
二维数组旋转编程
教法与学法
讲授法、练习法、讨论法
教具准备
多媒体、机房
教 学 过 程
教学内容
师生活动
一、 矩阵的旋转
矩阵的旋转有8种情况:逆时针90度、180度、270度、60度;顺时针90度、180度、270度、360度
二、 相同情况
逆时针90度与顺时针270度;
逆时针180度与顺时针180度
逆时针270度与顺时针90度
逆时针360度与顺时针360度
三、 矩阵旋转的3种情况编程
1:顺时针90度
假设原矩阵a[3][4],赋值时值和下标相同
方法I:已知新数组b[i][j]:
原数组的列为新数组的行
原数组的行=2-新数组的列
b[i][j]=a[2-j][i]
方法II:已知原数组a[i][j]:
新数组的行为原数组的列
新数组的列=2-原数组的行
b[j][2-i] = a[i][j]
方法II只要修改蓝色代码为:
for(i=0;i<3;i++)
for(j=0;j<4;j++)
b[j][2-i] = a[i][j];
特别注意for循环的循环次数
2:顺时针180度
方法I:
已知新数组b[i][j]:
原数组的行=2-新数组的行
原数组的列=3-新数组的列
b[i][j]=a[2-i][3-j]
方法II:
已知原数组a[i][j]:
新数组的行=2-原数组的行
新数组的列=3-原数组的列
b[2-i][3-j]=a[i][j]
3:顺时针270度
方法I:
已知新数组b[i][j]:
原数组的列=3-新数组的行
原数组的行=新数组的列
b[i][j]=a[j][3-i]
方法II:
已知原数组a[i][j]:
新数组的行=3-原数组的列
新数组的列=原数组的行
b[3-j][i]=a[i][j]
老师提问:矩阵旋转分为几种情况
学生讨论:。。。
学生回答:。。。
老师提问:矩阵旋转的所有情况中,哪几种旋转效果是相同的?
学生讨论:。。。
学生回答:。。。
老师提问:顺时针360度、逆时针360度与原矩阵有什么关系?
学生讨论后回答:。。。。。
答案:顺时针360度、逆时针360度与原矩阵相同
所以矩阵的旋转实际上只有3种情况。
让学生画出顺时针90度后的矩阵
答案: 旋转后放入新矩阵b[i][j]中
让学生讨论并找出b[i][j]与原数组a之间的关系。
学生编程:数组a按要求赋值并显示,按顺时针90度规则放入数组b中,变显示b数组。
I参考程序:
#include<stdio.h>
main( )
{ int a[3][4],b[4][3];
int i,j;
for(i=0;i<3;i++)
for(j=0;j<4;j++)
a[i][j]=10*i+j; //赋值
printf("原矩阵:\n");
for(i=0;i<3;i++)
{ for(j=0;j<4;j++)
{ if(a[i][j]/10==0)
printf(" 0%d ",a[i][j]);
else
printf("%3d ",a[i][j]); }
printf("\n");
} //显示原矩阵
for(i=0;i<4;i++)
for(j=0;j<3;j++)
b[i][j]=a[2-j][i];//放入b中
printf("\n新矩阵:\n");
for(i=0;i<4;i++)
{ for(j=0;j<3;j++)
{ if(b[i][j]/10==0)
printf(" 0%d ",b[i][j]);
else
printf("%3d ",b[i][j]); }
printf("\n");
}
}
让学生画出顺时针180度后的矩阵
答案: 旋转后放入新矩阵b[i][j]中
让学生讨论并找出b[i][j]与原数组a之间的关系,
并编程验证。
方法I:for(i=0;i<4;i++)
for(j=0;j<3;j++)
b[i][j]=a[2-i][3-j];
方法II:for(i=0;i<3;i++)
for(j=0;j<4;j++)
b[2-i][3-j]=a[i][j];
让学生画出顺时针270度后的矩阵
答案: 旋转后放入新矩阵b[i][j]中
让学生讨论并找出b[i][j]与原数组a之间的关系,
并编程验证。
方法I:for(i=0;i<4;i++)
for(j=0;j<3;j++)
b[i][j]= a[j][3-i];
方法II:for(i=0;i<3;i++)
for(j=0;j<4;j++)
b[3-j][i]=a[i][j];
教学内容
师生活动
四、总结
总结:
顺时针90度:
for(i=0;i<4;i++)
for(j=0;j<3;j++)
b[i][j]=a[2-j][i];//放入b中
顺时针180度:
for(i=0;i<4;i++)
for(j=0;j<3;j++)
b[i][j]=a[2-i][3-j];
顺时针270度:
for(i=0;i<4;i++)
for(j=0;j<3;j++)
b[i][j]= a[j][3-i];
观察代码:
只有180度的旋转新矩阵的行、列与原矩阵的行、列对应不变;
90度、270度的旋转新矩阵的行与原矩阵的列、新矩阵的列与原矩阵行对应。
思考:
1:矩阵的转置同矩阵的旋转有关系吗?
2:上面我们学习的方法I、方法II是按行优先顺序还是按列优先顺序?
请对顺时针90度旋转的方法I改成列优先顺序编程。
板书设计
一、 矩阵的旋转
二、 矩阵旋转的所有情况中,相同的情况
三、 矩阵旋转的3种情况编程
1、 顺时针90度
2、 顺时针180度
3、 顺时针270度
四、总结
教后记
通过适当的引导学生能掌握分析问题的方法,但是转变程序时还有点问题,以后对编程的练习要加强。
展开阅读全文