c语言程序设计第1章

2024-10-04

c语言程序设计第1章(通用4篇)

c语言程序设计第1章 篇1

第1章 程序设计和C语言

C语言版本很多,标准C、ANSI C、微软的C。这些C彼此之间会有小的区别。我们上课以微软的C为主。

编程环境:Visual C++ 6.0

1.1 什么是计算机程序

2.5 结构化程序设计方法

在60年代之间,编程很混乱,特别地,在许多的编程语言中有大量的Goto语句。

结构化程序设计强调程序设计风格、程序结构规范化,提倡清晰的结构。具体地说:

1)自顶向下;

2)逐步细化;

3)模块化设计;

4)结构化编码;

5)适当注释

更多的结构化程序设计思想在《软件工程》课程中介绍。但是,现在又有许多的新的思想,如面向对象程序设计思想等。

c语言程序设计第1章 篇2

(建议用时:30分钟)

一、选择题

1.下列交际用语使用不得体的一项是()A.今日厂家平价促销,机会难得,敬请惠顾!B.舍弟光临寒舍,真乃蓬荜生辉,不胜荣幸!C.请恕我直言,你的做法我不敢苟同,敬请三思!D.久仰您的大名,今日一见,果然名不虚传!

B [对别人称比自己小的家人时冠以“舍”,这里称呼的是对方,因此错误。] 2.下列交际用语使用得体的一项是()A.犬子能取得这样优秀的成绩,全靠老师您的悉心指导,我内心非常感激。B.阁下降尊纡贵,千里迢迢拜访寒舍,鄙人深感荣幸。

C.毕业时,你送给我的书和照片,我一直惠存着。每当想起你,我都会拿出来看看。D.承蒙您老亲自奉书指导,我读后受益匪浅,然因琐事繁杂,未能及时回信,望见谅。A [本题考查语言表达得体的能力。B项,“拜访”是敬辞,这里误用,可改为“光临”。C项,“惠存”是敬辞,不能用于自己。D项,“奉书”是谦辞,是说自己给人写信,不能用于别人。] 3.下列交际用语使用不得体的一项是()A.张老师,您是我们敬仰的文学泰斗,我们以缅怀之心恭候您驾临。B.贵店开张大吉,送上短信表心意。祝生意兴隆,事事顺利。C.毕业在即,虽然人生难免有聚有散,但你会永远在我心中。

D.当年恩师惠泽播春雨,今朝桃李九州竞争妍,恩师六十寿诞,敬祝生日快乐。A [本题考查语言表达得体的能力。A项中“缅怀”指对已往的人或事的怀念或追想,用于句中不得体。B项,是祝贺商店开业的短信,表达得体。C项,是同学间的毕业寄语,符合情境,也符合得体要求。D项,是给老师的生日祝贺语,符合得体要求。] 4.下列交际用语使用得体的一项是()A.为了您的小儿能够顺利考上一所大学,希望您在假期中督促他复习功课。B.改日我一定亲自到潭府,当面向您请教,到时还望不吝赐教。

C.诚挚邀请您莅临会议,指导我校课外阅读活动开展工作,敬请届时惠顾。D.毕业在即,我把这本纪念册惠赠给你,纪念我们三年的同窗之谊。

B [本题考查语言表达得体的能力。A项,“小儿”谦称自己的儿子,应该将“您的小儿”改为“令郎”;C项,“惠顾”多用于商店对顾客,可改为“光临”;D项,“惠赠”是

敬辞,指对方赠予(财物),应改为“赠送”。] 5.在下面一段文字横线处填入句子,最得体的一项是()

【导学号:54012037】

某校学生吴笑天在全国作文大赛中获得一等奖。校长在国旗下讲话时向全校师生介绍说:“________”

A.笑天同学忝获全国一等奖,成为文学领域的佼佼者。这是他勤奋努力的结果,也是敝校老师精心培育的成果。

B.笑天同学忝获全国一等奖,成为文学领域的佼佼者。这是他笔耕不辍的结果,也是我校老师精心培育的成果。

C.笑天同学荣获全国一等奖,成为我校学子的骄傲。这是他笔耕不辍的结果,也是敝校老师精心培育的成果。

D.笑天同学荣获全国一等奖,成为我校学子的骄傲。这是他勤奋努力的结果,也是我校老师精心培育的成果。

D [本题考查语言表达得体的能力。A、B两项中的“忝”是谦辞,表示辱没他人,自己有愧。只能用在自己身上,不能用于对方,且与语境不符,故排除。C项,“笔耕不辍”指勤奋写作,一刻也不停止。用在作文比赛中获奖的学生身上,不恰当。“敝”是谦辞,也不恰当。排除C项,故选D项。] 6.张华说话喜欢引经据典,下列各句中,所引诗词最符合语境的一项是()A.长江发生沉船事件,张华沉吟良久,感叹道:“真可谓‘沉舟侧畔千帆过,病树前头万木春’呀!”

B.爷爷生日寿宴上,张华激情洋溢地说:“花甲喜循环,风霜变老颜。感谢大家百忙之中来参加我爷爷的古稀寿宴,让我们一起祝福我爷爷:生日快乐!”

C.儿子想踢足球,张华要他学钢琴,几番争执后,张华摇摇头说:“这真是‘无可奈何花落去,似曾相识燕归来’啊!”

D.朋友来访,张华走到小院门口迎接,说:“‘花径不曾缘客扫,蓬门今始为君开’,欢迎你到我家来做客。”

D [本题考查语言表达得体、准确的能力。D项,诗句的含意是主人热情地欢迎来访的朋友,符合语境。A项,诗句的含意是事物总是向前发展的,与语境不合。B项,“花甲”指人六十岁,与古稀矛盾。C项,诗句的含意是一切美好的事物都会不可避免地走向消逝,但新的事物也会产生,不符合语境。] 7.下列礼貌用语中,说法有误的一项是()A.初次见面称“久仰”,好久不见称“久违”。B.求人原谅称“包涵”,求人方便称“借光”。C.受人之礼称“笑纳”,赠人书画题“惠存”。D.客人到家称“光临”,归还原物说“奉还”。C [请人受礼称“笑纳”。] 8.下列拟用于高中学生餐厅的对联,恰当的一项是()A.说地谈天且以烹茶寻雅趣,怡情悦性还从赏月借春风 B.春夏秋冬一岁川流不息,东西南北四方宾客如归 C.红日坠西行客身倦堪止步,群鸦噪晚离人马疲可停骖

D.件件随心饥有佳肴醉有酒李桃交谊笃,般般适合冷添汽水热添茶橘柚及时登 A [B项,“四方宾客”往往是招待外来客的。C项,“行客”“离人马疲”常常用于旅栈。D项,“醉有酒”不适合高中校园。] 9.下列有关各节日的对联,不恰当的一项是()A.教师节对联:旭日灿星照学府,春风化雨育新苗。B.中秋节对联:灯火交辉元夜里,笙歌簇拥月明中。C.国庆节对联:惠政兴邦千家乐,赤诚报国万众心。D.重阳节对联:何处题糕酬锦句,有人送酒对黄花。

B [B项,“灯火交辉元夜里,笙歌簇拥月明中”为元宵节对联。] 10.下列句子语言表达得体的一项是()

【导学号:54012038】

A.值张老师的令郎结婚之际,我们办公室全体人员集体制作了一段视频,向他全家表达了诚挚的祝福。

B.淮海路上一家手机经销店正在搞让利促销,我过去垂询了一下几款名牌智能手机的价格,发现并没有便宜多少。

C.刚刚接到出版社寄来的论著样书,我匆匆打开,看到扉页上印着几位编者的姓名,我的名字也忝列其中。

D.李教授出院了,小王在电话里对他说:“欣闻您康复出院,特表示衷心祝贺,不知您何时来上班?”

