2005-02
23

C语言之循环程序(7)

By xrspook @ 20:16:24 归类于: 扮IT

不知不觉已经写了一个星期学习日志。原来在抱怨之中也挺好玩。

今天学习的是循环程序。开始觉得应该是挺麻烦的,但原来也一般般。

while语句和do-while语句的区别就是前一个是先进行e,然后看条件如何再决定循环与否,是否执行S;而do-while语句则是先执行S,然后再执行e,同样是看此后的条件决定是否循环。所以说白了就是do-while要在之前先执行一个程序。

然后就是for语句,也是循环语句。相比while和do-while要方便,所以也是最常用的。最神奇的是3个语句其实可以表示同样的东西,比如那个例题“计算1+3+5+…+(2i-1), 其中i=1,2,3,…,100。”在同样计算这道题,显然for就比用前面两个要方便。

然后就是多重循环。其实就是几个循环语句的套叠,不过一定要遵守一个规则就是不能交叉,其他的,就喜欢怎么就怎么。一共有9个选择都是合法的,也就是无论是他们两两互叠还是自己叠自己都是合法的。

接下来就是介绍中途退出的命令。一个是break, 一个是continue, 前者是完全退出整个循环,而后一个只是退出正在进行的循环。其实在前面说分支switch的时候已经见过break了,而且那时说习惯在switch的case里写break是个好的编程习惯,这样可以便于维护和修改。

接下来就是不明不白的goto语句,到处都说用它要有节制,滥用就会出现恶果,程序没有了完整性。所以到底怎么用它还是应该斟酌的。

这些东西反倒不是令人怎么麻烦,麻烦的是为什么要采取这样的算法。尽管觉得自己的数学不是十分臭,但遇到如此的数学问题的确是发现自己力不从心的。比如说“求2至32767之间的全部素数。”它的解释它的程序是这样的“所谓素数就是只能被1和它自身整除的数。所以断定一个数是不是素数,是用从2直至该数之间的所有数来试除,看其是否能被整除……但实际上不需要进行这么多次的试除,而只需除到该数的平方根为止。” “除到平方根”这怎么想啊?也许这就是高明的程序和一般的程序的差别。它用了捷径,而我就傻傻地只懂直走。

然后就是经典的“百鸡问题”的例题。
“假设公鸡每只5元,母鸡每只3元,小鸡三只1元,现有100元,要求买100只鸡,公鸡、母鸡、小鸡各多少只?”
然后它的程序是:
#include
main()
{
int x, y, z;
for (x=0; x<20; x++)
for (y=0; y<33; y++)
{
z=100-x-y;
if ((z%3==0)&&(5*x+3*y+z/3==100))
printf("cock=%d\t hen=%d\t chicken=%d\n", x, y, z);
}
}
要在x<20和y<33之下在用条件来把z作为突破口,我只能……的确它的思维是和自己做的数学是有多少一点出入的。

今天结束了第三章,明天又是一个新的开始了。

2005-02
22

C语言之顺序及分支程序(6)

By xrspook @ 19:10:00 归类于: 扮IT

终于越来越有趣了,没有了烦琐的定义,似乎什么都简单了起来,比前几天好理解了许多。看着一大堆的东西终于开始有点马上有反应的样子。

首先是输出输入格式。printf或者scanf("输入格式", 输入项表 ),挺好理解的。所谓格式就是%d, %f, %c, %x, %s, 然后外加说明它们所表示的字符。不过发现例题里面好像有一点问题。其中有一句“……printf("x=%d y=%d z=%d \n", x, y, z);……”然后它的解释居然是“x=10y= 15z=25” ,这不是应该表示为x=10, y=15, z=25的吗?我以为是我的错误,但看清楚,的确在%d和y,z之间是有很大的空格的,而且输出项表里面也说明了是x, y, z三个项的输出,为什么会解释为它们之间有产生了关系呢?这里明显和它前一页的解释有截然相反的效果。而看类似的scanf()的输入格式的解释之中就有明确的说明“如果有多个输入项,从键盘上输入的各个数据之间可以用空格、TAB键或者回车键作为分隔符。”那么由此看来无端上面的例题把x, y, z扯上关系是不对的。

