一次上机课,重新写了一遍99乘法表,早在去年暑假,我就分析过这一段代码,也独自写过几遍,可是就是对其中一个地方不满意,先上代码再说,
#include<stdio.h>
void main()
{
int i,j,k;
for(i=1;i<=9;i++)
{
for(j=1;j<=i;j++)
{
k=i*j;
printf("%dx%d=%d ",i,j,k);
}
printf("/n");
}
}
这段代码的结果如下:
1x1=1
2x1=2 2x2=4
3x1=3 3x2=6 3x3=9
4x1=4 4x2=8 4x3=12 4x4=16
5x1=5 5x2=10 5x3=15 5x4=20 5x5=25
6x1=6 6x2=12 6x3=18 6x4=24 6x5=30 6x6=36
7x1=7 7x2=14 7x3=21 7x4=28 7x5=35 7x6=42 7x7=49
8x1=8 8x2=16 8x3=24 8x4=32 8x5=40 8x6=48 8x7=56 8x8=64
9x1=9 9x2=18 9x3=27 9x4=36 9x5=45 9x6=54 9x7=63 9x8=72 9x9=81
虽然正确的出了结果,可是并不是很完美,可以看出,由于从第五行第二列处结果变成两位数导致第三行第三列和第四行第三列与第四列这三个元素(红色部分)(姑且称之为元素)与第五行及以下没有对齐,虽然无伤大雅,但还是觉得应该想办法处理一下,使之能够全部对齐。
从代码可以看出,造成这种结果得原因是"%dx%d=%d "后的空格是在最内层的循环体中,自然它只能按代码输出,并不会判断什么时候结果从一位数变成两位数,也不会判断应在哪儿多空一格或少空一格。
分析完原因后,接下来就是解决了,起初我在第二个循环体开头中加了一个if ,如下:
If(i<=4&&j>=3)
{
printf(“ ”);
}
运行后,第三列上面两个元素和下面对齐了,可是又出现了一个问题,4x4=16这个元素从左边突出变成了右边突出,如下:
4x3=12 4x4=16
5x1=5 5x2=10 5x3=15 5x4=20 5x5=25
6x1=6 6x2=12 6x3=18 6x4=24 6x5=30
经过分析,发现当i==4&&j==4时,4x4=16前不仅有"%dx%d=%d "中的空格,还有if中的空格,这就导致4x4=16前会多出一个空格。随后我没有深入的分析,认为既然4x4=16前多一个空格,那就用一个退格符让它退回去,于是又在先前的if后面又加了一个if,如下:
If(i==4&&j==4)
{
printf(“/b”);
}
这样,代码完成,那一点瑕疵也解决了,结果如下:
1x1=1
2x1=2 2x2=4
3x1=3 3x2=6 3x3=9
4x1=4 4x2=8 4x3=12 4x4=16
5x1=5 5x2=10 5x3=15 5x4=20 5x5=25
6x1=6 6x2=12 6x3=18 6x4=24 6x5=30 6x6=36
7x1=7 7x2=14 7x3=21 7x4=28 7x5=35 7x6=42 7x7=49
8x1=8 8x2=16 8x3=24 8x4=32 8x5=40 8x6=48 8x7=56 8x8=64
9x1=9 9x2=18 9x3=27 9x4=36 9x5=45 9x6=54 9x7=63 9x8=72 9x9=81
可是在回去的路上,总觉的这种解法不够好,我认为那个空格的问题用不到两个if,肯定还有别的解法,于是我分析了一遍代码,认真观察每一段代码的结果,最终找到了另外一种方法。因为第一个if的作用是在元素前加空格,在给第三列的两个元素加了空格之后,4x4=16这一元素自然就对齐了,所以说只需把if的作用限定在第三列,那么问题就解决了,代码如下:
if(i<=4&&j>=3&&j<4)
如此一来,相对于先前两个if,一个if显然更加简洁,
当然,现在我也就只学了一点皮毛而已,只能在自己知道的知识体系当中解决这个问题,我也只能按照自己的理解认为把代码缩短会更加好的原则来修改代码,并不知道这样的修改会不会使编译时间更短,会不会使代码质量更高,也许还有很多更好的方法,那也只有等自己学习了更多的知识之后才有能力去分析。写这篇文章的目的只是为了记下自己思考的过程,谈不上什么分享学习经验,毕竟自己也还只是个刚踏入IT大门的菜鸟,像99乘法表之类的东西对于懂程序的人来说是简单了不能再简单了。
虽然问题如此简单,但对于这个问题的分析,可以加强自己对循环语句和循环嵌套的理解,记得第一次看见99乘法表代码的时候,那时连循环语句都看得有点吃力,更别说嵌套了,现在接触了更多的知识后,发现循环嵌套用的非常多,如果不会循环嵌套,至少连二维数组数据的输入都写不出来,所以说,99乘法表收获的不仅仅是一张表,更多的是对于一个知识点更深入的理解。
在上机时看到很多同学写的代码,有一个很普遍的问题,就是格式,当然这也是不可避免的,很多人也许对计算机并没兴趣,所以自然以前没有关注过计算机方面的东西,但是既然学习了这个专业,那就应该多了解了解相关知识,至少也应该知道什么是缩进格式,因为好的编程习惯我认为很重要,但是不管是学校的教材还是谭浩强的书,里面代码的格式都极不规范,对于才开始接触编程的我们,大多数都是照着书敲代码,这就很容易让人养成不规范的代码书写习惯,所以,对于那些对编程一丁点都不知道的同学,了解一下代码格式很有必要。当然,除了格式,谭浩强的书的内容很不错,很适合初学者。
写这篇文章,除了记录自己的思考过程以外,还有就是想练习一下自己对技术性内容的叙述,看自己能不能把一个问题的解决过程用文字表达出来,所以,某种意义上说纯粹是为了自己,因为有些人看不惯别人尤其是同龄人提的建议,说你在炫耀之类的,所以我也说了,这谈不上分享学习经验。不过,对于真正想学好计算机的人,希望我的文章对各位有所帮助,技术上的帮助说不上,因为我说过,我也只是个菜鸟。
2010/3/13