C语言-全国计算机等级考试2级-所有教程最全_第1页
C语言-全国计算机等级考试2级-所有教程最全_第2页
C语言-全国计算机等级考试2级-所有教程最全_第3页
C语言-全国计算机等级考试2级-所有教程最全_第4页
C语言-全国计算机等级考试2级-所有教程最全_第5页
已阅读5页,还剩183页未读 继续免费阅读

下载本文档

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

文档简介

全国计算机

等级考试二级教程

——C语言程序设计培训讲座辛建军3/14/202412012年计算机等级考试二级C考试大纲◆根本要求

1.熟悉VisualC++6.0集成开发环境。

2.掌握结构化程序设计的方法,具有良好的程序设计风格。

3.掌握程序设计中简单的数据结构和算法并能阅读简单的程序。

4.在VisualC++6.0集成环境下,能够编写简单的C程序,并具有根本的纠错和调试程序的能力。3/14/20242考试方式1.笔试:90分钟,总分值100分,其中含公共根底知识局部的30分。

2.上机:90分钟,总分值100分

3.上机操作包括:

〔1〕填空。

〔2〕改错。

〔3〕编程。3/14/20243考试内容,如下表

3/14/20244考试内容,如下表

3/14/20245考试要点总结3/14/20246第1章程序设计根本概念第9章数组第2章C的初步知识第10章字符串第3章顺序结构第11章对函数的进一步讨论第4章选择结构第12章作用域和存储类别第5章循环结构第13章编译预处理和动态存储分配第6章字符型数据第14章结构体、共用体和用户定义类型第7章函数第15章位运算第8章地址和指针第16章文件内容导航3/14/20247第1章程序设计根本概念1.1程序和程序设计

程序

连续执行的一条条指令的集合称为“程序”。计算机并不能直接识别由高级语言编写的程序,它只能接受和处理由0和1的代码构成的二进制指令或数据。这种形式的指令称为“机器语言”。

每条C语句,经过编译(Compile)最终都将转换成二进制的机器指令。由C语言构成的指令序列称为C源程序。C源程序经过C编译程序编译之后生成一个后缀为.OBJ的二进制文件(称为目标文件),然后由“连接程序”(Link),把此.OBJ文件与C语言提供的各种库函数连接起来生成一个后缀为.EXE的可执行文件。在操作系统环境下,只需点击或输入此文件的名字(而不必输入后缀.EXE),该可执行文件就可运行。

程序设计

简单的程序设计一般包含以下几个局部:确定数据结构、确定算法、编码、在计算机上调试程序、整理并写出文档资料。3/14/20248【例题分析】

〔2007.4试题〕以下表达中错误的选项是(D)

A〕计算机不能直接执行用C语言编写的源程序

B〕C程序经C编译程序编译后,生成后缀为.obj的文件是一个二进制文件

C〕后缀为.obj的文件,经连接程序生成后缀为.exe的文件是一个二进制文件

D〕后缀为.obj和.exe的二进制文件都可以直接运行

〔2009.9试题〕以下表达中正确的选项是(D)

A〕程序设计的任务就是编写程序代码并上机调试

B〕程序设计的任务就是确定所用数据结构

C〕程序设计的任务就是确定所用算法

D〕以上三种说法都不完整3/14/202491.2算法

学习计算机程序设计语言的目的,是要用语言作为工具,设计出可供计算机运行的程序。有了一个好的算法,就可以用任何一种计算机高级语言把算法转换为程序(编写程序)。算法是指为解决某个特定问题而采取确实定且有限的步骤。一个算法应当具有以下五个特性:有穷性、确定性、可行性、有零个或多个输入、有一个或多个输出。

算法可以用各种描述方法来进行描述,最常用的是伪代码、流程图和N-S流程图。

3/14/202410【例题分析】〔习题〕以下那一个不是算法的特性()

A〕有穷性B〕唯一性C〕确定性D〕可行性3/14/2024111.3结构化程序设计和模块结构

结构化程序

结构化程序由三种根本结构组成:顺序结构、选择结构、循环结构。

模块化结构

3/14/202412以下选项中关于程序模块化的表达错误的选项是______。A)把程序分成假设干相对独立的模块,便于编码和调试B)把程序分成假设干相对独立、功能单一的模块,可便于重复使用这些模块C)可采用自底向上、逐步细化的设计方法把假设干独立模块组装成所要求的程序D)可采用自顶向下、逐步细化的设计方法把假设干独立模块组装成所要求的程序【例题分析】3/14/202413第2章C程序设计的初步知识2.1认识C程序例2.1第一个程序Hello,World!/*example2.1ThefirstCProgram*/#include<stdio.h>main(){printf(“Hello,World!”);}输出:Hello,World!注释编译预处理函数语句3/14/202414例2.2求矩形的面积。#include<stdio.h>/*Thisisthemainprogram*/main(){doublea,b,area;a=1.2;b=3.6;area=a*b;

printf(”area=%f\n",area);}语句>3/14/202415格式特点习惯用小写字母,大小写敏感不使用行号,无程序行概念可使用空行和空格常用锯齿形书写格式<>main(){

……………….………………

…………..…………..

……………….

………………………….

……………….………………..}#include<stdio.h>

