教她写代码的那些日子 6 数组

学习写程序其实是一个不断练习,最终熟能生巧的过程,她显然是在我的多次唠叨后明白这一点了的。于是,她的热情便幻化成勤奋,回到家往往会做很多练习,当然练习多,出现的问题也多。那天我正躺床上悠闲地看着电视剧呢,突然手机屏幕上弹出一个微信消息:“快帮我看看,怎么出错了。”,紧接着是她发来的代码截图:

uploading.4e448015.gif

以及运行时报的错:

uploading.4e448015.gif

看了她的这个代码我不觉莞尔,新手就是新手啊,出这样的错似乎也是理所当然的。于是,我不得不放下我心爱的电视剧,耐心给她讲为什么。

“还记得数据的类型不?”我问她。

“当然记得。”她说。

“那你知道你错在哪里了吗?”我再问她。

“数据类型不对?”她试着找出问题。

“可以这么说吧。”我说,虽然问题的本质不是这样,但也可以从这个方向去解决这个问题,所以我才这么说。

“我知道了。”她说。

然后我们的对话就此中断了,想来她是去改代码去了。

果然,几分钟后她发来消息:“哈哈,进行一下强制类型转换就可以了。”。

接着这句话的后面是她发过来的程序截图:

uploading.4e448015.gif

“这样解决问题没错,但是你没有找到本质问题。”我说。

“什么本质问题?”她问。

“这个要不明天再给你讲吧。”我说,因为我终于还是放不下我心爱的电视剧,紧张刺激的情节刚刚开始,让我放下不看,真是一种煎熬。

“好吧,那你早点休息。”她回。

虽然我从这句话中读出了她的有些不高兴,但我依然回了一句:“嗯呢,你也早点休息,晚安。”

第二天,她倒是忘掉了昨晚的不高兴,还没下班,就兴冲冲地就找我:“快给我讲讲,昨天那个本质问题是什么?”。

我不知道她昨晚是否因为这个而失眠,但能肯定的是这成功地吊起了她的胃口。

“你这学习的劲头真是高涨啊。”我笑着说。

“呵呵,我现在觉得编程还挺有意思的呢。”她说。

“觉得有意思很好,学起来就事半功倍了。”我说了一个事实,不都说兴趣是最好的老师吗。

她点了点头,表示赞同,于是我接着说:“这里的本质问题是你使用的占位符用错了。”

“占位符?那个%.2f?”她疑惑地问。

“对。“

”那个有什么问题,你不是也这么写的吗?“

”那是因为被格式化的对象是一个小数,当格式化的对象不是小数时就不能用%f了,要用数据类型对应的占位符。比如这里,你要格式化的对象是一个整数,那么就要用%d这个占位符。“

”是吗?我试试。“她一边说着,一边动手改起她的程序来。

她改过的程序:

uploading.4e448015.gif

运行结果:

uploading.4e448015.gif

看到程序没有报错,她高兴地说:”哈哈,还真是呢,换个占位符就好了。“

”懂了吧,这才是问题的本质。“

”嗯,懂了,那其他数据类型是不是有其他的占位符?“

”你说得一点没错,你看看这个表就基本知道所有的占位符了。“我说着在电脑上打开一个表格给她看:

占 位 符

说    明 

示    例

%s

字符串类型

"mingrisoft"

%c

字符类型

'm'

%b

布尔类型

true

%d

整数类型(十进制)

99

%x

整数类型(十六进制)

FF

%o

整数类型(八进制)

77

%f

浮点类型

99.99

%a

十六进制浮点类型

FF.35AE

%e

指数类型

9.38e+5

%g

通用浮点类型(f和e类型中较短的)

 

%h

散列码

 

%%

百分比类型

%n

换行符

 

%tx

