《C语言程序设计》讲稿_第1页
《C语言程序设计》讲稿_第2页
《C语言程序设计》讲稿_第3页
《C语言程序设计》讲稿_第4页
《C语言程序设计》讲稿_第5页
已阅读5页,还剩102页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第二讲C语言程序介绍学时:2学时多媒体+实例程序演示教学目标:了解C语言的语法及结构;掌握C语言的编写流程;熟悉C语言的编译环境VC++6.0。主要内容及时间安排〔课堂90分钟,80分钟讲课,5分钟复习,5分钟总结〕:〔1〕以提问的方式复习上节课的内容〔5分钟〕;〔2〕通过实例编写简单程序〔先用多媒体展示第一个实例程序,要求学生了解一般C程序的编写流程,然后在编译环境演示程序执行过程,总结C语言程序的根本结构和语法要求〕〔15分钟〕;〔3〕通过实例演示程序的运算功能〔先用多媒体展示编写程序,一一讲解给学生,5分钟〕;〔4〕通过上述实例,利用板式总结C语言的编写和编译过程〔借助VC++6.0来展示C语言的编写和执行过程〕〔10分钟〕;〔5〕C语言结构特点总结〔〕〔20分钟〕;〔6〕C语言上机编译环境介绍〔主要介绍TC、VC++、Rarnu_CV1.0三个编译环境,主推Rarnu_CV1.0编译环境〕〔20分钟〕;〔7〕总结本节课程的主要内容并布置课后练习题〔5分钟〕;重点:C语言的程序结构、C语言语法细节、C语言编译过程、C语言运行环境等;难点:C语言语法细节和程序结构。教学内容细节:一、通过提问的方式复习上节课程的主要内容。二、实例演示实例1-1简单输出:{printf("Iamaprogrammer,IlikeC!");程序说明:“〞中的内容原样输出。其中“\n〞是换行符。以/*和*/括起来的是注释,程序运行期间是不执行的只是增加程序的可读性。实例1-2简单计算:/*求两个数的和*/{inta,b,sum;/*定义局部变量*/scanf("%d,%d",&a,&b);/*输入两个整数值放到a、b变量中*/sum=a+b;/*将ab的和送入sum中*/printf("sum=%d",sum);/*输出ab的和sum*/}程序说明:本实例的功能是实现两个数相加;为了增加程序的可读性应适当加上注释,和printf提示。三、C语言的编写流程四、C语言结构特点总结程序要有适当的注释语句,提高程序的可读性,注意注释语句不能嵌套;〔5〕C语言中的变量必须先定义后使用;〞〞五、优秀的程序员应具备的根本素质〔1〕具有良好的编程习惯〔2〕使用TAB缩进〔3〕{}对齐〔4〕有足够的注释〔5〕有适宜的空行六、上机环境使用介绍重点介绍上机环境VC++6.0第三讲算法学时:2学时授课形式:多媒体讲解主要内容及时间安排〔课堂90分钟,80分钟讲课,5分钟复习,5分钟总结〕:复习上节课的主要知识点〔5分钟〕;算法和程序的关系〔5分钟〕;〔3〕算法的概念及算法优劣比较举例〔什么是算法,连加算法优劣比较、算法的分类〕〔10分钟〕;〔4〕简单算法举例〔设计5个例子,从易到难〕〔40分钟〕;〔5〕算法的特性〔有穷性、确定性、有零个或多个输入、有一个或多个输出、有效性〕〔10分钟〕;〔6〕〔10分钟〕;〔7〕〔〕〔5分钟〕;〔8〕总结和布置课后练习题〔课后题2.4、2.5,下一节讲解数据类型相关知识〕〔5分钟〕重点:教学内容细节:以提问的方式复习上节课的主要知识点。算法和程序的关系程序=数据结构+算法数据结构——对数据的描述;算法——对操作的描述。简单举例进行说明。三、算法概念及算法优劣比较算法:解决问题的步骤。不是只有数值运算问题才有算法,好多非数值运算问题也是有算法的。在进行数值运算或解决非数值算法时有时需要考虑算法的优劣,比方连加和,可以从1一直加到100,也可以采用首尾相加,在相乘的形式。当然所用的步骤是不同的。例3-1:计算输入整数的平方根,如果输入的是负数,那么先求它的绝对值,在求平方根:#include<stdio.h>#include<math.h>voidmain(){inta;doubles;printf("inputthea:");scanf("%d",&a);a=fabs(a);s=sqrt(a);printf("%dthesqrt=%f",a,s);}四、算法举例介绍几个典型算法:每一个算法都有多种描述方式,下面主要介绍自然语言表示法、流程图表示法、N-S图表示法。起止框起止框输入输出框处理框判断框流程线或连接点〔1〕计算1*2*3*4*5自然语言表示法改进的算法开辟两个空间p和i,一个放计算之后的积,一个放被乘数,上面的算法进行改造后如下:〔S1表示第一步,S2表示第二步,依此类推〕S1:1=>p,2=>iS2:计算p*i的积,结果仍然放在p中,即p*i=>pS3:i的值增1,即i+1=>iS4:如果i没有超过5,那么继续执行S2、S3、S5,否那么,算法结束,p中的数据就是连乘积。开始开始1=>p,2=>iP*i=>pi+1=>i结束i<=5NY流程图表示法:N-S图表示法:1=>p,2=>ip*i=>pi+1=>i直到i>5输出p习题:计算1+3+5+7+9的和,用流程图和N-S图表示此算法。ii表示第i个学生成绩,那么算法如下:自然语言表示法:S1:1=>iS2:如果gi>80,那么输出ni和gi,否那么不输出;S3:i+1=>IS4:如果i<=50,返回到S2,继续执行S2、S3、S4;否那么,算法结束。N-S图表示法:1=>iN-S图表示法:1=>igi>=80i+1=>i输出nigi直到i>50NY流程图表示法:开始1=>ii+1=>i结束gi>=80NY输出nigii>50NY〔3〕判断某一年份是否是闰年判断某一年份是闰年的条件是:〔1〕能被4整除,但是不能被100整除,那么这一年份是闰年;〔2〕能被100整除,又能被400整除的,那么这一年份是闰年;其他的年份都不是闰年,假设用一个空间y来存放被校验的年份,那么算法描述如下:自然语言表示法:S1:输入年份=>yS2:假设y能被4整除,但不能被100整除,那么输出y是闰年,算法结束;否那么,执行S3;S3:假设y能被100整除,也能被400整除,那么输出y是闰年,算法结束;否那么,执行S4;S4:输出y不是闰年,算法结束。流程图表示法:流程图表示法:开始结束Yy不能被4整除输出y是闰年y不能被100整除NYNY输出y是闰年输出y不是闰年y不能被400整除输出y不是闰年N输入年份=>yN-S图表示法:N-S图表示法:输入年份=>yy/4的余数为0输出y不是闰年输出y不是闰年NYNYy/100余数不为0NYy/400余数不为0输出y是闰年输出y是闰年习题:输出某一年份段内〔比方1000-3000之间,包括1000和3000〕的所有闰年。〔4〕求一个数列的值1-1/2+1/3-1/4+1/5+……+1/99-1/100。算法表示如下:自然语言表示法:S1:0.0=>sum,1.0=>i;1=>t;S2:t*1/i+sum=>sumS3:-t=>t;i+1=>iS4:如果i<=100,那么返回S2,继续执行S2、S3、S4,否那么,算法结束,sum中的值就是所求。N-S图表示法:流程图表示法:N-S图表示法:流程图表示法:0.0=>sum,1.0=>i,1=tt*1/i+sum=>sum0.0=>sum,1.0=>i,1=tt*1/i+sum=>sum-t=>t,i+1=>i直到i>100输出sum开始0.0=>sum,1.0=>i,1=>tt*1/i+sum=>sum-t=>t,i+1=>i结束i<=100NY习题:计算1,1/2,2/3,3/5,5/8,8/13……这个数列前20项的和。〔5〕判断一个大于3的数是不是素数一个数是不是素数主要看它除了1和它本身之外不能被其他任何整数整除,那么它是素数,否那么就不是素数,首先需要开辟一个空间n存放待判断的数,其次开辟一个除数的空间i〔i从2开始〕,利用n除以这个i,看能否整除,具体算法如下:自然语言表示法:S1:输入待判断的数=>nS2:2=>iS4:n除以i,得余数rS5:如果r不为0,那么i+1=>i,否那么,输出n不是素数,算法结束S6:如果i<n,那么返回S4,否那么,输出n是素数,算法结束。考虑是否非要做到i=n-1,是不是可以做到i<=sqrt(n)。流程图表示法:〔改进〕开始流程图表示法:〔改进〕开始0=>w,2=>in/i的余数=>r结束r=0?YN输入待判断数=>n输出n不是素数W=0和i<=i+1=>iNY输出n是素数1=>wNw=0?流程图表示法:开始2=>in/i的余数=>r结束r=0?YN输入待判断数=>n输出n不是素数i<=i+1=>iNY输出n是素数N-S图表示法:N-S图表示法:输入待判断数=>nn/i的余数=>rr=01=>w输出n是素数0=>w,2=>ii+1=>i直到i>或w=1YNw=0YN输出n不是素数习题:输出100-200之间的所有素数。五、总结三种程序流程结构〔顺序、选择和循环,给出图形表示〕循环结构N循环结构NpAYpAB选择结构YNAB顺序结构循环体当p成立循环体循环体当p成立循环体直到p成立循环结构选择结构pNYAAB顺序结构六、算法的特性算法共有五个特性:有穷性、确定性、有零个或多个输入、有一个或多个输出、有效性;有穷性:一个算法的步骤必须是有限的;确定性:算法中的每个步骤必须是确定的,不能是模糊不清的,不能有歧义;输入:算法运行时有时需要外部输入的信息;输出:算法的最终目的是求解和输出;有效性:算法的每个步骤都能有效的执行,并得到确定的结果。七、结构化程序设计思想结构化程序设计强调的是程序设计风格和程序结构的标准化,提倡清晰的结构,编程的根本要求是“清晰第一、效率第二〞。结构化程序设计风格需要经过以下几个步骤进行:〔1〕自顶向下〔2〕逐步细化〔3〕模块化设计〔4〕结构化编码〔利用现有的流控语句进行编码设计〕八、总结和布置课后练习题〔5分钟〕第四讲数据类型〔1〕学时:2学时授课形式:多媒体讲解+实例程序演示教学目标:掌握各种数据类型的关键字,掌握各种数据类型在计算机中所占的存储空间,常量及变量的定义形式,针对各种数据类型printf的格式控制输出。主要内容及时间安排〔课堂90分钟,80分钟讲课,5分钟复习,5分钟总结〕:〔1〕以提问的方式复习上节课的主要知识点〔5分钟〕;〔2〕C语言的各种数据类型简介〔根本类型和构造类型,各种数据类型的关键字及所占字节等〕〔10分钟〕;〔3〕针对不同格式的printf输出格式介绍及举例〔printf格式介绍,各种类型格式控制符介绍,以例子说明〕〔20分钟〕;〔4〕常量〔包括整型常量、实型常量、字符型常量〕〔20分钟〕〔5〕整型变量的概念及举例〔整型变量的定义及举例〕〔20分钟〕〔6〕课堂练习〔针对所讲知识进行相关习题练习〕〔10分钟〕〔7〕总结及新一讲内容提要〔下一讲实型变量、字符型变量、指针变量的定义和使用〕〔5分钟〕重点:C语言各种数据类型的关键字、各种类型的常量表示法、整型变量的定义和操作等;难点:整型变量的表示范围。教学内容细节:一、C语言各种数据类型介绍数据类型数据类型根本类型构造类型指针类型空类型整型实型字符型长整型整型、短整型型单精度双精度数组结构体共用体枚举型各种数据类型的关键字,及在计算机内存中所占大小〔以各种不同的编译环境为例〕类型名关键字所占字节〔B〕TCRarnu_cVC++整型int224短整型short[int]222长整形long[int]444unsignedint224unsignedlong444unsignedshort222单精度float444双精度double888字符型char111指针类型*244二、以printf输出各种数据类型printf根本格式说明printf〔格式控制,输出表列〕;,格式说明以%开头。输出表列:与格式说明对应的输出表列。在格式控制符中,除了格式说明去后边对应输出表列之外其他字符原样原位置输出,输出表列为带输出的内容。比方:printf(“abcd〞);/*输出abcd字符串*/intx=8,y=9;printf(“abcd%defg%d〞,x,y);/*输出abcd8efg9*/具体格式说明符有:%d/*输出短整型和整数*/比方inta=-1;printf(“%d,%u,%o,%x\n〞,a,a,a,a);输出内容分别是:-1,65535,177777,ffff所以原反补码的含义大家一定要清楚,对为什么出现这样的情况加以分析。对于其他的数据类型也要采取不同的输出格式:%f/*以单精度形式输出实数*/%lf/*以双精度形式输出实数*/%c/*以字符形式输出,只输出一个字符*/分析:inta=65;charc=’B’;printf(“%d,%d,%c,%c\n〞,a,c,a,c);输出结果:65,66,A,B当整数不超过字符型的表示范围时,整数可以以字符型的形式输出,输出的是它对应的ASCII码,字符型也可以以整数的形式输出,输出的是它ASCII码对应的值。单精度或双精度不能利用字符型或整型格式输出,否那么会产生错误结果〔语法不会出错,但结果意想不到〕。三、各种数据类型常量1.整型常量〔1〕十进制整型常量〔2〕八进制整型常量〔以0开头〕〔3〕十六进制整型常量〔以0x开头〕赋给相应变量。2.实型常量〔1〕十进制小数形式〔2〕科学计数法:XeY——e前必须有数字,e后必须为整数。3.字符型常量4.字符串型常量常量系统默认会在最后加一个‘\0’。比较‘a’和“a〞在内存中的状态。#defineX12四、整型变量的概念和举例〔1〕标示符的命名规那么:由字母数字下划线,开头不能使数字。例:以下合法的用户标识符是〔〕Aa1B3erC_a#Dif〔2〕各种类型变量的定义:类型名变量名列表;/*如果变量名多余1个,用,分隔*/inta;inta,b;inta,b,c=12;inta=12,b=12,c=12;不能写成inta=b=c=12;可以在变量定义时给变量赋初值。第五讲数据类型〔2〕学时:2学时授课形式:多媒体讲解+实例程序演示主要内容及时间安排〔课堂90分钟,80分钟讲课,5分钟复习,5分钟总结〕:〔1〕以提问的方式复习上节课的主要内容〔5分钟〕;〔2〕实型变量〔15分钟〕;〔3〕;〔4〔5;〔6〕课堂习题〔15分钟〕;〔7〕总结及下一讲知识提要〔运算符和表达式〕〔5分钟〕。重点:难点:指针和其他数据类型的配合使用,数据间的转化。教学内容细节:一、实型〔浮点型〕变量浮点型数据在计算机内存中的存储状态分为三局部:数符、小数局部、指数局部。C语言的编译环境不同,那么给各个局局部配的位数不同,一般情况下,数符和小数局局部配24位,指数局部非配8位。数符数符小数局部指数局部24位8位+.314159+.314159124位8位表示3.14159浮点型变量定义的类型包括:float、double、longdouble举例说明浮点型数据是有误差的:#include<stdio.h>voidmain(){floata,b;a=123456.789e5;b=a+20;printf("%f\n",b);}如果将float改为double那么结果不同。二、字符型变量字符变量的定义使用的是关键字charchara,b;a=’a’;b=97;整数和字符型可以互相赋值。一般编译系统默认字符型为signed类型,表示-128—127之间的数字对应的字符,如果想表示128-255之间的数字那么字符需定义为unsignedchar。三、指针型变量指针型变量往往是和其他变量的定义配合使用,表示不同变量在内存中的地址。指针变量定义是以*为标识符的。比方:int*a,*b;char*c,*d;这时需要注意,在定义中出现的*与程序中出现的*是不同的,定义时出现的*表示变量为指针类型,程序中出现*表示取出地址中的具体数值。*与&地址运算互逆。#include<stdio.h>voidmain(){int*p;intc;p=&c;scanf("%d",p);printf("%d,%d\n",c,*p);}四、变量赋初值在前面的变量定义时,有时在定义的同时就给变量赋了初值,有的是在定义好后,再利用赋值语句给变量赋初值,不管利用哪种方式,都要注意两点:不能在定义时进行连续赋值;不能将不匹配的数据类型互相赋值,否那么会产生错误。错误的:inta=b=c=10;inta=3.56;正确的:inta,b,c;a=b=c=10;五、各类数据类型间混合运算各种数据类型可以进行混合运算,运算结果为一种数据类型,具体规那么如下:doubledoublefloatlongunsignedintchar、short低高横向的是必须转化的,比方float型数据在进行运算时,其运算记过统统要转化为double类型,不管参与运算的是否有double类型;char或short类型的数据在进行运算时,结果都会转化成int型。纵向箭头表示对象类型不同时的转换方向,当参与运算的对象数据类型不同时,采用低级向高级转化的规律。比方int型和long型进行运算时,将int转化为long类型再进行运算。比方:10+’a’+1.5-8765.4321*’b’结果为double类型,转化由系统自动完成,无需用户操作。如果在计算过程中不想按照上述转化规那么进行转化,那么可以利用强制类型转换。具体方式为:〔强制类型名〕变量或常量例如:#include<stdio.h>voidmain(){inta;floatb=3.67;a=(int)3.67;printf("%d,%f\n",a,b);}六、总结及课堂练习课堂习题:3.2,3.3作业:3.5,3.6,3.8第六讲运算符和表达式〔1〕学时:2学时授课形式:多媒体讲解+实例程序演示主要内容及时间安排〔课堂90分钟,80分钟讲课,5分钟复习,5分钟总结〕:〔1〕以提问的方式复习上节课的主要内容〔5分钟〕;〔2〕C语言运算符简介〔各种运算符作用介绍、优先级介绍、结合性介绍〕〔15分钟〕;〔3〕算术运算符和表达式〔分钟〕;〔4〕自加自减运算及举例〔15分钟〕〔5〕赋值运算符和赋值表达式〔简单赋值和符合赋值〕〔10分钟〕〔6〕〔10分钟〕〔7〕指针运算符〔10〕〔8〕课堂习题〔〕〔10分钟〕〔9〕总结及下一节内容提要〔关系运算符、逻辑运算符、位运算符、条件运算符等〕〔5分钟〕重点:C难点:自加自减运算,各种运算符的结合性。教学内容细节:一、C语言中各种运算符1.算术运算符算术运算符包括:+,-,*,/,%,它们都属于双目运算,结合性自左至右。前三种运算都很简单,对于/,如果操作数为整数,那么结果也为整数,%运算的操作数必须为整数,其含义是去两个整数相除的余数。2.自加自减运算符自加自减运算符包括++和--,它属于单目运算,结合性自右至左,操作数必须为整型的变量。3.赋值运算符赋值运算符包括简单赋值运算符=和复合的赋值运算,复合的赋值运算符是其他运算符和简单赋值运算符组合在一起构成的,一般式位运算符和算术运算符,比方+=,%=,<<=,>>=等。它属于双目运算,结合性自右至左。5.位运算符位运算符包括<<,>>,^,小弯弯,&,|,按位运算,双目运算符,其中按位取反为单目运算符〔结合性自右至左〕,双目位运算结合性自左至右。6.指针运算符指针运算符*,取地址运算符&,单目运算符,结合性自右至左。7.逻辑运算符逻辑运算符包括:!,&&,||,其中!为单目运算符结合性自右至左,&&和||为双目运算符结合性自左至右。8.关系运算符关系运算符包括:>,<,>=,<=,==,!=,<>。结合性自左至右,双目运算符。9.条件运算符条件运算符;表达式?值1:值211.分量运算符分量运算符:->和.,结合性为自左至右。12.下标运算符下标运算符[],结合性自左至右。13.求字节运算符求字节运算符sizeof〔操作数〕,结合性自右至左。14.强制类型转换运算符强制类型转换:〔类型〕操作数,结合性自右至左。二、各种运算符的优先级〔1〕初等运算符〔〕、[]、、.〔2〕单目运算符!、~、++、--、-、〔类型〕、*、&、sizeof〔3〕算术运算符〔先乘除后加减〕〔4〕位运算符<<、>>〔5〕关系运算符<、>、<=、>=、其中==和!=级别低一级〔6〕位运算符&、^、|、分先后〔7〕逻辑运算符&&、||、分先后〔8〕条件运算符?:〔9〕赋值运算符注意:在利用逻辑运算符时:||和&&有其特殊性,如果前表达式已经可以确定整个表达式的值,那么后表达式不再做。自加++自减--运算符,只能对整形变量进行。三、算术运算符和算术表达式最终运算为算术运算的式子称为算术式。例:3/5,3%5,-3%5四、自加自减运算注意:运算对象只能是整型变量。例main(){inta=5;a++;printf(“%d〞,a);}为学生描述内存存储状态。计算:(a++)+(--a)-a+(++a)表达式的值,a的初始值为4。五、赋值运算1.简单赋值运算符如:inta=5;2.复合的赋值运算比方:a+=5;等价于a=a+5;前提是复合赋值运算前的变量必须有初值,否那么无法运算。3.赋值运算的规那么赋值运算符的赋值规那么:〔也就是当赋值运算符前后类型不一致时如何赋值〕〔1〕将浮点型赋给整型:舍弃小数局部。如:inti=3.56那么i的值为3。〔2〕将整型赋给浮点型:数值不变,但要以浮点型进行存储。如:floata=23,那么a为23.00000,补足有效位。〔3〕将double型赋给float型,截取其前面7位有效数字,但要注意数值范围不能溢出。如:floata;doubleb=123.456789e100;a=b;如果输出a那么会产生溢出错误,因为b超过了浮点型表示范围。如果将b改为123.456789e2,那么a的值会有7个有效位是和b完全相同的,其他位会产生误差。〔4〕字符型赋给整型,比方main(){inta;unsignedcharc='\376';a=c;printf("%d",a);}输出为254,如果去掉unsigned那么输出为-2。;long型赋给int型时,只将long的低十六位放在int型中。〔6〕int、short、long赋给char型只是将低八位赋给char空间。例如:main(){unsignedinta=65535;intb;b=a;printf("%d",b);}这时b=-1。main(){unsignedinta;intb=-1;a=b;printf("%u",a);}这时a=65535。各种赋值形式虽然看起来复杂,但是都是它们都是:按存储单元中的存储形式直接传送。要求学生必须对补码只是熟练掌握。六例如:inta,b,c;a=b=5;c=(a+3,b+a,a=a+b,b+a)c输出的值应该为15。例如:a=3*4,a+5;七、指针运算指针运算符的作用是取指针地址中对应的具体数值,它与取地址符为互逆运算。例:int*p,a;a=5;p=&a;那么*p的值为5。这个思想我们在前面的练习中也给大家说过。八这两个运算我们在前面讲过,这里就不再说了。九、总结及课堂练习作业:3.11,3.12。第七讲运算符和表达式〔2〕学时:2学时授课形式:多媒体讲解+实例程序演示主要内容及时间安排〔课堂90分钟,80分钟讲课,5分钟复习,5分钟总结〕:复习上节课的主要知识点〔5分钟〕;关系运算符和关系表达式〔15分钟〕;〔3〕逻辑运算符和逻辑表达式〔20分钟〕;〔4〕位运算符〔20分钟〕;〔5〕课堂练习〔30分钟〕。重点:关系运算符,逻辑运算符,。难点:各种运算符的混合运算,需要考虑算符的优先级和结合性等因素。教学内容细节:一、关系运算符和关系表达式关系运算符表示的是前后两个表达式的关系,表达式的值为逻辑值“真〞或“假〞,如果关系正确那么表达式的值为“真〞,否那么为“假〞,由于C语言不提供逻辑类型值,所以如果表达式的值为“真〞,那么用1表示,表达式的值为“假〞那么用0表示。例:inta=3,b=4,c=5;那么c!=a>b的值为1。二、逻辑运算符和逻辑表达式逻辑运算符表示两个操作数的逻辑关系,逻辑运算的结果也是逻辑值“真〞和“假〞,也是对应数字1和0;但是要注意:在表示“真〞和“假〞时,非零就表示“真〞,0就表示“假〞。ab!aa&&ba||b真真假真真真假假假真假真真假真假假真假假例:!a&&b||x>y&&〔c++〕,运算级别!最高,然后是算术,然后是关系、然后是逻辑、然后是赋值;a=1,b=0,c=3,x=7,y=10;那么表达式的值为0,c的值为3。注意:&&和||的运算规那么。三、位运算符和表达式位运算符的前提示首先将数据转化为二进制在进行相应的操作。运算符含义运算符含义&按位与取反|按位或<<左移^按位异或>>右移例如:64<<1;左移1位相当于乘以2,所以一些C语言系统将2n处理为左移n位。如果a的值为八进制113755,那么四、条件运算符例如:inta=5,b=3;a>b?a:b;五、总结及课堂练习1、2、3、4、52、自设题目:a=45;求~a,a>>2,a<<2;a&0000000011111111;a|0000000011111111第八讲学时:2学时授课形式:多媒体讲解+实例程序演示主要内容及时间安排〔课堂90分钟,80分钟讲课,5分钟复习,5分钟总结〕:〔2〕〔5分钟〕;〔3〕〔20分钟〕;〔4〕〔getchar的使用、字符输入与scanf的区别〕〔10分钟〕10分钟〕〔6〕〔5分钟〕〔7〕程序举例〔10分钟〕〔8〕课堂练习〔15分钟〕〔9〕总结及下一节内容提要〔5分钟〕重点:C语言教学内容细节:一、C语言的根本语句1、语句的概念C程序源C程序源程序……数据声明……数据声明执行语句3、各种根本语句〔1〕流控语句if〔〕…else… 条件语句for〔〕…… 循环语句while〔〕…… 循环语句do……while〔〕 循环语句continue 结束本次循环进入下一次循环break 终止所在循环或switch结构switch〔〕{case……} 多分支选择语句goto 转向语句printf(“%d,%d〞,a,b);c=max(a,b);〔3〕表达式语句a=3;a=c+b;〔4〕空语句;〔5〕复合语句{z=x+y;t=z/100;printf(“%d,%d〞,z,t);}二、〔1scanf(“格式说明〞,输入表列);如:scanf〔“a=%d,b=%d〞,&a,&b〕;在运行时,为了让ab得到正确的值,那么应输入a=12,b=15回车;这里a=,b=均为显性分隔符,在输入时除了格式控制符对应变量类型外,其他的显性分隔符原样输入。又如:scanf(“%d%d〞,&a,&b);在运行时,为了让ab得到正确的赋值,那么应输入12空格/tab/回车13回车;这里空格、tab和回车都属于隐形分隔符,当两个格式控制符连在一起没有任何分隔符时,在输入变量值时应该用隐形分隔符。格式控制符表如下:格式控制符含义%d,%i%u%o%x,%X%c字符型%s字符串型%f,%lf单精度、双精度小数%e,%E指数形式浮点型数据%g,%G选用%f或%e中宽度较小的一种进行输出,不输出无意义的0,用G时以指数形式输出的E大写〔2〕getchar〔getchar的使用、字符输入与scanf的区别〕〔10分钟〕时应注意:%c可以接收隐形分隔符,所以在使用时应注意;getchar〔〕也可以接收所有字符型,包括隐形分隔符;例:#include<stdio.h>main(){inta,b;charc,d;scanf("%d%d%c",&a,&b,&c);d=getchar();printf("%d,%d,%c,%cabc",a,b,c,d);}如果想给a赋12,b赋13,c符字符a,d赋字符b,在输入时,如果输入12回车13回车a,那么编译系统不会再让你输入,因为这是它会将回车赋给c,将a赋给d。如果想得到正确的赋值那么在输入时应输入12隐形分隔符13ab即可,系统会根据数据类型自动将13和字符型分开,同时将a赋给c,b赋给d。〔1printf我们在前面应经讲过,在此我们做一下功能拓展。如果想输出指定宽度的数据如何在格式控制符中加以控制,比方,想输出小数,小数点后只保存两位,怎么设计?解决:利用%m.nf、%m.nlf,%-m.nf,%-m.nlf,其中m表示具体的小数宽度小数点也算一位,n表示小数点后位数;m,n的设计在%d和%s中也使用,在整数中只使用m,在%s中使用m和n,m表示为字符串开辟的输出区宽度,这个宽度也要大于字符串长度,否那么m失效,n表示截取的字符串字符个数。#include<stdio.h>main(){floatf=4567.8912;inta,b,c;scanf("%3d%3d%4d",&a,&b,&c);printf("%10.2e,%5.1f,%6.1f,%7.1f\n",f,f,f,f,f);printf("%2d,%-6d,%5d",a,b,c);}〔2四、程序举例1、求三角形面积:利用公式其中s=〔a+b+c〕/2;#include<math.h>main(){floata,b,c,s,area;scanf("%f%f%f",&a,&b,&c);s=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c));printf("\n%f\n",area);}注意数据类型的选择。2、从键盘输入小写字母,然后输出其大写字母;#include<stdio.h>main(){charc1,c2;c1=getchar();putchar(c1);printf(",%d",c1);c2=c1+32;putchar(‘\n’);putchar(c2);printf(",%d",c2);}五、总结及课堂练习思考4.10;作业:4.8,第九讲选择结构程序设计〔1〕学时:2学时授课形式:多媒体讲解+实例程序演示主要内容及时间安排〔课堂90分钟,80分钟讲课,5分钟复习,5分钟总结〕:〔1〕关系运算符、逻辑运算符运算复习、选择结构流控图形复习〔10分钟〕;〔2〕简单if结构及举例〔15分钟〕;〔3〕if……else结构及举例〔15分钟〕;〔4〕if……else嵌套及举例〔20分钟〕;〔5〕条件运算符和if的关系及举例〔5分钟〕;〔6〕课堂练习,要求学生完成指定分支程序设计〔20〕;〔7〕总结、习题布置及下一节内容提要〔习题5.3、5.4、5.5,下一节多分支switch结构〕〔5分钟〕;重点:三种if结构、if结构的嵌套、if和else的配对原那么;难点教学内容细节:一、关系运算符、逻辑运算符运算复习、选择结构流控图形复习关系运算符:>、<、>=、<=、<>、!=、==逻辑运算符:!,&&,||运算结果为逻辑值“真〞或“假〞对应具体数值1和0,而数值向逻辑值对应时,非零表示真,零表示假。分支流程图表示:pApA选择结构YNpAB选择结构YN简化简化形式分支结构盒图表示:选择结构p选择结构pNYA选择结构pNYAB简化简化形式我们在进行程序设计时,首先要根据自己的思路设计具体的流程图,然后在进行程序设计,这对于我们在进行其他高级语言的拓展学习是非常必要的,因为每种语言它的语法规那么是不同的,但其编程思想都是一样的。二、简单if结构及举例〔10分钟〕;简单if结构格式:if(条件表达式)语句1语句2执行过程:判断“条件表达式〞的值,如果成立,那么执行“语句1〞,然后执行“语句2〞,如果“条件表达式〞不成立,那么执行“语句2〞。不管“条件表达式〞成立不成立,“语句2〞都要执行。注意:语句1和语句2都可以是多句的复合语句,如果语句1是多句要用{}括起来,因为if只能控制离它最近的一句或一个语句组。它和我们简化的流程图是相对应的。例1:输入两个整数,将其按从小到大顺序输出。N-S图:输入两个整数a、b输入两个整数a、b输入两个整数a,ba>b交换a,bYN输入两个整数a,b程序对应:#include<stdio.H>voidmain(){inta,b,temp;scanf("a=%d,b=%d",&a,&b);if(a>b){temp=a;a=b;b=temp;}printf("a=%d,b=%d",a,b);}例2:输入三个整数,将其按从小到大顺序输出。流程图:输入三个整数a,b,c输入三个整数a,b,ca>b交换a,bNYa>c交换a,cNYb>c交换b,c输出a,b,cYN程序对应:#include<stdio.H>main(){inta,b,c,temp;scanf("%d,%d,%d",&a,&b,&c);if(a>b){temp=a;a=b;b=temp;}if(a>c){temp=a;a=c;c=temp;}if(b>c){temp=b;b=c;c=temp;}printf("a=%d,b=%d,c=%d",a,b,c);}三、if……else结构及举例〔15分钟〕if……else结构格式:if(条件表达式)语句1;else语句2;执行过程:如果“条件表达式〞成立,那么执行语句1,否那么执行语句2;它和我们所画的一般流程图是对应的。例3:输出一个整数的绝对值。N-S图表示:输入两个整数a、b输入两个整数a、b输入一个整数xx>0输出xYN输出-x程序对应:#include<stdio.h>main(){intx;scanf("%d",&x);if(x>=0)printf("%d",x);elseprintf("%d",-x)}四、if……else嵌套及举例〔20分钟〕if……else嵌套的使用只是对于if或else所执行的语句依然是if结构或if……else结构if……else结构嵌套根本格式为:语句1为if结构或if……语句1为if结构或if……else结构语句1语句2语句2为if结构或if……else结构语句2执行过程和我们的根本结构执行方式相同。例4、计算如下表达式的值N-S图表示:输入两个整数a、b输入两个整数a、b输入一个整数xx>0YNYNx=0输出yy=1y=-1y=0程序对应:#include<stdio.h>main(){intx,y;scanf("%d",&x);if(x>0)y=1;elseif(x==0)y=0;elsey=-1;printf("y=%d",y)}注意:if和else的配对原那么;else总是和离它最近的没有被配对的if进行配对。例5、编程实现判断输入的年份是否是闰年。参考第三讲算法中的N-S图,进行程序设计;N-S图表示法:N-S图表示法:输入年份=>yy/4的余数为0输出y不是闰年输出y不是闰年NYNYy/100余数不为0NYy/400余数不为0输出y是闰年输出y是闰年程序对应:#include<stdio.H>main(){inty;printf("inputtheyear:");scanf("%d",&y);if(y%4!=0)printf("%dno",y);elseif(y%100!=0)printf("%dyes!",y);elseif(y%400!=0)printf("%dno!",y);elseprintf("%dyes!",y);}对它进行改造,这样的程序看起来很乱,我们可以通过标识位先对年份是不是闰年进行标识,比方0标识不是闰年,1标识是闰年,所有条件判断结束后,通过判断标识位来看这一年是不是闰年。输入年份=>yy输入年份=>yy/4的余数为0Flag=0NYNYy/100余数不为0NYy/400余数不为0Flag=0Flag=1Flag=1Flag=1YN输出y是不闰年输出y是闰年改造后的程序为:#include<stdio.H>main(){inty,flag;printf("inputtheyear:");scanf("%d",&y);if(y%4!=0)flag=0;elseif(y%100!=0)flag=1;elseif(y%400!=0)flag=0;elseflag=1;if(flag==1)printf(“%dyes!〞,y);elseprintf(“%dno!〞,y)}练习:读程序写结果#include<stdio.h>main(){inta=1,b=2,c=3;if(a==1&&b++==2)if(b!=2||c--!=3)printf("%d,%d,%d\n",a,b,c);elseprintf("%d,%d,%d\n",a,b,c);elseprintf("%d,%d,%d\n",a,b,c);}程序运行结果为:1,3,3五、条件运算符和if的关系及举例〔10分钟〕条件运算符的优先级在所有运算符优先级中算是比较低的,它计算两个数中的较大值:利用条件运算符:c=a>b?a:b;利用分支语句:if(a>b)c=a;elsec=b;六、课堂练习,要求学生完成指定分支程序设计〔20〕读程序写结果:习1:#include<stdio.h>main(){intx=1,y=2,z=3; if(x>y) if(y>z)printf("%d",++z); elseprintf("%d",++y); printf("%d\n",x++);}输出结果1;程序设计:编1:设计程序输出两个整数中的较大值;编2:设计程序输出三个数中的较大值;七、习题布置及下一节内容提要〔习题5.3、5.4、5.5,下一节多分支switch结构〕〔1分钟〕第十讲选择结构程序设计〔2〕学时:2学时主要内容及时间安排〔课堂90分钟,80分钟讲课,5分钟复习,5分钟总结〕:〔1〕前一节if……else结构拓展〔利用if……else结构编写多分支程序,了解它在多分支程序设计上的缺乏〕〔10分钟〕;〔2〕switch……case结构分析〔10分钟〕;〔3〕switch……case结构举例〔注意break的作用和default的使用〕〔30分钟〕〔4〕课堂练习〔35分钟〕〔5〕总结、习题布置及下一节内容提要〔习题5.6、5.7、5.8、5.9,下一节循环结构程序设计〕〔5分钟〕重点:switch的执行流程,switch结构细节,case后常量的要求,break在switch结构中的作用;难点:switch的执行流程、case后值的限制条件、break的使用。教学内容细节:一、if……else结构嵌套编写多分支结构例1:给定百分制成绩,输出其对应的等级制成绩。两种写法:输入分数scorescore>=90输入分数scorescore>=90score>=70score>=80score>=60score>=60输出AYYYYNNNN输出B输出D输出E输入分数值scorescore>=90YN输出Ascore>=80且score<90YN输出Bscore<60YN输出Escore>=70且score<80YN输出Cscore>=60且score<70YN输出D`#include<stdio.H>main(){intscore;scanf("%d",&score);if(score>=90)printf("A");if(score>=80&&score<90)printf("B");if(score>=70&&score<80)printf("C");if(score>=60&&score<70)printf("D");if(score<60)printf("E");}如果条件特别多,而且分的比较细,再利用if结构显然看上去很乱。所以C语言提供了专门用于多分支的程序结构,就是我们接下来要讲的switch……case。二、switch……case结构1、switch……case结构switch(表达式){case常量表达式1:语句1case常量表达式2:语句2……case常量表达式n:语句ndefault:语句n+1}2、执行过程判断switch后表达式的值,然后根据其值去寻找case后的常量表达式的值,找到后从相应的语句开始执行,其后的case都失效,不再判断,但其后的case后的语句都要执行,直到遇到break或switch结构结束。3、说明〔1〕switch后的表达式可以为C语言的任何类型;〔2〕case后的内容必须为常量或常量表达式,不能带变量;〔3〕每个语句的后边都可以根据需要添加break,来终止其所在的switch结构;〔4〕当所有条件都不满足时,执行default后的语句;三、switch……case结构举例例2:将百分制改成等级制。#include<stdio.h>main(){intscore,k;scanf("%d",&score);k=score/10;//每一个分数都只要其十位或百位可以减少分支数。switch(k){case10:case9:printf("A");break;case8:printf("B");break;case7:printf("C");break;case6:printf("D");break;default:printf("E");}}执行时,注意如果输入98,那么只输出“A〞,其他的等级不输出,因为在每个printf的后边有一个break,break能够跳出switch。如果没有break,当输入98时,输出ABCDE。原因是:98/10,得到9,case9作为入口,输出A,其后的case不再判断,将所有的语句都执行。四、课堂练习读程序写结果,判断如下程序的执行结果:#include<stdio.h>main(){intj,a[]={1,3,5,7,9,11,13,15},*p=a+5;for(j=3;j;j--){switch(j){case1:case2:printf(“%d〞,*p++);break;case3:printf(“%d〞,*(--p));}}}五、总结及习题布置〔习题5.6、5.7、5.8、5.9〕第十一讲循环结构〔1〕学时:2学时主要内容及时间安排〔课堂90分钟,80分钟讲课,5分钟复习,5分钟总结〕:〔1〕循环的含义及循环流控图形的复习〔10分钟〕;〔2〕for循环的根本结构及执行过程〔10分钟〕〔4〕for循环程序举例〔30分钟〕〔5〕〔15分钟〕〔6〕课堂练习〔20分钟〕〔7〕总结、习题布置及下一节提要〔习题6.1、6.2、6.3,下一节while循环和do……while循环〕〔5分钟〕重点:循环的含义、for循环的执行过程、break和continue的使用难点:for循环的执行过程、break和continue的使用教学内容细节:一、循环的含义及循环流控图形的复习循环的含义是:在条件成立的情况下,对于相同的动作反复执行,直到条件不成立;循环的流程图和盒图表示如下:条件循环体条件循环体YN循环体外语句条件条件循环体循环体外语句二、for循环的根本结构及执行过程1、for语句的一般形式:for(表达式1;表达式2;表达式3)循环体;2、执行过程:〔1〕首先执行表达式1;〔2〕判断表达式2的值;如果表达式2成立执行〔3〕;否那么执行〔4〕〔3〕执行循环体,执行表达式3;跳转到〔2〕;〔4〕循环结构结束,执行循环之后的其他语句。3、流程图形和盒图对应表达式1循环体表达式1循环体循环体外语句表达式2表达式3表达式2循环体YN循环体外语句表达式1表达式34、简单理解形式for(循环变量赋初值;循环条件;循环变量修改)循环体;5、本卷须知:〔3〕注意表达式2〔循环条件〕的设置,不要设计成死循环;〔4〕在执行过程中,表达式1只有在初次进循环体时执行1次,以后就不再执行了。三、for循环程序举例1、读程序写结果:#include<stdio.H>main(){charch;for(ch=getchar();ch!='\n';ch=getchar()){if(ch>='a'&&ch<='z')ch=ch-32;printf("%c",ch);}}如果输入:abc345FGJ2、设计程序实现求1到100的所有整数和;输出sum值输出sum值设置i=1,sum=0sum+=ii++i<=100#include<stdio.H>main(){inti,sum;for(i=1,sum=0;i<=100;i++)sum+=i;printf("sum=%d",sum);}3、设计程序实现数列求前20项和:1,1/2,2/3,3/5,5/8,8/13,……设置i=1;b=1.0;sum=0.0;a=1.0设置i=1;b=1.0;sum=0.0;a=1.0i<=20sum+=a/bt=aa=bb=t+b输出sum值#include<stdio.H>main(){inti;floatsum=0.0,a=1.0,b=1.0,t;for(i=1;i<=3;i++){sum=sum+a/b;t=a;a=b;b=t+b;}printf("sum=%f",sum);}四、1、continue的含义是:结束本次循环进入下一次循环;2、break的含义是:跳出所在循环,执行循环体外的其他语句;break只能跳出其所在的一重循环;读程序写结果:#include<stdio.h>main(){intk,s=0; for(k=1;k<=10;k++) {if((k%2)!=0)continue; s+=k;} printf(“s=%d\n〞,s);}五、for循环中表达式含义的延伸for的根本格式为:for〔表达式1;表达式2;表达式3〕循环体;根据for循环的执行流程,可以将for循环写成如下容易理解的形式:for(循环变量赋初值;循环条件;循环变量修改)循环体;六、课堂练习1、读程序写结果写出下面程序的执行结果:#include<stdio.h>main(){inti,j,sum;for(i=3;i>=1;i--){sum=0; for(j=1;j<=i;j++) sum+=i*j; }printf("%d\n",sum);}2、编程练习题把100-200之间的不能被3整除的数输出。七、总结、习题布置及下一节提要〔习题6.1、6.2、6.3,下一节while循环和do……while循环〕〔1分钟〕第十二讲循环结构〔2〕学时:2学时主要内容及时间安排〔课堂90分钟,80分钟讲课,5分钟复习,5分钟总结〕:〔1〕for循环的复习,for循环的变形得来while循环、while流程图的画法、while循环的执行过程〔20分钟〕;〔2〕while循环程序举例〔20分钟〕;〔3〕do……while结构的根本格式、执行过程与while的区别〔15分钟〕〔4〕课堂练习,读程序和写程序〔30分钟〕〔5〕习题布置〔习题6.4、6.5、6.6、6.8、6.14,思考6.10、6.15〕〔5分钟〕重点:while循环和do……while循环的根本格式和执行过程、区别;难点:循环算法的分析和设计。教学内容细节:一、for循环复习for循环的根本格式是:for(表达式1;表达式2;表达式3)循环体;和循环变量改变省略。如果for采用了这种格式,那么程序在设计时往往将表达式1作为for循环结构上面的语句;而将表达式3作为循环体里的语句。如果只有表达式2,那么for循就和我们要将的while循环相同了。二、while循环根本格式及举例while循环的根本格式为:while〔表达式〕循环体;执行过程为:先判断表达式的值,如果表达是的值成立那么执行循环体,执行完循环体继续判断表达式的值,如果表达式的值成立继续执行循环体,如此往复直到表达式的值不成立,做while循环后面的语句。例:设计程序实现求1到100的所有整数和#include<stdio.h>main(){inti,sum;i=1;sum=0;while(i<=100){sum+=i;i++;}printf("sum=%d",sum);}三、do…while循环根本格式及举例do…while循环的格式:do循环体while〔表达式〕;其执行过程和while循环相同,只不过是先做一次循环体,然后在判断表达式,如果表达式成立那么继续执行循环体,直到表达式不成立。例:求1到100之间所有整数的和。#include<stdio.h>main(){inti,sum;i=1;sum=0;do{sum+=i;i++;}while〔i<=100〕;printf("sum=%d",sum);}四、三种循环的区别〔3〕do…………while循环的结束。〔4〕三种循环在处理同一问题时是可以互相替代的。五、程序练习例:分别利用while循环和do……while循环求π的值。π值计算公式为:π/4=1-1/3+1/5-1/7+1/9……直到某一项的绝对值小于10的-6此方为止。-6盒图表示为:pi=0,n=1,t=1,s=1pi=0,n=1,t=1,s=1|t|<=10-6pi=pi+ts=s+2n=-nt=n/spi=pi*4#include<stdio.h>#include<math.h>main(){doublepi,s;intn=1;pi=0.0;s=1.0;如果利用do……如果利用do……while循环do{pi=pi+n/s;s=s+2;n=-n;}while(fabs(n/s)>10e-6);{pi=pi+n/s;s=s+2;n=-n;}pi=pi*4;printf("%lf",pi);}六、总结及布置课后习题第十三讲习题课学时:2学时主要内容及时间安排〔课堂90分钟,80分钟讲解,5分钟复习、5分钟总结〕:〔1〕三种循环结构复习〔10分钟〕;〔2〕分析、讲解所留习题〔75分钟〕;〔3〕下一讲内容提要〔5分钟〕;重点:一、三种循环结构复习回忆三种循环的具体格式,并明确每一种循环的执行过程及本卷须知。二、嵌套循环程序设计例:输出从3到100之间的所有素数在分支结构中我们分析了素数的算法,除了1和它本身不能被其他数整除的数被称为素数。n<=100n/i的余数=>rn<=100n/i的余数=>rr=01=>w输出n0=>w,2=>ii+1=>i直到i>或w=1YNw=0YN用for循环此处可加continuen++n=3输入待判断数=>n输入待判断数=>nn/i的余数=>rr=01=>w输出n是素数0=>w,2=>ii+1=>i直到i>或w=1YNw=0YN输出n不是素数将上面的盒图嵌套在3-100之间变化的数的循环内。〔循环嵌套〕#include<stdio.h>#include<math.h>main(){intn;inti,w;for(n=3;n<=100;n++){w=0;for(i=2;i<=sqrt(n)&&w==0;i++)if(n%i==0)w=1;if(w==0)printf("%d,",n);}}注意:在进行循环嵌套程序设计时往往是内重小循环执行的是一个循环功能,而外重大循环控制的是小循环的执行次数。但是注意循环嵌套的层数不要太多,否那么会影响程序的可读性和执行效率。三、课后习题分析讲解1、求两个正整数的最大公约数和最小公倍数。最大公约数:#include<stdio.h>main(){intx,y;scanf("%d%d",&x,&y);while(x!=y){if(x>y)x=x-y;elsey=y-x;}printf("%d",x);}最小公倍数:2、输入一行字符,分别统计出其中的英文字母、空格、数字和其他字符的个数#include<stdio.h>main(){charch;intzm=0,sz=0,kg=0,qt=0;ch=getchar();while(ch!='\n'){if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))zm++;elseif(ch>='0'&&ch<='9')sz++;elseif(ch=='')kg++;elseqt++;ch=getchar();}printf("zimu=%d,shuzi=%d,kongge=%d,qita=%d",zm,sz,kg,qt);}3、求Sn=a+aa+aaa+aaaa+……之值,其中a是数字,n表示a的位数。例如a=2,n=5;#include<stdio.h>main(){inta,n;intsum,i,t;printf("a=");scanf("%d",&a);printf("n=");scanf("%d",&n);t=a;for(sum=0,i=1;i<=n;i++){sum=sum+t;t=t*10+a;}printf("sum=%d",sum);}4、求=1!+2!+……+10!#include<stdio.h>main(){inti,n;longintsum=0,fac;for(i=1;i<=3;i++){for(n=1,fac=1;n<=i;n++)fac=fac*n;sum+=fac;}printf("%ld,%ld",sum,fac);}5、输出所有水仙花数,所谓水仙花数就是指一个三位数每一位上数字的立方和等于这个数本身如153=13+53+33#include<stdio.h>main(){inti;intm,n,t;for(i=100;i<=999;i++){m=i%10;n=i/10%10;t=i/100;if(i==m*m*m+n*n*n+t*t*t)printf("%d,",i);}}6、一个数如果是完数,那么这个数正好等于它的因子和,输出1000以内的完数。#include<stdio.h>main(){intn;inti,sum;for(n=1;n<=1000;n++){for(sum=0,i=1;i<n;i++)if(n%i==0)sum+=i;if(sum==n){printf("\n%d",sum);printf("itsfactorsare:");for(i=1;i<n;i++)if(n%i==0)printf("%d,",i);}}}7、给定一个小于五位的正整数,计算每一位数字的和。#include<stdio.h>main(){intn,t;intsum=0;scanf("%d",&n);while(n<0&&n>10000){printf("inputn:");scanf("%d",&n);}while(n>0){t=n%10;printf("%d,",t);sum+=t;n=n/10;}printf("sum=%d",sum);}四、作业布置〔实验题目〕第十四讲一维数组的定义和使用学时:2学时主要内容及时间安排〔课堂90分钟,85分钟讲课,5分钟总结〕:〔1〕一维数组的引出、一维数组的优点〔5分钟〕;〔2〕一维数组的定义、下标范围解释、初始化、元素引用〔20分钟〕;〔3〕一维数组的程序举例〔40分钟〕〔4〕一维数组和指针的配合使用〔20分钟〕〔5〕习题布置和下一节内容提要〔习题7.1、7.2、7.4、7.5,下一节二维数组相关知识〕〔5分钟〕重点:一维数组的定义、初始化、元素引用、常用算法、指针和一维数组的配合使用;难点:一维数组常用算法、指针和一维数组的配合使用。教学内容细节:一、一维数组的意义在第二章算法局部,我们讲过一个算法,就是对于所以,我们考虑将相同数据类型的数据放在一段连续的地址空间内,然后依次取出来对他们进行处理,这样对于我们的大量相同数据类型的数据操作就简单了许多。对于上面的问题,我们可以开辟50个连续的内存地址空间,每个空间4个字节,存放float类型数据。对这50个空间的数据从头开始依次校验,如果大于80那么输出这样的数据,直到50个数据都处理完。在处理这50个数据时,将他们作为一个整体来处理,每一个具体的数据就是一个小分量。这时如果再用我们前面讲过的根本数据类型就无法解决这个问题了。所以要引出我们今天要讲的内容——数组。数组:具有相同数据类型的数据集合。数组具有统一的名字和具体大小,数组中的每一个分量用数组名和下标的形式进行标示。例如上面的例子,就可以定义一个含有50个空间的单精度类型数组G[50],数组元素可以通过G[0]到G[49]进行表示。二、一维数组的定义及下标表示数组分为一维数组和多维数组,我们主要介绍常用的一维数组和二维数组。定义方式:类型说明符数组名[常量表达式];例:floatG[10];其中:G为数组名,10表示数组长度,整个数组分配了40个连续字节空间。2、一维数组的下标范围例如:floatG[10];它的分量是从G[0]到G[9]的,也就是第一个元素的下标为0,第十个元素的下标为9。3、几点说明〔1〕定义数组时,数组名要符合标识符的命名规那么。〔2〕定义数组时,要明确数组的大小,否那么即使知道数据类型系统不知道给数组分配多大空间,会出现错误。三、一维数组的初始化、元素引用1、一维数组的初始化对全部元素赋初值:inta[10]={10,9,34,67,34,21,45,12,98,11};inta[]={10,98,76,56};//不写数组长度,对所有元素赋值,数组默认长度为4。对局部元素赋初值:inta[10]={10,98,76,43,12};//对局部元素赋值,其余元素为0。例:inta[5]={12,67,45,87,10};如果要将45输出,那么可以用它的下标进行引用:printf(“%d〞,a[2]);四、一维数组程序举例例:为一维整型数组A[10]赋值,体会内存存储形式,并计算A数组所有元素和。定义数组a[10],sum=0,i=0i<=9定义数组a[10],sum=0,i=0i<=9为a[i]输入值将a[i]累加到sum中i++i<=9输出a[i]和a[i]的地址i++i=0输出sum值main(){inta[10];inti,sum=0;for(i=0;i<=9;i++){scanf("%d",&a[i]);sum+=a[i];}printf("sum=%d\n",sum);for(i=0;i<=9;i++)printf("a[i]=%d,\ta[i]addr=%x\n",a[i],&a[i]);}例:利用数组处理fibonacci数列问题。为f1和f2赋初值,f1=1,f2=2,i=1i<=20为f1和f2赋初值,f1=1,f2=2,i=1i<=20输出f1,f2f1=f1+f2;f2=f2+f1假设i被2整除,那么打印回车i++main(){longintf1=1,f2=1;inti;for(i=1;i<=20;i++){printf("\t%ld\t%ld",f1,f2);f1=f1+f2;f2=f2+f1;if(i%2==0)printf("\n");}}然后给出数组处理这个问题的思路。根本思路:先根据要求开辟数组的大小,比方要求输出20项,那么数组大小应该为20。然后找出规律,它的规律是,从第3个元素〔下标是2〕开始,每个元素是它前两个元素的和,即a[i]=a[i-1]+a[i-2];i是从2变化到19的〔即第3个元素到第20个元素〕。#include<stdio.H>main(){longinta[20]={1,1};inti;for(i=2;i<=19;i++)a[i]=a[i-1]+a[i-2];for(i=0;i<=19;i++){if(i%4==0)printf("\n");printf("%d\t",a[i]);}}例:在一维数组上实现冒泡排序。根本思路:从数组开头开始进行比较,如果前小后大那么交换,第一次交换后会有一个最大数跑到数组的最后,然后下一次的排序空间缩小一个数,也就是最后的那个最大数不用再比了。第二次后又会有一个无序序列中的最大值跑到排序空间的最后,然后每次空间都缩小一个数,直到待排序空间只剩一个数的时候,数组就有序了。步骤描述:[]中为无序数组。原始数组:[12,45,9,78,34,51,20,18,61,14]第一趟过程:12和45比较不交换,45和9比较交换,45和78比不交换,78和34比交换;78和51比交换;78和20比交换;78和18比交换;78和61比交换;78和14比交换,经过第一趟比较,78跑到了数组的最后,作为有序空间的第一个数。第一趟结果:[12,9,45,34,51,20,18,61,14,]78输入10个待排序数到a[10]中j=8,//j相当与挡板,挡着i的变化输入10个待排序数到a[10]中j=8,//j相当与挡板,挡着i的变化j>0i=0i<=ja[i]>a[i+1]交换a[i]、a[i+1]i++FTj--输出排好序的数组a[10]#include<stdio.h>main(){inta[10],i,j,t;for(i=0;i<10;i++)scanf("%d",&a[i]);j=8;while(j>0){for(i=0;i<=j;i++)if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}j--;}for(i=0;i<10;i++)printf("%d,",a[i]);}思考:对冒泡排序进行改进,当比较到某一次数组已经有序时就不再进行下一次比较。五、一维数组元素和指针的对应关系inta[10],*pp=a;数组名表示的是数组的首地址。这时可以用p[0]表示a[0],用p[1]表示a[1]。但是p也并不完全等价于a。因为p可以进行p++操作,而a不能进行此操作。例:输入数组元素#include<stdio.h>main(){inta[5],*p,i;p=a;for(i=0;i<=4;i++)scanf("%d",p+i);for(i=0;i<5;i++)printf("%d\t",a[i]);}六、习题布置第十五讲二维数组学时:2学时主要内容及时间安排〔课堂90分钟,80分钟讲课,5分钟复习,5分钟总结〕:〔1〕二维数组的由来〔元素是一维数组的一维数组〕〔5分钟〕;〔2〕二维数组的定义、初始化、元素引用〔15分钟〕;〔3〕二维数组典型程序举例〔40分钟〕〔4〕二维数组和指针的配合使用〔25分钟〕〔5〕总结及〔5分钟〕重点:二维数组的定义、二维数组初始化和元素引用、二维数组常用典型算法、二维数组和指针的配合使用;难点:二维数组的典型算法、二维数组和指针的配合使用。教学内容细节:一、二维数组的引出及意义对于有些数学问题,比方矩阵运算等,它所要求的处理对象是一个二维的概念,不但有行还有列。这时,我们的一维数组如果每个元素再是一个单独的数值就无法处理了,但是如果一维数组的元素又是一个一维数组就能够解决这样的问题。所以二维数组是元素是一维数组的一维数组。二、二维数组的定义二维数组定义的一般形式:类型说明符:数组名[常量表达式][常量表达式];例如:floata[3][4];定义a数组为3行4列的二维数组,行下标从0-2,列下标从0-3;三、二维数组的初始化inta[3][4]={{1

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论