《2022年程序员考试补课笔记 .pdf》由会员分享,可在线阅读,更多相关《2022年程序员考试补课笔记 .pdf(31页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、475170.doc - 1 - 程序员考试补课笔记-第一天今天是第一天补课,终于有又机会可以听到林老师的课了,我觉得他比老潭说得还要好呢,虽然我没有听过老潭的课,不过我相信绝大部份在校的人学C语言都是用老潭的 C程序设计吧。这本书的好处是有很多的,最主要的一点就是可以用生动的例子来说明一些概念,不过还是一点不好的地方,就是本书全都只是围绕着基础来说,没有一些可以让同学深入研究的课题。就我知道机械工业译的一本C语言设计教程,这本书有大量的实例练习,而且是围绕着生活的。学习和乐趣合在一齐,我在看这本书时都有好几个特别吸引我的兴趣课题呢!书就介绍到这里吧,还是说回今天补课的情况。今天因为第一天吧,
2、老师还不太清楚我们的底究竟到那里。是因为我们之前都是全自学的,所以现在要摸一摸底吧。一开始,他直接引入了上界程序员考试的下午的第一道题,是一道编程填空题。如下:int strcmp( char *s, char *t) while(*s & *t & _) s+;t+; return _; 这是模仿 C语言字符函数库里的字符比较函数,当时我第一时间就想到了一种方法,第一空因为大家都没有问题吧,*s和*t 这两个都保持为逻辑真就行,表明这个存储单元是用字符的,大家都知道C语言里没有字符串这种变量的,只有字符数组,0这个符号就是用来表明这个字符数组到了结尾了,这里又有一个新的概念要说说的了,就是C
3、语言逻辑里非零的都为真,那么 0这个符号就是为零。所以填这个空就应该没有什么太大的难度了,跟着就是还要有一个条件退出循环,因为是比较大小,只要保持一样都继续,所以条件也很显示的可以写出来*s = *t。至于第二题当时我的思维就销定在条件运算符里,因为返回的值是有三种可以性的,大于返回正数,等于就返回零,小于就返回负数。知道了这三种可能就可以用条件运算符填了,我当时的答案是这样的 *s = *t ? 0: *s*t ? 1 : -1 ,这是不是很长呢,其实我的答案我也不知道是否对,但是真正的答案是 *s - * t .知道答案为什么是这样吗?当时我也一时给答案吓住啦,因为当时我真想到是用它们本身
4、的比较就可以得出结果 (运用 ACSII 码) ,*s - *t 如果 s 指针所指向的单元如果是大于当然就是正数啦,跟着其它的原理一样,这里不再详细说明。除了引用这道答给我们说了很多的基础知识外,还更详细地给我们介绍了指针,唉!为什么老师说的总是这么的清晰明白,如果当初可以老师教的话就可以走少很多弯路了。算了,说这些话都是没有用的,只有现在能学好就行了。大家都指针的基础还有些吧,这里重要的提一提老师今天反复强调的一个概念,就是指针就是指向地址的一个变量。好了,今天就到这里吧。程序员考试补课笔记-第二天因为前天老师摸到我们的底的关系,所以今天要补一补前面的基础部份。他先是列出一个数据类型的表,
5、如下:| 整型| 字符型| 基本类型 | 单精度型| | 实型(浮点型) | | 枚举类型| 双精度型| 数据类型 | 数组类型| 构造类型 结构体类型(结构)| | 共用体类型(联合)| 指针类型| 空类型上面这个表,基本类型是我们平常用得最多的,包括整型、字符型、实型(浮点型),就从这里最常用的数据类型说起吧。说起 C语言的数据内容就要说说计算机里存放的数据是究竟怎么一回事,大家应该都知道计算机只可以处理二进制的数吧,因为是硬件的关系(二态器件),这些只能有两种表示的状态,所以运用到计算机里就显得特别有用了。从现在开始我们要知道计算机处理的所有数据都是二进制数,那么他究竟是怎么运算的呢?老
6、师先给一些十进制数转换为二进制数的几道题我们做,这些小儿科当然是没问题啦,很简单的就做了出来。老师当然知道我们是会做的了,但是其实是想我们在做这些题目的时候找出更简单的转换方法。例:10111012 =(93)10 很简单的就可以计算出来了,我的方法就是传统的计算方法。它们都有自己的位权,第一位就是20,第二位是 21, 跟着的都如些类推, 将有 1 的地方乘上该位的数跟着相加起来就等于93了。这里说说其实二进制的次方特别好算,就像我们的内存一样阶梯上去的,1-2-4-8-16-32-64-128-256-512-1024, 你知道这规律吗,如果知道是不是计算起来特别别好办呢!不过老师在这里提
7、出了一个更好的方法,起码比一个一个加上去也快多了。就是将那个要转换的数变为全都是1111111,你知道这个数是多少吗?其实就是有一技巧在里面,把它看成 10000000 减 1 吧! 那么是不是很快就知道10000000是多少呢,没错就是 128嘛,再减 1 就是 127 了,在些基础上试着将原来的那个二进制数位为零的那两个数求出来,第一个零在第二位,所以是 2,第二个零在第六位,所以是32,将其加起来被 127 减去就可以得出 93 了,是不是很简单方便呢(学到东西快交学费啊,哈哈 !)。你知道计算机里二进制有什么几种运算吗?我在这里告诉你,其实就只有这么的一种,就是加法运算(你名师资料总结
8、 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 31 页 - - - - - - - - - 475170.doc - 2 - 不要告诉我你连二进制的加法也不会运算,其实就是蓬二制一嘛)。为什么这样说呢?其实二进制也有减法运算和乘除,但是计算机里有一种叫补码的方法,可以将减法运算变为加法运算,至于怎么实现教师也没有再深入讲下去了(在些补充,乘法也是利用移位来实现转为加法的)。现在转入到 C语言的整型数据里, C语言的整型数据是2 字节的,就是 16 位,最多可以存储 65536,他的
9、范围是 -32768 到 32767 。C语言里分有符号类型和无符号类型,如果是没有符号的整数类型的范围就是0 到 65535 了。关于字符型数据,如果严格来说 C语言里根本没有字符这种类型,因为他所存储的是它的ASCII 码。直接可以用来和其它的数据类型运算,比如:main() char s=A; int i=2; s=s+i; printf(%d,s); /*这里可以直接输出其ASCII 码*/ printf(%c,s); /*这里的结果因为上面的语句改变了字符s 的字符,输出的是 C*/ 那么更不要说字符串了,所以字符串在C语言里也只是用数组来表示,和其它的高级语言不同,有其的字符串类型
10、,而且还是字符和字符串结合在同一种类型里。现在该说一下实型数据了,字型类型通常用在有小数位的一些数据。就像这题一样:S=1/1+1/3- 1/5+1/7,1/2n-1 这个程序是我写的:main() int n,i,s; int r=1; printf(please input: ; scanf(%d,&n); for(i=1;i=n;i+) s=s+r/(2*i-1); r=-1*r; printf(%d,s); 这个是考试里的:void fun(float *sn, int n) float s=0.0,w,f=-1.0; int i=0; for(i=0;in;i+) f=_*f; /*
11、这里填 -1 */ w=f / (2*i+1); s+=w; _=s; /*这里填 *sn */ 考试里的两个空我都做对了,可是自己写的那个程序就有大问题了,就是答案用了整型数据,从答可知答案应该是小数啊,真的一时的糊涂就可以至命啊!我们几乎所有人都是错了这点,当然也要另类的错法, 就是用回来以前 QB的一些运算符, 这个是 QB里的次方运算符,这可真的闹出笑话了。之后是要我们编一个主函数来调用这个函数。我是我做的main() float s; int n; printf(please input:; scanf(%d,&n); fun(&s,n); printf(%f,s); 这是这么几条简
12、单的语句,不过就难道了几乎所有人(除了我)。你知道他们的答案吗?让我给大家展示出来吧名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 31 页 - - - - - - - - - 475170.doc - 3 - main() float *ss; int n; printf(Please input:; scanf(%d,&n); fun(*ss,n); /*这里出了问题 *printf(%f,*ss); 他可以还没有了解到C语言里的函数参数的问题吧,既没有定义一个可以存
13、放结果的变量,参数方面也用错了,如果真的要用指针也得要指针指向一个存储单元才行吧。而且还不是传了地址,他而是试图传一个指针指向单元进函数里,这是绝对错误的。因为该调用的函数是地址,好了,下面给他的程序更正一下。如下:main() float *ss,s; /*这里多定义一个单精度的变量*/ int n; ss=&s; printf(Please input:; scanf(%d,&n); fun(*ss,n); /*这里出了问题 * printf(%f,*ss); 好了,就这样这条程序就完全正确了,不过要是为了节省空间就用我写的那条吧,因为不要多开消一个指针变量。今天写得特别的长,也特别的嗅,
14、望大家见谅了。程序员考试补课笔记-第三天很快的就到了第三天了,接下来的学习任务应该越来越重了。至于今天讲了些什么,现在想起来也觉得没有什么似的,可能因为我之前已经把这今天所讲的内容搞懂搞透的原因吧。不过也得把今天的写下来,也没有什么特别原因的,想有个回忆吧。今天所讲的都是围绕着数组,我们在C语言里定义数组和其它高级语言定义的不同,这里示出C语言和其它语言的。C语言Foxbase int a1010; dim a(10,10) 是不是符号也不同了,我们以前用惯的都是小括号,但是现在突然来的是中括号真的是有些不习惯呢。但是谁叫我们是学 C语言呢,不习惯都要得习惯了。还记得以前定数组根本就是不用理会
15、它的地址,只知道用就行了,就算用错了也会编译出错。可是 C语言可不是呢,一但你定义了一个数组之后,你就得好好的管住它,因为数组出了边界是绝对不会通知你的。数组的定义和调用方法也是很多,真是灵活多变,这里不再重复书上里的东西了。现在就定义一个数组来看看:int a10; 如这个表所示,数组定义之后有相对地址,而且数组名a 就是存放这些地址的首地址。现在我们定义多一个整型指针变量 int *p; ,让他指向数组 a,p=a; 我们试着让指针运算递增一个p+; 我们看到的结果是p 指向了新的地址2003,原来的地址是 2001,为什么递增一个就移向了2003 呢?不是 2002 才是正确的吗?其实这
16、里就说明了我们定义指针变量为什么要整型呢,是因为所有的指针运算也是看自己本身是什么类型的指针作出什么的运算,就是现在是整型类型,整型数据存储是需要 2 字节的,所以针指运算也是按这个方式来到进行,结果很显然就是往下移2 了。其实这里说这么多,老潭那本书里基本上都有详细说明介绍,所以我一开始说只要自己有看过书的,应该也很容易明白了(反而上面可能给我说模糊了)。好了,接下来我们做一些题目吧,这是今天老师给我们出的题,其实也是2001年程序员下午考试里出现过的题目。所以请大家自己也动手做做,多思考,看看谁的方法比较好。在 n 行 n 列矩阵中,每行都有最大数,本程序求这几个最大数中的最小一个。#in
17、clude #define N 100 int aNN; void main() int row,col,max,min,n; /* 输入合法的 n 和 n*n 个整数的代码 , 注,这里略了一部份到后面练习自己做回*/ for(row=0;rown;row+) for(max=arow0,col=1;coln;col+) if ( ) max=arowcol; if ( ) min=max; else if ( ) min=max; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第
18、3 页,共 31 页 - - - - - - - - - 475170.doc - 4 - printf(最大数中的最小数为 :%dn,min); 这题可真有些难度,它的难就难在第二个空那里,相信第一个空绝大部分都会做,可是第二个空呢,真的下不笔了。当时看程序的最后继续两个空后面的语句为什么一样的呢,可真的没有想通,只是要死钻牛解尖,老是想着一定是用数组的,第一个循环里是行,跟着就是列了。可是还是想不到答案,因为我的思路已经大错特错了。最后老师还是说出答案,也说这题真的是比较难。第二空其实是填row= =0, 为什么这样填呢,是因为这个矩阵里一开始要有一个BASE 数做底,所以 row= =0
19、只出现一次,很自然的就成了第一个比较的基数,跟着这个if语句里的就是比较这几个最大数中的最小一个数了,第二个空填了出来当然答案也就随之可以出来了maxmin 。看来我现在功力去考中程还是白费心机吧,因为这只是第一大题啊, 有很多难的题都在后几题。那么既然现在知道自己的弱点就应该去好好克服改正它,好了,这只是第一道练习题,跟着下面还有将略了的那部份编出来。我所写的如下,因为考虑到整数类型界限的问题,我所编的所着重这里。printf(please input n:; scanf(%d,&n); for(row=0;rown;row+) for(col=0;coln;col+) do printf(
20、please a%d%d,row,col); scanf(%d,&arowcol); while(arowcol32767 ); 接下的是第二题了 , 题目如下:求 n*n 的对角线和这题因为全由自己写,所以各种写法都有。在下面先写我的最基础简单的方法吧。#include #define n 5 main() int ann; int row, col; int sum=0; /* 输入略 */ for(row=col=0;rown;row+,col+) sum+=arowcol; for(row=0,col=n-1;rown;row+,col-) sum+=arowcol; if ( n%2
21、 !=0) sum-= an/2n/2; printf(%d,max); 这是最基本的方法了,两个循环跟着判断是否偶数来减去中间重复出现的一个数,这样就求得结果了下面我写一个我同学编的还比较简单,而且方法独到的(反正所有人都没有想过这种方法,除了他)。这里主要写一写他的方法。int sum=0,j; for ( j=0; jn; j+ ) sum+=ajj+ajn-1-j; if ( n%2 !=0 ) sum-=an/2n/2; 够简单吧,一次循环就可以了,他的思路是这样的,比方有一个如下的矩阵每次都两个两个刚好相对立,所以可以一次就扫描完了。好了,我写的有些累了,因为今天没有什么精神,最后
22、老师还补充了另一个更简单的,方法其实就是一种只是运用了条件运算符sum+=ajj+( (j = (n-1-j) ? 0: ajn-1-j; C语言真的想有多简洁有多简洁。程序员考试补课笔记-第三天真的不知道为什么,我所有WORD 的日期都变了,可是是WORD 的宏病毒吧。但是为什么感染上的呢?这下可真奇怪了,我没有用过宏啊。算了,现在没有时间去理会它了,我要抓紧时间写完这篇补习日记。今天的课程里终于到了重点了,就是算法,因为才刚开始,先从容易的排序算法开始说,抄了一道题目让我们做,如下:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - -
23、 - 名师精心整理 - - - - - - - 第 4 页,共 31 页 - - - - - - - - - 475170.doc - 5 - 已有一个已排序的数组,今输入一个数,要求按原来的排序规律将它插入数组中。看到了这个题目我觉得自己比较有把握,很快的就写了出来,可是谁知道我的程序有一个至命的地方,刚给老师看的时候还得意洋洋,可是看完指出我的错来时真的不好受,既然都错了,就把我所做的那个答案写下来吧,也好让大家比较比较。#define n 8 main() int an; int i,j,t,s; for(i=1;i=7;i+) ai-1=i*10; for ( i=0;i 7;i-)
24、if ( a i a i+1 ) s=a i ; a i = a i+1 ; a i+1 = s; for(i=0;i=0;i-) if(n 0; i-) for(j=0; j aj+1 交换 ; 以上的是冒泡法int n=6,i,j; for ( i=0; i i; j-) if(ajb) if(ac)printf(a; else if(bc)printf(b; else printf(c; 这么一条源程序是否让你看得不舒服呢,这就是C语言的另一个特点啊,你知道这条程序的答案吗?不过其实也不难,程序也很短嘛,就让我说出答案好了,答案不就是输出b 嘛,道理很简单一看就出了,谁?谁?谁在这里搞乱
25、,答案会是输出 b 吗,笨!所以写你功夫还不到家嘛,下面让整理一下程序名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 31 页 - - - - - - - - - 475170.doc - 6 - int a=5,b=10,c=8; if(ab) if(ac) printf(a; else if(bc)printf(b; else printf(c; 这样看清楚了吗?答案就是什么都没有,因为一开始第一个if语句就不成立了, 那里有答案出呢! 这里也看出一个情况,所以我们要
26、陪养好代码的格式,如果有良好的编码风格就有好的程序。还有我今日又明白了一样,想看看下面的if语句:if if else else if if else if else else if if else 我原还以为这两个是不同的呢,在QB里的印象是两个不if语句呢。可是今天就给我弄明白了,大家也应该知道吧,可能就是我笨了。在 C语言里 swtich 也和别的高级语言不同, 你们有发现吗?现在看看第四天图二吧在这个图里清楚的说明了这个语句与其的不同之处,而且条件是用常量的,所以老师说给我们听他自己也不怎么喜欢用这个swtich 语句。如果用懂了这个条件运算符? : 还真的挺方便的,这个也是可以无限嵌
27、套的,这里不多说了,让自己慢慢体会研究。程序员考试补课笔记-第五天今天是离散学礼的最后一天了,我的成绩嘛,当然也不会高得去那里了,还很有可能第一呢(倒数啊)。都怪自己不好,不过也不能全怪。因为学校本来的电脑课程也不少了,可就是全部都在教图形方面呢,什么PS 、CW 都要我们编程班的去学,真有点不爽。好了,也不说太多自己学校的羞事了。那么下面我们就开始来学习今天的知识吧,很多朋友都是我整天在打字,可我自己觉得打一篇这些也不是浪费很多时间,而且收益的更多(早上听完,晚上复习)。故语有云 温故知新 ,我觉得这句特别有道理的,因为通常我在看书里也看不到老师在课堂里向我们提出的问题。好了好了,我还是赶紧
28、说说今天的学习吧。昨天老师布置的我们一道答,我昨天都给忙了做,而是今天突然想起才冲冲的赶着做,是这样的一道题:给一个不多于 5 位的正整数,要求: 1,这个数有几位 2,打印每一位的数, 3 逆序打印,比如 321 输出 123 。好在这答也不难,用了一会儿时间就做完了。main() int n; int num; int i=0,a5; printf(请输入不大于 5 位的正整数 ; scanf(%d,&num); do doi =num % 10; num /=10; i+; while(num!=0); n=i; printf(LEN%d,n); for(i=n-1;i=0;i-) pr
29、intf(%d,a i ); for(i=0;i10) break; printf(%d,i); 这说这里 i 是多少呢?这里就关系到这个运算符了+递增运算符, 可以有两种方式, 一种是 i+ 就像上面的那样, 至于另一种就是 +i, 这里的答案是前者等于12, 而后者就等于 11。这里全是因为 +递增的两个方式所至,那么我们要好好掌握一下这个,你自己试试动手上机编一下。另一个程序好让看出这个递增运算符的:int i=0; if (i+) printf(a; /* 如果这里为真的就输出a */ else printf(b; /*否则就是输出 b */ 自己试试看,是不是很明显可以知道这个递增符
30、的原理呢,这里说一下吧,其实i+ 这个呢就是先那 i 比较后才运算 +的,所以很自然就是0 那么结果当然就是输出b 了,则那个 +i 就是先把 i 加 1 才比较,那么真就输出a 了,好了,那么 +递增和 - - 递减都是同一性质的。不过要注意的是这两个递增递减运算符都是要变量才行的,不可以和常量运算。好了,说完了循环语句当然就是要懂得去运用在编程里了啊!所以老师马上出了一道题让我们想想,不过相信有些人都是研究过的了,就是 魔方阵 ,可是老师说虽然这个魔方阵虽然有直接的算法可以运算出来,但是要让我们思考用循环做这题,利用计算机的能力来完成,但看到要排列这么多的数,循环也更不要说要很多了,所以我
31、根本没法想下去了(开始头晕起来)。最后还是没有一个能做出,只好听老师说了,不过老师也没有完全说完,只是给了我们一个结构,如第五天图二让我们自己有兴趣就去完成它吧,我对数学这东西最没有FEEL的了。好了,接着继续第二题,也是一个排列组合的问题,你们手头上应该都有老潭的C程序语言第二版了,那么请大家翻翻书到第 121页,6.15 题,这题就是排列组合的题目了。这其实也是有一个规律可以找到的,不过不是我们找到的而是老师给我们说,今天这堂课真的有太多的难题了,至少对于我来说。下面我也没有什么好插嘴的了,只好示出老师的方法吧,如第五天图三程序也在下。char xyz=X,Y,Z; int i,j,k;
32、for(i=0;i3;i+) for(j=0;j3;j+) if(j=i0 continue; for(k=0;k3;k+) if(k=i | k=j) continue; printf(A-%cn,xyzi); prihtf(B-%cn,xyzj); prihtf(C-%cn,xyzk); 让大家自己看明白了。好了,今天我的头也特别的晕,肩膀也特别的酸。不过我还是要努力的!程序员考试补课笔记-第六天今天的整个课程只有这么的一道题,但是学到的东西确很多。下面给出这条题目:字符数字转为整数数值(字符可以任意:比如342A)遇到其它否数字取前数。我所写的程序如下,自认为写得不错:#define N
33、 10; int catio(const char *str) /*const 的作用是常数,所以这里的地址不会返回到实参里*/ int numN; int i=0;j=1,n=0; for(;*str+;i+) if(*str57) break; /*判断是否数字数值 */ numi=*str-48; for(i-=1;i=0;i-) n+=numi*j; j*=10; return n; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 31 页 - - - - - -
34、 - - - 475170.doc - 8 - 你们说是不是比较简单呢?现在看不出等看完以下的另一个程序先断定吧。如下:long catio(char c); int n,d; char *q,*p; long e=1,s=0; for(q=p=c,n=0;*p!=0 & *p=0 & *p0) d=*q+; switch(d) case 48: d=0;break; /*太长了,略 */ : : case 57: d=9;break; s+=d*(e/=10); n-; return (s); 现在比较来看看,不过虽然这条程序是比我那个复杂,但是也有他的思路和可取之处。像在那个for 循环了
35、,一条命令带过很方便也很简洁。其实我们可以继续改造这个程序,我们跟着老师的思路一步一步的把它进化,现在看看如下:long catio(char c); int n,d; char *q,*p; long e=1,s=0; for(q=p=c,n=0;*p & *p=0 & *p0) d=*q+-0; s+=d*(e/=10); n-; return (s); 这样是不是更简化了,那么还可以再简化下去吗?前面的我们是可以做出来啊,当是老师说还可以更简单,我们都只好怀着期待的心情去听了。 他一步一步的说出来, 第一就是在 s+d*(e/10) 这里可以变为另一种形式 ,s=s*10+d ,如果按照
36、这样又可以去掉一个多余的变量了,变量e 就没有了。接下来的更不可意议了,我不知道怎么说,看看程序先吧。long catio(char *c); long s=0; for(;*p & *c=0 & *c1) s= n*abc(n-1); else s=1; return (s); 从这个源程序很容易就看出有一个同自己名字的函数在里面,所以以后我们看到一个函数里面调用自己就是递归函数了。而且我们看一个递归函数就主要就是看它是否一个返回的条件,就好像一条又黑又深的山洞,我们前去探险如果往到底就一定要回头,就算是更深的也要返回啊!所以我们判定一个递归函数是否成立也常常是看它的返回条件。至于上面的那个
37、源程序我也不想多说了,应该大家也看得明白。这里就看看另一个利用递归函数做的题目吧,就是诺汉塔(老潭的书上也是有的)。#include void move(char x,char y) printf(%c-%cn,x,y); void hanoi (int n,char one ,char two,char three) if(n=1) move (one ,three); else hanoi (n-1,one,three,two); move(one,three); hanoi(n-1,two,one,three); main() int m; printf(input the number
38、 of diskes:; scanf(%d,&m); printf(the step to moving %3d diskes:n,m); hanoi(m,A,B,C); /* 运行情况如下:input the number of diskes:3 回车the step to moving 3 diskes: A-C A-B C-B A-C B-A B-C A-C 书上说 hanoi(n-1,one,three,two);是把one 上的 n-1 个往two 上移,接着 move(one,three);然后是hanoi(n-1,two,one,three)即把two 上的 n-1 个往thre
39、e 上移;|h(2,1,3,2)|h(1,1,2,3)=move(1,3) -1- | | move(1,2) move(3,2) -3- |move(1,3) move(2,1) -5- | h(2,2,1,3)|move(2,3) move(1,3) j) int k=1,i=2,j=3; pirntf(%dn,i*3); printf(%dn,j*10); printf(%d,k); 程序员考试补课笔记-第八天今天回到学佼也没有讲课,因为老师忙着一些其它事,听说好像是多媒体比赛的吧,要今天上交了。那我们只好回到课室里自己看书了,不过在这段时间里我们都没有看什么书,只是大家聊了起来。我也插
40、了嘴吹了几句,可是很快就没有心情了,唉!只好睡一睡吧。当我休息了一会发现老师都已经回来了,而且说让我们今天上机房。今天是第一次上机房,不过如果不是什么事我也不愿上机房,因为我觉得听老师讲课还好。我们上到机房,老师给了一条程序我们,喔!这不是前两天说要搞的那个诺汉塔吗!而且是结合了图形表示的。我们都兴奋起来了,开始研究着这条程序。我开始执行这个诺塔了,他给的参数不是很多,只是十个盘子而已,你知道我按了多长时间吗?我一直按着来看也看了快一个5 分钟才看完啊,这个问题果然是复杂。看着这些图画演示让我更加清晰的明白了诺汉塔的原理,这里我不敢自私, 我把源程序也 COPY 回家了,以下就是了:#incl
41、ude #include char dd1020,space20; int a11,b11,c11; init() int i,j; for(i=0;i20-1;i+) spacei= ; spacei=0; for(i=0;i10;i+) for(j=0;j20-1;j+)ddij= ; ddij=0; for(j=9-i;j=9+i;j+)ddij=a+i; for(i=0;i10;i+) ai=i,bi=-1,ci=-1; a10=2,b10=25,c10=50; for(i=0;i10;i+) gotoxy(a10,10+i); cprintf(%s,ddi); move(int *s
42、,int *d) int i,j; for(i=0;si=-1&i10;i+); gotoxy(s10,10+i); cprintf(%s,space); for(j=0;dj=-1&j。p-sex=m ;我们来这样理解这个表达式,p 是地址, -这个是指向这个结构体里的,p-sex 就是指向这个结构体里的元素了。时间过得很快,没程序员考试补课笔记-第十二天今天老师和我们讲了链表,和老潭书里一样大家都讲得很好,让人很容易就可以听进。所以这里我也不再重复了,大家自己慢慢看一下老潭书里的链表那节,绝对不会觉得难的,而且还举了一些生动的例子来到说明。下面我就从网上找来一些关于指针的文章,这个人绝对是
43、高手,大家这回要好好研究一下咯。相信看完第一遍之后一定对指针有个大概,第二遍已经有印象在脑海里不停的回旋了,第三遍可以大功告成了。 _ 为初学者服务。这是我的帖子的宗旨。我也是个初学者(强调了无数遍了),我以我的理解把初学者觉得难懂的东西用浅显的语言写出来。由于小学时语文没学好,所以竭尽全力也未必能达到这个目的。尽力而为吧。指针是 c 和 c+中的难点和重点。我只精通dos 下的 basic 。c 语言的其它各种特性,在 basic 中都有类似的东西。只有指针,是baisc 所不具备的。指针是c 的灵魂。我不想重复大多数书上说得很清楚的东西,我只是把我看过的书中说得不清名师资料总结 - - -
44、精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 14 页,共 31 页 - - - - - - - - - 475170.doc - 15 - 楚或没有说,而我又觉得我理解得有点道理的东西写出来。我的目的是:1。通过写这些东西,把我脑袋中关于c 的模糊的知识清晰化。2。给初学者们一点提示。3。赚几个经验值。(因为贴这些东西没有灌水之嫌啊)第一章。指针的概念指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指
45、针所指向的内存区,还有指针本身所占据的内存区。让我们分别说明。先声明几个指针放着做例子:例一:(1)int *ptr; (2)char *ptr; (3)int *ptr; (4)int (*ptr)3; (5)int *(*ptr)4; 如果看不懂后几个例子的话,请参阅我前段时间贴出的文?lt;。1。 指针的类型。从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型:(1)int *ptr; /指针的类型是 int * (2)char *ptr; /指针的类型是 char * (3)int *ptr; /
46、指针的类型是 int * (4)int (*ptr)3; /指针的类型是 int(*)3 (5)int *(*ptr)4; /指针的类型是 int *(*)4 怎么样?找出指针的类型的方法是不是很简单?2。指针所指向的类型。当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。例如:(1)int *ptr; /指针所指向的类型是int (2)char *ptr; /指针所指向的的类型是char (3)int *ptr; /指针所指向的的类型是
47、 int * (4)int (*ptr)3; /指针所指向的的类型是 int()3 (5)int *(*ptr)4; /指针所指向的的类型是 int *()4 在指针的算术运算中,指针所指向的类型有很大的作用。指针的类型 (即指针本身的类型 )和指针所指向的类型是两个概念。当你对C越来越熟悉时,你会发现,把与指针搅和在一起的类型 这个概念分成 指针的类型和指针所指向的类型 两个概念,是精通指针的关键点之一。我看了不少书,发现有些写得差的书中,就把指针的这两个概念搅在一起了,所以看起书来前后矛盾,越看越糊涂。3。 指针的值,或者叫指针所指向的内存区或地址。指针的值是指针本身存储的数值,这个值将被
48、编译器当作一个地址,而不是一个一般的数值。在32 位程序里,所有类型的指针的值都是一个32 位整数,因为32 位程序里内存地址全都是32 位长。指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为si zeof( 指针所指向的类型 ) 的一片内存区。以后,我们说一个指针的值是XX ,就相当于说该指针指向了以XX为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。指针所指向的内存区和指针所指向的类型是两个完全不同的概念。在例一中,指针所指向的类型已经有了,但由于指针还未初始化,所以它所指向的内存区是不存在的,或者说是无意义的。以后,每
49、遇到一个指针,都应该问问:这个指针的类型是什么?指针指向的名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 15 页,共 31 页 - - - - - - - - - 475170.doc - 16 - 类型是什么?该指针指向了哪里?4。 指针本身所占据的内存区。指针本身占了多大的内存?你只要用函数sizeof(指针的类型 ) 测一下就知道了。在 32 位平台里,指针本身占据了4 个字节的长度。指针本身占据的内存这个概念在判断一个指针表达式是否是左值时很有用。第二章。指针的算术运算指针
50、可以加上或减去一个整数。指针的这种运算的意义和通常的数值的加减运算的意义是不一样的。例如:例二:1。 char a20; 2。 int *ptr=a; . . 3。 ptr+; 在上例中,指针ptr 的类型是 int*,它指向的类型是 int ,它被初始化为指向整形变量 a。接下来的第 3 句中,指针 ptr 被加了 1,编译器是这样处理的:它把指针ptr 的值加上了 sizeof(int),在 32 位程序中,是被加上了4。由于地址是用字节做单位的,故 ptr 所指向的地址由原来的变量a 的地址向高地址方向增加了4 个字节。由于 char 类型的长度是一个字节,所以,原来ptr 是指向数组