日期与时间类型(x代表不同的日期与时间转换符

 

她一个一个占位符认真看着,末了她转过头,看着我说:”有一点我不是很明白,%.2f这个占位符不在这个表格内,它是%f的变体?“

”这都被你发现了,你真的是冰雪聪明。你说得没错,%.2f这个占位符就是%f这个占位符变来的,之所以要这样变是因为我们想要得到一个2位小数的字符串数字。如果不对占位符做这样的变化的话,那么被格式化的数有多少位小数就会得到多少位小数的字符串数字,这显然不是我们想要的。再比如我们要格式话一个整数,让它占4位,不足四位用0补齐,那么占位符就是%04d。”说了这一大堆,我停顿了一下,用询问的眼神看向她。

她想了想说:“我大概明白了。那做这些变化,肯定有什么规则的吧,是什么样的?”

“这个我们先要来说一下占位符的构成。”说着,我找来一张纸,将占位位符的构成写下来。

 

常规类型、字符类型和数值类型的占位符格式:

%[index$][标识][最小宽度][.精度]转换符

日期和时间类型的占位符格式:

%[index$][标识][最小宽度]转换符

与参数不对应的占位符格式:

%[标识][最小宽度]转换符

其中index表示参数列表中的位置上的值

 

她仔细看着我写完,然后向我投来迷惑的目光。

“首先%就不用说了,每个占位符都是以%开头的,结尾的转换符也不用多说了,就是前面那个表格看到的那些f、d、s等等。接下来的index$用来确定这个占位符是代表第几个参数。”

说到这,我停下来转头看向她,果然从她的眼中看到了更多的问号。于是我说:“我们还是来看一个例子吧。”

uploading.4e448015.gif

编译运行:

uploading.4e448015.gif

“哈,我明白了,当有多个参数时,通过这种方式可以控制每一个参数在字符串中出现的位置。”看了这个例子,她兴奋地说。

“你很聪明。”我说,“接下来的标识,我们还是来看一个表。”

标识

含义

-

在最小宽度内左对齐,不可与0标识一起使用

0

若内容长度不足最小宽度,则在左边用0来填充

#

对8进制和16进制,8进制前添加一个0,16进制前添加0x

+

结果总包含一个+或-号

空格

正数前加空格,负数前加-号

,

只用与十进制,每3位数字间用,分隔

(

若结果为负数,则用括号括住,且不显示符号

“这个表很好理解吧?”在她认真看了这个表后,我问她。

“嗯,还是有点不直观,还是写几个例子来看看吧。”她说着拿过电脑开始敲起代码来。

uploading.4e448015.gif

编译运行:

uploading.4e448015.gif

“哈哈,这样一看就很直观了。”程序运行后,她对比着程序代码、输出结果以及我给她看过的表格看了看说。

我张了张嘴正要说点什么,又听她说:“好了,这个字符串的格式化我已经学会了,你可以讲其他内容了。”

“真的都掌握了?”我问。

“那当然,没看我都把程序写出来了吗?”她反问,一副自信满满的样子。

“好吧,看来你是真的掌握了字符串的格式化。”我想以她的聪慧,应该是真的掌握了。

”不过,还有一点,这个字符串的格式化,还可以用到别的地方,比如在标准输出时可以直接应用字符串格式化。“我突然想起这个知识点,于是给她说。

“是吗?写个例子看看呗。”她说,似乎已经掌握了学习编程的真谛,那就是多看例子,多写例子。

“好的。”我答道,既然女神有令,我自然乖乖拿过电脑写一个例子。

uploading.4e448015.gif

编译运行:

uploading.4e448015.gif

“原来如此,很简单嘛。”看了我写的这个例子后,她说。

“是很简单啊,只是将println改成printf就可以了。不过我要不讲,你也不知道啊。所以,年轻人,你要学的东西还很多。”我装出语重心长的口气说。

“咦,几眼没见,你居然老了几十岁。”她很认真地盯着我看了好几秒后说。

“什么意思?我变老了吗?”我摸了摸我的脸说。

“没有吗?那你干嘛像个老年人一样说话。”她说。

我这才明白过来,她是在嘲弄我故作老成地说话,想到这,我不禁笑了,她还真是一点不吃亏的主啊。

”好了,不说这个了,我们还是来学习新的内容吧。“我赶紧转移话题。

”今天学什么?“她问,眼中迸射着期待的光芒。

“数组。”我说。

她没有说话,而是眨巴着眼睛看着我,意思是说:“你继续,我认真听着呢。”

于是,我继续说:“数组就是一组数据的组合。”

她依然用她那双动人的眼睛看着我,不说一句话,但我从她的眼神中读出两个字来:“废话。”

我的确是说了一句废话,所以我不再说下去,而是陷入了沉思。

她或许对于我这样的思考已经习以为常了,所以她依然没说话,于是又出现了一副定格画面,不过这次是她看着我,而且是明目张胆地看着。

我被她看得不好意思了,于是我说:“你先练习练习字符串的格式化,我想想怎么给你讲数组。”

“好吧。”她说,然后拿过笔记本电脑,敲起代码来。

就这样,我成功地让被盯着看的对象,由我变成了她,不过我却没有心思去欣赏她的美,此时的我满脑子想的是,怎样给她讲清楚数组。

“假如有10个整数,现在要让你找出其中最小的一个数,你会怎么写程序?”最终我想出这个找出最小数的例子来开始数组的教学。

她停下敲键盘的手,歪着头想了想说:“先定义一个变量并将第一个整数赋值给它,然后依次拿这个变量和其他的整数进行比较,如果变量比当前比较的整数大,就把当前比较的整数赋值给变量,以此类推,和所有整数比较完了以后,最后变量的值就是需要的最小整数。”

没想到她能清楚地说出算法来,这让我有些意外,不过转念一想,她本身就很聪明,再加上这些天来的勤奋学习,能想清楚这样一个简单的算法也不足为奇了。

“说得很好,写出来看看呢。”我说。

“没问题。”她说着新建了一个文件,然后双手在键盘上轻快的敲击起来。

过了几分钟,她的想法已经以程序代码的形式表现了出来:

uploading.4e448015.gif

编译运行:

uploading.4e448015.gif

“哈哈,完美。”看到运行结果她兴奋地说。

而我却看着她的手说:“敲这么多代码,手累不?”

“手?”她擡起双手看了看,说:“好像确实有点酸痛。”

“哈哈,”我笑了,“我要说1000个数,可能你的手就废了。”

“不许笑!“她佯装愠怒,转而又柔声说:”你一定有更好的方法,快给我讲讲。”

“这个时候该我们今天的主角数组出场了。”我说,“且让我把代码改上一改。”

我改过的代码:

uploading.4e448015.gif

编译运行:

uploading.4e448015.gif

“这样就不用写到手抽筋了。”我说。

“这样确实是简洁了很多。”她认真地点了点头说。

“这就是数组的作用,我们可以把相同类型的数据按顺序组成数组,然后通过数组名加下标来使用数组中的数据。”我说了一段纯理论后看向她,期待她能理解我所说。

她显然没能一下子听懂我说的话,歪着头思考着。

“下标是中括号里面的数字吗?”思考了一会儿后,她问。

“对,没错。“我说,”因为数据在数组中是按顺序存放的,所以下标其实是表示数据在数组中的位置。这里要注意的是,在数组中下标的是从0开始的,也就是说第一个数据的位置是0,第二个数据的位置是1,以此类推。“

”所以,在你写的这个例子中,a=nums[0]就是取数组nums中的第一个数据,也就是12赋值给变量a,是不是这样?“听了我的讲解,她抢着说出这个程序中一行代码的意思来。

我不由得投去赞许的目光,她果真是聪明伶俐,一点就透。

”你说得没错,看来你已经学会数组了,那你就来解释一下我写这个程序呗。“我想我已经不用再讲更多了,她基本上已经掌握了数组这个知识点。

”嗯,我试试,讲错了你要给我指正哦。“她说。

”好,那么开始你的表演。“我答应她。

“数组可以看成一个变量,所以和变量一样需要声明,声明一个数组的形式为:数据类型 [] 数组名。”她想了想说,看我点了点头后,她又继续说,“数组的创建用‘new 数据类型{element1,element2,element3...}’这种形式进行。然后,需要从数组中取值的话就用'数据类型[下标]'这种形式取到指定序号的元素的值,我猜想给数组元素负责也是用下标指定元素进行赋值,形如这样:数组名[下标]=一个相同类型的值。”

“你基本上说得不错,”我向她投去赞许的目光,“但是有几点我需要给你补充一下。1、数组的声明还有一种形式,就是把中括号放最后,形如:数据类型 数组名[]。2、数组的初始化可以不指定具体的值,而只是指明数组的大小,就像这样:new 数据类型[length],这里这个length可以是一个常量也可以是一个变量,比如: new int[3]或者new[n],其中n是一个变量。3、如果声明和初始化写到一起的话,可以省掉‘new 数据类型’这几个字符,形如:数据类型[] 数组名={element1,element2,element3...},所以刚那个例子其实可以写成:int []nums ={12,1,23,13,34,5,-10,12,90,32,23,34545,-12}。4、除了这里说的一维数组,还可以有多维数组,多维数组可以理解为数组的数组,也就是数据类型是一个数组。所以多维数组我不用细讲,你应该可以猜得到怎么使用了。“

”嗯,“她想了想说,”我猜多维数组的声明应该是这样的:数据类型 [][]... 数组名,而它的初始化可以是这样的:{{{}{}...}{{}{}...}...}。比如一个二维数组应该就是这样的:int [][]nums={{1,2},{3,4}}或者是int nums [][]=new int [2][3]。“

“说得太对了,”对于她的聪慧,我已经不再惊讶了,“你真是聪明伶俐啊。”

“哈哈,那是当然。”她开心地笑着。

“那既然你已经学会了数组,我们就来写个例子玩玩呗。”

“好啊,那你出题目,我来写。”

“那我们来做一个排序的例子吧。假如有五个学生,他们的升高分别是1米、1.5米、1.2米、0.9米、1.4米,现在需要将五位学生的身高从低到高进行排序。”

“好的,小意思,看我的。”她说着就拿过电脑开始写代码了。

但她的手在键盘上敲击了一会儿就停下了,她似乎高估了自己的能力,愁眉苦脸地转过头来看向我说:“这个排序该怎么写呢?”

“哈哈,不会了吧。”我不觉笑了起来。

“不许笑,快说怎么写。”

“遇到问题呢不要一上来就写代码,”我拿过纸笔,“我们先理好了思路再来写代码。”

她奇怪地看着我手里的纸笔不说话,我只好一边在纸上画出五个小人来,一边说:”你看,假如有这么五个学生站在你面前,你会怎么去给他们排序?“

“首先我会找到最矮的这个放到第一个位置,“她指着纸上的小人说,”然后再把第二矮的放在第2个位置,以此类推,直至排好位置。“

”很好,我来给你翻译一下,首先你从第一个位置依次向后查找,找到最小的一个,然后把他移动到第一个位置,然后从第二个位置依次向后面查找,找到最小的放在第二个位置,依次类推,直至排好序。“

“是这样。”她说,然后她想了想后突然笑起来:“哈哈,我知道怎么写程序了。”

“那么就开始写呗。”

她写的程序 :

uploading.4e448015.gif

编译运行:

uploading.4e448015.gif

“哈哈,这么难的问题都被我解决了,我还是挺牛的是不是?”程序正确运行后,她笑着看向我说。

“嗯,你是我带过最好的学生。”我笑着回答她。

“哈哈,我这样优秀的学生带起来是不是很省心?”

“确实。”

“不过呢,再优秀的学生肚子饿了也是学不好的,所以今天就到这吧。”

“既然这样,不如我请你吃烧烤吧。”

“好啊,好啊。”她兴奋地几乎跳起来了。

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章