ITEducation&TrainingDate:February12,2020九宫算术email:duanenze@126.com计科系段恩泽ITEducation&TrainingDate:February12,2020目标与内容•理解九宫算术,掌握九宫算术的变换和填数规律以及九宫算术的存储;•掌握二维数组的概念、数组元素的默认值,能够定义二维数组,处理二维数组,如给二维数组的元素赋值,输出二维数组中的元素;•掌握模运算,使用模运算防止二维数组的行号和列号越界;•能够使用二重循环控制二维数组;•理解格式输出的含义,能够对九宫算术进行格式输出;•能够使用Console类的Write方法输出信息;•能够使用Console类的WriteLine方法进行换行输出;•能够使用while循环进行数据的连续输入,直到输入的数满足要求;•能够使用foreach循环遍历数组;•能够对九宫算术进行改造,变成类,巩固字段、属性、构造器、方法等概念及应用•理解类的多态性及方法的重载,能够定义多态方法。ITEducation&TrainingDate:February12,2020内容导读•先给出一个九宫算术的例子:3行3列,介绍九宫算术的概念,分析九宫算术的变换,给出教材中九宫算术的图。•先给出问题:九宫格子中的数如何存放,引出二维数组的概念。•然后分析九宫算术的规律,并且,以3行3列的九宫算术为例,分析九宫算术的过程,这里面涉及产生行号和列号的模运算。•然后进行九宫算术的代码分析。•在输出九宫中元素时,涉及二重循环,这时,介绍二重循环的概念,语法,以及如何应用二重循环控制九宫中数的输出,这里涉及Console类的Write方法和格式输出,此时,介绍格式输出的含义。ITEducation&TrainingDate:February12,2020内容导读•下面介绍九宫算术的扩展功能。•首先是n是小于3的整数或者n表示偶数情况的分析,要求一直持续输入,直到输入一个不小于3的奇数为止。这里涉及while循环,分析while循环,以及应用while循环解决该问题。•然后,检查二维数组是否是以行序存放的,使用foreach循环来处理。•将九宫算术变成一个类,便于单独处理,起其有两个字段,一个行列数,另一个是存放九宫元素的九宫数组,相应有属性和索引器,因为是数组,所以是索引器,并且是二维的。该类的构造器应该是1个参数行列数,因为行列数需要由外界决定。九宫数组在构造器中产生。ITEducation&TrainingDate:February12,2020内容导读•九宫类有两个方法,一个是产生九宫数组数的方法CreateJiugong,另一个是输出九宫元素的方法Write。•可以增加方法,如最小数不是1而有一个增量,如从4开始,4,5,6,…,12,此时可增加一个与CreateJiugong同名的方法,该方法有一个参数increment表示增量,两个方法同名的情况称为方法重载,是类的多态性的表现。•非连续数,有一个间隔和增量,如5,8,11,14,17,20,23,26,29。此时,定义一个重载方法,带两个参数,第一个参数是增量increment,第二个参数是间隔span。ITEducation&TrainingDate:February12,2020九宫算术问题•在金庸小说《射雕英雄传》中,瑛姑耗尽半生不能解决的一个问题,被黄蓉用一句口诀“二四为肩,六八为足,三七当腰,中五为腹,戴九履一”轻易解答了。此为著名的九宫算术。•九宫可为3行3列、5行5列等奇数,也可为偶数,本教材取奇数,并且取基本的3行3列。294357618ITEducation&TrainingDate:February12,2020几种变换618753294276951438672159834教材例子使用的图ITEducation&TrainingDate:February12,2020九宫如何存储•二维数组•表示九宫的二维数组:int[,]jiugongArr=newint[2,3];调试运行(F10),注意每个元素的初始值。此时,数组中的每个元素没有初始化,每个元素的值为默认值0。注意元素的顺序[0,0],[0,1],[0,2],[1,0],[1,1],[1,2],[2,0],[2,1],[2,2],是以行为主序,第一行存放完,才存第二行,依次类推。还有一种是以列为主序,即[0,0],[1,0],[2,0],[0,1],1,1],[2,1],[0,2],[1,2],[2,2],第一列存放完,才存第二列,依次类推。•其他的数组看书P80。ITEducation&TrainingDate:February12,2020九宫算术填数规律•中间一行,最后一列填入最大的数(jiugongArr[1,2]=9)。•然后行号加1,列号加1(均采用模运算,以达到行、列越界翻转的效果)如当行号为2时,如果加1,变成3,在3行3列的二维数组中,没有行号为3的行,此时的行号应该是2,即3%3的余数为0,即为模运算。•如果对应的格子还没有数(即数组中对应元素的值为默认值0,如jiugongArr[1,2]=9,而jiugongArr[2,3%3]=0,此时应该填入下一个数字8)•如果已经填入了数,则原行号不变,原列号减1,再在对应格子填入下一个数字。•依次循环,直到所有数字都填入格子为止。ITEducation&TrainingDate:February12,20203行3列九宫格的填数过程•jiugongArr[1,2]=9•行号加1变为2,列号加1变为3,进行模运算,列号为0,而jiugongArr[2,0]的值为0,填入8。•行号加1变为3,进行模运算,行号为0,列号加1变为1,jiugongArr[0,1]的值为0,填入7。•行号加1变为1,列号加1变为2,jiugongArr[1,2]=9,取原行号0,原列号减1为0,jiugongArr[0,0]=0,填入6。•行号加1变为1,列号加1变为1,jiugongArr[1,1]=0,填入5。•行号加1变为2,列号加1变为2,jiugongArr[2,2]=0,填入4。•行号加1变为3,取0,列号加1变为3,取0,jiugongArr[0,0]=6,取原行号2,原列号减1为1,jiugongArr[2,1]=0,填入3。•行号加1变为3,取0,列号加1变为2,jiugongArr[0,2]=0,填入2。•行号加1变为1,取0,列号加1变为3,取0,jiugongArr[1,0]=0,填入1。•所有数字填充完毕。ITEducation&TrainingDate:February12,2020代码分析•输入行列数(奇数)//注:可以输入大于3的奇数Console.WriteLine(请输入行列数(奇数):);intn=int.Parse(Console.ReadLine());•请注意:后面的条件n%2!=0是保证n是奇数。ITEducation&TrainingDate:February12,2020将最大的数填入中间一行,最后一列introw=(n+1)/2-1;//中间一行intcol=n-1;//最后一列int[,]jiugongArr=newint[n,n];//九宫数组jiugongArr[row,col]=n*n;//最大的数ITEducation&TrainingDate:February12,2020循环处理填入所有的数for(inti=n*n-1;i=1;--i){//里面是处理代码}ITEducation&TrainingDate:February12,2020行号加1,列号加1intr=(row+1)%n;intc=(col+1)%n;ITEducation&TrainingDate:February12,2020对应格子没有填入数if(jiugongArr[r,c]==0){jiugongArr[r,c]=i;}ITEducation&TrainingDate:February12,2020对应的格子已经填入了数else{r=row;//原来行号c=col-1;//原来列号减1jiugongArr[r,c]=i;//填数}row=r;//现在的行号col=c;//现在的列号ITEducation&TrainingDate:February12,2020输出九宫格中的数•由于是二维数组,要控制行数和列数,一般是先把第1行输出完后才输出第2行,依次类推。所以需要两重循环,外层循环控制输出的行数,内层循环控制输出的列数。•两重循环的例子如下:for(inti=0;in;++i)//n为行数{for(intj=0;jn;++j)//n为列数{}}•看书P93。ITEducation&TrainingDate:February12,2020格式输出•为了输出数字呈九宫格排列,需要对输出的数进行格式控制。•格式输出的例子如下:Console.WriteLine({0,6:000}“”,12);–12占6个字符,形式为012,因为要求输出占3个字符,不足3个用0补齐。•由于输出一行后要换行,所以输出不能使用WriteLine方法,而使用Write方法,输出完一行后使用WriteLine方法换行。ITEducation&TrainingDate:February12,2020输出九宫格中的数for(inti=0;in;++i)//控制行数{for(intj=0;jn;++j)//控制列数{Console.Write(“{0,5:00}”,jiugongArr[i,j]);//输出数}Console.WriteLine();//一行输出后换行}ITEducation&TrainingDate:February12,2020功能扩展•下面开始对九宫算术的功能进行扩展。ITEducation&TrainingDate:February12,2020输入的n不是正的奇数•在九宫算术中要求n应该是正的奇数,准确地讲要大于等于3。但在实际当中,可能误输入了偶数、负数。•如果输入了以上的数,要求继续输入,直到输入了正确的正的奇数为止。•使用while循环控制。while(boolean-expression){statements;}•看书P88。ITEducation&TrainingDate:February12,2020输入的n不是正的奇数•持续输入直到输入的数是大于等于3的奇数为止。Console.WriteLine(请输入行列数(奇数):);intn=int.Parse(Console.ReadLine());while((n3)||(n%2==0)){n=int.Parse(Console.ReadLine());}ITEducation&TrainingDate:February12,2020检查二维数组是否以行为主序存放•我们已经知道了九宫数组jiugongArr中每个格子中的数据元素,现在要检查该数组是否以行为主序进行存放。此时,需要从头到尾遍历该数组,要使用foreach循环来进行控制。•foreach的语法如下:foreach(typeidentifierincollection){statements;}•练习:一个数组整数一维数组arr,有10个数,输出这10个数。•看书P94。ITEducation&TrainingDate:February12,2020遍历jiugongArr数组foreach(intiinjiugongArr){Console.Write({0,5:00},i);}ITEducation&TrainingDate:February12,2020•可以将九宫算术变成一个类,类名就是Jiugong。•该类有一个数据是行和列的数目,即前面的n,这是该类的一个字段,私有的,名字可为number。•该字段应该有一个属性,可以对这个数据进行读写。将九宫算术变成一个类ITEducation&