main(){

inti,j,sum;sum=0;for(i=1;i<10;i++){for(j=1;j<10;j++){sum+=i*j;}}printf(“%d\n”,sum);}优秀程序员的素质之一:使用TAB缩进{}对齐有足够的注释有适宜的空行3/14/202416结构特点函数与主函数程序由一个或多个函数组成必须有且只能有一个主函数main()程序执行从main开始,在main中结束,其它函数通过嵌套调用得以执行。程序语句C程序由语句组成用“;”作为语句终止符注释/**/为注释,不能嵌套不产生编译代码<>例:/*Thisisthemain/*ofexample1.1*/*/非法编译预处理命令#include<stdio.h>3/14/202417知识点

1、C语言由函数组成,有且仅有一个主函数--main(),一个程序总是从主函数开始执行;

2、C语言的语句由“;”结束,书写格式自由,一行可写多个语句,一个语句可分多行书写;

3、C程序是大小写敏感的〔严格区分字母大小写〕;4、C程序的文件扩展名必须是.c;5、C语言的两种注释方式://行尾注释或/*块注释*/;6、使用输入/出库函数时需在预处理命令中包含stdio.h头文件;7、要求熟记本章中出现的几种定界符:<>、""、;、()、\n、//等;3/14/202418【例题分析】〔2010.3试题〕以下表达正确的选项是(B)

A〕C语言程序是由过程和函数组成的

B〕C语言函数可以嵌套调用的,例如:fun(fun(x))

C〕C语言函数不可以单独编译

D〕C语言中除了main函数,其他函数不可作为单独文件形式存在

〔2008.4试题〕以下表达中正确的选项是(C)

A)C程序中的注释只能出现在程序的开始位置和语句的后面

B)C程序书写格式严格,要求一行内只能写一个语句

C)C程序书写格式自由,一个语句可以写在多行上

D)用C语言编写的程序只能放在一个程序文件中3/14/2024192.2标识符、常量和变量定义:用来标识变量、常量、函数等的字符序列组成:只能由字母、数字、下划线组成,且第一个字母必须是字母或下划线大小写敏感不能使用关键字长度:最长32个字符命名原那么:见名知意不宜混淆如l与I,o与0例:判断以下标识符号合法性sumSumM.D.JohndayDate3daysstudent_name#33lotus_1_2_3chara>b_above$123<>3days#33char$123a>b

3/14/202420一般用大写字母是宏定义预处理命令,不是C语句如#definePRICE30定义:程序运行时其值不能改变的量〔即常数〕分类:符号常量:用标识符代表常量定义格式:#define符号常量常量<>例符号常量举例(ch2_1.c)#definePRICE30main(){intnum,total;num=10;total=num*PRICE;printf("total=%d",total);}运行结果:total=300常量常量与变量3/14/202421编译程序根据变量定义为其分配指定字节的内存单元…...地址inta=1,b=-3,c;abc2字节2字节2字节地址地址…...内存1-3

随机数概念:其值可以改变的量变量名与变量值变量定义的一般格式:

数据类型变量1[,变量2,…,变量n];变量初始化:定义时赋初值例:inta,b,c;floatdata;决定分配字节数和数的表示范围合法标识符例:inta=2,b,c=4;floatdata=3.67;charch=‘A’;intx=1,y=1,z=1;

intx=y=z=1;变量的使用:先定义,后使用例1intstudent;stadent=19;//Undefinedsymbol‘stadent’infunctionmain

例2floata,b,c;c=a%b;//Illegaluseoffloatingpointinfunctionmain

变量定义位置:一般放在函数开头main(){inta,b=2;floatdata;a=1;data=(a+b)*1.2;printf(“data=%f\n”,data);}变量定义可执行语句main(){inta,b=2;a=1;floatdata;data=(a+b)*1.2;printf(“data=%f\n”,data);}变量3/14/202422三种形式:十进制整数:由数字0~9和正负号表示.如123,-456,0八进制整数:由数字0开头,后跟数字0~7表示.如0123,011十六进制整数:由0x开头,后跟0~9,a~f,A~F表示.如0x123,0Xff例12与12L例30000为int型65536为longint型整型常量的类型根据其值所在范围确定其数据类型在整常量后加字母l或L,认为它是longint型常量问题:0123=()100x123=()100Xff=()1083291255问题:0123=()100x123=()100Xff=()10整型常量〔整常数〕3/14/202423表示形式:十进制数形式:〔必须有小数点〕如0.123,.123,123.0,0.0,123.指数形式:〔e或E之前必须有数字;指数必须为整数〕如12.3e3,123E2,1.23e4,e-5,实型常量的类型默认double型在实型常量后加字母f或F,认为它是float型