然后就是输出函数putchar()和输入函数getchar()又是好像是一对的东西。但看来两个东西和进制格式和ASCII码是有紧密联系的,但为什么这本书从来就不提到底ASCII码到底是什么东西呢?只是在书后面的附录出现了常用的字符的ASCII码。

然后就是顺序程序设计,基本上是一帆风顺。其中的步骤都是显然易见的,但为什么把字母从小写变成大写的程序其中一步是“c2=c1-32”就是把c2(小写字母)的代码减去32就是大写字母呢?字母表显然是只有26个,但为什么要来个32个呢?原来一切又是可恶的ASCII码,的确在ASCII码当中,小写字母和大写字母相差刚好32个,因为其中存在“[ \ ] ^ _ ` ”这6个符号,这不是耍我吗?如果不是不久之后看到,看来又会成为我长时间的疑问了。

在顺序编程里面有个十分实在的秘诀“自顶向下,逐步求精”看来这也是设计方法的精髓吧。

分支结构就更好玩了。一堆的if-else, if, else, else if就似乎搞定了所有的情况。当然还有一个叫做开关分支的东西。switch-case,最后的分支开关就是
switch (e)
{
case c1:
S1;
break;

case cn:
Sn;
break;
default:
Sn+1
break;
}
很好玩嘛!符合这个就这个,要不就下一个,如果一个结束就用一个break跳出程序,和前面的if与else的神奇配合有异曲同工之妙。不过它到底和if和else的配合又有什么不同呢?好像两者在某种情况下是可以互用的。

在条件分支程序设计举例里面遇到了关于计算闰年的例题。闰年原来是“能被4整除而不能被100整除,或能被400整除。”就是如果即使2000年能被4和一百整除,但由于它也能被400整除,所以它也是闰年,怎么我好像以前就没有听说过闰年计算里面会有100和400的定义呢?看这本书无端端让我增长了这些知识。就是说1100,1300,1400,1500都不是闰年,神奇的400事件400年才发生一次,2000年就是一次,而概率有75%的正常不闰年我却没有遇到过,与我最近的2100年不闰年到现在也有95年,不知我有没有机会看到。快到那时的时候肯定世界会大型宣传闰年的真正定义,为什么那次8年才一个闰年。改变很多人心目中能被4整除的年就是闰年的错误定义。

说道闰年又让我想起了JEA,1968-02-29,可怜的闰年出生,到现在才过了9个真正的生日。于是fans们中的一员曾经说,“难怪我们心目中的JEA那么年轻,原来2005年他才9岁,不过岁月还是不会饶人的……”(以上为我的翻译) 的确,闰年出生的人在理论上岂不是很年轻,足足比普通人年轻3倍(数值上),哈哈,果然有趣。在这个层面上讲那些可怜的02-29出生的人,也不是太可怜:)

明天没有以外的话(但可能有以外,因为是元宵,可能要一天出外,没时间学习)就开始学习循环程序了,这个应该是个硬骨头,因为我到现在连它的N-S图表示的意思还不能很快地作出反应。

今天也特意去查C++和C的关系了,还是不清晰,一时说C++和C完全是分离不同的东西,但从

说明它们当中多少有一点联系。

同时也开始明白了一点关于计算机等级考试的东西。详情请看http://cpp.ysu.edu.cn/dengjikaoshi/djks.htm

看过一级考试的试题,除了一般的Windows和Office知识以外多少还是要有一点其他计算机的常识的,比如说进制之间的转换和最基本的ASCII码认识。

看来没有报考今年4月的等级考试还是正确的,老练一点的好。

2005-02
21

C语言之算法(5)

By xrspook @ 19:58:00 归类于: 扮IT

今天由于种种原因所以学习的量有所减少。

算法,真的是一种很神奇的东西,可以说它就是一种解题的思维,在数学里可以所是思路,如果在文章里应该可以说是段意。只有清楚了算法才能继续下去,没有思路一片空白,算法其实就是要首先有下手的地方。

算法基本概念的地方第一题就是解一个一元二次方程,令我惊讶的是除了有理部分的思维以外还要理会到无理虚数的思维。然后第二个例题是玩魔方的算法。其中的第二步,第三步是看完几次都不能理解为什么要这样子。 “……(2)向右上方斜对角线方向给出下一个自然数。在此过程中,若这个数跑到方阵以外,则把它移到它所在的列或排的另一端的格子里。(3)每写完三个数之后,要把第四个数写在第三个数下面的方格里。……”

其实我觉得算法的其中一个重难点应该是怎么用3个表示法来表示编程者心中的算法,用图把思维表示出来。

当然无论是图还是思维最终还是要靠符号语言来表示出来成为真正的C语言。不过如果连思路都不清晰,图都不能画好,又怎么可以谈得上能用符号表示好呢?

刚才又问了师兄,我的食工专业应该在大二上学习C语言,看来我的功夫应该不会白费。不过他是大四的师兄,会不会他当年的课程和我将要的课程有出入呢?

到现在还是不太明白C和C++的区别,因为昨天搜索的时候又发现其实C++和Visual C++是完全不同的,到底他们之间什么关系啊????

2005-02
20

C语言之位运算符(4)

By xrspook @ 19:12:00 归类于: 扮IT

在搞位运算符之前,首先要搞清楚几种进位制的互换。

真的开始的时候一头冒水,单是看,肯定不行,不计一下始终是纸上谈兵。可恶的C语言教科书,老是无端端就说到“按位取反运算符”其中马上就用“八进制数0217(即二进制10001111)”说得好像理所当然,而我则是??????思想之中老是觉得当年高中的时候电脑老师曾经好像讲过十进制数和二进制数之间的互换。于是就去找书,又忽然发现原来高二下学期的时候发的电脑教材原来就有说明。那本书我翻都没翻过,因为高二下开始就没有电脑课了。那本书里面居然是讲“第一章 程序设计基础; 第二章 程序设计实例; 第三章 进一步认识信息处理工具——计算机”气死人,怎么这么实际的东西就没有教呢?都是可恶的应试教育害的。

乱翻书之中终于发现为什么C语言在Windows系统中好像不怎么出现的原因。因为对于C语言来说,它不是可视化开发系统,也就是它不是早就搞好一块一块的东西和程序等待我们去拼凑,也许这样的说法并不真的能表达我的意思。我要说明的就是,C语言需要一步一步用字符去表达意思,这些操作基本上都是程序人员在键盘上输入,而我现在所接触的几乎所有系统都是可视化系统。从Windows到Photoshop,都是以窗口形式出现,而现在正十分流行的Visual C++也是可视化开发系统。这样子能给人更直观的感觉。如果Authoware不是可视化,Flash不是可视化,真的会令我这些傻B很难上手。我一直不知道C语言和C++的区别,区别就在于一个是可视化开发系统,一个不是。要不为什么C++前面要加Visual而C语言没有呢!(我猜)根据我仅有的一点经验,如果没有猜错的话在Visual C++之中,编辑的代码可以在我熟悉的窗口中输入,而且在简单的保存之后可以很容易按一个“预览”之类的键达到把刚才的编程很快地运行出来,马上能够看到效果。

以上的东西都是我根据在Authoware和Flash的一点逻辑思维而想出来的,不知道正确性如何。还是要看看Visual C++的书来证实一下。

书中说“目前,Windows下有很多可视化开发系统,如Visual C++, Visual Basic, Delphi等。”Visual Basic在那本书的后面介绍了一些简单的例子,在窗口的帮助之下,编程似乎简单了一点。

同时在书后面的附录之中发现了近几天不断出现在我眼前的一个词的中英文对照ASCII(American Standard Code for Information Interchange)就是美国信息交换用标准代码,原来如此,原来ASCII是这些东西的缩写。而char字符型的范围就是ASCII这又是怎么理解呢?

言归正传,还是回到几个进制的换算,于是就
http://www.d2school.com/bcyl/bhcpp/newls/ls06.htm#6.2.1,本来想剪切-粘贴,不过那么多的资料这样做好像不太好,搞个连接就算了。不过它还是没有直接说道八进制和二进制的直接转换。都是以十进制为中间桥梁的。不过这本可恶的C语言教材几乎所有地方都是用八进制和二进制来说明问题,即使是十进制的还要把它转成八进制,然后再说明问题,由此看来,应该八进制和二进制的转换应该不是很难的,甚至比十进制换二进制还要简单。不过为什么就是……

按位“与”、按位“或”、按位“异或”是明白它的操作是怎样的。但就是不明白为什么它说“例如,假设X是一般的unsigned类型的整数(2个字节),我们想获取其低字节的值时,只需要将X与0377相与即可。”这是什么意思啊!为什么不和别的八进制相与,偏偏只和0337相与呢?还有什么叫做低字节?同样出现相似问题的就是“例如要使X的各位翻转,只需执行X=X^0177777”就是X和0177777异或,这也许还好理解一点因为0177777(八进制数)的二进制数正好是16个1,正好使任何数都来个翻转。但在“与”的那里的0377(八进制数)的二进制数是0000000011111111,又为什么和任何数做到“与”的效果呢?

位运算符搞定之后第二章就好像已经结束了,不过好像留给我的更多是疑问。真的觉得一个技术blog——技术点滴的作者(linrun)的一句话说得很对“做软件开发的人应该尊重编码,就如同剑客尊重他手中的剑那样。尊重来源于了解,畏惧来源于陌生,轻蔑来源于无知。”

2005-02
19

C语言之运算符号和表达式(3)

By xrspook @ 21:24:00 归类于: 扮IT

首先在学习新课之前要搞清楚以前的一些力所能及解决的疑问。

原来“C语言的基本数据类型”也不是那么难搞,基本上是十分有规律的,不过好像一定要记住。它那个列表之中的“范围”我好像到现在都不知道有什么用途。要明白的就是char表示字符型,int表示整型,unsigned表示无符号,signed(书中多处都写错了,写成了singned,我晕!)表示有符号,然后其他的一堆就是charint分别与unsignedsigned的几个配合。然后就是简单的几个float浮点, double双精度型, void空。

短的和字符型的长度是8,整形、短整型的长度是16,有时候是8,然后长整型的长度是32,而最大就是最高级的双精度型的长度是64。

明白了这些,然后后面的类型转换也就比较简单了。基本上就是遵循两条路:
float- double
char,short- int- unsigned- long- double
最终就是到达高级的double,其它的在相对情况下表示高级和低级。其实我觉得就是所谓高级低级就是长度要从短的变成长的。

今天学习的运算符和表达式要记住的东西就比较那个了。首先名称操作符就一定要记住,要不就连那个东西是什么都不知道了。但这还不足够,记住了这个东西只是知道了外表,接下来还要记住优先级,不记住优先级也是乱套,就像不会数学的先乘除后加减的基本法则一样,然后就是结合法,有分左到右和右到左,也是需要记忆。但通常这些要不这样要不那样的东西记一个就好了,免得搞乱。当然知道了以上以外也要知道一些内涵,比如说每个操作符的真正含义和运用的条件,都需要清楚。有了这些才叫装备了武器,有了武器就不等于战无不胜,清楚了武器的名称和使用方法和条件,最终证明你会不会武器的方法还是实操。

因为符号的优先级,就硬性规定了到底谁先谁后,因为结合性也规定了到底怎么算的方向。关系运算符的优先级分别是: <小于10,>大于10,<=小于或等于10,>=大于或等于,= =等于9,!=不等9,真够怪的等于的运算符是2个等号,然后不等就是一个叹号加一个等号。

最喜欢就是看到逻辑运算符号和逻辑表达式了。好有亲切感,与高一数学的真假命题完全是一模一样。 !表示否命题,&&表示且,||表示或,优先级是!> && > ||

三项条件运算符介绍了两个运算符,分别是。其实这两个东西的结合就是对要说明的东西进行分类讨论,就是提出分类的条件,而结果则是的左右两边的东西。如果之前的东西成立,则用左边的,反之则用右边的。这些东西如果手写在纸上肯定用大括号来表示,清晰明白。

逗号表达式其实就是一个给了明显条件的简单计算。不过我觉得有一个例题有些乱来“例如逗号表达式:x=5, x+10, x*10+3 其结果是53”,53其实就是5*10+3,直接用第一个个最后一个就能算出来,那么中间的x+10又有什么用途呢?

求字符数运算符其实也是只有2类,一个是sizeof(type_specifier)sizeof expr,其中type_specifier是类型标识符,expr是表达式(难道就是express表达的简写?),其中还是不太清楚type_specifier在实际中的真正用途。而什么强制类型运算符则是一头冒水。

以上就是我今天所知道的了。

© 2004 - 2024 我的天 | Theme by xrspook | Power by WordPress