C [A项,“令郎”用来表达对对方尊敬,不能用于第三方。B项,“垂询”,敬辞,不能用于自己。D项,应该用口语。] 11.下列对联,最适合祝老师70岁寿辰的一联是()A.碧桃献岁宜家受福,花甲逢春获寿延年。B.为学有宗古稀成庆,诲人无倦恩重及门。C.乐道安贫音容宛在,因材施教手泽犹存。D.执掌教坛垂七十载,栽培桃李满三千株。

B [B项中“为学有宗”“诲人无倦”“古稀成庆”符合题干中“老师”“70岁”的要素。] 12.下文是一份请柬中的四句话,其中表述不得体的一句是()...(甲)我校文学社定于本月18日晚7点在学校礼堂举行“民俗文化报告会”。(乙)您是著名民俗专家,对民俗文化的研究造诣颇深。(丙)今诚挚邀请您莅临会议,为我社民俗文化活动的开展做出认真的指导。(丁)敬请届时光临。

A.(甲)

B.(乙)

C.(丙)

D.(丁)C [本题考查语言的得体。邀请对方进行指导,却提出“认真”的要求,显然不得体,将“做出认真的指导”改为“提出宝贵的意见”。] 13.杨先生为父亲举办个人书画展,下面是他给某知名书画家写的一份邀请函的正文内容,其中有几处用语不得体,修改不正确的一项是()明日请您屈驾到府上一坐,令尊珍藏的墨宝将悉数展出,届时还请您抛砖引玉,不吝赐教。明早七点请您在家恭候,我们将有专车迎接。真诚期待您的光临!

A.“府上”改为“寒舍” B.“令尊”改为“鄙人” C.“抛砖引玉”改为“发表高见” D.“恭候”改为“等候”

B [B项,“令尊”改为“家父”,因为是为自己的父亲举办的书画展,而不是为对方的父亲。]

二、主观题

14.(2016·浙江卷)在空格处分别补写出倡议的理由和具体内容。(两处字数各不超过40个字)

倡议书

各位同学:

乘坐公交是很多市民日常出行的选择。众所周知。可是,我市不文明乘车现象时有发生,甚至发生老人被人群挤倒而摔成粉碎性骨折的悲剧。

为此,我们向全校同学发出倡议:。

文明乘车,从我做起!让我们用自己的行动为城市增光添彩!

××中学学生会 ×年×月×日 【解析】 本题考查简明、连贯、得体、准确、鲜明、生动的语言表达。首先要准确理解所给材料的基本意思:为了呼吁大家文明乘车而写倡议书,补出倡议的理由和具体内容。根据语境,第一段的空白处应填写文明乘车的好处,也就是文明乘车的理由。后一空白处则是文明乘车的具体做法。

【答案】(示例)文明乘车让出行更安全,更高效,体现了一个人的基本素养,也有益于社会和谐。自觉排队,有序上车;尊老爱幼,主动让座;举止文明,谈吐有礼。

15.下面这封信有四处不合规范,请指出其中的三处。【导学号:54012039】 ××学兄:

寄呈的大作收悉,拜读再三,激动不已。你的诗构思巧妙,语言隽永,弟自愧不如。只是个别字句略有笔误或不合韵律,我冒昧地作了一点雅正,随信寄回,谨供参考。

顺祝 夏安!

弟××

2017年6月6日

【解析】 本题考查应用类文体格式和语言得体等内容,本文属于书信,称谓和祝语都要顶格,用语要符合人物身份,语言要得体。“寄呈”“雅正”是敬辞,用于对别人。

C语言程序设计教案 第十章指针 篇3

课题:

教学目的: 教学重点: 教学难点: 第十章 指针

§1-§2

1、了解指针与地址的概念

2、掌握指针变量的定义、初始化及指针的运算 指针变量的定义、初始化及指针的运算

指针的运算

步骤一 复习引导

指针是C语言的一个重要概念,也是C语言的一个重要特色。正确而灵活地运用它,可以有效地表示复杂的数据结构;能动态分配内存;能方便地使用字符串;有效而方便地使用数组;在调用函数时能得到多于1个的值;能直接处理内存地址等,这对设计系统软件是很必要的。

指针的概念比较复杂,使用也比较灵活,因此初学者时常会出错,务请在学习本章内容时十分小心。

步骤二 讲授新课

§10.1 地址和指针的概念

计算机的主存储器被分成一个个存储单元,为了区分各存储单元,要为每个存储单元编号,这个编号即地址。

例:i =3;

或 scanf(“%d”, &i);

是将3送给 i所在的空间。

例:将3送到变量I_pointer所“指向”的单元(即I所标志的单元)。

所谓“指向”,是通过地址来体现的,I_pointer中的值为2000,它是变量I 的地址,这样就在I_pointer和变量之间建立起一种联系,即通过I_pointer能知道I的地址,从而找到变量I的内存单元。因而在C语言中,将地址形象化地称为“指针”。

意思是通过它能找到以它为地址的内存单元。一个变量的地址称为该变量的“指针”。

内存单元的地址和内存单元的内容是两个不同的概念。

指针:就是地址,即内存单元的编号。

指针变量:用来存放另一变量的地址(即指针)的变量。

如:地址2000是变量 i的指针;i_pointer是指针变量,其值就是指针2000。

§10.2变量的指针和指向变量的指针变量

变量的指针就是变量的地址。

存放变量地址的变量是指针变量,用来指向另一个变量。

*i_pointer 表示 i_pointer 所指向的变量。

一、定义一个指针变量

指针变量的定义包含三个方面的内容:

⑴ 指针类型说明,即定义变量为一个指针变量 ⑵ 指针变量名

⑶ 变量值(指针)所指向的变量的数据类型。格式:

存储类型

基类型

*指针变量名;例:int *pointer_1, *pointer_2;

float *pointer_3;

char *pointer_4;

二、指针的引用

指针变量有两个运算符: & :取地址运算符

功能:取变量地址;单目,右结合。

* :取内容运算符(“间接访问”运算符)

功能:只能跟地址,取变量所指向单元的内容;单目,右结合。

例:&a为变量a的地址,*p 为指针变量p所指向的存储单元。

例:int a=5, *p=&a;

printf(“%d”, *p);main(){ int a,b;

int *pointer_1,*pointer_2;

a=100;b=10;

pointer_1=&a;

/*把变量a的地址赋给pointer_1*/

pointer_2=&b;

/*把变量b的地址赋给pointer_2*/

printf(“%d,%dn”,a,b);

printf(“%d,%dn”,*pointer_1, *pointer_2);} 输出结果:100, 10

100, 10

评注:

1、在第3行虽然定义了两个指针变量,只是提供了两个指针变量,但并未指向任何一个整型变量。称为指针“悬空”。

2、最后一行的*pointer_1和pointer_2就是变量a和b。

3、程序中两处出现*pointer_1等,含义不同。程序第3行中的*pointer_1表示定义指针变量pointer_1。它前面的*只是表示该变量是指针变量。程序最后一行中的*pointer_1则代表变量,即pointer_1所指向的变量。

4、第5行中的pointer_1=&a 是将a的地址赋给指针变量pointer_1,而不是*pointer_1。

注意:不应写成:*pointer_1=&a;

5、从上例中可看出,*pointer_1等价于a,*pointer_2等价于b,故凡在程序中出现a的地方均可用 *pointer_1 代替。所以,若有: int x, y, *px=&x;则下面的运算均是正确的: y=*px+1;

/*把 x 的内容加1 送变量y*/ printf(“%dn”, px);

/*打印当前x 的内容*/ d=sqrt((double)px);

/*把x的平方根送变量d*/ px=0;

/*把 x 置为0*/ *px+=1;

/*把 x 的值加 1*/(*px)++;

/*使 x 的值加 1*/ y=(*px)++;

/*即y=x, x++*/

6、假设px和py都被定义为指向int 对象的指针,而且px当前已指向了int 型变量x,则执行:

py=px;

/*把指针px的内容拷贝到指针py中去*/ 即

py和px 这两个不同的指针指向了同一对象x

7、指针不是整数,不能将它与整数混为一谈。例:

# include main(){ int x=100,*p;p=x;printf(“%d”, p);}