实型常量〔实数或浮点数〕3/14/202424占字节数随机器不同而不同,一般占一个机器字short≤int≤long可用sizeof(类型标识符〕测量实型变量float:占4字节,提供7位有效数字double:占8字节,提供15~16位有效数字例1:floata;a=111111.111;/*a=111111.1*/例2:doubleb;b=111111.111;/*b=111111.111*/整型变量3/14/202425/*ch2_003.c*/#definePRICE12.5main(){intnum=3;floattotal;

total=num*PRICE;

printf(“total=%f\n”,total);}宏定义变量定义输出结果运行结果:total=37.500000例:3/14/202426运算符功能与运算量关系要求运算量个数要求运算量类型运算符优先级别结合方向结果的类型学习运算符应注意3/14/202427根本算术运算符:+-*/%结合方向:从左向右优先级:----->*/%----->+-(2)(3)(4) 说明:“-”可为单目运算符时,右结合性两整数相除,结果为整数%要求两侧均为整型数据例5/2=-5/2.0=例5%2=-5%2=1%10=

5%1=5.5%22.3算术运算符和表达式2-2.51-110(

)3/14/202428一般形式:〔类型名〕〔表达式〕例:(int)(x+y)(int)x+y(double)(3/2)(int)3.6说明:强制转换得到所需类型的中间变量,原变量类型不变例main(){floatx;inti;x=3.6;i=(int)x;printf(“x=%f,i=%d”,x,i);}结果:x=3.600000,i=3较高类型向较低类型转换时可能发生精度损失问题2.4强制类型转换〔显式转换〕3/14/202429简单赋值运算符符号:=格式:变量标识符=表达式作用:将一个数据〔常量或表达式〕赋给一个变量复合赋值运算符种类:+=-=*=/=%=《=》=&=^=|=含义:exp1op=exp2

exp1=exp1opexp2a+=3a=a+3x*=y+8x=x*(y+8)x%=3x=x%3例a=3;d=func();c=d+2;2.5赋值运算符和表达式3/14/202430结合方向:自右向左优先级:14左侧必须是变量,不能是常量或表达式赋值表达式的值与变量值相等,且可嵌套赋值转换规那么:使赋值号右边表达式值自动转换成其左边变量的类型例3=x-2*y;a+b=3;例floatf;inti;i=10;f=i;那么f=10.0例inti;i=2.56;//结果i=2;例:a=b=c=5a=(b=5)a=5+(c=6)a=(b=4)+(c=6)a=(b=10)/(c=2)//表达式值为5,a,b,c值为5//b=5;a=5//表达式值11,c=6,a=11//表达式值10,a=10,b=4,c=6//表达式值5,a=5,b=10,c=2说明〔1〕:

3/14/202431结合方向:自右向左优先级:12

左侧必须是变量,不能是常量或表达式赋值表达式的值与变量值相等,且可嵌套赋值转换规那么:使赋值号右边表达式值自动转换成其左边变量的类型例:a=12;a+=a-=a*a例:inta=2;a%=4-1;a+=a*=a-=a*=3;//a=-264等价于a=a+(a=a-(a*a))//a=0等价于a=a+(a=a*(a=a-(a=a*3)))说明〔2〕:

