还剩31页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
C语言程序设计复习提纲
一、Visual C++
6.0开发环境
1、了解Visual C++
6.0的安装过程;
2、了解Visual C++
6.0的工作界面,菜单和工具栏的使用;▲
二、掌握C语言程序运行的过程
1、编辑是指把按照C语法规则编写的程序代码通过编辑器Visual C++
6.0,Turbo C
3.0输入计算机,并存盘在存盘时,C源文件的扩展名为.c
2、编译对源程序进行编译,即将源程序转换为扩展名为.obj的二进制代码;即生成该源文件的目标代码
3、连接将用户程序生成的多个目标代码文件.obj和系统提供的库文件.lib中的某些代码连接在一起,生成一个可执行文件.exe
4、执行执行生成的可执行代码,并输出结果
5、调试是将编制的程序投入实际运行前,用手工或编译程序等方法进行测试,修正语法错误和逻辑错误的过程▲
三、结构化程序设计的基本概念
1、概念以模块化设计为中心,将待开发的软件系统划分为若干个相互独立的模块,将原来较为复杂的问题化简为一系列简单模块的设计,任何模块都可以使用一些基本的结构来实现,任何复杂的程序,都可以使用这些基本结构按一定的顺序组合起来,这些基本结构的特点都是只有一个入口、一个出口,这样的程序设计方法称为结构化程序设计
2、基本思想结构化程序设计的基本思想是采用〃自顶向下,逐步细化、模块化设计、结构化编码〃的程序设计方法和〃单入口单出口〃的控制结构自顶向下、逐步细化的程序设计方法从问题本身开始,经过逐步细化,将解决问题的步•骤分解为由基本程序结构模块组成的结构化程序框图;〃单入口单出口〃的思想认为一个复杂的程序,如果它仅是由顺序、选择和循环三种基本程序结构通过组合、嵌套构成,那么这个新构造的程序一定是一个单入口单出口的程序据此就很容易编写出结构良好、易于调试的程序来
3、三种基本结构⑴顺序结构⑵选择结构⑶循环结构
4、三种基本结构的特点⑴只有一个入口⑵只有一个出口⑶每一个基本结构中的每一部分都有机会执行到⑷结构内不存在“死循环”
5、设计原则⑴自顶向下⑶逐步细化⑶模块化设计⑷结构化编码
6、结构化程序设计方法⑴要求把程序的结构规定为顺序、选择和循环三种基本机构,并提出了自顶向下、逐步求精、模块化程序设计等原则⑵结构化程序设计是把模块分割方法作为对大型系统进行分析的手段,使其最终转化为解/*程序功能打印5行〃*〃,第一行1个,第二行3个,第三行5个...*/include stdio.h void main{int i=l;whilei=5{int j=l,k=l;whilej=5-i{printf;j++;whilek=2*i-l{printf***;k++;printf\n;i++;}6^break语句与continue语句⑴、一般格式break;continue;⑵、功能
①break强行结束循环,转向执行循环语句的下一条语句
②continue对于for循环,跳过循环体其余语句,转向循环变量增量表达式的计算;对于while和do-while循环,跳过循环体其余语句,但转向循环继续条件的判定⑶、说明
①break能用于循环语句和switch语句中,continue只能用于循环语句中
②循环嵌套时,break和continue只影响包含它们的最内层循环,与外层循环无关例求输入的十个整数中正数的个数及其平均值#include stdio.h void main{int i,num=0,a;float sum=0;fori=0;i10;i++{scanfa;ifa=0continue;num++;sum+=a;printf,z%d plusinteger*s sum:%
6.Of\n”,num,sum;printfMean value:%
6.2f\n”,sum/num;}例编程设计一个程序完成以卜功能若输入英文字母,则原样输出;输入其他字符,则不输出,直到输入q键结束解^include stdio.h void main char ch;doch=getchar;if ch==,Q*||ch==,q,break;else ifch=,A*ch=,Z||ch=ach=,zputcharch;while1;}▲
九、数组及其使用
1、一维数组⑴、一维数组的定义数据类型数组名[常量表达式][,数组名2[常量表达式2]……]■“数据类型”是指数组元素的数据类型■数组名,与变量名一样,必须遵循标识符命名规则■“常量表达式”必须用方括号括起来,指的是数组的元素个数又称数组长度,它是一个整型值,其中可以包含常数和符号常量,但不能包含变量■数组元素的下标,是元素相对于数组起始地址的偏移量,所以从0开始顺序编号■数组名中存放的是一个地址常量,它代表整个数组的首地址同一数组中的所有元素,按其下标的顺序占用•段连续的存储单元
2、数组元素的引用引用数组中的任意一个元素的形式数组名[下标表达式]■“下标表达式”可以是任何非负整型数据,取值范围是0~元素个数-1■1个数组元素,实质上就是1个变量,它具有和相同类型单个变量一样的属性,可以对它进行赋值和参与各种运算■在C语言中,数组作为1个整体,不能参加数据运算,只能对单个的元素进行处理⑶、一维数组元素的初始化■初始化格式数据类型数组名[常量表达式]={初值表}■如果对数组的全部元素赋以初值,定义时可以不指定数组长度系统根据初值个数自动确定如果被定义数组的长度,与初值个数不同,则数组长度不能省略■“初值表”中的初值个数,可以少于元素个数,即允许只给部分元素赋初值例从键盘上任意输入n个整数,用冒泡法按从小到大地排序,并在屏幕上显示出来解冒泡法排序的基本思想从第一个数开始依次对相邻两数进行比较,如次序对则不做任何操作;如次序不对则使这两个数交换位置第一遍的NT次比较后,最大的数已放在最后,第二遍只需考虑NT个数,以此类推直到第NT遍比较后就可以完成排序^include z,iostream,h”itdefine N10/*定义符号常量数据个数N*/void mainint data[N];/*定义1个1维整型数组data*/int i,j,temp;/*定义循环变量和临时变量*/cout”请输入10个数\n”;fori=0;iN;i++cindata[i];/*冒泡法排序*/fori=0;iN-l;i++/*外循环:控制比较趟数*/forj=0;jN-l-i;j++/*内循环:进行每趟比较*/if data[j]data[j+l]/*如果data]j]大于data[j+l],交换两者的位置*/temp=data[j];data[j]=data[j+l];data[j+l]=temp;;/*输出排序后的数据*/cout«,/\n输出排序后的结果\n〃;fori=0;iN;i++cout«data[i]«*cout«endl;
2、二维数组
1、二维数组的定义数据类型数组名[行常量表达式][列常量表达式][,数组名2[行常量表达式2][列常量表达式2]……];■数组元素在内存中的排列顺序为“按行存放”,即先顺序存放第一行的元素,再存放第二行,以此类推■设有一个m*n的数组x,则第i行第j列的元素x[i][j]在数组中的位置为i*n+j注意行号、列号均从开始计数
2、二维数组元素的引用引用2维数组元素的形式为数组名[行下标表达式][列下标表达式]■”行下标表达式”和“列下标表达式”,都应是整型表达式或符号常量■“行下标表达式”和“列下标表达式”的值,都应在已定义数组大小的范围内假设有数组x
[3]
[4],则可用的行下标范围为0~2,列下标范围为0~3■对基本数据类型的变量所能进行的操作,也都适合于相同数据类型的2维数组元素
6.lf\t*,scorc[i][j];printf\n;/*输出1条短划线*/forj=0;j8*NUM_course+2;j++printf一;printff\n课程平均”;/*输出每门课程的平均成绩*/forj=0;jNLM course;j++printf v%
6.score[NUM_std][j];printf\n〃;}
3、字符数组⑴、字符数组的定义■1维字符数组,用于存储和处理1个字符串,其定义格式与1维数值数组一样■2维字符数组,用于同时存储和处理多个字符串,其定义格式与2维数值数组一样
2、字符数组的初始化字符数组的初始化,可以通过为每个数组元素指定初值字符来实现
3、字符数组的引用字符数组的逐个字符引用,与引用数值数组元素类似■字符数组的输入除了可以通过初始化使字符数组各元素得到初值外,也可以使用86丘1^1或$02比函数输入字符■字符数组的输出字符数组的输出,可以用putchar或printf函数
4、字符串及其结束标志所谓字符串,是指若干有效字符的序列C语言中的字符串,可以包括字母、数字、专用字符、转义字符等C语言规定以\0作为字符串结束标志0代表ASCII码为的字符,表示一个“空操作”,只起一个标志作用因此可以对字符数组采用另一种方式进行操作了一字符数组的整体操作注意由于系统在存储字符串常量时,会在串尾自动加上1个结束标志,所以无需人为地再加1个另外,由于结束标志也要在字符数组中占用一个元素的存储空间,因此在说明字符数组长度时,至少为字符串所需长度加
11.字符数组的整体初始化字符串设置了结束标志以后,对字符数组的初始化,就可以用字符串常量来初始化字符数组
2.字符数组的整体引用■字符串的输入除了可以通过初始化使字符数组各元素得到初值外,也可以使用scanf函数输入字符串■字符串的输出printf函数,不仅可以逐个输出字符数组元素,还可以整体输出存放在字符数组中的字符串
5、常用的字符串处理函数字符串标准函数的原型在头文件string,h中⑴、输入字符串一gets函数
①调用方式gets字符数组
②函数功能从标准输入设备sldin——键盘上,读取1个字符串可以包含空格,并将其存储到字符数组中去
③使用说明■gets读取的字符串,其长度没有限制,编程者要保证字符数组有足够大的空间,存放输入的字符串■该函数输入的字符串中允许包含空格,而scanfO函数不允许
2.输出字符串一puts函数
①调用方式puts字符数组
②函数功能把字符数组中所存放的字符串,输出到标准输出设备中去,并用取代字符串的结束标志\0所以用puts函数输出字符串时,不要求另加换行符
③使用说明■字符串中允许包含转义字符,输出时产生一个控制操作■该函数一次只能输出一个字符串,而printf函数也能用来输出字符串,且一次能输出多个
3、字符串比较一strcmpO函数
①调用方式stremp字符串1,字符串2其中“字符串”可以是串常量,也可以是1维字符数组
②函数功能比较两个字符串的大小如果字符串1二字符串2,函数返回值等于0;字符串1<字符串2,函数返回值负整数;字符串1》字符串2,函数返回值正整数
③使用说明■如果一个字符串是另一个字符串从头开始的子串,则母串为大■不能使用关系运算符“==”来比较两个字符串,只能用strcmp()函数来处理⑷、拷贝字符串一slrcpyO函数
①调用方式strcpy(字符数组,字符串)其中“字符串”可以是串常量,也可以是字符数组
②函数功能:将“字符串”完整地复制到“字符数组”中,字符数组中原有内容被覆盖
③使用说明■字符数组必须定义得足够大,以便容纳复制过来的字符串复制时,连同结束标志\0一起复制■不能用赋值运算符“=”将一个字符串直接赋值给一个字符数组,只能用strcpy0函数来处理
(5).连接字符串一strcat()函数
①调用方式strcat(字符数组,字符串)
②函数功能把“字符串”连接到“字符数组”中的字符串尾端,并存储于“字符数组,,中“字符数组”中原来的结束标志,被“字符串”的第一个字符覆盖,而“字符串”在操作中未被修改
③使用说明■由于没有边界检查,编程者要注意保证“字符数组”定义得足够大,以便容纳连接后的目标字符串否则,会因长度不够而产生问题■连接前两个字符串都有结束标志\0,连接后字符数组”中存储的字符串的结束标志\0被舍弃,只在目标串的最后保留一个‘\0
(6).求字符串长度——strlenO函数(len是length的缩写)
①调用方式strlen(字符串)
②函数功能求字符串(常量或字符数组)的实际长度(不包含结束标志
(7).将字符串中大写字母转换成小写一slrlwr函数
①调用方式strlwr(字符串)
②函数功能将字符串中的大写字母转换成小写,其它字符(包括小写字母和非字母字符)不转换⑻.将字符串中小写字母转换成大写一struprO函数
①调用方式strupr(字符串)
②函数功能将字符串中小写字母转换成大写,其它字符(包括大写字母和非字母字符)不转换▲
十、函数的定义与调用
1、函数的定义任何函数(包括主函数main)都是由函数说明和函数体两部分组成根据函数是否需要参数,可将函数分为无参函数和有参函数两种
(1)、无参函数的一般形式函数类型函数名(void)(说明语句部分;可执行语句部分;)注意在旧标准中,函数可以缺省参数表但在新标准中,函数不可缺省参数表;如果不需要参数,则用“void”表示,主函数main例外
2、有参函数的一般形式函数类型函数名数据类型参数[,数据类型参数2……]说明语句部分;可执行语句部分有参函数比无参函数多了一个参数表调用有参函数时,调用函数将赋予这些参数实际的值为了与调用函数提供的实际参数区别开,将函数定义中的参数表称为形式参数表,简称形参表例定义一个函数,用于求两个数中的大数解/*功能定义•个求较大数的函数并在主函数中调用*/int maxint nl,int n2/*定义一个函数max*/{return nln2nl:n2;mainOint maxint nl,int n2;/*函数说明*/int numl,num2;printfinput twonumbers:%”;scanf%d%d”,numl,num2;printfmax=%d\n”,maxnum1,num2;}⑶、说明
①函数定义不允许嵌套在C语言中,所有函数包括主函数mainO都是平行的一个函数的定义,可以放在程序中的任意位置,主函数main之前或之后但在一个函数的函数体内,不能再定义另一个函数,即不能嵌套定义
②空函数一既无参数、函数体又为空的函数其一般形式为[函数类型]函数名void}
③在老版本C语言中,参数类型说明允许放在函数说明部分的第2行单独指定
2、函数的返|可值与函数类型
1.函数返回值与return语句有参函数的返回值,是通过函数中的return语句来获得的
①return语句的一般格式return返回值表达式;
②return语句的功能返回调用函数,并将“返回值表达式”的值带给调用函数注意调用函数中无return语句,并不是不返回一个值,而是一个不确定的值为了明确表示不返回值,可以用“void”定义成“无空类型”
2.函数类型在定义函数时,对函数类型的说明,应与return语句中、返回值表达式的类型一致如果不一致,则以函数类型为准如果缺省函数类型,则系统一律按整型处理
3、对被调用函数的说明和函数原型在ANSI C新标准中,采用函数原型方式,对被调用函数进行说明,其一般格式如下函数类型函数名数据类型[参数名][,数据类型[参数名2]…];C/C语言同时乂规定,在以下2种情况下,可以省去对被调用函数的说明
①当被调用函数的函数定义出现在调用函数之前时因为在调用之前,编译系统已经知道了被调用函数的函数类型、参数个数、类型和顺序
②如果在所有函数定义之前,在函数外部(例如文件开始处)预先对各个函数进行了说明,则在调用函数中可缺省对被调用函数的说明
4、函数的调用一般形式为函数名([实际参数表])切记实参的个数、类型和顺序,应该与被调用函数所要求的参数(形参)个数、类型和顺序一致,才能正确地进行数据传递⑴、调用函数方式:
①函数表达式函数作为表达式的一项,出现在表达式中,以函数返回值参与表达式的运算
②函数语句C/C语言中的函数可以只进行某些操作而不返回函数值,这时的函数调用可作为一条独立的语句
③函数实参函数作为另一个函数调用的实际参数出现这种情况是把该函数的返回值作为实参进行传送,因此要求该函数必须是有返回值的⑵、说明
①调用函数时,函数名称必须与具有该功能的自定义函数名称完全一致
②实参在类型上按顺序与形参,必须一一对应和匹配如果类型不匹配,C编译程序将按赋值兼容的规则进行转换如果实参和形参的类型不赋值兼容,通常并不给出出错信息,且程序仍然继续执行,只是得不到正确的结果
③如果实参表中包括多个参数,对实参的求值顺序随系统而异有的系统按自左向右顺序求实参的值,有的系统则相反Turbo C和MS C是按自右向左的顺序进行的
5、函数的形参与实参
(1)、函数的参数分为形参和实参两种,作用是实现数据传送形参出现在函数定义中,只能在该函数体内使用发生函数调用时,调用函数把实参的值复制1份,传送给被调用函数的形参,从而实现调用函数向被调用函数的数据传送例实参对形参的数据传递/*实参对形参的数据传递*/void main()void sintn;/*说明函数*/intn=100;/*定义实参n,并初始化*/sn;/*调用函数*/printf z,n s=%d\n,n;/*输出调用后实参的值,便于进行比较*/)void sintn int i;printfn_x=%d\n”,n;/*输出改变前形参的值*/fori=n-l;i=l;i printfn n=n+i;/*改变形参的值*/x=%d\n”,n;/*输出改变后形参的值*/⑵、说明:
①实参可以是常量、变量、表达式、函数等无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参
②形参变量只有在被调用时,才分配内存单元;调用结束时,即刻释放所分配的内存单元因此,形参只有在该函数内有效调用结束,返回调用函数后,则不能再使用该形参变量
③实参对形参的数据传送是单向的,即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参
④实参和形参占用不同的内存单元,即使同名也互不影响
6、函数的嵌套调用和递归调用
1、函数的嵌套调用指在执行被调用函数时,被调用函数又调用了其它函数如图所示ma.i n
①▼调用f1
⑨▼结⑵、函双削如归胴用函数的递归调用是指,一个函数在它的函数体内,直接或间接地调用它自身
7、内部变量与外部变量⑴、内部变量在一个函数内部说明的变量是内部变量,它只在该函数范围内有效只有在包含变量说明的函数内部,才能使用被说明的变量,在此函数之外就不能使用这些变量了所以内部变量也称“局部变量”⑵、关于局部变量的作用域还要说明以下几点
①主函数main中定义的内部变量,也只能在主函数中使用,其它函数不能使用同时,主函数中也不能使用其它函数中定义的内部变量因为主函数也是一个函数,与其它函数是平行关系
②形参变量也是内部变量,属于被调用函数;实参变量,则是调用函数的内部变量
③允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆
④在复合语句中也可定义变量,其作用域只在复合语句范围内
3、外部变量
①在函数外部定义的变量称为外部变量外部变量不属于任何一个函数,其作用域是从外部变量的定义位置开始,到本文件结束为止
②外部变量可被作用域内的所有函数直接引用,所以外部变量又称全局变量例输入长方体的长
1、宽w、高h,求长方体体积及正、侧、顶三个面的面积解/*功能利用全局变量计算长方体的体积及三个面的面积*/int si,s2,s3;int vsint a,int b,int cint v;v=a*b*c;sl=a*b;s2=b*c;s3=a*c;return v;}mainint v,1,w,h;printf z,\ninput length,width andheight;scanfC%d%d%d,l,w,h;v=vs1,w,h;printf,,v=%d sl=%d s2=%d s3=%d\n”,v,si,s2,s3;▲
十一、指针
1、指针和指针变量的概念⑴、指针一即地址一个变量的地址称为该变量的指针通过变量的指针能够找到该变量⑵指针变量一专门用于存储其它变量地址的变量
2、指针变量的定义与应用⑴、指针变量的定义数据类型*指针变量L*指针变量2……];⑵、取地址运算和指针运算*取地址运算的格式变量指针运算的格式:*指针变量例#include stdio.h void mainOint a,b;int*pl,*p2;a=100;b=10;pl=a;p2=b;printfa=%d\n”,a;printf/,b+2=%d\n,,b+2;printfpl=%x\n”,pl;printfp2二/x\n”,p2;printf*pl=%d\n,*pl;printf C*p2+2==%d\n*,*p2+2;例编写程序,实现从键盘输入两个数,输出时从大到小排列利用指针概念,^include stdio.h void mainint*pl,*p2,*p,a,b;scanf与d,%d”,a,b;p1=a;三种基本结构,其目的是为了解决由许多人共同开发大型软件时,如何高效率地完成可靠系统的问题⑶程序的可读性好、可维护性好成为评价程序质量的首要条件⑷缺点程序和数据结构松散地耦合在一起解决此问题的方法就是采用面向对象的程序设计方法(OOP)▲
四、C程序的基本组成C程序是由若干个函数构成的,至少有一个主函数main,各函数在程序中的前后位置是任意的C程序的基本组成声明区、主程序区、函数定义区
1、声明区处在程序文件的所有函数的外部,一般包含包含头文件、宏定义、类定义、结构体定义、函数声明、全局变量声明、条件编译等
2、主程序区主程序以main函数开始,main函数(主函数)是程序运行时的入口,包含局部变量的声明、函数调用、一般运算、结构控制、对象与结构的处理、文件处理等
3、函数定义区函数的定义包含函数说明和函数体两部分▲
五、C的数据类型、运算符、表达式r整型int r单精度型float实型(浮点型)t双精度型double单字符型char字符型{宽字符型w-char逻辑型bool枚举型类型enum空类型(无值类型)void数据类型〈C数组类型构造类型结构类型struct指针类型联合型类型union类类型class图1C语言数据类型
1、常量和变量⑴、常量在程序中直接用符号(文字)表示的数据■整型常量表示形式有十进制、八进制(以0开头)和十六进制(以()x或0X开头)整型常量可以后缀字母L(或1)表示长整数,后缀字母U(或u)表示无符号整数■实型常量(浮点型常量)表示形式有一般形式和指数形式实型常量缺省为double型,如后缀f或F,则为float型■字符常量用单引号括起来的一个字符不可显示的字符可用转义序列的方法来表p2=b;ifa<b{p=pl;pl=p2;p2=p;printf z,a=%d,b=%d\n,,»a,b;printf,,max=%d,min=%d\n,z,*pl,*p2;
3、指针与数组⑴指针和一维数组数组名代表数组的首地址,是一个常量数组指针就是指向数组元素地址的指针变量例从n个数中找出最大值和最小值见P180⑵指针和二维数组用数组名表示二维数组的行地址数组元素三种形式引用⑴a[i][j]下标法⑵用一维数组名⑶**a+i+j用二维数组名⑶指针数组指针数组数组的所有元素都是存放指针的数组称为指针数组即指针数组中每一个元素下标变量都是指针变量指针数组的定义形式<存储类型〉〈数据类型》〈村旨针数组名>[数组长度]={地址列表}];
4、指针与字符串⑴将字符串的首地址赋给指针,用字符指针变量来处理字符串⑵字符指针变量与字符指针数组字符数组和字符指针变量都能实现字符串的存储与运算,但两者之间还是有区别的,主要包括以下几点
①字符数组由若干元素组成,每个元素存放一个字符;字符指针变量存放的是字符串的首地址
②赋值方式不同不能用赋值语句给字符数组赋值char str
[14];str=love china!M这是错误的字符指针变量可以采用下面的形式赋值:char*p;p:china!”这是正确的但要注意赋给指针变量P的不是字符串,而是字符串的首地址定义一个数组,在编译时分配存放n个元素的存储空间;定义指针变量只分配存放一个地址的空间
5、指针与函数⑴函数指针函数名就代表函数的入口地址函数指针函数的入I I地址称为函数指针即指向函数的指针变量为函数指针函数指针定义格式<存储类型><数据类型>*指针变量名;其中“存储类型”是函数指针本身的存储类型;“数据类型”是指函数返回值的数据类型;例如int*p;定义一个指向整形函数的指针变量P.例求a和b中的最大者程序如下void mainint max;int*p;int a,b,c;p=max;/*函数max入口地址赋给p*/scanf c=*p a,b;printf aa=%d,b=%d,max=%d w,a,b,c;int maxint x,int y{int z;i fxy z=x;else z=y;return z;说明
(1)表示定义一个指向函数的指针变量2在给函数指针变量赋值时,只需给出函数名3用函数指针调用函数时,*p只代替函数名4对指向函数的指针变量,像p+n、p++、p一等运算是无意义的⑵指针函数指针函数返回指针值的函数称为指针函数指针函数定义形式■类型标识符函数名参数表例如int*fl x,y;其中fl为函数名,调用fl后得到一个指向整型数据的指针地址⑶指针作为函数的参数函数的参数传递可以采用地址传递所以指针可作为函数参数当指针作为函数的形参时,实参传递的是地址,在函数中通过地址访问实参,所以,在函数中通过地址对实参的修改影响到实参的值例输入的两个整数按大小顺序输出#includestdio.h swapint*pl,int*p2int temp;temp=*pl;■pl=*p2;*p2=temp;void mainO{int a,b;int*pl,*p2;scanf%d”,a,b;pl=a;p2=b;if abswap pl,p2;printf\n%d,%d\n,/,a,b;运行结果1,2/2,
16、指向指针的指针指向指针的指针:用来存放指针变量的地址的变量就称为指向指针变量的指针变量有的教材又称为二级指针变量定义格式〈类型标识符**变量名;
十二、结构体、共用体、枚举
1、结构体结构体是用户自定义的新数据类型,在结构体中可以包含若干个不同数据类型和不同意义的数据项当然也可以相同,从而使这些数据项组合起来反映某一个信息⑴、定义一个结构体类型的一般形式为struct结构体名数据类型成员名1;数据类型成员名2;•*数据类型成员名n;;例如定义一个职工worker结构体如下struct worker{long number;char name
[20];char sex;〃sex是成员名int age;float salary;char address
[80];char phone
[20];};〃注意分号不要省略int sex=10;〃sex是变量名⑵、结构体类型变量的定义方法■先定义结构体类型再定义变量名slrucl结构体名变量名■在定义结构体类型的同时定义变量
3、结构体变量的使用形式和初始化■结构体变量的使用形式结构体变量名.成员名■结构体变量的初始化struct结构体名变量名={初始数据表};StlUCt结构体名{成员列表;}变量名:{初始数据表};
2、共用体
(1)、共用体的概念在C语言中,不同数据类型的数据可以使用共同的存储区域,这种数据构造类型称为共用体,简称共用,又称联合体⑵、定义一个共用体类型的一般形式为union共用体名{成员列表;};
3、枚举⑴、枚举的概念枚举就是指将某一变量所有可能的取值一一列举出来
(2)、枚举的定义enum枚举类型名{枚举元素表}枚举变量名
(3)、枚举变量的定义■在定义枚举类型的同时,定义枚举类型的变量■已定义过的枚举数据类型定义枚举变量,格式为enum枚举名称变量名表
十三、编译预处理所谓编译预处理是指,在对源程序进行编译之前,先对源程序中的编译预处理命令进行处理;然后再将处理的结果,和源程序一起进行编译,以得到目标代码
1、宏定义与符号常量在C/C语言中,“宏”分为无参数的宏(简称无参宏)和有参数的宏(简称有参宏)两种
(1)、无参宏定义■无参宏定义的一般格式define标识符语言符号字符串其中“define”为宏定义命令;“标识符”为所定义的宏名,通常用大写字母表示,以便于与变量区别;“语言符号字符串”可以是常数、表达式、格式串等■使用宏定义的优点
①可提高源程序的可维护性
②可提高源程序的可移植性
③减少源程序中重复书写字符串的工作量■说明
①宏名一般用大写字母表示,以示与变量区别但这并非是规定
②宏定义不是C语句,所以不能在行尾加分号
③宏定义命令#define出现在函数的外部,宏名的有效范围是从定义命令之后,到本文件结束通常,宏定义命令放在文件开头处
(2)、符号常量在定义无参宏时,如果“语言符号字符串”是一个常量,则相应的“宏名”就是一个符号常量恰当命名的符号常量,除具有宏定义的上述优点外,还能表达出它所代表常量的实际含义,从而增强程序的可读性⑶、有参宏定义■带参宏定义的一般格式define宏名(形参表)语言符号字符串■带参宏的调用和宏展开
①调用格式宏名(实参表)
②宏展开用宏调用提供的实参字符串,直接置换宏定义命令行中、相应形参字符串,非形参字符保持不变■说明
①定义有参宏时,宏名与左圆括号之间不能留有空格否则,C编译系统将空格以后的所有字符均作为替代字符串,而将该宏视为无参宏
②有参宏的展开,只是将实参作为字符串,简单地置换形参字符串,而不做任何语法检查在定义有参宏时,在所有形参外和整个字符串外,均加一对圆括号
③虽然有参宏与有参函数确实有相似之处,但不同之处更多,主要有以下儿个方面■调用有参函数时,是先求出实参的值,然后再复制一份给形参而展开有参宏时,只是将实参简单地置换形参■在有参函数中,形参是有类型的,所以要求实参的类型与其一致;而在有参宏中,形参是没有类型信息的,因此用于置换的实参,什么类型都可以有时,可利用有参宏的这一特性,实现通用函数功能■使用有参函数,无论调用多少次,都不会使目标程序变长,但每次调用都要占用系统时间进行调用现场保护和现场恢复;而使用有参宏,由于宏展开是在编译时进行的,所以不占运行时间,但是每引用1次,都会使目标程序增大1次
2、文件包含⑴、文件包含的概念文件包含是指,一个源文件可以将另一个源文件的全部内容包含进来
(2).文件包含处理命令的格式#include”包含文件名”或#include<包含文件名)两种格式的区别仅在于
①使用双引号系统首先到当前目录下查找被包含文件,如果没找到,再到系统指定的“包含文件目录”(由用户在配置环境时设置)去查找
②使用尖括号直接到系统指定的“包含文件目录”去查找一般地说,使用双引号比较保险
(3).文件包含的优点一个大程序,通常分为多个模块,并由多个程序员分别编程有了文件包含处理功能,就可以将多个模块共用的数据(如符号常量和数据结构)或函数,集中到一个单独的文件中这样,凡是要使用其中数据或调用其中函数的程序员,只要使用文件包含处理功能,将所需文件包含进来即可,不必再重复定义它们,从而减少重复劳动
(4).说明
①编译预处理时,预处理程序将查找指定的被包含文件,并将其复制到^include命令出现的位置上
②常用在文件头部的被包含文件,称为“标题文件”或“头部文件”,常以“h(head)作为后缀,简称头文件在头文件中,除可包含宏定义外,还可包含外部变量定义、结构类型定义等
③一条包含命令,只能指定一个被包含文件如果要包含n个文件,则要用n条包含命令
④文件包含可以嵌套,即被包含文件中又包含另一个文件
3、条件编译根据一定的条件编译源文件的部分语句⑴、#ifdef标识符程序段1#else程序段2#endif⑵、#ifndef标识符程序段1#else程序段2ttendif⑶、#if常量表达式1程序段1#elif常量表达式2程序段2#elif常量表达式n程序段n#else程序段n+1#endif
十四、文件
1、文件指针文件指针C语言系统对文件的操作必须通过一个指向“FILE类型”的指针来实现,我们称这种指针为“文件指针二
2、文件位置指针C语言规定每一个文件都必须设置一个位置指针(文件指针)来控制文件的访问位置,其规律如下♦文件打开时指针自动指向文件的开始位置;♦每读取一个单元内容文件位置指针自动顺序向后移动一定的偏移量(该偏移量的字节数由所读取单元的数据类型决定);♦读到文件的结尾,则文件的位置指针指向一个特殊的位置一一EOFo♦对文件进行顺序写操作时,数据写入到文件位置指针所指向的位置写入后文件位置指针自动向后移动到一个新的位置,等待下一次的写入操作♦可将文件位置指针移动到任何位置.,实现对■文件的随机读写访问
3、文件的打开---打开文件函数fopenO打开文件使用fopcnO函数实现打开文件格式为FILE*fp;fp=fopen(文件名,使用方式);文件名为包含访问路径的文件名字符串
4、关闭文件函数fcloseO文件操作结束前,必须关闭文件执行关闭文件操作时,系统会对文件缓冲区中的数据写入文件,并释放文件指针指向的存放文件信息结构体的内存资源否则可能会引发数据的丢失关闭文件使用fcloseO函数格式如下fclosc文件指针;其中的“文件指针”参数,就是保存打开文件操作时fopen函数返回值的FILE指针变量
5、文件读写操作应用实例例打开一个由键盘输入名字的文本文件,并为它写入一些用户输入的字符-include stdio.h#include stdlib.h voidmainFILE*fp;charch,filename
[10];printf^Please inputthe filename:;/*输Hl提示信息*/scanf filename;/*输入要打开的文件名*/i ffp二fopen filename/V==NULL/*打开文件操作失败*/printfcannot openfilen;exit0;/*终止程序*/ch=getchar;/*接收在执行scanf语句时最后输入的回车符*/printf Pleaseinput dataCto stopinput:\n,z;/*输出提示信息*/ch=getchar;/*接受第一个有效字符*/whi lech!=,#{fputcch,fp;/*输出到文件*/putchar ch;/*将字符显示到屏幕*/ch=getchar;putchar10;/*向屏幕输出一个换行符*/fclosefp;/*关闭文件*/getchO;
十五、其他
1、类型定义typedef的使用用typedef定义新的类型名代替已有的类型名⑴、格式typedef数据类型新的名称
2、类型定义一般为大写,与原来的数据类型关键相区别
3、类型定义只是给已存在的数据类型增加一个类型名,并没有创造一个新的数据类型注标有符号者重点掌握内容附录资料:不需要的可以自行删除Abstract:Based onthe comprehensiveanalysis onthe plasticparts structureservice requirement,mounding qualityand mouldmenu factoringcost.A correspondinginjection mouldof internalside corepulling wasdesigned.By adoptingthe multi-direction andmulti-combination core-pulling.A correspondinginjection mouldof internalside corepulling wasdesigned,the workingprocess ofthe mould was introducedC语言详解一枚举类型注以下全部代码的执行环境为VC++
6.0在程序中,可能需要为某些整数定义一个别名,我们可以利用预处理指令#deEne来完成这项工作,您的代码可能是#define MONI#define TUE2#define WED3#defineTHU4#define FRI5#define SAT6#dcfine SUN7在此,我们定义一种新的数据类型,希望它能完成同样的工作这种新的数据类型叫枚举型
1.定义一种新的数据类型-枚举型以下代码定义了这种新的数据类型一枚举型cnum DAYMON=I,TUE,WED,THU,FRI,SAT,SUN;1枚举型是一个集合,集合中的元素枚举成员是一些命名的整型常量,元素之间用逗号,隔开2DAY是一个标识符,可以看成这个集合的名字,是一个可选项,即是可有可无的项3第一个枚举成员的默认值为整型的0,后续枚举成员的值在前一个成员.匕加14可以人为设定枚举成员的值,从而自定义某个范围内的整数5枚举型是预处理指令#define的替代6类型定义以分号;结束
2.使用枚举类型对变量进行声明新的数据类型定义完成后,它就可以使用了我们已经见过最基本的数据类型,如整型in1,单精度浮点型float,双精度浮点型double,字符型char,短整型short等等用这些基本数据类型声明变量通常是这样:char a;〃变量a的类型均为字符型char charletter;int x,y,z;〃变量x,y和z的类型均为整型int intnumber;double m,n;double result;〃变量result的类型为双精度浮点型double既然枚举也是一种数据类型,那么它和基本数据类型一样也可以对变量进行声明方法一枚举类型的定义和变量的声明分开enum DAYMON=1,TUE,WED,THU,FRI,SAT,SUN};enum DAYyesterday;enum DAYtoday;enum DAYtomorrow;〃变量tomorrow的类型为枚举型enum DAYenum DAYgood_day,bad_day;〃变量good_day和bad_day的类型均为枚举型enum DAY方法二类型定义与变量声明同时进行enum//跟第一个定义不同的是,此处的标号DAY省略,这是允许的Saturday,sunday=0,monday,tuesday,Wednesday,thursday,friday}workday;//变量workday的类型为枚举型enum DAYenum week{Mon=l,Tue,Wed,Thu,Fri Sat,Sun}days;〃变量days的类型为枚举型enum weekenum BOOLEAN{false,true}end_flag,match_flag;〃定义枚举类型并声明了两个枚举型变量方法三用typede「关键字将枚举类型定义成别名,并利用该别名进行变量声明typedef enum workdaySaturday,sunday=0,monday,tuesday,Wednesday,thursday,friday workday;//此处的workday为枚举型enum workday的别名workday today,tomorrow;〃变量today和tomorrow的类型为枚举型workday,也即enum workdayenum workday中的workday可以省略typedef enumSaturday,sunday=0,monday,tuesday,Wednesday,thursday,friday workday;//此处的workday为枚举型enum workday的别名workday today,tomorrow;〃变最today和tomorrow的类型为枚举型workday,也即enum workday也可以用这种方式typedef enumworkdaySaturday,sunday=0,monday,tuesday,Wednesday,thursday,friday};workday today,tomorrow;〃变量today和tomorrow的类型为枚举型workday,也即enumworkday注意同一个程序中不能定义同名的枚举类型,不同的枚举类型中也不能存在同名的命名常量错误示例如下所示错误声明•存在同名的枚举类型typedef enum示(见P%)■字符串常量用双引号括起来的字符序列■布尔常量false,true■符号常量◊^define宏名常数例下列哪些常量是合法的常量
①
12.7,
②-
6.87E-2,
③OXAbCD,
④、0625L,
⑤87U,
⑥-0x98C2⑵变量指程序在运行时其值可改变的量■变量应先定义(声明其类型和名称)后使用;■变量定义的一般形式为♦数据类型〈变名1,变名2,…,变名n;■在定义一个变量的同时,也可以给它赋以初值■变量的命名规则(见巴)
2、数据类型⑴、基本数据类型(见P23)
(2)、构造类型又称为组合类型,它是由基本类型按照某种规则组合而成的■数组是由具有相同数据类型的元素组成的集合■结构体是由不同的数据类型构成的一种混合的数据结构,构成结构体的成员的数据类型一般不同,并且在内存中分别占据不同的存储单元■共用体是类似于结构体的一种构造类型,与结构体不同的是构成共同体的数据成员共用同一段内存单元■枚举是将变量的值一一列举出来,变量的值只限于列举出来的值的范围内
(3)、指针类型变量用于存储另•变量的地址,而不能用来存放基本类型的数据它在内存中占据一个存储单元
(4)、类是一个数据类型,它定义的是一种对象类型,由数据和方法组成,描述了属于该类型的所有对象的性质
3、运算符和表达式⑴、算术运算符和算术表达式注意ini i=l.2*3;〃结果为3,而不是
3.6int i=5/3结果为1
(2)、赋值运算符和赋值表达式注意■赋值运算符的结合性是从右至左的■复合赋值运算符int a=12;a+=a-=a*=a;
(3)、关系运算符和关系表达式注意■关系运算符的优先级低于算术运算符例如a+bc等价于(a+b)c,a!=bc等价于a!=(bc)■“二”与“二二”的区别■关系运算符的优先级低于•算术运算符
(4)、逻辑运算符与逻辑表达式注意■逻辑非的优先级最高,逻辑与次之,逻辑或最低■逻辑运算符的短路特性int x,y,z;x=y=z=-l;++x++y I|++z;printf(x二%d\ty二%d\tz=%d\n”,x,y,z);(结果0T0)x=y=z=-l;++x||++y++z;printf(“x=%d\ty=%d\tz=%d\n”,x,y,z);(结果00Wednesday,thursday,friday}workday;typedef enumWEEKSaturday,sunday=0,monday,}workday;错误声明二存在同名的枚举成员typcdcf cnumWednesday,thursday,friday}workday」;typcdcf cnumWEEKWednesday,sunday=0,inonday,workday_2;
3.使用枚举类型的变量
3.1对枚举型的变量赋值实例将枚举类型的赋值与基本数据类型的赋值进行了对比:方法一先声明变量,再对变量赋值#includestdio.h/*定义枚举类型*/enum DAY{MON=1,TUE,WED,THU,FRL SAT,SUN};voidmain/*使用基本数据类型声明变量,然后对变量赋值*/int x,y,z;x=10;y=20;z=30;/*使用枚举类型声明变量,再对枚举型变量赋值*/cnum DAYyesterday,today,tomorrow;yesterday=MON;today=TUE;tomorrow=WED;printf%d%d%d\n\yesterday,today,tomorrow;方法二声明变量的同时赋初值#include stdio.h/*定义枚举类型*/enum DAY{MON=1,TUE,WED,THU,FRI.SAT,SUN};voidmain/*使用基本数据类型声明变量同时对变量赋初值*/int x=10,y=20,z=30;/*使用枚举类型声明变量同时对枚举型变量赋初值*/enum DAYyesterday=MON,today=TUE,tomorrow=WED;printf%d%d%d\n,yesterday,today,tomorrow;I方法三定义类型的同时声明变量,然后对变量赋值#include stdio.h/*定义枚举类型,同时声明该类型的三个变量,它们都为全局变量*/enum DAY{MON=1,TUE,WED,THU,FRL SAT,SUN}yesterday,today,tomorrow;/*定义三个具有基本数据类型的变量,它们都为全局变量*/intx,y,z;void inain/*对基本数据类型的变量赋值*/x=10;y=20;z=30;/*对枚举型的变景赋值*/yesterday=MON;today=TUE;tomorrow=WED;printf%d%d%d\n,x,y,z;//输出:102030printf%d%d%d\n,yesterday,today,tomorrow;〃输出123方法四类型定义,变量声明,赋初值同时进行#include stdio.h/*定义枚举类型,同时声明该类型的三个变量,并赋初值它们都为全局变量*/enum DAYMON=1,TUE,WED,THU,FRI,SAT,SUNyesterday=MON,today=TUE,tomorrow=WED;/*定义三个具有基本数据类型的变量,并赋初值它们都为全局变量*/intx=10,y=20,z=30;voidmain|printf%d%d%d\n,x,y,z;〃输出102030printf%d%d%d\n\yesterday,today,tomorrow;//®j出123}
3.2对枚举型的变量赋整数值时,需要进行类型转换#include stdio.h enum DAY{MON”TUE,WED,THU,FRI,SAT,SUN;void inainenum DAYyesterday,today,tomorrow;yesterday=TUE;today=enum DAYyesterday+1;〃类型转换tomorrow=enumDAY30;〃类型转换//tomorrow=3;〃错误printf%d%d%d\n,yesterday,today,tomorrow;〃输出:2330I
3.3使用枚举型变量#includestdio.h enumBELL=\a,BACKSPACE=\b,HTAB=\t;RETURN=T,NEWLINE=\n,VTAB=\v\SPACE=;enum BOOLEAN{FALSE=0,TRUEmatch_flag;voidmainint index=0;int couni_o匚lelter=0;int count_oLspace=0;char str[l=Im Elyefod;match_flag=FALSE;for;str[index]!=IO;index++if SPACE!=str[index]count_of_letter++;else match_flag=enum BOOLEAN1;count_oCspace++;printf%s%d times%c,match_flagmatch:not match,count_of_space,NEWLINE;printfcount of letters:%d%c%c\count_of_letter,NEWLINE,RETURN;输出match2times countofletters:10Press anykey tocontinue
4.枚举类型与sizeof运算符#include stdio.h enumescapesBELL=\a,BACKSPACE=\b,HTAB=*,RETURN=V,NEWLINE=\n\VTAB=\v,SPACE=;enum BOOLEAN{FALSE=0,TRUEmatch_flag;voidmainprintf%d bytes\n,sizeofenum escapes;//4bytes printf%d bytes\n,sizeofescapes;//4bytes printf%d bytes\n,sizeofenum BOOLEAN;//4bytes printf%d bytes\n,sizeofBOOLEAN;//4bytes printf%d bytes\n\sizeofmatch_flag;//4bytes printf%d bytes\n,sizeofSPACE;//4bytes primf%d bytes\n\sizeofNEWLINE;//4bytes printf%d bytes\n,sizeofFALSE;//4bytes printf%d bytes\n\sizeof0;//4bytes
5.综合举例#inckidcstdio.h enumSeasonspring,summer100,fall=96,winter;typcdcf cnumMonday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday IWeekday;voidmain/*Season*/printf%d\n,spring;//0pnntf%d,%c\n\summer,summer;//100,d printf%d\n,fall+winter;//193Season mySeason=winter;ifwintcr==myScason printfmySeason is winter\n;//mySeasoniswinter intx=IOO;ifx==summer printfx is equal to summer\n;//xisequaltosummer printf%d bytes\n\sizeofspring;//4bytes/*Weekday*/printfsizeof Weekdayis:%d\n,sizeofWeekday;Z/sizeof Weekdayis:4Weekday today=Saturday;Weekday tomorrow;if today==Monday tomorrow=Tuesday;else tomorrow=Weekday today+1;//remember toconvert fromint toWeekday-1x=y=z=T;++x++y++z;printf ax=%d\ty=%d\tz=%d\nn,x,y,z;结果0-1-
15、自增++、自减-运算符注意自增++、自减-运算符的前置用法和后置用法的区别int i,j,k;int m,n,p;i=8;j=10;k=12;/*自增在操作数之前*/m=++i;printf*i=%d\n w,i;printf*m=%d\n”,m;结果:99/*自减在操作数之后*/n=j―;printf*j=%d\n*»j;printf*n=%d\n*»n;结果:910/*自增、自减的混合运算*/p=++m*n+++一k;printf*k=%d\n”,k;printf*p=%d\n*,p;结果
111116、条件运算符表达式1表达式2表达式3注意■结合性是自右向左aba:cdc:d相当于aba:cdc:d■条件运算符的优先级别高于赋值运算符,低于关系运算符和算术运算符如aba-b:b-a相当于aba-b:b-a
7、位运算符位运算符是对其操作数按其二进制形式逐位进行运算,参加位运算的操作数必须为整数如int a=5,b=6;ab=4;a|b=7:ab=3;^b=249;b«2=28;b»2=1o
204、运算符的优先级与结合性⑴、所谓结合性是指,当一个操作数两侧的运算符具有相同的优先级时,该操作数是先与左边的运算符结合,还是先与右边的运算符结合自左至右的结合方向,称为左结合性反之,称为右结合性结合性是C语言的独有概念除单目运算符、赋值运算符和条件运算符是右结合性外,其它运算符都是左结合性
2、表达式求值■按运算符的优先级高低次序执行例如,先乘除后加减■如果在一个运算对象或称操作数两侧的运算符的优先级相同,则按C语言规定的结合方向结合性进行例如,算术运算符的结合方向是“自左至右”,即在执行“a-b+c”时,变量b先与减号结合,执行“a-b”;然后再执行加c的运算▲
六、顺序结构程序设计一一数据的输入和输出
1、格式化输出----printfO函数和格式化输入------scanf函数⑴、格式化输出函数printfO和格式化输入函数scanfO都包含在头文件“stdio.h”中⑵、格式化输出---printfO函数■printfO函数的一般格式如下printf格式字符串”输出项表];如printf(ax=%dw,x)输出项表要输出的数据项(可以没有,多个时以“,”分隔)■格式控制用包含两种信息格式说明机修饰符]格式字符,用于指定输出格式普通字符或转义序列原样输出■格式控制字符格式转换字符含义举例%d,%i以十进制整数输出int a=65;printf,a//65%x,%X以十六进制数输出无符号整数int a=65;printf a%x w,a//41%o以八进制数输出无符号整数int a=65;printf,a//101%u以十进制数输出无符号整数int a=-l;printf w%u n,a//65535%c输出一个字符型数据inta=65;printf,a//A%s输出一个字符串printf$s”,“abed”%e,%E以指数形式输出一个浮点型数据float x=
984.235497426;(小数位数缺省值为6位)printfC%e,x;//
9.842355e+002%f以十进制小数形式输出一个浮点型float x=
984.235432426;数据(小数位数缺省值为6位)printfC%r,x;//
984.235413%g,%G按照%e*f输出宽度较短的格式输float x=
9.8;出,不输出无意义的0printfx;//
9.8
(3)、格式化输入-scan「()函数scanf()函数的一般格式scanf(格式字符串〃,输入项首地址表);■格式字符串格式字符串可以包含3种类型的字符格式指示符、空白字符(空格、Tab键和回车键)和非空白字符(又称普通字符)格式指示符与printfO函数的相似,空白字符作为相邻2个输入数据的缺省分隔符,非空白字符在输入有效数据时,必须原样一起输入■输入项首地址表一由若干个输入项首地址组成,相邻2个输入项首地址之间,用逗号分开输入项首地址表中的地址,可以是变量的首地址,也可以是字符数组名或指针变量变量首地址的表示方法变量名其中是地址运算符■数据输入操作如果相邻2个格式指示符之间,不指定数据分隔符(如逗号、冒号等),则相应的2个输入数据之间,至少用一个空格分开,或者用Tab键分开,或者输入1个数据后,按回车,然后再输入下1个数据例如,scanf ftnuml,num2);假设给numl输入12,给num2输入36,则正确的输入操作为12036/或者12/36/注使用符号表示按回车键操作,在输入数据操作中的作用是,通知系统输入操作结束◊“格式字符串”中出现的普通字符(包括转义字符形式的字符),务必原样输入例如,scanf(,z%d,%d,,»numl,num2);假设给numl输入12,给num2输入36,正确的输入操作为12,36/▲
七、选择结构程序设计
1、if语句
(1)、if语句的一般格式if(表达式){语句组1;}[else{语句组2;}]■if语句中的“表达式”必须用“(”和“)”括起来■else子句(可选)是if语句的一部分,必须与if配对使用,不能单独使用■当if和else下面的语句组,仅由一条语句构成时,也可不使用复合语句形式(即去掉花括号)
(2)、if语句的执行过程■缺省else子句时■当“表达式”的值不等于()(即判定为“逻辑真”)时.,则执行语句组1,否则直接转向执行下一条■指定else子句时■当“表达式”的值不等于0(即判定为“逻辑真”)时,则执行语句组1,然后转向下一条语句;否则,执行语句组2⑶、if语句的嵌套与嵌套匹配原则■if语句允许嵌套所谓if语句的嵌套是指,在“语句组1”或(和)“语句组2”中,又包含有if语句的情况■if语句嵌套时,else子句与if的匹配原则与在它上面、距它最近、且尚未匹配的if配对例铁路托运行李,假设每张车票可按每公斤
0.5元托运50公斤以内的行李,如果超过50公斤时,超过的部分每公斤加价
0.3元,试编写一道计算行李托运费的程序解/*程序功能计算行李托运费*/include stdio.h VoidmainO(float w,x;printf(〃输入行李的重量:〃);scanfw);if(w
50.0)x=
50.0*().5+(w-
50.0)*
0.8;else x=w*
0.5;printf(行李重量w=%.2f公斤,托运费x=%.2f元\n”,w,x);)
2.switch语句⑴、switch语句的一般形式switch(表达式){case常量表达式1语句组;break;case常量表达式2语句组;break;case常量表达式n语句组;break;[default语句组[break;]])⑵、执行过程■当switch后面“表达式”的值,与某个case后面的“常量表达式”的值相同时,就执行该case后面的语句组当执行到break语句时,跳出switch语句,转向执行switch语句的下一条■如果没有任何一个case后面的“常量表达式”的值,与“表达式”的值匹配,则执行default后面的语句组然后,再执行switch语句的下一条⑶说明■switch后面的“表达式”,可以是int、char和枚举型中的一种■每个case后面“常量表达式”的值,必须各不相同,否则会出现相互矛盾的现象即对表达式的同一值,有两种或两种以上的执行方案■case后面的常量表达式仅起语句标号作用,并不进行条件判断,系统一旦找到入口标号,就从此标号开始执行,不再进行标号判断,所以必须加上break语句,以便结束switch语句■各case及default子句的先后次序,不影响程序执行结果■多个case子句,可共用同一语句组■用switch语句实现的多分支结构程序,完全可以用if语句或if语句的嵌套来实现例从键盘上输入一个百分制成绩score,按下列原则输出其等级score290,等级为A;80^score90,等级为B;70^score80,等级为C;60^score70,等级为D;score60,等级为Eo解^include stdio.h Voidmain{int score,grade;printf MInputa score0^100:;scanf“%d”,scoro;grade=score/10;/*将成绩整除10,转化成switch语句中的case标号*/switch grade{case10:case9:printf grade=A\n;break;case8:printfgrade=B\n;break;case7:printfgrade=C\n;break;case6:printfgrade;Dn;break;case5:case4:case3:case2:case1:case0:printf ugrade=E\n w;break;default:printf Thescore isout ofrange!\nM;▲
八、循环程序设计
1、while语句⑴、一般格式while(循环继续条件){循环体语句组;}
(2)、执行过程
①求解循环继续条件”表达式如果其值为非0,转
②;否则转
③②执行循环体语句组,然后转
①③执行while语句的下一条例/*程序功能求1〜100的累计和*/#include stdio.h voidmainO{int i=l,sum=0;/*初始化循环控制变量i和累计器sum*/while(i=100){sum+=i;/*实现累加*/i++;/*循环控制变量i增1*/}printf(rtsum=%d\n w,sum);}程序运行情况如下sum=
50502、do-while语句(直到型循环)⑴、一般格式do(循环体语句组;}while(循环继续条件);/*本行的分号不能缺省*/当循环体语句组仅由•条语句构成时,可以不使用复合语句形式
(2)、执行过程
①执行循环体语句组
②计算“循环继续条件”表达式如果“循环继续条件”表达式的值为非0(真),则转向
①继续执行;否则,转向
③③执行do-whilc的下一条语句⑶、d-while循环语句的特点是先执行循环体语句组,然后再判断循环条件do-while语句比较适用于处理不论条件是否成立,先执行1次循环体语句组的情况例用do-wh i1e语句求解1〜1()0的累计和/*程序功能求1~100的累计和*/main(){inti=l,sum=0;/*定义并初始化循环控制变量,以及累计器*/Do(sum+=i;/*累加*/i++;)while(i=100);/*循环继续条件i=100*/printf(sum=%d\n,sum);)
3、for语句⑴、for语句的一般格式for([变量赋初值]:[循环继续条件];[循环变量增值])(循环体语句组;}⑵、for语句的执行过程
①求解”变量赋初值”表达式
②求解“循环继续条件”表达式如果其值非0,执行
③否则,转至
④③执行循环体语句组,并求解“循环变量增值”表达式,然后转向
②④执行for语句的下一条语句⑶、说明
①“变量赋初值”、“循环继续条件”和“循环变量增值”部分均可缺省,甚至全部缺省,但其间的分号不能省略
②当循环体语句组仅由一条语句构成时,可以不使用复合语句形式
③“循环变量赋初值”表达式,既可以是给循环变量赋初值的赋值表达式,也可以是与此无关的其它表达式如逗号表达式例如,for sum=0;i=100;i++sum+=i;forsum=0,i=l;i=100;i++sum+=i;
1204、循环的比较1^While和for都是先判断后循环,而do-while是先循后判断即do-while语句在条件不成立时循环体也要被执行一次⑵、while和do-while语句的条件表达式只有一个,只起到控制循环结束的作用,循环变量的初值等都用其他语句完成;for语句则有3个表达式,不仅能起到控制循环结束的作用,还可给循环变量赋初值
5、循环的嵌套⑴、循环语句的循环体内,又包含另一个完整的循环结构,称为循环的嵌套循环嵌套的概念,对所有高级语言都是一样的⑵、for语句和while语句允许嵌套,dorvhile语句也不例外例编程打印下列图形*************************。