例如:

# include main(){ int a, b, *d=&a;

b = d;

printf(“%d n”, b);

……

}——编译不出错,但得不到希望的值

关于&和*运算符的说明:

假设已执行

pointer_1=&a;

1、&*pointer_1含义是什么?

&*pointer_1与&a相同,即变量a的地址。

2、*&a的含义是什么?

先进行&a运算,得a的地址,再进行*运算。

*&a、*pointer_1及变量a等价。

3、(*pointer_1)+ + 相当于a + +。

它与*pointer_1 + + 不同。

4、*pointer_1 + + 等价于*(pointer_1 + +),即先进行*运算,得到a的值,然后使pointer_1的值改变,这样pointer_1不再指向a了。

例10.2:输入a和b两个整数,按先大后小的顺序输出a和b。

main(){ int *p1,*p2,*p, a, b;

scanf(“%d,%d”,&a,&b);

p1=&a;p2=&b;

if(a

{p=p1;p1=p2;p2=p;}

printf(“n a=%d,b=%dn”,a,b);

printf(“max=%d,min=%dn”,*p1,*p2);

} 运行情况: 5,9 a=5,b=9 max=9,min=5

三、指针变量作为函数参数

例10.3对输入的两个整数按大小顺序输出。先考察如下程序,看是否能得到预期的结果

swap(int p1, int p2){ int temp;temp = p1;p1 = p2;p2 =temp;} main(){ int a, b;

scanf(“%d, %d”, &a, &b);

if(a

printf(“n%d,%dn”,a,b);} 不能得到预期的结果。改为:

swap(int *p1,int *p2){ int temp;

temp = *p1;

*p1 = *p2;

*p2 =temp;} main(){ int a,b;

int *pointer_1,*pointer_2;

scanf(“%d,%d”,&a,&b);

pointer_1=&a;

pointer_2=&b;

if(a

swap(pointer_1,pointer_2);

printf(“n%d,%dn”,a,b);}

注:如果想通过函数调用得到n个改变的值,可以:

1、在主调函数中设n 个变量,用n个指针变量指向它们;

2、然后将指针变量作实参,将这n 个变量的地址传给所调用的函数的形参;

3、通过形参指针变量,改变该n个变量的值;

4、主调函数中就可以使用这些改变了值的变量。

四、指针(变量)的初始化 指针置初始化值的格式:

存储类型

基类型

*指针名=初始化值; 如:main()

{ static int a;

int *p=&a, *p1=p;

…… } 再如: int *p = 0;

int *p = NULL;

五、指针的运算

1、指针的算术运算

指针仅能进行加、减算术运算

如:p+n , p-n , p++ , p--, ++p ,--p

p-= n , p+= n , p1-p2 等 其中n是整数,p、p1、p2均为指针;

施行加法运算时,指针向地址增大的方向移动; 施行减法运算时,指针向地址减小的方向移动; 移动长度取决于指针的基类型,由计算机决定; 如有:int a,b,c, *pt =&a;

pt++ 则指针向后移动两个字节; 再如:main()

{ int *p1,a=8,b=3;

p1=&a;

printf(“%d,%dn”,(*p1)++, *p1++);

printf(“%d,%dn”,a, *p1);

} 运行结果:3,8,4 注:p1+k = p1+k*sizeof(p1的基类型);

p1-k = p1-k*sizeof(p1的基类型);如:

strlen(char *s)

{ char *p=s;

while(*p!=„‟)p++;

return(p-s);

}

2、指针的关系运算

设指针p1,p2指向同一数组中的元素,则

p1

p1

p1= =p2:

表示p1、p2指向数组中的同一元素;

同理可推出>、>=、<=、!=比较的意义; 不可将指针与其他类型的对象作比较;

若两指针指向不同数组中的元素,也不可比较;

允许将指针与NULL或数值0进行= =或!=的比较,以便判定一个指针是否为空指针。

步骤三 课堂小结

本课介绍了指针与地址的概念,指针变量的定义、初始化及指针的运算。

指针:就是地址,即内存单元的编号。

指针变量:用来存放另一变量的地址(即指针)的变量。

例如:int a=5, *p=&a;

printf(“%d”, *p);

注意:运算符*和&的用法,指针变量的自加自减运算。步骤四 布置作业

课后作业:第十章课后练习10.1 10.2 课题:

教学目的: 教学重点: 教学难点: 第十章 指针

§3 掌握指针与数组的知识 指向数组的指针变量

指向二维数组的指针

步骤一 复习引导

上节课介绍了指针变量的定义及其赋值。一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。指针变量既然可以指向变量,当然也可以指向数组和数组元素(把数组起始地址或某一元素的地址放到一个指针变量中)。

步骤二 讲授新课

所谓数组的指针是指数组的起始地址,数组元素的指针是数组元素的地址。

引用数组元素可以用下标法(如a[3]),也可以用指针法,即通过指向数组元素的指针找到所需的元素。使用指针法能使目标程序质量高(占内存少,运行速度快)。

一、指向一维数组的指针

定义形式:

int a[10];

int *p;

p=&a[0];

p=a;

含义:把数组的首地址赋给指针变量p。

也即: int *p=&a[0];

int *p=a;

二、通过指针引用数组元素

按C的规定:如果指针变量p已指向数组中的一个元素,则p+1指向同一个数组中的下一个元素(而不是简单地加1)。

如果p的初值为&a[0],则:

p+i  a+i  &a[i],即指向a数组的第i个元素。

*(p+i) *(a+i)

a[i]。

指向数组的指针变量也可以带下标,如p[i]与*(p+i)等价 引用数组元素时,可以用:

1、下标法,如:a[i]

2、指针法,如:*(a+i)

*(p+i)

其中,a是数组名,p是指向数组的指针

例10.5:输出数组中的全部元素

假设有一个a数组,整型,有10个元素。用三种方法输出各元素的值:

1、下标法: main(){ int a[10], i;

for(i=0;i<10;i++)

scanf(“%d”,&a[i]);

printf(“n”);

for(i=0;i<10;i++)

printf(“%d”,a[i]);}

2、利用数组名计算数组元素地址,找出元素的值。main(){ int a[10], i;

for(i=0;i<10;i++)

scanf(“%d”,&a[i]);

printf(“n”);

for(i=0;i<10;i++)

printf(“%d”,*(a+i));}

3、用指针变量指向数组元素。main(){ int a[10], *p, i;

for(i=0;i<10;i++)

scanf(“%d”,&a[i]);

printf(“n”);

for(p=a;p<(a+10);p++)

printf(“%d”,*p);} 评注:

1、第1和2种方法执行效率是相同的。

2、第3种方法效率高。

3、用下标法比较直观。

在使用指针变量时,有几个问题要注意:

1、指针变量可以实现使本身的值改变。如:for(p=a;p<(a+10);p++)

2、要注意指针变量的当前值。

如:要通过指针变量输出a数组的10个元素。main(){ int a[10], i , *p=a;

for(i=0;i<10;i++)

scanf(“%d”, p++);

printf(“n”);

for(i=0;i<10;i++,p++)

printf(“%d”, *p);} 这个程序输出的并不是a数组中各元素的值。因为第一个 for 循环结束时,p已经指向数组的末尾。再继续下去,p指向的是a数组下面的10个元素,是不可预料的。可加一句为:p=a;

3、用指针变量p指向数组元素,可以指到数组以后的内存单元。C编译程序不作下标越界检查。

4、注意指针变量的运算。如果p指向数组a,⑴ p++(或 p+=1),使p指向下一元素a[1]。⑵ *p++

等价 *(p++)。作用是先得到p指向的变量的值(即*p),然后再使p+1→p。⑶ *(p++)与*(++p)不同。前者为a[0],后者为a[1] ⑷(*p)++表示p指向的元素值加1,即(a[0])++ ⑸ 如果p当前指向a数组中第i个元素,则:

*(p--)相当于a[i--],先对p进行*运算,再使p自减; *(+ + p)相当于a[+ +i],先使p自加,再作*运算。*(-){ temp=*i;*i = *j;*j =temp;} return;} main(){ int i, a[10],*p=a;printf(“The original array: n ”);for(i=0;i<10;i++,p++)scanf(“%d”, p);printf(“n”);p=a;inv(p,10);printf(“The array is : n”);for(p=a;p

例10.10:用选择法对10个整数排序。main(){int *p, i, a[10];p=a;for(i=0;i<10;i++)scanf(“%d”,p++);p=a;sort(p,10);for(p=a, i=0;i<10;i++){ printf(“%d”,*p);p++;} } sort(int x[],int n){ int i, j, k, t;for(i=0;ix[k])k=j;if(k!=i){ t = x[i];x[i] = x[k];x[k] = t;} }

四、指向二维数组的指针和指针变量

1、二维数组的地址如:

int a[3][4] A

a[0]

a[0] [0] a[0] [1] a[0] [2] a[0] [3]

A+1

a[1]

a[1] [0] a[1] [1] a[1] [2] a[1] [3]

A+2

a[2]

a[2] [0] a[2] [1] a[2] [2] a[2] [3] 例:int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};

设首地址为2000。

 a[k]+p(0<=k< i , 0<=p

 a+k与&a[k][0]等价,而a[0]+k与&a[0][k]等价;  *(a+i)可理解为a[i],故有如下等价关系:

a+0

等价于 a[0]、a[0]+0、&a[0][0]、*(a+0)

a+1

等价于 a[1]、a[1]+0、&a[1][0]、*(a+1)

a+(i-1)等价于 a[i-1]、a[i-1]+0、&a[i-1][0]、*(a+i-1)

 *(a+k)与*a[k]是不同的,前者相当于a[k],是一个地址值;后者相当于*(a[k]+0)或*&a[k][0],是数组元素a[k][0]中存储的值。 数组元素a[k][p]就是*(a[k]+p),即*(*(a+k)+p)

步骤三 课堂小结

本课介绍了指向数组的指针,主要是指向一维数组的指针。用指针变量p指向数组a,指针变量p可以++、--,表示指向数组的上一元素或下一元素。但C编译程序不作下标越界检查。使用指针既方便有灵活,但初学者容易搞错。

步骤四 布置作业

课后作业:第十章课后练习10.31 10.5 课题:

教学目的: 教学重点: 教学难点: 第十章 指针

§3-§4 在掌握指针与数组的基础上,掌握字符串的指针与指向字符串的指针变量 指向字符串的指针变量

用指针处理字符串

步骤一 复习引导

上节课介绍了指向一维数组的指针及二维数组的地址,指向一维数组的指针也即指向元素的指针,那么指向二维数组的指针是怎样的呢?它有两种类型。

步骤二 讲授新课

2、指向二维数组的指针变量

——(1)指向数组元素的指针变量

设指针变量p=a[0]

(&a[0][0]、a、a+0、*(a+0))计算a[i][j]在n*m数组中的位置:

例:……

for(i=0;i<3;i++)

{for(j=0;j<4;j++)printf(“%4d”, *(p+i*m+j));

printf(“n”);}

……

例:用指针变量输出数组元素的值。main(){ int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};

int *p;

for(p=a[0];p

{if((p-a[0])%4 == 0)printf(“n”);

printf(“%4d”, *p);

} } 计算a[i][j]在n*m数组中的位置:a[0]+i*m+j

——(2)行指针(指向由m个元素组成的一维数组的指针变量)

定义:指针基类型

(*指针名)[m]

其中,m表示二维数组每行有m列;

如: int(*p)[3];

于是,p

指向第0行元素的起始存储地址;

p+1

指向第1行元素的起始存储地址;……

p+I

指向第i 行元素的起始存储地址;

而每一行的元素的表示形式为:

第0行元素的表示为(*p)[j];

第1行元素的表示为(*(p+1))[j];……

第i 行元素的表示为(*(p+ I))[j];

例 :

#include main(){ int(*p)[4], j;

int a[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};for(p=a;p

for(j=0;j<4;j++)

if(j==3)printf(“%4dn”,(*p)[j]);

else printf(“%4d” ,(*p)[j]);

} 改写为:

#include main(){ int(*p)[4], i, j;

int a[4][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};

p=a;

for(i=0;i<4;i++)

for(j=0;j<4;j++)

printf(j==3?“%4dn”: “%4d” , *(*(p+i)+j));

}

3、多维数组的指针作函数参数

一维数组的地址可以作为函数参数传递,多维数组的地址也可作函数参数传递。在用指针变量作形参以接受实参数组名传递来的地址时,有两种方法:

1、用指向变量的指针变量;

2、用指向一维数组的指针变量。

例;有一个班,3个学生,各学4门课,计算总平均分数,以及第n个学生的成绩。main(){ void average(float *p ,int n);

void search(float(*p)[4], int n);

float score[3][4]={{65,67,70,60},{80,87,90,81}, {90,99,100,98}};

average(*score, 12);

/*求12个分数的平均分*/

search(score , 2);

/*求第2个学生成绩*/ } void average(float *p , int n){float *p_end;

float sum= 0,aver;

p_end = p+n-1;

for(;p<=p_end;p++)sum =sum+(*p);aver = sum/n;printf(“average=%5.2fn”,aver);} void search(float(*p)[4], int n){ int i;printf(“the score of No %d are:n”,n);for(i=0;i<4;i++)printf(“%5.2f”, *(*(p+n)+i));}

例10.15 在上题基础上,查找一门以上课程不及格的学生,打印出他们的全部课程的成绩。main(){ void search(float(*p)[4], int n);float score[3][4]={{65,57,70,60},{58,87,90,81),{90,99,100,98}};search(score, 3);} void search(float(*p)[4], int n){int i, j, flag;for(j=0;j

§10.4字符串的指针和指向字符串的指针变量

一、字符串的表示形式

1、用字符数组存放一个字符串。如:main()

{ char string[ ]=“I love China!”;

printf(“%sn”, string);}

2、用字符指针指向一个字符串。

如:main()

{ char *string=“I love China!”;

printf(“%sn”, string);} 例10.18 将字符串a复制为字符串b。main(){ char a[]=“I am a boy.” , b[20];

int i;

for(i=0;*(a+i)!=„‟;i++)*(b+i)= *(a+i);

*(b+i)= „‟;

printf(“string a is : %sn”, a);

printf(“string b is :”);

for(i=0;b[i]!=„‟;i++)

printf(“%c”, b[i]);

printf(“n”);}

例10.19 用指针变量来处理上例。main(){ char a[ ]=“I am a boy.” , b[20], *p1, *p2;

int i;

p1= a;p2= b;

for(;*p1!=„‟;p1++,p2++)*p2 = *p1;

*p2 = „‟;

printf(“string a is : %sn”, a);

printf(“string b is :”);

for(i=0;b[i]!=„‟;i++)

printf(“%c”, b[i]);

printf(“n”);}

二、字符串指针作函数参数

例10.20:用函数调用实现字符串的复制。——(1)用字符数组作参数。

void copy_string(char from[],char to[]){ int i=0;

while(from[i]!=„‟)

{ to[i] = from[i];i++;}

to[i]=„‟;

} main(){ char a[]=“I am a teach.”;

char b[]=“you are a student.”;

printf(“string a= %snstring b=%sn”,a,b);

copy_string(a,b);

printf(“nstring a=%snstring b=%sn”,a,b);} ——(2)形参用字符指针变量 void copy_string(char *from,char *to){ for(;* from!=„‟;from++, to++)

*to = *from;

*to=„‟;

} ——(3)对copy_string函数还可以简化。① void copy_string(char *from, char *to)

{ while((*to =* from)!=„‟)

{ to ++;from++;}

} ② void copy_string(char *from, char *to)

{ while((*to ++ =* from++)!=„‟);}

③void copy_string(char *from, char *to)

{ while(* from!=„‟)

*to++ = *from ++;

*to = „‟;

} ④void copy_string(char *from, char *to)

{ while(*to++ = *from ++);}

⑤void copy_string(char *from, char *to)

{ for(;*to++ = *from ++;);}

⑥void copy_string(char from[], char to[])

{ char *p1,*p2;

p1=from;p2=to;

while((*p2++ = *p1++)!=„‟);

}

三、字符指针变量和字符数组的讨论

1、字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放的是地址,决不是将字符串放到字符指针变量中。

2、赋值方式。对字符数组只能对各个元素赋值,不能用以下办法对字符数组赋值;

char str[14];

str=“I love China.”;对字符指针变量,可以采用下面方法赋值:

char *a;

a= “I love China.”;

/*赋给a的是串的首地址*/

3、对字符指针变量赋初值:

char *a=“I love China.”;

等价于

char *a;

a=“I love China.”;

而对数组的初始化:

char str[14]={“I love China.”};不等价于

char str[14];

str[]=“I love China.”;

即数组可以在变量定义时整体赋初值,但不能在赋值语句中整体赋值。

4、如果定义了一个字符数组,在编译时为它分配内存单元,它有确定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个地址值,也就是说,该指针变量可以指向一个字符型数据,但如果未对它赋一个地址值,则它并未具体指向一个确定的字符数据。这很危险。

如: char str[10];

scanf(“%s”,str);是可以的 char *a;

scanf(“%s”,a);

能运行,但危险,不提倡,在a单元中是一个不可预料的值。

应当 char *a,str[10];a=str;scanf(“%s”,a);

5、指针变量的值是可以改变的,数组名虽然代表地址,但它的值是不能改变的。可以下标形式引用所指的字符串中的字符。

如:main()

{char *a=“I love China.”;

a=a+7;

printf(“%s”,a);}

又如:char str[]={“I love China.”};str=str+7;printf(“%s”,str);是错的

6、用指针变量指向一个格式字符串,可以用它代替printf函数中的格式字符串。也可以用字符数组实现,但由于不能采用赋值语句对数组整体赋值。

如:char *format;format=“a=%d,b=%fn”;printf(format,a,b);

等价于:printf(“a=%d,b=%fn”,a,b);

也可以:char format[ ]=“a=%d,b=%fn”;printf(format,a,b);

步骤三 课堂小结

本课介绍了指针与二维数组、指针与字符串,指向二维数组的指针有指向元素的指针和行指针,使用时应注意它们的区别。我们既要掌握用数组处理字符串,也要掌握用指针变量处理字符串。要区分这两种方法的不同之处。

步骤四 布置作业

课后作业:第十章课后练习10.61 10.7 课题: 第十章 指针

§5-§7 教学目的: 了解指针与函数的概念 教学重点:

教学难点: 指针数组,二级指针 掌握指针数组,二级指针等知识 掌握指针数组,二级指针等知识

步骤一 复习引导

前面介绍了指针与维数组、指针与字符串,我们可以用指针变量指向整型变量、字符串、数组,也可以指向一个函数。

步骤二 讲授新课

§10.5函数的指针和指向函数的指针变量

函数的地址:函数存储区域的首地址就是该函数的入口点,其函数名表示了入口地址。

一、函数指针变量的定义:

存储类型

数据类型

(*函数指针名)();

例:static int(*p)();例10.23 求a和b中的大者。

main()

{ int max(int, int);

int a,b,c;

scanf(“%d,%d”,&a,&b);

c=max(a,b);

printf(“a=%d,b=%d,max=%d”,a,b,c);

} max(int x, int y){ int z;

if(x>y)z=x;

else z=y;

return(z);} 法2:main()

{

int max(int, int);

int(*p)();

int a,b,c;

p=max;

/*将地址送入p */

scanf(“%d,%d”,&a,&b);

c=(*p)(a,b);

/*与max(a,b)等价*/

printf(“a=%d,b=%d,max=%d”,a,b,c);

} 注:int(*p)()定义p是一个指向函数的指针变量,此函数带回整型的返回值。

说明:

1、函数的调用可以通过函数名调用,也可以通过函数指针调用。

2、(*p)()表示定义一个指向函数的指针变量,它不是固定指向哪一个函数的,而只是表示定义了这样一个类型的变量,它是专门用来存放函数的入口地址的。

3、在给函数指针变量赋值时,只需给出函数名而不必给出参数,如:p=max。

4、用函数指针变量调用函数时,只需将(*p)代替函数名即可(p为指针变量名),在(*p)之后的括号中根据需要写上实参。如:c=(*p)(a,b);

5、对指向函数的指针变量,像p+n、p++、p--等运算是无意义的。

二、用指向函数的指针作函数参数

函数的参数可以是变量、指向变量的指针变量、数组名、指向数组的指针变量等。现介绍指向函数的指针也可以作为参数,以便实现函数地址的传递,也就是将函数名传给形参。

它的原理可以简述如下:有一个函数(假设函数为sub),它有两个形参(x1和x2),定义x1和x2为指向函数的指针变量。在调用函数sub时,实参用两个函数名f1和f2给形参传递函数地址。这样在函数sub中就可以调用f1和f2函数了。

有人会问,既然在sub函数中要调用f1和f2函数,为什么不直接调用f1和f2而用函数指针变量呢?的确,如果只是用到f1和f2,完全可以直接在sub函数中直接f1和f2,而不必设指针变量x1、x2。但是,如果在每次调用sub函数时,要调用的函数是不固定的,这次调用f1和f2,而下次要调用f3和f4,第三次要调用的名作为实参即可,sub函数不必作任何修改。这种方法是符合结构化程序设计方法原则的,是程序设计中常使用的。

例10.24 设一个函数process,在调用它的时候,每次实现不同的功能。

main(){ int max(int ,int);

int min(int , int);

int add(int , int);

int a, b;

printf(“enter a and b:”);

scanf(“%d,%d”, &a, &b);

printf(“max=”);process(a,b,max);

printf(“min=”);process(a,b, min);

printf(“sum=”);process(a,b, add);}

max(int x, int y)

{ int z;

if(x>y)z = x;else z = y;

return(z);

}

min(int x, int y)

{ int z;

if(x

else z = y;

return(z);} add(int x, int y){ int z;

z = x+y;

return(z);}

process(int x, int y, int(*fun)(int ,int)){int result;

result =(*fun)(x,y);

printf(“%dn” , result);}

在函数process定义中,int(*fun)(int,int)表示fun是指向函数的指针,该函数是一个整型函数,有两个整型形参。

在三次调用中,分别将函数名max、min、add作为实参将其入口地址送给process函数中的形参fun(fun是指向函数的指针变量)。例:process函数中的(*fun)(x,y)相当于max(x,y)。

注:在使用时,应将函数声明,这样编译系统将它按函数名处理(把函数入口地址作实参值),而不是作为变量名,不致出错。

Process函数无固定功能。如果max、min、add换成其它函数,此process函数不需改变,只要修改每函数的函数体。

§10.6 返回指针值的函数

一个函数可以带回一个整型值、字符值、实型值等,也可以带回指针型的数据,即地址。其概念与以前类似,只是带回的值的类型是指针类型而已。格式: 类型名

*函数名(参数表);例: int

*a(int x, int y);

a是函数名,调用它以后能得到一个指向整型数据的指针(地址)。

例10.25 有若干个学生的成绩(每个学生有4门课程),要求在用户输入学生序号以后,能输出该学生的全部成绩。用指针函数来实现。float *search(float(*pointer)[4], int n)

{float *pt;

pt = *(pointer +n);

return(pt);

} main(){ float score[][4]={{60,70,80,90},{56,89,67,88),{34,78,90,66}};

float *p;

int i, m;

printf(“enter the number of student:”);

scanf(“%d”,&m);

printf(“The score of No.%d are:n”, m);

p=search(score, m);

for(i=0;i<4;i++)

printf(“%5.2t”, *(p + i));

}

例10.26 对上例中的学生,找出其中有不及格课程的学生及其学生号。float *search(float(*pointer)[4]){ int i;

float *pt;

pt = *(pointer+1);

for(i=0;i<4;i++)

if(*(*pointer+i)<60)pt = *pointer;

return(pt);} main(){ score[][4]={{60,70,80,90},{56,89,67,88),{34,78,90,66}};

float *search(float(*pointer)[4], int n);

float *p;

int i, m;

for(i=0;i<3;i++){ p=search(score+i);

if(p==*(score + i))

{ printf(“ No.%d score:”, i);

for(j=0;j<4;j++)

printf(“%5.2t”, *(p + i));

printf(“n”);}

} }

关于函数的返回值是指针的情况,程序设计时应注意:

1、因数组名是地址常量,用于接受这种返值的对象不能是数组名,这与把数组名作为实在参数传递给形式参数的情况不同(作为形式参数的数组名总被视为指针)。

2、不应将局部于被调用函数的指针作为返值返回给调用者,理由是局部于被调用函数的数据对象执行返回语句离开被调用函数后,原来分配的被调用函数的所有局部对象的存储空间立即被收回(释放),虽然调用者已经获得了正确的地址值,但此时它指向的存储区域的内容可能已经发生了变化,或许已经分配给其他函数了。如果调用函数中仍然使用这个指针去存取那个区域中的数据,得到的可能并非原先的数据。对于这种情况的正确做法是应该把所处理的对象定义成全局对象或static型对象。

§10.7 指针数组和指向指针的指针

一、指针数组的概念

一个数组中的元素均为指针类型,称为指针数组。

形式:

存储类型

类型名

*数组名[数组长度]

例如:

static

int

*p[4]

定义指针数组时也可以进行初始化,如:

static char ch[][20]={“Beijing”,“Nanjing”,“Shanghai”,“Guangzhou”};

char *p[ ]={ch[0],ch[1],ch[2],ch[3]};该例也可以等价定义为:

char *p[ ]={“Beijing”,“Nanjing”,“Shanghai”,“Guangzhou”};

例如: main(){ int i, min, j;

char *temp, *p[ ]={“Beging”,“Nanjing”,“Shanghai”, “Guangzhou”};

for(i=0;i<3;i++)

{ min=i;

for(j=i+1;j<4;j++)

if(strcmp(p[j], p[min])<0)min=j;

temp=p[i];p[i]=p[min];p[min]=temp;

}

for(i=0;i<4;i++)

printf(“%sn”, p[i]);} 注意:不能把一个二维数组与一个指针数组混淆;

如:int a[10][10];与

int *b[10];的异同点  访问形式相同;如a[5][5],b[5][5];  占用的存储空间数不同;

 每一个b[i]必须置初值者能使用;  使用b优越

不需进行复杂的下标计算;

b[i]指向的数组并非一定要10个元素,但a中,每一行上的元素个数必须相同;因指针指向的是一个地址,故对b而言,各个b[i]指向的存储区域之间不必连续;而对a而言,必须存储100个连续的存储int型数据对象的区域。

例10.27 将若干字符串按字母顺序(由小到大)输出。main(){ void sort(char *name[], int n);

void print(char *name[], int n);

char *name[]={“Follow me”, “Basic”, “Great Wall”, “Fortran”, “Computer”};

int n=5;

sort(name, n);

print(name, n);

} void sort(char *name[], int n){ char *temp;

int i, j, k;

for(i=0;i

{ k=i;

for(j=i+1;j

if(strcmp(name[k], name[j])>0)k=j;if(k!=i)

{temp=name[i];

name[i]=name[k];

name[k]=temp;}

} } void print(char *name[], int n);{ int i;

for(i=0;i

}

二、指向指针的指针

在本章开头已提到“间接访问”变量的方式。利用指针变量访问另一个变量就是“间接访问”。

如果在一个指针变量中存放一个目标变量的地址,这就是“单级间址”。指向指针的指针用的是“二级间址”方法。从理论上讲,间址方法可以延伸到更多的级。但实际上在程序中很少有超过二级间址的。级数愈多,愈难理解,容易产生混乱,出错机会也多。

二级指针的定义:

char **p;

含义:表示指针变量p是指向一个字符指针变量(即指向字符型数据的指针变量)的。main(){ int i, min, j;

char *temp, *p[ ]={“Beging”,“Nanjing”,“Shanghai”, “Guangzhou”};

char **pp;

pp=p;

for(i=0;i<3;i++)

{ min=i;

for(j=i+1;j<4;j++)

if(strcmp(*(pp+j),*(pp+min))<0)min=j;

temp=*(pp+i);

*(pp+i)=*(pp+min);

*(pp+min)=temp;

}

for(i=0;i<4;i++)printf(“%sn”,*pp++);} 例10.28 使用指向指针的指针。main(){ char *name[]={“Follow me”, “Basic”, “Great Wall”, “Fortran”, “Computer”};

char **p;

int i;

for(i=0;i<5;i++)

{ p=name+i;

printf(“%sn”, *p);

}

} 例 main(){ static int a[5]={1,3,5,7,9};

int *num[5]={&a[0],&a[1],&a[2],&a[3],&a[4]};

int **p, i;

p= num;

for(i=0;i<5;i++)

{ printf(“%dt”, **p);

p++;

}

} 运行结果: 步骤三 课堂小结

本课介绍了指针数组、二级指针、指针与函数。要搞清它们的定义及应用; 注意区分:

char a[5];

char(*a)[5];

int

*p(int x);

int(*p)();

步骤四 布置作业

《C语言习题集》同步练习课题: 第十章 指针

§7-§8 教学目的: 了解指针数组作main函数的形参 教学重点:

教学难点: 指针的应用 掌握指针的应用 掌握指针的应用

步骤一 复习引导

上节课介绍了二级指针、指针数组,而指针数组的一个重要应用是作为main函数的形参。main()函数是我们C语言程序必不可少的,以往使用时main()是不带参数的。实际上是可带参数的,如:main(argc, argv)。

步骤二 讲授新课

三、指针数组作main函数的形参

带参数的main原型:

main(int argc, char *argv[ ])

{ ……

}

说明:

第1个参数是指命令行中参数的个数,含文件名本身。

第2个参数是一个指向字符串的指针数组。

main函数是由系统调用的。当处于操作命令状态下,输入main所在的文件名(经过编译、连接后得到的可执行文件名),系统就调用main函数。参数应和命令一起给出。命令形式:

命令名

参数1

参数2

……参数n 例如:有一个目标文件名file1,今想将两个字符串“China”, “Beijing”作为传送给main函数的参数。可写成:

file1 China Beijing

例:编写一程序echo.c,实现将命令行上除程序名之外的所有给出的其他参数都回显到显示器上。

main(int argc, int *argv[ ]){ while(argc>1){ ++argv;

printf(“%s”, *argv);

--argc;} }

若将该程序编译、连接、装配成echo.exe,则在命令行上输入:

echo hello, world! 则通过虚实结合后得:argc=3,argv[0]指向echo,argv[1]指向hello,argv[2]指向world!结果为:hello, world!

§10.8有关指针的数据类型和指针运算的小结

一、有关指针的数据类型的小结

见书中的表

二、指针运算小结

1、指针变量加(减)一个整数 例:p++、p--、p+i、p-=I等

2、指针变量赋值

将一个变量地址赋给一个指针变量。p=&a;p1=p2;

3、指针变量可以有空值,即该指针变量不指向任何变量。如 :

p=NULL;

4、两个指向同一数组元素的指针变量可以相减

5、两个指向同一数组的指针变量可作关系运算

习题举例:

习题10.4

有n个整数,使其前面各数顺序向右移m个位置,最后m个数变成最前面m个数。写一函数实现以上功能,在主函数中输入n个整数,并输出调整后的n个数。

main(){ int number[20],n,m,I;

printf(“How many number?”);

scanf(“%d”,&n);

printf(“Input %d number:n”,n);

for(i=0;i

scanf(“%d”,&number[i]);

printf(“How many place you want to move?”);

scanf(“%d”,&m);

move(number, n, m);

printf(“Now,they are:n”);

for(i=0;i

printf(“%d”, number[i]);} move(int array[20], int n, int m){ int *p,array_end;

array_end = *(array+n-1);

for(p= array+n-1;p>array;p--)

*p= *(p-1);

*array=array_end;

m--;

if(m>0)move(array, n, m);}

习题10.5 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。程序: main(){ int i, k, m, n, num[50], *p;

printf(“Input number of person:n=”);

scanf(“%d”,&n);

p=num;

for(i=0;i

*(p+i)= i+1;

i=0;k=0;m=0;

while(m

{ if(*(p+i)!=0)k++;

if(k==3)

{ *(p+i)=0;k=0;m++;}

i++;

if(i= =n)i=0;

}

while(*p==0)p++;

printf(“The last one is NO.%dn”,*p);

}

习题10.6

写出一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度。main(){ int len;

char *str[20];

printf(“Input string:”);

scanf(“%s”, str);

len=length(str);

printf(“The length of string is %d.”,len);}

length(char *p){ int n;

n=0;

while(*p!=„‟)

{ n++;

p++;

}

return(n);} 习题10.7

有一字符串,包含n个字符。写一个函数,将此字符串中从第m个字符开始的全部字符复制成为另一个字符串。main(){ int m;

char *str1[20],*str2[20];

printf(“Input string:”);

gets(str1);

printf(“Which character that begin to copy?”);

scanf(“%d”,&m);

if(strlen(str1)

printf(“Input error!”);

else { copystr(str1,str2,m);

printf(“result:%s”,str2);

} }

copystr(char *p1, char *p2, int m){ int n;

n=0;

while(n

{n++;

p1++;

}

while(*p1!=„‟)

{ *p2 = *p1;

p1++;p2++;

}

*p2=„‟;}

习题10.9 写一个函数,将3×3的矩阵转置。main(){ int a[3][3],*p, i;

printf(“Input matrix:n”);

for(i=0;i<3;i++)scanf(“%d %d %d”, &a[i][0], &a[i][1] , &a[i][2]);

p=&a[0][0];

move(p);

printf(“Now,matrix:n”);

for(i=0;i<3;i++)

printf(“%d %d %d”,&a[i][0], &a[i][1], &a[i][2]);

} move(int *pointer){ int i, j, t;

for(i=0;i<3;i++)

for(j=i;j<3;j++)

{ t= *(pointer+ 3*i + j);

*(pointer+ 3*i +j)= *(pointer+ 3*j + i);

*(pointer+3*j + i)=t;

}

}习题10.16

输入一个字符串,内有数字和非数字字符,如:

a123x456 17960?302tab5876 将其中连续的数字作为一个整数,依次存放到一数组a中。例如123放在a[0]中,456放在a[1]中……统计共有多少个整数,并输出这些数。#include main(){ char str[50], *pstr;

int i, j, k, m, e10, digit, ndigit, a[10], *pa;

printf(“Input a string:n”);

gets(str);

printf(“n”);

pstr=&str[0];

pa=&a[0];

ndigit = 0;i = 0;j=0;

while(*(pstr+i)!=„‟)

{ if((*(pstr+i)>=„0‟)&&(*(pstr+i)<=„9‟))j++;

else { if(j>0)

{ digit = *(pstr+i-1)-48;

k=1;

while(k

{ e10=1;

for(m=1;m<=k;m++)e10 =e10*10;

digit =digit+(*(pstr+i-k)-48)*e10;

k++;

}

*pa=digit;ndigit++;

pa++;

j=0;

}

}

i++;

}

printf(“There are %d numbers in this line.They are:n”,ndigit);

j=0;

pa=&a[0];

for(j=0;j

printf(“%d”, *(pa+j));

printf(“n”);} 步骤三 课堂小结

本课主要讲了一些习题,希望通过这些例子加深对指针的了解,看到指针在程序设计中的重要应用。同学们课后需要多看、多想、多练,逐步去体会指针这一重要的概念。步骤四 布置作业

c语言程序设计第1章 篇4

审稿人:张磊

第三章第一节 醇 酚(第一课时)

一、教材分析

醇是重要的烃的含氧衍生物,在进行教学时,要注意根据“结构决定性质”的基本思想方法,研究羟基官能团的结构特点及其化学性质,要注意从乙醇的结构和性质迁移到醇类的结构和性质,要注意运用多种教学手段帮助学生对知识的理解,培养学生的能力。学生已经了解了乙醇的结构和性质,因此教学的重点是在复习乙醇的结构和化学性质的基础上,深入研究羟基官能团的结构特点,深入研究乙醇的取代、消去、氧化反应的基本规律,并将乙醇的结构和性质迁移到醇类化合物。

二、教学目标 1.知识目标:

1、分析醇的结构,了解性质的过程中使学生获得物质的结构与性质之间关系的和科学观点。

2、学会由事物的表象分析事物的本质,进一步培养学生综合运用知识、解决问题的能力 2.能力目标:

1、通过分析表格的数据,使学生学会利用曲线图分析有关数据并且得出正确的结论找出相关的规律

2、培养学生分析数据和处理数据的能力

3、利用假说的方法引导学生开拓思维,进行科学探究 3.情感、态度和价值观目标:

对学生进行辩证唯物主义教育,即内因是事物变化的依据,外因是事物变化的条件,从而使学生了解学习和研究问题的一般方法和思维过程,进一步激发学生学习的兴趣和求知欲望。

三、教学重点难点

重点:醇的典型代表物的组成和结构特点。难点:醇的化学性质。

四、学情分析

学生在必修2中已经对醇的知识已经有所了解,通过预习学生可以掌握大部分知识点本节的重点要放在醇的消去反应上。

五、教学方法

1.实验法:醇的消去反应实验。2.学案导学:见后面的学案。

3.新授课教学基本环节:预习检查、总结疑惑→情境导入、展示目标→合作探究、精讲点拨→反思总结、当堂检测→发导学案、布置预习

六、课前准备

1.学生的学习准备:完成预习学案的填写,初步把握消去反应实验的原理和方法步骤。2.教师的教学准备:实验仪器的准备,课前预习学案,课内探究学案,课后延伸拓展学案。3.教学环境的设计和布置:小组教学。

七、课时安排:1课时

八、教学过程 [引入]据我国《周礼》记载,早在周朝就有酿酒和制醋作坊,可见人类制造和使用有机物有很长的历史。从结构上看,酒、醋、苹果酸、柠檬酸等有机物,可以看作是烃分子里的氢原子被含有氧原子的原子团取代而衍生成的,它们被称为烃的含氧衍生物。

[讲]烃的含氧衍生物种类很多,可分为醇、酚、醛、羧酸和酯等。烃的含氧衍生物的性质由所含官能团决定。利用有机物的性质,可以合成具有特定性质而自然界并不存在的有机物,以满足我们的需要。

[板书] 第三章 烃的含氧衍生物第一节 醇 酚

学生探究:

同学们已经学过乙烷分子中一个氢原子被羟基取代后就是乙醇,那么苯环上的一个氢原子被羟基取代后它属于哪类物质呢?是否含有羟基的有机物都属于醇类呢?这样把思路交给学生,通过让同学自己阅读课文了解酚类和苯酚,接着再问:如果甲苯的苯环或甲基上一个氢原子被羟基取代后又各属于哪类物质呢?最后讨论得出:含有羟基的有机物有醇类和酚类,羟基连在链烃(或环烃)的烃基上的是醇,羟基直接连在苯环上的是酚,然后让同学讨论:芳香醇与酚有何区别?下列哪些物质属于酚类? 通过练习,同学们对酚的结构有了深刻的理解。

醇:羟基与链烃基相连的化合物。如:C2H5─OH(脂肪醇)、─CH2─OH(芳香醇)。

最简单的脂肪醇——甲醇,最简单的芳香醇——苯甲醇,最简单的酚——苯酚。

学生归纳:

物理性质和用途:无色粘稠有甜味的液体,沸点198℃,熔点-11.5℃,密度是1.109g/mL,易溶于水和乙醇,它的水溶液凝固点很低,可用作内燃机的抗冻剂。同时也是制造涤纶的重要原料。

[板书]丙三醇: 分子式:C3H8O3 结构简式:

[讲] 醇的命名原则:

1、将含有与羟基(—OH)相连的碳原子的最长碳链作为主链,根据碳原子数目称为某醇。

2、从距离羟基最近的一端给主链上的碳原子依次编号定位。

3、羟基的位置用阿拉伯数字表示,羟基的个数用“二”、“三”等表示。

[板书]

3、醇的命名

[随堂练习]阅读课本 “资料卡片”,用系统命名法对下列物质命名:

__2-丙醇___ _间位苯乙醇_ __1,2-丙二醇___

[讲]物理性质和用途:俗称甘油,是无色粘稠有甜味的液体,密度是1.261g/mL,沸点是290℃。它的吸湿性强,能跟水、酒精以任意比混溶,它的水溶液的凝固点很低。甘油用途广泛,可用于制造硝化甘油(一种烈性炸药的主要成分)。还用于制造油墨、印泥、日化产品、用于加工皮革,用作防冻剂和润滑剂等。[投影] [投影]表3-1相对分子量相近的醇与烷烃的沸点比较表:

[思考与交流]仔细研究课本P49表3-1数据,可以得出什么样结论:

[讲]醇分子中的羟基的氧原子与另一之间醇分子中的羟基的氢原子相互吸引,形成氢键,使醇的沸点高于烷烃,同样道理,使醇易溶于水。多增强。

[板书]

4、醇的沸点变化规律:

(1)同碳原子数醇,羟基数目越多,沸点越高。(2)醇碳原子数越多。沸点越高。

学生完成课本上的探究材料

[板书]

二、乙醇的化学性质

1、消去反应

[思考]什么是消去反应?

[投影]实验3-1 如图3—4所示,在长颈圆底烧瓶中加入乙醇和浓硫酸(体积比约为l:3)的混合液20mL,放入几片碎瓷片,以避免混合液在受热时暴沸。加热混合液,使液体温度迅速升到170℃,将生成的气体通入高锰酸钾酸性溶液和溴的四氯化碳溶液中,观察并记录实验现象

[投影]生成略有甜味气体,该气体能使高锰酸钾酸性溶液或溴的四氯化碳溶液褪色。[探究]乙醇在浓硫酸的作用下,加热到170℃时发生消去反应生成乙烯按课本P51图3-4组装好实验装置,开始反应,认真观察现象,积极思考:

(1)写出反应的化学方程式:_____,反应中乙醇分子断裂的化学键是____。(2)如何配制反应所需的混合液体?

(3)浓硫酸所起的作用是______________________________________;(4)烧瓶中的液体混合物为什么会逐渐变黑?

(5)结合课本P51“资料卡片”思考:反应中为什么要强调“加热,使液体温度迅速升到170℃”?

(6)氢氧化钠溶液是用来除去乙烯气体中的杂质的,那么在生成的乙烯气体中会有什么杂质气体呢? [板书] 分子内脱水:C2H5OH CH2=CH2↑+ H2O [讲]需要注意的是(1)迅速升温至170℃(2)浓硫酸所作用:催化剂 脱水剂(3)配制浓硫酸与乙醇同浓硫酸与水。

[学与问]溴乙烷与乙醇都能发生消去反应,它们有什么异同?

[讲]都是从一个分子内去掉一个小分子,都由单键生成双键,反应条件不同,溴乙烷是氢氧化钠醇溶液,而乙醇是浓硫酸,170℃。

[讲]如果把乙醇与浓硫酸的混合液共热的温度控制在140℃,乙醇将以另一种方式脱水,即每两个醇分子间脱去一个水分子,反应生成的是乙醇

[板书]分子间脱水:C2H5OH+HOC2H5 C2H5OC2H5+H2O(取代反应)

[讲] 取代反应:乙醇与浓氢溴酸混合加热发生取代反应生成溴乙烷。

[板书]

2、取代反应 C2H5OH +HBr C2H5Br+ H2O 断裂的化学键是C-O。

[投影]实验3-2 在试管中加入少量重铬酸钾酸性溶液,然后滴加少量乙醇,充分振荡,观察并记录实验现象

[板书]

3、氧化反应:乙醇可以使酸性高锰酸钾溶液和重铬酸钾溶液褪色,氧化过程:

[随堂练习]关于醇类物质发生消去反应和氧化反应的情况分析:

(1)以下醇类哪些可以在一定条件下发生消去反应?_________________

那么,能发生消去反应的醇类必须具备的结构特点是_______________;

(2)以上醇类哪些可以在一定条件下发生氧化反应(燃烧除外)?那么,能发生氧化反应的醇类必须具备的结构特点是什么

[讲]醇的性质主要表现在羟基上,与乙醇的性质相似。当其与活泼金属反应时,羟基与氢气的定量的关系是2个羟基对应1个氢气。

[随堂练习]相同质量的下列醇分别跟适量的钠作用,放出H2最多的是()A.甲醇 B.乙醇 C.乙二醇 D.丙三醇

[讲]醇羟基在一定条件下(Cu或Ag作催化剂)可发生催化氧化反应,其反应如下: [投影] ① ② ③

[板书]

三、醇的化学性质规律

1、醇的催化氧化反应规律

[讲]羟基(-OH)上的氢原子与羟基相连碳原子上的氢原子脱去,氧化为含有(的醛或酮。醇的催化氧化(或去氢氧化)形成 上必须有氢原子,否则该醇不能被催化氧化。)双键

双键的条件是:连有羟基(-OH)的碳原子[板书]①与羟基(-OH)相连碳原子上有两个氢原子的醇(-OH在碳链末端的醇),被氧化生成醛。2R-CH2-CH2OH+O2 生成酮。

2R-CH2-CHO+2H2O ②与羟基(-OH)相连碳原子上有一个氢原子的醇(-OH在碳链中间的醇),被氧化

③与羟基(-OH)相连碳原子上没有氢原子的醇不能被催化氧化。

不能形成 双键,不能被氧化成醛或酮。

(四)反思总结,当堂检测。

九.教师组织学生反思总结本节课的主要内容,并进行当堂检测。设计意图:引导学生构建知识网络并对所学内容进行简单的反馈纠正。(课堂实录)

(五)发导学案、布置预习。

十、教学反思

本课的设计采用了课前下发预习学案,学生预习本节内容,找出自己迷惑的地方。课堂上师生主要解决重点、难点、疑点、考点、探究点以及学生学习过程中易忘、易混点等,最后进行当堂检测,课后进行延伸拓展,以达到提高课堂效率的目的。

本节课的最大的特色在于以实验探究为手段,步步设疑,层层深入,处处铺垫,环环相扣,过渡自然,一气呵成,让学生参与获取知识的过程,符合思维逻辑,符合认知规律。课堂教学引入巧妙,创设了新的情景,产生强烈的动机、激活了课堂

教学目标明确、具体,而且能够在课堂内较好的实施和完成,达到了本节课的教学目的。教学策略、学习策略的选择是合适的,教学设计的环节和期望都得到了实现;从知识与技能、过程与方法、情感态度与价值观三个教学目标看,目标的制定符合新课标要求和学生实际,有很强的可操作性,在课堂中得到很好的落实。学生掌握了苯酚的化学性质,初步了解了实验探究的学习方法,培养了学生的实验能力和观察能力,激发了学生的学习兴趣,学生学会了结构决定性质,性质反映的唯物主义的思维观点和思维方法,突出了学生作为主体的地位。

学生参与课堂活动是认真的,每一位学生都在进行思考,参与获取知识的过程,在此过程中,师生互动,生生互动,互相补充,互相启迪。

在后面的教学过程中会继续研究本节课,争取设计的更科学,更有利于学生的学习,也希望大家提出宝贵意见,共同完善,共同进步!

上一篇:浅析海尔集团如何下一篇:阳台上杜鹃花开作文650字