3/14/202432作用:使变量值加1或减1种类:前置++i,--i(先执行i+1或i-1,再使用i值〕后置i++,i--(先使用i值,再执行i+1或i-1〕例j=3;k=++j;j=3;k=j++;j=3;printf(“%d”,++j);j=3;printf(“%d”,j++);a=3;b=5;c=(++a)*b;a=3;b=5;c=(a++)*b;//k=4,j=4//k=3,j=4//4//3//c=20,a=4//c=15,a=42.6自增、自减运算符++--3/14/202433作用:使变量值加1或减1种类:前置++i,--i(先执行i+1或i-1,再使用i值〕后置i++,i--(先使用i值,再执行i+1或i-1〕说明:++--不能用于常量和表达式,如5++,(a+b)++++--结合方向:自右向左优先级:-++-------->*/%----->+-

(2)(3)(4)例-i++

-(i++)i=3;printf(“%d”,-i++);//-3

例-i++i=3;printf(“%d”,-i++);

自增、自减运算符++--3/14/202434形式:表达式1,表达式2,……表达式n结合性:从左向右优先级:15逗号表达式的值:等于表达式n的值用途:常用于循环for语句中例a=3*5,a*4a=3*5,a*4,a+5例x=(a=3,6*3)x=a=3,6*a例a=1;b=2;c=3;printf(“%d,%d,%d”,a,b,c);printf(“%d,%d,%d”,(a,b,c),b,c);//a=15,表达式值60//a=15,表达式值20//赋值表达式,表达式值18,x=18//逗号表达式,表达式值18,x=3//1,2,3//3,2,32.7逗号运算符和表达式例:/*ch2_6.c*/#include<stdio.h>main(){intx,y=7;floatz=4;x=(y=y+6,y/z);printf("x=%d\n",x);}运行结果:x=33/14/2024351、假设所有变量均为整型,那么表达式〔a=2,b=5,b++,a+b〕的值是。A、7B、8C、6D、22、假设有以下定义,那么能使值为3的表达式是。Intk=7,X=12;A、X%=〔k%=5〕B、X%=〔k-k%5〕C、X%=k-k%5D、〔X%=k〕-〔k%=5〕3、以下不能定义为用户标识符是。

A、MainB、_0C、_intD、sizeof4、以下选项中,不能作为合法常量的是。

A、1.234e04B、1.234e0.4C、1.234e+4D、1.234e05.用C语言描述:“X是偶数”的表达式是______。6.利用减1运算符“--”,下面的两个语句:b=5+a;a-=1;表达的功能,可由一个语句来实现。这个语句是______。【例题分析】3/14/202436第3章顺序结构程序设计ABAB流程图N-S图顺序结构3/14/202437第3章顺序结构程序设计3.1C语言的顺序结构语句1.表达式语句表达式的后面加一个分号就构成了一个语句,例如:sum=a+b;。事实上,C语言中有使用价值的表达式语句主要有3种:(1)赋值语句。例如:sum=a+b;(2)自动增1、减1运算符构成的表达式语句。例如:i++;(3)逗号表达式语句。例:x=1,y=2;2.空语句语句仅有一个分号“;”,它表示什么也不做。一般和后面章节所讲循环语句结合使用起到延时作用。3.复合语句由"{"和"}"把一些变量定义和执行语句组合在一起,称之为复合语句,又称语句块。复合语句的语句形式如下:{语句1;语句2;…;语句n;}3/14/202438例如:{inta=0,b=1,sum;sum=a+b;printf("%d",sum);}【注意】与C语言中的其他语句不同,复合语句不以分号作为结束符,假设复合语句的"}"后面出现分号,那不是该复合语句的组成成分,而是单独的一个空语句。在复合语句起始局部可以有变量定义,如:"inta=0,b=1,sum;",也可以没有。复合语句的"{}"内可能会有多个语句,但在语法上把它整体上视为一条语句看待。4.函数调用语句由一个函数调用加上一个分号组成一个语句,如:scanf("%d%d",&a,&b);printf("a=%d,b=%d\n",a,b);3/14/202439在C语言中,所有的数据输入/输出都是由库函数完成的。在使用C语言库函数时,要用预编译命令#include将有关“头文件”包括到源文件中。使用标准输入输出库函数时要用到“stdio.h”文件,因此源文件开头应有以下预编译命令:#include<stdio.h>或#include“stdio.h”stdio是standardinput&outupt的意思。3.2数据输入与输出3/14/202440格式输入输出函数一、printf的一般形式

printf()和scanf()是C语言中使用得最多的一种输出输入函数,它可按指定的格式输出和输入多个不同类型的数据。printf(格式控制序列,输出表列);输出表列–––用“,”号隔开的变量或表达式序列,其变量的值按对应的格式控制符所指定的格式输出。3/14/202441格式控制序列–––用双引号“...”括起来的格式符序列。格式控制序列由格式说明符和普通字符组成。2.普通字符原样输出1.格式说明符:由%加–格式字符组成如:%f,%d等3/14/202442例:a=3;b=4;printf("a=%d,b=%d",a,b);输出结果:a=3,b=4无论a,b中位数多少,均为上述形式.假设:a=123,b=45那么:printf("a=%d,b=%d",a,b);输出结果:a=123,b=45而:printf("%d%d",a,b);那么输出结果为:123453/14/202443二、scanf()的一般形式功能:在标准输入装置(键盘)上按指定格式输入各种类型的数据地址表列–––变量的地址或字符串首地址。形式:scanf(格式控制序列,地址表列)格式控制序列–––同printf(…..)用&(变量名)表示取<变量名>的地址如:&a,&b等等。3/14/202444例:main(){inta,b,c;scanf("%d%d%d",&a,&b,&c);prinft("%d,%d,%d\n,"a,b,c);}结果3,4,5运行,机器等待你输入:345↙

3/14/202445注意:

1.scanf函数采用地址量接受数据。2.数据之间的间隔为↙,Tab.空格。3.允许在格式符中插入附加字符。格式字符及附加字符的定义祥见表。3/14/202446表scanf〔〕函数中的局部格式字符格式字符d用来输入十进制整数。oxcsfe用来输入八进制整数。用来输入十六进制整数。用来输入单个字符。说明用来输入字符串,将字符串送到一个字符数组中,在输入时以非空白字符开始,以第一个空白字符结束。字符串以串结束标志‘\0’作为其最后一个字符。用来输入实数,可以用小数形式或指数形式输入。以f作用相同,e与f可以互相替换。3/14/2024474.对于输入unsigned型数据,不用%u,而用%d,%o,%x.5.指定数据长度时,系统自动截取。scanf("%3d%3d",&a,&b);例如:inta,bprintf("a=%d,b=%d",a,b)则当输入123456789后显示:a=123,b=4563/14/2024487.输入数据不能规定精度.6.在%后加“*”表示跳过相应的数据那么当输入为1234567↙那么a12b67scanf("%2d%*3d%2d",&a,&b);scanf("%7.2f",&a);是错误的3/14/2024498.在格式控制中除格式说明符外假设还有其它字符,那么应按顺序原样输入。例:scanf("%d,%d",&a,&b);这必须输入:21,28↙又如:scanf("a=%d,b=%d,c=%d",&a,&b,&c);必须这样输入:a=34,b=58,c=1003/14/202450提示:输入格式要求比较严格,稍有疏忽,就会出错。例:inta,bscanf("%d,%d",&a,&b);printf("a=%d,b=%d",a,b);那么结果显示:a=12345,b=23266显然b的结果是错误的。若输入:12345↙(或1234523456↙)应输入:12345,23456↙3/14/202451【例3.1】由键盘输入两个整数给变量a和b,然后输出a和b,在交换a和b中的值后,再输出a和b,验证两个变量中的数值是否正确地进行了交换。#include"stdio.h"main(){inta,b,t;printf("Enteraandb:\n");scanf("%d%d",&a,&b);printf("a=%d,b=%d\n",a,b);t=a;a=b;b=t;printf("a=%d,b=%d\n",a,b);}3.3程序举例3/14/202452程序运行情况如下:Enteraandb:123456<CR>a=123,b=456a=456,b=123

注意:在程序中交换两个变量a和b的值,不可以简单地用:a=b;b=a;两条语句来实现。假设a和b的值分别为23和78,赋值语句a=b;将使a的值变为78,接下来的b=a;使b的值变为78,这样,a和b的值最终都变为78。所以在本例中引入了中间变量t,用来临时存放a的值,这样才能完成变量a和b的正确交换。3/14/202453【例3.2】输入一个double类型的数,使该数保存小数点后两位,对第三位小数进行四舍五入处理,然后输出此数,以便验证处理是否正确。#include"stdio.h"main(){doublex;printf("Inputx:\n");scanf("%lf",&x);3/14/202454printf("(1)x=%f\n",x);/*将x输出*/x=x*100;x=x+0.5;x=(int)x;x=x/100;/*将x扩大100倍,加上0.5之后取整,再缩小100倍*/printf("(2)x=%f\n",x);/*将四舍五入后的x输出*/}程序运行情况如下:Inputx:3.14159<CR>那么输出的结果为:(1)x=3.141590(2)x=3.1400003/14/202455

2011年9月全国计算机等级考试

C语言程序设计(16)假设有定义:inta,b;,通过语句scanf("%d;%d",&a,&b);,能把整数3赋给a,5赋给b的输入数据是___________。A)35B)3,5C)3;5D)35(6)假设程序中已给整型变量a和b赋值10和20,请写出按以下格式输出a、b值的语句【6】。****a=10,b=20****(7)以下程序运行后输出结果是【7】。#include<stdio.h>main(){inta=37;a%=9;printf("%d\n",a);}3/14/2024562011年3月全国计算机等级考试

C语言程序设计(6)以下程序运行后的输出结果是【6】。#includemain(){inta;a=(int)((double)(3/2)+0.5+(int)1.99*2);printf("%d\n",a);}3/14/202457

1.以下程序运行时假设从键盘输入:102030<回车>.输出结果是______

#include

main()

{

inti=0,j=0,k=0;

scanf(“%d%*d%d”,&i,&j,&k);printf(“%d%d%d\n”,i,j,k);

}

2.假设变量a,b已定义为int类型并赋值21和55,要求用printf函数以a=21,b=55的形式输出,请写出完整的输出语句______。3/14/202458第4章选择结构程序设计4.1关系运算符与关系表达式4.2逻辑运算符与逻辑表达式4.3if语句4.4switch语句4.5goto语句3/14/202459关系运算符种类:<<===>=>!=结合方向:自左向右优先级别:<<=>>===!=优先级6(高)优先级7(低)例c>a+b//c>(a+b)a>b!=c//(a>b)!=ca==b<c//a==(b<c)a=b>c//a=(b>c)关系表达式的值:是逻辑值“真”或“假”,用1和0表示例inta=3,b=2,c=1,d,f;a>b(a>b)==cb+c<ad=a>bf=a>b>c//表达式值1//表达式值1//表达式值0//d=1//f=04.1关系运算符与关系表达式3/14/202460例假设a=0;b=0.5;x=0.3;那么a<=x<=b的值为0例5>2>7>8在C中是允许的,值为0例inti=1,j=7,a;a=i+(j%4!=0);那么a=2例‘a’>0结果为‘A’>100结果为10关系运算注意〔1〕3/14/202461例注意区分“=”与“==”inta=0,b=1;if(a=b)printf(“aequaltob”);elseprintf(“anotequaltob”);例应防止对实数作相等或不等的判断如1.0/3.0*3.0==1.0结果为可改写为:fabs(1.0/3.0*3.0-1.0)<1e-60关系运算注意〔2〕3/14/202462ab!a!ba&&ba||b真假真假假假真真逻辑运算符种类:!&&||逻辑运算真值表C语言中,运算量:

0表示“假”,非0表示“真”,

运算结果:0表示“假”,1表示“真”,真假假假假假真真假假真真真假真真逻辑运算符和表达式〔1〕4.2逻辑运算符与逻辑表达式3/14/202463!(2)&&(11)||(12)高低例a<=x&&x<=b

a>b&&x>ya==b||x==y!a||a>b优先级:结合方向:!:从右向左&&:从左向右||:从左向右//(a<=x)&&(x<=b)//(a>b)&&(x>y)//(a==b)||(x==y)//(!a)||(a>b)逻辑运算符和表达式〔2〕3/14/202464!(2)&&(11)||(12)高低优先级:结合方向:!:从右向左&&:从左向右||:从左向右例a=4;b=5;!aa&&ba||b!a||b4&&0||25>3&&2||8<4-!0‘c’&&‘d’值为1值为0值为1值为1值为1值为1//(5>3)&&2||(8<(4-(!0)))值为1逻辑运算符和表达式〔3〕3/14/202465!(2)&&(11)||(12)高低优先级:结合方向:!:从右向左&&:从左向右||:从左向右短路特性:逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符<>例a&&b&&c//只在a为真时,才判别b的值;只在a、b都为真时,才判别c的值例a||b||c//只在a为假时,才判别b的值;只在a、b都为假时,才判别c的值例a=1;b=2;c=3;d=4;m=1;n=1;(m=a>b)&&(n=c>d)//结果m=0,n=1逻辑运算符和表达式〔4〕3/14/202466很多问题是顺序结构解决不了的看这样一个例子:计算分段函数x在大于等于0和小于0两种不同的情况时,函数将用不同的表达式来求y的值,这时就需要在计算y的值之前,先对x的值进行判断,C语言中用选择语句来实现这一判断。算法N-S图如右上图所示。x<0YNy=3-xy=2xN-S图3/14/202467PAB真假PBA真假A1A2AiAnk=k2k=k1k=knk=ki......二分支选择结构多分支选择结构选择结构3/14/202468C语言中的选择语句有两种:双分支选择语句if多分支选择语句switch

3/14/202469§4.3if选择结构–––条件判断一、if的三种形式功能:当表达式值非0时,执行语句体A,否那么不执行语句体A.形式1if(表达式)语句体A3/14/202470表达式语句体A=00例如:if(x>y)

{x=x%2;

printf("%d",x);

}其流程图:3/14/202471形式2if(表达式)功能:表达式为非0,执行语句体A表达式为0,执行语句体Belse语句体B语句体A3/14/202472表达式语句体A语句体B0=0例:if(x>y) printf("%d",x); else

printf("%d",y);3/14/202473形式3if(表达式1)elseif(表达式2)elseif(表达式3)……elseif(表达式n)else语句体1语句体2语句体3语句体n语句体n+13/14/202474expr1statemnt1非0=0expr2expr3statemntnstatemnt3statemnt2非0非0=0=0流程:例:if(salary>1000)index=0.4;elseif(salary>800)index=0.3;elseif(salary>600)index=0.2;elseif(salary>400)index=0.1;elseindex=0;3/14/202475如:if(3)prinf("o.k");if('a')…1.表达式可以是逻辑、关系,甚至是算术表达式。2.语句必须以分号结束3.假设语句不止一条,那么必须用{}括起来。在{}外可以不用分号.二、注意的问题:3/14/202476如:if(a==b&&x==y)printf(“a=b,x=y”);if(3)printf(“OK”);if(‘a’)printf(“%d”,’a’);if后面的表达式类型任意语句可以是复合语句

if(x)

if(x!=0)if(!x)

if(x==0)例考虑下面程序的输出结果:#include<stdio.h>main(){intx,y;scanf(“%d,%d”,&x,&y);if(x>y)x=y;y=x;elsex++;y++;printf(“%d,%d\n”,x,y);}CompileError!说明:3/14/202477一般形式:expr1?expr2:expr3执行过程功能:相当于条件语句,但不能取代一般if语句例if(a>b)printf(“%d”,a);elseprintf(“%d”,b);printf(“%d”,a>b?a:b);例求a+|b|printf(“a+|b|=%d\n”,b>0?a+b:a-b);expr1取expr2值取expr3值非0=0例(a==b)?’Y’:’N’(x%2==1)?1:0(x>=0)?x:-x(c>=‘a’&&c<=‘z’)?c-’a’+’A’:c条件运算符可嵌套

如x>0?1:(x<0?-1:0)优先级:13结合方向:自右向左

如a>b?a:c>d?c:d

a>b?a:(c>d?c:d)expr1、expr2、expr3类型可不同,表达式值取较高的类型例x?‘a’:‘b’//x=0,表达式值为‘b’;x‡0,表达式值为‘a’x>y?1:1.5//x>y,值为1.0;x<y,值为1.5◆

条件运算符与表达式3/14/202478三、if语句的嵌套if(表达式1)内嵌ifelse内嵌注意:else与最近的if配对.一般形式在上述形式的if语句中,又可以是if语句–––称为嵌套。if(表达式2)语句1if(表达式3)语句3else语句2else语句43/14/202479例:if()if()语句2else语句3if(){if()语句1}else…所以:必要时加{}.if()语句1else3/14/202480§4.4switch多分支选择语句用if或if/else或它们的嵌套也可使程序实现多路分支,但容易出现下面的问题:

可读性差

破坏结构解决问题的方法:采用switch语句。3/14/202481switch(变量){case常量表达式1:语句体1case常量表达式2:语句体2

case常量表达式n:语句体ndefault:语句体(n+1)}一般形式:3/14/2024821、语句形式:switch〔表达式〕{ case常量1:语句1;case常量2:语句2;case常量3:语句3;.......case常量n:语句n;default:语句n+1;}根据表达式的不同值,选择不同的程序分支,又称开关语句。数值型或字符型常量表达式的值必须互不相同,否那么执行时将出现矛盾,即同一个开关值,将对应多种执行方案。千万不能接(;)号3/14/202483根据表达式的取值,判断其与哪一个常量表达式相等。如=表达式i,那么自语句i开始执行,直到语句n+1止。假设与所有常量表达式值不相等,那么从default后的语句开始执行。功能:注:default可有可无。3/14/2024842、语句执行流程:指语句的最后一条是否为break简单语句或复合语句breakbreak有无break有无有计算表达式常量1常量2常量n=语句1…===语句2语句n其它=语句n+1无值case语句出现的次序并不影响执行结果。3/14/202485例:根据成绩等级打印百分数段.switch(grade){case'A':printf("85~100\n");case'B':printf("70~84\n");case'C':printf("60~69\n");case'D':printf("<60\n");default:printf("error\n");}3/14/202486程序如下:#include<stdio.h>main(){chargrade;scanf("%c",&grade);switch(grade){case'A':printf("85-100\n");case'B':printf("70-84\n");case'C':printf("60-69\n");case'D':printf("<60\n");default:printf("Error\n");}}3/14/202487运行结果为:A

程序运行结果不在预料之中!产生错误的原因:没有完全起到分支作用。85-10070-8460-69<60Error3/14/202488switch(表达式)

{case常表1:语句1;

break;

case常表2:语句2;

break;

……

case常表n:语句n;

break;

default:语句n+1;

}一般形式为:解决方法:增加break语句,使之跳出switch结构。3/14/202489修改程序为:#include<stdio.h>main(){chargrade;scanf("%c",&grade);switch(grade){case'A':printf("85-100\n");break;case'B':printf("70-84\n");break;case'C':printf("60-69\n");break;case'D':printf("<60\n");break;default:printf("Error\n");}}3/14/2024901.常量表达式的值必须互不相等,否那么会有二异性。2.case顺序无关紧要。3.不一定非用break不可,有时几种情况合并执行一组语句。注意:3/14/202491switch(grade){case'A':case'B':case'C':printf(">60\n");break;case'D':printf("<60\n");break;}例如:3/14/2024922008年9月二级C语言笔试试题以下程序运行后的输出结果是____。

main()

{inta,b,c;

a=10;b=20;c=(a%b<1)||(a/b>1);

printf(“%d%d%d\n”,a,b,c);}3/14/2024932007年4月二级C语言笔试试题二.(9)以下程序的运行结果是

。main(){inta=2,b=7,c=5;switch(a>0){case1:switch(b<0){case1:printf(“@”);break;case2:printf(“!”);break;}case0:switch(c==5){case0:printf(“*”);break;case1:printf(“#”);break;case2:printf(“$”);break;}default:printf(“&”);}printf(“\n”);}3/14/2024942006年4月二级C语言笔试试题31〕假设有以下程序

main()

{

inta=0,b=0,c=0,d=0;

if(a=1)b=1;c=2;

elsed=3;

printf(“%d,%d,%d,%d\n”,a,b,c,d);

}

程序输出

A〕0,1,2,0

B)0,0,0,3

C)1,1,2,0

D)编译有错

3/14/2024952006年4月二级C语言笔试试题7〕以下程序用于判断a,b,c能否构成三角形,假设能输出YES,假设不能输出NO。当a,b,c输入三角形三条边长时,确定a,b,c能构成三角形的条件是需要同时满足三条件:a+b>c,a+c>b,b+c>a。请填空。

main()

{

floata,b,c;

scanf(“%f%f%f”,&a,&b,&c);

if(__[7]__)printf(“YES\n”);/*a,b,c能构成三角形*/

elseprintf(“NO\n”);/*a,b,c不能构成三角形*/

}

3/14/202496第五章循环结构程序设计本章目标1.掌握while循环结构的运用。2.掌握do~while循环结构的运用。3.掌握for循环结构的运用。4.理解break和contiue在程序控制中的作用。学习要求:详细阅读第5章:循环结构3/14/202497

循环的本质:不断地重复某种动作。

对计算机程序而言,循环必须具备两个重要因素:1.在一定的条件下,重复执行一组指令2.必然出现不满足条件的情况,使循环终止循环控制3/14/202498

计算机程序的循环方式有两种:1.计算器控制的循环2.标记控制的循环3/14/202499§5.1while语句初始表达式;

while(条件表达式)

{语句;

循环表达式;

}3/14/2024100一般形式:while(表达式)循环体语句;执行流程:expr循环体假(0)真(非0)whilewhile语句3/14/2024101特点:先判断表达式,后执行循环体说明:循环体有可能一次也不执行循环体可为任意类型语句以下情况,退出while循环条件表达式不成立〔为零〕循环体内遇break,return,goto无限循环:while(1)循环体;While语句特点和说明3/14/2024102例:用while循环求

#include<stdio.h>main(){inti,sum=0;i=1;while(i<=100){sum=sum+i;i++;}printf("%d",sum);}循环初值循环终值循环变量增值循环条件循环体3/14/2024103#include<stdio.h>main(){inti=1;while(i<=10){printf("%d*%d=%d\n",i,i,i*i);i++;}}运行结果:1*1=12*2=43*3=94*4=165*5=256*6=367*7=498*8=649*9=8110*10=100例:显示1~10的平方3/14/2024104§5.2do/while语句一、语法结构do语句体while(条件表达式);3/14/2024105二、执行过程先执行语句体,再判断条件表达式的值,

假设0,再执行语句,否那么结束循环。3/14/2024106三、流程语句表达式0=03/14/2024107#include<stdio.h>

main()

{inti,sum=0;

i=1;

do

{sum=sum+i;

i++;

}

while(i<=100);

printf("%d",sum);

}程序如下:四、实例求3/14/2024108注:1、do·······while结构的作用

与while根本相同。2、语句至少要执行一次。3/14/2024109一、语法结构for(初始表达式;条件表达式;循环表达式)§5.3for循环属计算器控制的循环。语句体3/14/2024110

、计算初始表达式的值。、判断条件表达式,假设条件表达式的值0,那么执行语句体,转第步;

假设条件表达式的值=0,那么跳出循环体。

、计算循环表达式。

、转到第

步。二、执行过程3/14/2024111三、流程计算初始表达式求条件表达式的值语句体计算循环表达式for循环外的语句=0(假)

0(真)3/14/2024112可用for语句写成:for(i=1;i<=100;i++)

sum=sum+i;四、实例求可表示成:sum=1+2+3+…+1003/14/2024113用for循环来计算,程序如下:#include<stdio.h>main(){inti,sum;sum=0;for(i=1;i<=100;i++)sum=sum+i;printf("sum=%d",sum);}可以用while代替for循环3/14/2024114五、for语句的几种特例可以省略初始表达式,但须保存分号;且在for之前必须给循环变量赋值;3/14/2024115例:任意输入两个整数a,b,求#include<stdio.h>

main()

{inti,j,a,b,sum;

printf("pleaseinputtwonumber!\n");

scanf("a=%d,b=%d",&a,&b);

i=a;j=b;if(a>b){i=b;j=a;}

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

sum=sum+i;

printf("\nsum=%d",sum);

}3/14/2024116条件表达式一般不可省略,否那么为无限循环相当于:while(1){sum=sum+i;i++;}例:for(i=1;;i++)

sum=sum+i;相当于条件永真、永不为0,假设用while表示3/14/2024117

循环表达式亦可省略,但在循环体中必须有语句

来修改循环变量,以使条件表达式在某一时刻

为0而正常结束循环。例:for(sum=0,i=1;i<=100;)/*没有循环表达式*/{sum=sum+i;i++;}3/14/2024118假设同时省略初始表达式,和循环表达式,那么相当于while语句。相当于while(i<=100){sum+=i;i++;}例:for(;i<=100;){sum+=i;i++;}3/14/2024119三个表达式均省略即for(;;)语句那么相当于while(1)语句,为无限循环。

初始表达式、循环表达式可以是逗号表达式,以使循环变量值在修改时可以对其它变量赋值。如:

for(sum=0,i=1;i<=100;i++,i++)相当于:sum=0;

for(i=1;i<=100;i=i+2)3/14/2024120

条件表达式可以是关系表达式,也可以是数值表达式或字符表达式。只要值0.即执行循环体.例:for(i=0;(c=getchar())!='\n';i+=c);条件表达式3/14/2024121附加:if…goto…循环一、goto语句的语法功能:无条件转向标号处。标号:用标识符命名。goto标号;特别提醒:goto语句有可能使得程序混乱3/14/2024122二、与if构成循环.例:求#include<stdio.h>

main()

{inti,sum=0;i=1;loop:if(i<=100){sum=sum+i;i++;gotoloop;

}printf(”sum=%d",sum);

}程序结构相当于while循环3/14/2024123#include<stdio.h>

main()

{intsum=0,i=0;

loop:sum=sum+i;

i++;

if(i<=100)

gotoloop;

printf("sum=%d",sum);

}也可以写成do/while型循环建议:尽可能的不用goto语句,以免破坏程

序的结构化。3/14/2024124

§5.4循环的嵌套例1:while(){…

while() {…}}一、for循环

while循环do/while循环三种结构可以互相嵌套3/14/2024125例2:for(;<条件表达式>;) {… while()

{} do {}

while(); … }为正确的嵌套。3/14/2024126但:while(){…while(){}…}for(;;){for(;;){…}}不能理解为正确的形式。要注意语句的包含关系。3/14/20241271.对于同一问题,三种循环可相互替代。但不要用goto语句。2.假设循环次数、初始值、终止值不是明显地给出,可用while或do…while。以增强程序的结构化和可读性。二、几种循环比较3/14/20241283.要防止无限循环––死循环。4.循环过程中,为了结束本次循环或跳出整个循环。分别要用到continue和break语句。3/14/2024129三、程序举例例1:求Fibonacci数例:1,1,2,3,5,8,…前20个数。规律:F1=1,F2=1

Fn=Fn–1+Fn–2(n>2)程序要点:每输出4个数时换行。f1=f1+f2;f2=f1+f2;交替的结果正好为一序列3/14/2024130程

温馨提示

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

评论

0/150

提交评论