全套课件:C语言程序设计教程(第2版)李丽娟_第1页
全套课件:C语言程序设计教程(第2版)李丽娟_第2页
全套课件:C语言程序设计教程(第2版)李丽娟_第3页
全套课件:C语言程序设计教程(第2版)李丽娟_第4页
全套课件:C语言程序设计教程(第2版)李丽娟_第5页
已阅读5页,还剩382页未读 继续免费阅读

下载本文档

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

文档简介

C语言程序设计教程

(第2版)第1章引言第1章引言本章主要内容1

C语言的发展过程2

C语言的特点3简单的C语言程序4

C语言程序的结构5

C语言程序的执行1.1C语言的发展过程∙

20世纪70年代初问世:∙

1978年贝尔实验室正式发表了C语言。∙

1983年美国国家标准协会发表C语言标准;∙

1989年12月通过该标准;∙

1990年,国际标准化组织(ISO)接受了ANSI提出的标准;∙

称之为C89或ANSIC。1.2C语言的特点1.程序设计结构化2.运算符丰富

共有34种运算符,可以实现其他高级语言难以实现的一些运算3.数据结构类型丰富

除自身规定的数据类型外,允许用户定义自定义数据结构。4.书写灵活

程序书写所受的限制并不严格(注:并不提倡这样做)。1.2C语言的特点5.适应性广

程序执行效率高,可移植性好。6.关键字简洁

共有32个关键字。分为以下4大类。

(1)数据类型关键字12个;

(2)控制语句关键字12个;

(3)存储类型关键字4个;

(4)其他关键字4个。7.区分大小写1.3简单的C语言程序【例1-1】编写程序,在屏幕上输出“Hello,World!”的字符串。程序如下:/*example1_1.c在屏幕上输出字符串*/#include<stdio.h>main(){printf("Hello,World!\n");}1.3简单的C语言程序【例1-1】程序说明:1.include是文件包含命令,扩展名为.h的文件称为头文件,表示在程序中要用到这个文件中的函数。2.main是主函数的函数名,表示这是一个主函数。注意:1个C语言源程序只允许有1个main函数。1.3简单的C语言程序【例1-1】程序说明(续):3.printf是函数调用语句。

printf函数是系统定义的标准函数,其功能是把要输出的内容送到显示器上显示。在stdio.h库函数中。4.main()函数中的内容必须放在一对花括号“{}”中。1.3简单的C语言程序【例1-2】请从键盘输入一个角度的弧度值x,计算该角度的余弦值,将计算结果输出到屏幕。程序如下:/*example1_2.c计算角度的余弦*/#include<stdio.h>#include<math.h>main(){doublex,s;printf("Pleaseinputvalueofx:");

scanf("%lf",&x);s=cos(x);printf("cos(%lf)=%lf\n",x,s);}1.3简单的C语言程序【例1-2】程序说明:1.程序包含了两个头文件:stdio.h、math.h。2.在main函数中定义了两个双精度实数型变量x、s。3.printf("Pleaseinputvalueofx:");用于显示提示信息。4.scanf(“%lf”,&x);用于从键盘获得一个实数x。

x代表角度的弧度值。5.s=cos(x);计算x的余弦,并把计算结果赋给变量s。6.printf(“cos(%lf)=%lf\n”,x,s);将x和s的值输出到屏幕。双引号中得两个格式字符“%lf”,分别对应着x和s两个输出变量。1.3简单的C语言程序【例1-3】设计一个加法器,能实现两数的相加。通过调用该加法器,计算两数的和。程序如下:#include<stdio.h>intadd(intx,inty);main(){inta,b,c;printf("pleaseinputvalueofaandb:\n");scanf("%d%d",&a,&b);c=add(a,b);printf("max=%d\n",c);}intadd(intx,inty){return(x+y);}1.3简单的C语言程序【例1-3】程序说明:1.主函数体分为两部分:说明部分和执行部分。

2.语句c=add(a,b);是通过调用加法器add()来完成a+b的计算,并将计算结果赋给变量c。

3.屏幕上显示字符串:“pleaseinputvalueofaandb:”是提示用户从键盘输入a和b的值,用户从键盘上键入两个数,屏幕上会显示出这两个数的和。思考:分析前面3个程序的特点。1.4C语言程序的结构通常,C语言程序可由下面几个部分组合而成:1.文件包含部分;2.预处理部分;3.变量说明部分;4.函数原型声明部分;5.主函数部分;6.自定义函数部分。1.4C语言程序的结构关于程序结构的几点说明:1.不是每一个C语言程序都包含有上面的6个部分,最简单的C语言程序可以只有文件包含和主函数部分。2.每一个C语言程序都必须有且仅有一个主函数,主函数的组成形式如下所示:main(){

变量说明部分

程序语句部分}1.4C语言程序的结构3.每一个C语言程序可以有0个或多个自定义的函数。

注:自定义函数的形式同主函数形式一样:

<自定义的函数名>(<参数列表>)

{

变量说明部分

程序语句部分

}4.每一个C语言程序的语句由分号结束。1.5C语言程序的执行1.C语言程序要通过编译、链接后生成可加载模块(执行文件),才能在计算机上运行。2.完整的程序生成过程如下:1.5C语言程序的执行程序开发的具体步骤如下:1.编辑源程序。将C源程序用一个后缀为.C的文件保存。如:myfile.c2.编译。检查源程序中的语法错误,生成目标代码文件。如:myfile.obj3.链接。将多个目标程序链接到一个程序中,生成可执行文件,如:myfile.exe4.第四步:运行可执行文件,检验程序的正确性。大多用集成开发工具进行编辑、编译和调试程序。

1.5C语言程序的执行3.几种常用的C语言集成开发工具:开发工具运行环境各工具的差异基本特点TurboCDOS不能开发C++语言程序(1)符合标准C(2)各系统具有一些扩充内容(3)能开发C语言程序(集程序编辑、编译、链接、调试、运行于一体)BorlandCDOSMicrsoftCDOSVisualC++Windows能开发C++语言程序(集程序编辑、编译、链接、调试、运行于一体)DevC++WindowsBorlandC++DOS、WindowsC++BuilderWindowsGccLinux1.6本章小结本章主要内容1.简要介绍了C语言的特点和发展过程;2.

C语言程序的基本组成部分;3.

C语言程序的开发步骤;4.常见的C语言程序开发工具。课后练习1.资料查阅练习:【题1.1】、【题1.3】、【题1.5】、【题1.7】2.安装开发工具练习:【题1.9】或【题1.10】或【题1.11】3.程序开发练习:【题1.13】、【题1.14】、【题1.15】C语言程序设计教程

(第2版)第2章基本的程序语句本章主要内容1.

用二进制表示的数2.基本数据类型及取值范围3.标识符、变量和常量4.基本运算符、表达式及运算的优先级5.标准输入/ 输出函数简介6.程序范例第2章引言1.整型数的二进制表示整型数分为有符号的和无符号的两种;有符号的整型数的正负号由字节的最高位来表示:0表示正数,1表示负数。整型数占用的字节数可为8位、16位或者32位。整型数的取值范围:2.1用二进制表示的数字

数有符号的无符号的最

值最

值最

值最

值1−128+12702552−32

768+32

767065

5354−2

147

483

648+2

147

483

64704

294

967

2952.浮点数的二进制表示浮点数分成单精度浮点数和双精度浮点数;单精度浮点数占32位(4个字节),双精度浮点数占64位(8个字节)。浮点型数据的一般表达式:(−1)S×2e×m

e是实际的阶码值,代表浮点数的取值范围;

m是尾数,代表浮点数的精度。2.1用二进制表示的数(1)单精度浮点型数据的字节分配空间:2.1用二进制表示的数S代表符号位,占1位。E称为“移码”,占8位。

E的取值范围为0~255,E=127+e因此,e的取值范围为−127~+128);M代表有效位数或称为“小数”,

m2=(1.M)2(2)双精度浮点型数据的字节分配空间:2.1用二进制表示的数S代表符号位,占1位。E称为“移码”,占11位。

E的取值范围为0~2047,E=1023+e因此,e的取值范围为−1023~+1024);M代表有效位数或称为“小数”,

m2=(1.M)2浮点型数据的取值范围:2.1用二进制表示的数数据类型字节数(位数)阶码(e)取值范围最

值最

值单精度浮点数4字节(32位)−127~128±5.877

472×10−39±3.402

824×1038双精度浮点数8字节(64位)−1

023~1

024±1.112

537×10−308±1.797

693×103081.

C语言提供5种基本数据类型。(1)字符型:用char表示。(2)整数型:用int表示。(3)单精度实数型:用float表示。(4)双精度实数型:用double表示。(5)空类型:用void表示。对整数型,有四种修饰:①signed(有符号)②unsigned(无符号)③long(长型)④short(短型)数据类型决定了数据的大小、数据可执行的操作以及数据的取值范围。2.2基本数据类型及取值范围数据类型的长度和取值范围会随着机器的CPU类型和编译器的不同而不同。2.2基本数据类型及取值范围

实现环境数据类型字节长度TurboCBorlandC++VisualC++DevC++GCCchar(字符型)11111shortint(短整型)22222int(整型)22444longint(长整型)44444float(单精度浮点型)44444double(双精度浮点型)88888例1:验证数据类型的字节长度。见【例2-1】所示的程序:example2_1.c不同字节长度的数据类型和取值范围:见表2-5和表2-62.2基本数据类型及取值范围2.3.1标识符标识符是对变量名、函数名、标号和其他各种用户定义的对象命名。建议取有实际意义的标识符来命名。标识符的第1个字符必须是字母或下划线,标识符的长度可以是一个或多个字符,最长不允许超过32个字符。例如:

score、number12、student_name等均为正确的标识符;8times、price/tea、low!valume等均不为正确的标识符。注意:(1)标识符区分大小写,score、Score、SCORE代表三个不同的标识符。(2)标识符不能和C语言的关键字相同(3)标识符不能和用户自定义的函数或C语言库函数同名2.3标识符、变量和常量2.3.2变量和常量1.变量其值可以改变的量称为变量。变量的两个要素:标识符

(名字)和值。

C语言规定:变量必须在使用之前定义。变量定义的一般形式是:

<类型名><变量列表>;∙<类型名>必须是有效的C数据类型,如:int、float等,类型名规定了变量的存储空间和取值范围。∙<变量列表>可以由一个或多个由逗号分隔的多个标识符名构成。2.3标识符、变量和常量如:

inti,j,number;

unsignedintmax,min;

floathigh_value,price;

doublelenth,total_wieight;思考:上面各种变量的类型和他们的取值范围。2.3标识符、变量和常量例2:运行下面的程序,了解变量的取值范围和C语言的特性。/*example2_2.c变量的取值范围测试*/#include<stdio.h>main(){inta=32766,b=-32766;

unsignedm=6553;floatt=3.4e+37;printf("a=%d\n",a);printf("m=%u\n",m);printf(“t=%e\n”,t);

a=a+4;2.3标识符、变量和常量

b=b-6;

m=m*10+10;

t=t*10;

printf("Afterchange:\n");

printf("a+4=%d\n",a);

printf("b-6=%d\n",b);

printf("m*10+10=%u\n",m);

printf("t*10=%e\n",t);}2.常量

常量的值是不可变的。在C语言中,有整型常量、实型常量、字符常量、字符串常量、和枚举常量等。(1)整型常量可采用十进制、八进制、十六进制来表示整型常量。八进制数的前面用数字0开头,十六进制数前面用数字0和字母X开头(0x或0X)整型常量的表示见表2-9。2.3标识符、变量和常量例3:了解整型常量的不同进制表示法。/*example2_3.c*/#include<stdio.h>main(){printf("十六进制0x80的十进制值为:%d\n",0x80);printf("八进制0200的十进制值为:%d\n",0200);printf("十进制128的十进制值为:%d\n",128);printf("十进制128的十六进制值为:%x\n",128);printf("十进制128的八进制值为:%o\n”,128);}2.3标识符、变量和常量(2)实型常量实型常量的两种表示法:浮点计数法和科学计数法。例如:

231.46 7.36E−7 4.58E5 −0.0945对太大或太小的数,通常是采用科学计数法。如上面的7.36E−7、4.58E5。2.3标识符、变量和常量例4:了解实型常量的两种表示法。/*example2_4.c(浮点计数法,科学计数法)*/#include<stdio.h>main(){printf(“123.4456的浮点数表示:%6f\n",123.456);printf(“1.23456E2的浮点数表示:%6f\n",1.23456e2);printf(“12345.6E-2的浮点数表示:%6f\n",12345.6e-2);printf(“12345.6的科学计数法表示:%E\n",12345.6);}2.3标识符、变量和常量(3)字符常量

字符常量是由一对单引号括起来的单个字符。如:'A'、'S'、'9'、'$'等均为字符常量。

注1:单引号只起定界作用,并不代表字符。

注2:单引号(')和反斜杠(\)本身作为字符时要通过转义字符(\)。如:'\''和'\\'分别代表单个字符单引号(')和反斜杠(\)。2.3标识符、变量和常量在C语言中,字符是按其所对应的ASCII的值来存储的,一个字符占一个字节。部分字符所对应ASCII码值如下:2.3标识符、变量和常量字符019ABYZabyz…ASCII码值(十进制)484957656689909798121122…字符和与之对应的ASCII详见附录B注意:数字3和字符 ‘3’ 的区别:2.3标识符、变量和常量含义表达式值字节数常量33占2个字节字符'3'51占1个字节字符也可以参与运算:如: ‘A’+6;运算结果为71,对应的字符为H。 ‘8’−7;运算结果为49,对应的字符为1。 ‘y’−32;运算结果为89,对应的字符为Y。例5:了解字符常量与其顺序值的关系。/*example2_5.c字符常量与其顺序值的关系*/#include<stdio.h>main(){printf("%d-->%c\n",'A','A');printf("%d-->%c\n",'A'+5,'A'+5);printf("%d-->%c\n",'A'+70,'A'+70);}2.3标识符、变量和常量例5:了解字符常量与其顺序值的关系。/*example2_5.c字符常量与其顺序值的关系*/#include<stdio.h>main(){printf("%d-->%c\n",'A','A');printf("%d-->%c\n",'A'+5,'A'+5);printf("%d-->%c\n",'A'+70,'A'+70);}2.3标识符、变量和常量程序运行结果:65-->A70-->F135-->?(4)字符串常量字符串常量是指用一对双引号括起来的一串字符。如:

"world","TRUEorFLASE","8765431.0037","T"均为字符串常量。注:双引号(")和反斜杠(\)本身作为字符串时要通过转义字符(\)。如:

"\""和"\\"分别代表字符串(")和反斜杠(\)。2.3标识符、变量和常量注意字符常量与字符串常量的区别:在C语言中,字符串常量在内存中存储时,系统自动在字符串的末尾加一个“串结束标志”:\0该结束标志的ASCⅡ码值为0,字符为空NULL。因此,长度为n个字符的字符串常量,在内存中占有n+1个字节的存储空间。如:字符串“World”,共5个字符,需占用6个字节,其存储形式为:2.3标识符、变量和常量World\0(5)转义字符转义字符用反斜杠\后面跟一个字符或一个八进制或十六进制数表示。如:\a,\0,\n等。代表ASCII字符中不可打印的控制字符和特定功能的字符。表示特殊字符,如:单引号(')、双引号(")和反斜杠(\)等。常用的转义字符见表2-12。2.3标识符、变量和常量注意①转义字符中的字母只能是小写字母,每个转义字符只能看作一个字符。②表2-12中的\r、\v和

\f对屏幕输出不起作用,但会在控制打印机输出执行时响应其操作。③在程序中,使用不可打印字符时,通常用转义字符表示。2.3标识符、变量和常量例6:了解转义字符的作用。/*example2_6.c了解转义字符的作用*/#include<stdio.h>main(){printf("\a"); /*发出铃声*/printf("Thisisatest:\n");printf("Ready::");printf("\bBackspace.\n"); /*往左退一格*/printf("\tHorizontaltab\n"); /*往右进八格*/printf("\\\n"); /*输出\*/printf("\?\n"); /*输出?*/printf("\'\n"); /*输出'*/printf("\"\n"); /*输出"*/printf("\101\n"); /*输出八进制值101所对应的字符*/printf("\x41\n"); /*输出十六进制值41所对应的字符*/}运行程序,观察程序的运行结果。程序运行结果:Thisisatest:Ready:Backspace.Horizontaltab\?'"AA2.3标识符、变量和常量(6)符号常量将程序中的常量定义为一个标识符,称为符号常量。符号常量在使用前必须先定义,定义的形式是:

#define<符号常量名><常量>如:#definePI3.1415926

#defineTRUE1

#defineFALSE0其中PI、TRUE、FLASE均为符号常量;其值分别为3.1415926,1,0。注1:

#define是C语言的预处理命令;注2:习惯上符号常量用大写英文字母表示。2.3标识符、变量和常量例7:了解符号常量的使用。/*example2_7.c*/#include<stdio.h>#defineWHO"Iamastudent."#defineHOW"ThatisFine."#definePI3.1415926main(){printf("%s\n",WHO);printf("%s\n",HOW);printf("%f\n",PI);}2.3标识符、变量和常量程序运行结果:Iamastudent.ThatisFine.3.141593C语言的基本表达式是由操作数和操作符组成。操作数通常由变量或常量表示;操作符由各种运算符表示。一个基本表达式也可以作为操作数来构成复杂表达式。构成基本表达式的常用运算符有:(1)算术运算符。(2)关系运算符。(3)逻辑运算符。(4)赋值运算符。另外,条件运算符、自反赋值运算符、逗号运算符、指针运算符、位运算符等均可构成基本表达式。2.4基本运算符、表达式及运算的优先级2.4.1算术运算符及算术表达式算术运算符主要用于完成变量的算术运算。如:加、减、乘、除等。各运算符及其作用如下:2.4基本运算符、表达式及运算的优先级运

符优

级作

用++高(14)自增1(变量的值加1)――自减1(变量的值减1)+低(12)加法−减法*中(13)乘法/除法%模运算(整数相除,结果取余数)注:此处规定优先级的数字越大,优先级越高。例8:阅读下面的程序,了解由算术运算符组成的表达式。/*example2_8.c*/#include<stdio.h>main(){inta,b,c,d1,d2,d3,d4;doublex,y,z1,z2,z3;a=8;b=3;c=10;2.4基本运算符、表达式及运算的优先级d1=a+b*c-b/a+b%c*a;/*复杂表达式1*/d2=(a+b)*c-(b/a)+(b%c)*a;/*复杂表达式2*/d3=a/b;d4=c%b;printf("d1=%d,d2=%d,d3=%d,d4=%d\n",d1,d2,d3,d4);x=3.2;y=2.4;z1=x+y/x-y;/*复杂表达式3*/z2=(x+y)/(x-y);/*复杂表达式4*/z3=y/b;printf("z1=%f,z2=%f,z3=%f\n",z1,z2,z3);}程序运行结果:d1=62,d2=134,d3=2,d4=1z1=1.550000,z2=7.000000,z3=0.8000001.分析例8程序中存在的问题。2.修改例8的程序,提高程序的可读性。3.运行例2-9的程序,观察表达式及程序的运行结果。2.4基本运算符、表达式及运算的优先级思考关于前置++/−−和后置++/−−的作用前置++或前置−−表达式:

++<变量>;

先将变量的值加1,再使用变量。

−−<变量>;

先将变量的值减1,再使用变量。后置++或后置−−表达式:

<变量>++;

先使用变量,再将变量的值加1。

<变量>−−;

先使用变量,再将变量的值减1。2.4基本运算符、表达式及运算的优先级例9:阅读程序example2_10.c,了解前置++/--和后置++/−−的作用。2.4基本运算符、表达式及运算的优先级1.++/--运算符适合于什么数据类型?2.表达式++a和a++有什么区别?3.表达式b=a++还可以怎样表达?4.++/--能否用于常量表达式?思考注意++/--运算符在不同环境下的区别。例10:阅读程序example2_11.c。了解前置++/--和后置++/−−作为函数参数时的作用。2.4基本运算符、表达式及运算的优先级1.为什么程序的运行结果会有不同?2.程序设计应遵循什么原则?3.修改程序,使其具有更好的可读性。4.分析修改后的程序:example2_12.c。思考不同形式的程序表达式的含义:比较程序example2_13.c和example2_13a.c2.4基本运算符、表达式及运算的优先级注意2.4.2关系运算符及关系表达式关系运算符的作用:用于条件判断的表达。关系运算符及其含义和优先级如下:2.4基本运算符、表达式及运算的优先级关系运算符含

义优

级<小于高(10)>大于==等于低(9)!=不等于<=小于等于高(10)>=大于等于关系表达式的结果只有两个:

(1)真(值为1)

(2)假(值为0)假如有:

inta,b;a=(23>0)b=((23-9)==(18-6));则:变量a的值为1,变量b的值为0。2.4基本运算符、表达式及运算的优先级2.4.3逻辑运算符及逻辑表达式逻辑运算符的作用:用于判断条件中的逻辑关系。逻辑运算符及其含义和优先级如下:2.4基本运算符、表达式及运算的优先级逻辑运算符含

义优

级!逻辑非高(14)&&逻辑与中(5)||逻辑或低(4)逻辑表达式的结果:真(值为1)假(值为0)

(注:非零值均为真)逻辑运算规则:2.4基本运算符、表达式及运算的优先级ABA&&BA||B!A真真真真假真假假真假假假假假真假真假真真1.由关系运算符和逻辑运算符可组成复杂逻辑表达式。

如:(a>b)&&!(c-d)||(a>=5)

2.对于复杂逻辑表达式,要注意C语言的特殊语法规则。2.4基本运算符、表达式及运算的优先级特别提示(1).(表达式1)||(表达式2)语法规则若:(表达式1)的值为真,

则:(表达式1)||(表达式2)的结果就为真。

特点:系统对(表达式2)不会进行计算,但会检查其语法错误。结论:与(表达式2)的结果无关。例如:

inta=4,b=8,c;

c=(a<b)||(++a);

printf(“c=%d,a=%d\n”,c,a);程序运行结果为:c=1,a=4。2.4基本运算符、表达式及运算的优先级(2).(表达式1)&&(表达式2)语法规则若:(表达式1)的值为假,

则:(表达式1)&&(表达式2)的结果就为假。

特点:系统对(表达式2)不会进行计算,但会检查其语法错误。

结论:与(表达式2)的结果无关。例如:

inta=4,b=8,c;

c=(a>b)&&(++a);

printf(“c=%d,a=%d\n”,c,a);程序运行结果为:c=0,a=4。2.4基本运算符、表达式及运算的优先级例11:阅读下面的程序,分析复杂逻辑表达式运算的语法规则。/*example2_14.c*/#include<stdio.h>main(){inta=4,b=8,c=5;intd1,d2,d3,d4;d1=(a<b)||(++a==5)||(c>b--);/*表达式(1)*/printf("d1=%d,a=%d,b=%d,c=%d\n",d1,a,b,c);d2=(a>b)&&(++a==5)||(c>b--);/*表达式(2)*/printf("d2=%d,a=%d,b=%d,c=%d\n",d2,a,b,c);d3=(a<b)||(++a==5)&&(c>b--);/*表达式(3)*/printf("d3=%d,a=%d,b=%d,c=%d\n",d3,a,b,c);d4=(a>b)&&(++a==5)&&(c>b--);/*表达式(4)*/printf("d4=%d,a=%d,b=%d,c=%d\n",d4,a,b,c);}1.分析程序的运行结果。2.如果有:

inta=4,b=8,c=5;

intd1,d2,d3,d4;

d4=(a<b)&&(++a==5)&&(c>b--);则:d4,a,b,c的值分别为多少?提示:要避免含义不明确的表达式。2.4基本运算符、表达式及运算的优先级思考2.4.4位运算符及表达式位运算的作用:直接对变量的二进制按位进行操作。注意:位运算只适合于整型和字符型变量。位运算符及其含义和优先级如下:2.4基本运算符、表达式及运算的优先级位运算符含

义优

级~按位取反高(14)&位与低(8)^位异或低(7)|位或低(6)<<位左移中(11)>>位右移位运算规则:2.4基本运算符、表达式及运算的优先级ABA|BA^BA&B~A~B11101001011001000001101110102.4.5条件运算符条件运算符由“?”和“:”组成。条件表达式的一般形式:

表达式1?表达式2:表达式3;条件表达式的语法规则:当表达式1的值为1(真)时,其结果为表达式2的值;当表达式1的值为0(假)时,其结果为表达式3的值。注意:表达式1通常是关系表达式或逻辑表达式,也可以是其他表达式。条件运算符又称为三目运算符,“三目”指的是操作数的个数有3个。2.4基本运算符、表达式及运算的优先级例12:阅读下面的程序,了解三目运算符组成的表达式计算规则。/*example2_15.c了解三目运算符的语法规则*/#include<stdio.h>#include<stdlib.h>main(){inta=3,b=5,c;c=(a>b)?(a+b):(a-b);printf("Themaxvalueofaandbis:%d\n",c);a=6;b=2;c=(a>b)?(a-b):(a+b);printf("Themaxvalueofaandbis:%d\n",c);}请分析程序的运行结果。2.4基本运算符、表达式及运算的优先级2.4.6逗号表达式由逗号运算符“,”将两个表达式连接起来:表达式1,表达式2;逗号表达式的语法规则:先计算表达式1,再计算表达式2;最后结果为表达式2的结果。2.4基本运算符、表达式及运算的优先级例13:了解逗号表达式的语法规则。/*example2_16.c了解逗号表达式*/#include<stdio.h>main(){inta,b;a=3*5,a*4;b=(3*5,a*4);printf("a=%d\nb=%d\n",a,b);}请分析程序的运算结果。2.4基本运算符、表达式及运算的优先级1.逗号表达式可以扩充到具有n个表达式的情况:表达式1,表达式2,…,表达式n;整个逗号表达式的结果为表达式n的值。2.通常是用逗号表达式来分别求逗号表达式内各表达式的值,并不是为了求整个逗号表达式的值。3.变量定义中出现的逗号和在函数参数表中出现的逗号不构成逗号表达式。4.逗号表达式有可能降低程序的可读性,请谨慎使用。2.4基本运算符、表达式及运算的优先级几点说明请阅读程序example2_17.c,进一步了解逗号表达式。2.4.7数据类型的转换C语言允许表达式中混合有不同类型的常量和变量。1.系统自动转换容易出现意外结果。假设有:s=a+t;

b=a+t;结果为:s=6.7,b=6,原因:数据类型不一致,有可能产生数据丢失。应避免出现数据类型不一致的表达式。2.4基本运算符、表达式及运算的优先级2.强制转换数据类型强制转换表达式:

(数据类型符)表达式;或:(数据类型符)变量;强制转换语法规则:

将表达式或变量的值临时转换成圆括号内指定的数据类型。但不改变变量原来的数据类型。假设有:

inta;

floatt;

a=15;

t=(float)a/30;结果为:t=0.5,若表达式为t=a/30,则结果为:t=0。2.4基本运算符、表达式及运算的优先级2.4.8复杂表达式的计算顺序

C语言共有各类运算符47个,按优先级可分为11个类别共15个优先级。运算符的优先级与运算方向:表2-102.4基本运算符、表达式及运算的优先级例13:阅读程序,分析复杂表达式的计算顺序。/*example2_18.c复杂表达式的计算顺序*/#include<stdio.h>main(){inta=10,b=15,c=14,temp;temp=a+6>b&&b-c>c;

/*①*/printf("a+6>b&&b-c>c=%d\n",temp);temp=!a+b*c-b/a&&b-a*!(c-a); /*②*/printf("!a+b*c-b/a&&b-a*!(c-a)=%d\n",temp);}请分析表达式①和表达式②的结果。指出程序的不足,修改程序。2.4基本运算符、表达式及运算的优先级2.4.9C语言的基本语句结构C语言的语句可分为四大类:1.表达式语句2.复合语句3.控制语句4.转向控制语句2.4基本运算符、表达式及运算的优先级1.表达式语句一个独立的语句就是表达式语句。如:

a=3*b-c/2; i--; ++j: b=(a>3)?1:0;2.复合语句由一对花括号“{}”将多个表达式语句括起来所组成。如:{a=b+c;x=y%a;prinft("a=%d,x=%d\n",a,x);}3.控制语句由控制结构组成的语句,有5种控制语句:(1)选择(分支)语句:if…else。(2)多分支语句:switch。(3)for循环语句:for。(4)while循环:while。(5)do_while循环:do…while。4.转向控制语句由系统提供的关键字构成,用于改变程序的流程。

有4种转向控制语句:(1)break;可用于switch语句和循环的语句。(2)continue;只适用于循环语句。(3)return;用在函数的结束处。(4)goto<标号>;可用于程序的任何地方,但不提倡使用。C语言的输入/输出的操作是通过调用系统函数来实现。常用的标准输入/输出函数有如下几种。(1)格式化输入/输出函数:scanf()/printf()。(2)字符输入/输出函数:getc()/putc()。(3)字符输入/输出函数:getch()/putch()。(4)字符输入/输出函数:getchar()/putchar()。(5)字符串输入/输出函数:gets()/puts()。不同的函数在功能上有所不同,使用时应根据具体的要求,选择合适的输入/输出函数。2.5标准输入

/ 输出函数简介2.5.1格式化输出函数printf()函数printf()的一般形式为:

printf("控制字符串",输出项列表);函数printf()的作用:按控制字符串指定的格式,向标准输出设备(显示器)输出指定的输出项列表的值。注意:<输出项列表>可以是常量、变量、表达式。当有多个输出项时,各项之间用逗号分隔。<输出项列表>中的个数、类型必须与<"控制字符串">中格式字符的个数、类型相一致。<"控制字符串">必须用双引号将<控制字符串>括起,可由格式说明和普通字符两部分组成。2.5标准输入

/ 输出函数简介1.格式说明格式说明的一般格式为:

%[<修饰符>]<格式字符>格式字符规定了对应输出项的输出格式。注:

在格式字符前面,还可用字母1和h(大小写均可)来说明是用long型或short型格式输出数据。常用格式字符如表2-21所示。如:%d,%c,%f,%Lf,%s等均为正确的输出格式说明。2.5标准输入

/ 输出函数简介修饰符是可选的,用于确定数据输出的宽度、精度、小数位数、对齐方式等。若缺省修饰符,按系统默认设定输出。修饰符的主要类型:(1)字段宽度修饰符

用数字修饰输出字符占用的宽度,规则见表2-22。如:%3d,%4c,%5.2f,%8Lf,%6s等均为正确的输出格式说明。(2)对齐方式修饰符

默认输出方式为右对齐方式。

在%后面加上一个负号“−”,可使数据的输出方式改为左对齐的方式。如:%-3d,%-4c,%-5.2f,%-8Lf,%-6s等均为正确的输出格式说明。2.5标准输入

/ 输出函数简介2.普通字符普通字符包括可打印字符和转义字符。可打印字符按原样显示在屏幕上,起说明作用。转义字符是一些不可显示的控制字符,用于产生特殊的输出效果。如:“s=%4d\t%7.4f\n\t%lu\n”为正确的输出格式。阅读程序【例2-19】、【例2-20】、【例2-21】。了解格式输出的方法。2.5标准输入

/ 输出函数简介2.5.2格式化输入函数scanf()函数scanf()的一般形式为:

scanf("控制字符串",输入项列表);函数scanf()的作用:按控制字符串指定的格式,从键盘输入数据,并将输入的值赋给输入项列表相对应的变量。

注意:<“控制字符串”>规定了数据的类型,其内容也可由格式说明和普通字符两部分组成。(注:不提倡加普通字符)<输入项列表>则由一个或多个变量地址组成,各变量地址之间用逗号“,”分隔。如有:inta,b;则:&a,&b就可以是一个<输入项列表>2.5标准输入

/ 输出函数简介输入数据时,可用空格符、表格符(tab)和换行符(enter)作为每个变量输入完毕的标志。以换行符作为数据输入的结束。1.格式说明格式说明规定了输入项中各变量的数据类型。格式说明的一般形式:

%[<修饰符>]<格式字符>注意:格式字符的表示方法与printf()中的相同,各格式字符及其意义如表2-23所示。2.5标准输入

/ 输出函数简介修饰符是可选的,主要有下面几种:(1)字段宽度字段宽度用数字表示,其作用是限定输入的字符宽度。如:scanf("%3d",&a);则:变量a的宽度只占3个字符,有效值范围为:−99~999。若超过宽度,系统会截断,只取前3位。假如有:

inta,b;scanf("%d%3d",&a,&b);printf("a=%d\tb=%d\n",a,b);若输入为:

123412345则系统会将1234赋给变量a,将12345的前3位的值123赋给变量b。输出结果为:

a=1234b=1232.5标准输入

/ 输出函数简介(2)l和h字母(L,l)和(H,h)分别表示输入数据类型的长短。(L,l)可表示长整型、双精度浮点型。(H,h)可表示短整型数。如:

scanf("%10ld%hd%lf",&a,&b,&x);则:a按宽度为10的长整型数,b为短整型数,x为双精度浮点型数。(3)字符“*”*的作用是跳过相应的数据。输入的数据不赋给变量。假如有:intx=0,y=0,z=0;

scanf("%d%*d%d",&x,&y,&z);若输入为:112233↲则结果为:x=11,y=33,z=0(z保持原来的值不变,22被跳过,没有赋给任何变量。)2.5标准输入

/ 输出函数简介2.普通字符普通字符包括空白字符、转义字符和可见字符。注意:如果有普通字符,则输入时需要原样输入。特别提示:

在输入格式的修饰符中,不建议使用普通字符。普通字符的类型:(1)空白字符:空格符、制表符或换行符都是空白字符,但它们的ASCII值是不一样的。空白字符的作用:对输入的数据起分离作用。2.5标准输入

/ 输出函数简介若输入的数据中含有字符型的数据时,需要作一些技术处理,否则有可能出错。例如:inta;

charch;

scanf("%d%c",&a,&ch);若输入为:64q则结果为:ch=,a=64,注:结果并不是ch=q,a=64思考:怎样改进?可使得结果为:ch=q,a=642.5标准输入

/ 输出函数简介注意(2)转义字符:\n、\t转义字符属空白字符,对输入的数据不产生影响。(3)可见字符可见字符是指ASCII码中所有通过键盘输入的可见字符。如数字、字母、其他符号等。注意:若输入格式中含有可见字符,则实际输入要“原样输入”。假如有:inta,b;

charch;

scanf("%d,%d,%c",&a,&b,&ch);若输入为:12,34,q则结果为:a=12,b=34,ch=q思考:若输入为:12,34,q则结果会怎样?2.5标准输入

/ 输出函数简介1.要注意数值型数据和字符型数据的取值特点。若要同时输入这两种类型的数据,可采取先输入字符型数据,后输入数值型数据,以减少错误的发生。2.建议在scanf()语句中不要加入可见字符。避免错误的发生。2.5标准输入

/ 输出函数简介特别提醒2.5.3字符输出函数C语言专门为字符提供了专用的字符输出函数。(注:对不同的编译器,它们所在的头文件有可能不同。)常用的字符输出函数:表2-242.5标准输入

/ 输出函数简介函数原型函数功能intputc(intch,FILE*stream);将ch所对应的字符输出到stream指定的文

件流中(stdout表示屏幕)intputch(intch);将缓冲区中ch所对应的字符输出到屏幕intputchar(intch);将ch所对应的字符输出到屏幕阅读【例2-24】的程序example2_24.c,了解字符输出函数的功能。2.5.4字符输入函数C语言专门为字符提供了专用的字符输入函数。(注:对不同的编译器,它们所在的头文件有可能不同。)常用的字符输出函数:表2-252.5标准输入

/ 输出函数简介函数原型函数功能intgetc(FILE*stream);从指定的输入流stream中读取字符(stdin表示键盘)intgetch();将键盘读取的字符放入缓冲区,键盘输入的字符不显示在屏幕上intgetchar();将键盘读取的字符放入缓冲区,键盘输入的字符会显示在屏幕上1.使用getch()函数输入字符后,输入的字符不会显示在屏幕上。2.用字符输入函数接收字符时,并不是从键盘输入一个字符后立即响应,而是将输入的内容先读入缓冲区,待输入结束后再一并执行。3.与scanf()输入函数不一样,字符输入函数将空格符、制表符、换行符也作为字符接收。2.5标准输入

/ 输出函数简介特别提示阅读【例2-25】的程序example2_25.c,了解字符输入函数的功能。

【例2-26】编写程序,计算两复数的差。程序要求从键盘输入两个复数的实部和虚部的值,然后求第1个复数与第2个复数的差。核心算法分析:

两个复数的算术运算结果仍为复数,计算两个复数的差是实部与实部相减,虚部与虚部相减,即(a1+b1i)−(a2+b2i)=(a1-a2)+(b1-b2)i。程序见:

example2_26.c思考:请修改程序,完成计算两复数的和与两复数的差。2.6程序范例程序范例1

【例2-27】编写程序,在屏幕上输出由星号(*)组成的菱形图案。核心算法分析:利用printf()语句,可直接将*输出到屏幕上。程序见:

example2_

27.c思考:请修改程序,输出各种几何图案。2.5标准输入

/ 输出函数简介程序范例2

【例2-28】简单的数学计算。编写程序,计算3个数的和的平均值。核心算法分析:计算3个数a、b、c之和的平均值方法为:(a+b+c)/3。程序见:

example2_28.c思考:请修改程序,完成其他的简单算术运算。2.5标准输入

/ 输出函数简介程序范例3本章重点1.基本数据类型及取值范围。不同类型的变量有不同的取值范围。2.基本表达式的意义算术表达式、关系表达式、逻辑表达式3.复杂表达式的优先级和表达式的意义任何复杂表达式都是基本表达式的组合。4.几组输入/ 输出函数(1)格式化输入/输出函数:scanf()/printf()。(2)字符输入/输出函数:getc()/putc()。(3)字符输入/输出函数:getch()/putch()。(4)字符输入/输出函数:getchar()/putchar()。2.7本章小结一、填空题

【题2.1】~【题2.23】中的奇数号题(12个)二、单选题

【题2.24】~【题2.43】中的偶数号题(10个)三、编程题

【题2.44】

【题2.46】

【题2.47】

【题2.48】

【题2.50】

【题2.53】

本章练习C语言程序设计教程

(第2版)第3章简单算法设计第3章程序的简单算法制定本章主要内容1.结构化程序的算法设计2.结构化算法的性质及结构3.结构化算法的描述方法4.结构化算法流程图第3章程序的简单算法制定算法:解决问题的方法和要遵循的步骤。算法描述了程序要执行的操作及操作的步骤顺序。程序的功能是通过算法来描述的。C语言程序是一种结构化的程序。结构化程序:问题可以分解成相互独立的几个部分。每个独立部分可以通过简单的语句或结构来实现。分问题解的过程就是算法设计的过程。重点:掌握分析问题、解决问题的方法。

3.1结构化程序的算法设计【例3-1】要求从键盘输入3个数,找出其中最小的那个数,将其输出到屏幕。请给出解决这个问题的算法。分析:程序对于从键盘输入的3个数必须用3个变量来保存,分别为a,b,c代表输入的3个数,另外,还需要一个变量min来保存最小的那个数。1.先比较a和b的值,把数值小的放入min中;2.再将min与c比较,又把数值小的放入min中。3.经过两次比较,min中已存放的是a,b,c3个数中最小的数。把min的值输出就是所需结果。3.1结构化程序的算法设计算法步骤:1.输入3个数,其值分别赋给3个变量a,b,c;2.把a与b中较小的那个数放入变量min中;3.把c与min中较小的那个数放入变量min中;4.输出最后结果min的值。改进上面的算法描述,将第2步和第3步的算法具体化。1.输入三个数,其值分别赋给三个变量a,b,c;2.比较a与b的值,如果a<b,则min=a;否则min=b;3.比较c与min的值,如果c<min,则min=c;4.输出最后结果min的值。通过算法描述的步骤,可以很方便地用程序语言来实现。3.2结构化算法的性质及结构3.2.1结构化算法性质1.算法名称给算法命名,是为了方便算法的描述,在C语言中,算法的名字通常就是函数名。2.输入算法应有输入的数据或初始条件。3.输出算法通常会有一个或多个输出,是对输入数据加工后的结果。4.有效性算法的每一步都是可执行的,可通过人工计算的。5.正确性算法的结果必须是正确的,可验证的。6.有限性任何算法必须在执行有限条指令后结束。3.2结构化算法的性质及结构3.2.2结构化算法的结构在C语言算法的主要结构有如下3种。1.顺序结构顺序结构的特点:程序在执行过程中是按语句的先后顺序来执行的,每一条语句都代表着一个功能,2.分支结构分支结构的特点:程序在执行过程中,会根据条件的不同有选择的执行不同的功能。3.循环结构循环结构的特点:程序在执行过程中,在一定的时间段内或一定的条件下,重复地执行某个功能,直到时间已到或条件不再满足。3.2结构化算法的性质及结构程序设计要解决的两个主要问题:

(1)按什么顺序或步骤来执行;(2)用什么语句来实现。算法设计是核心问题。提示3.3结构化算法的描述方法常用的描述方法有自然语言、流程图、伪代码等。

3.3.1自然语言

用类自然语言表示算法。如:汉语、英语或其他语言。

特点:通俗易懂,简单明了。3.3结构化算法的描述方法【例3-2】从键盘输入两个变量的值a、b,请按输入值从小到大的顺序将这两个变量的值输出到屏幕。请写出这个问题的算法描述。算法描述:第1步:输入变量a和b的值;第2步:比较a和b的值;如果a大于等于b,则先输出a,再输出b;否则,先输出b,再输出a;第3步:算法结束。3.3结构化算法的描述方法【例3-3】几何级数求和:sum=1+2+3+4+5…+(n−1)+n。请写出该问题的算法。算法描述:第1步:给定一个大于0的正整数n的值;第2步:定义一个整型变量i,设其初始值1;第3步:定义整型变量sum,其初始值设置为0;第4步:如果i小于等于n,则转第5步,否则执行第8步;第5步:将sum的值加上i的值后,重新赋值给sum;第6步:将i的值加1,重新赋值给i;第7步:执行第4步;第8步:输出sum的值;第9步:算法结束。思考:①该问题的其他描述。②用自然语言描述算法的缺陷。3.3结构化算法的描述方法3.3.2流程图流程图是一种算法的形象表示。流程图是由流程线和几何图形框连接而成的。算法流程图的符号采用美国国家标准化协会(ANSI)规定的一些常用符号:开始框判断框结束框执行框数据框连接符流程线算法流程图的3种基本结构:顺序结构、分支结构、循环结构1.顺序结构顺序结构是一种简单的线性结构,根据流程线所示的方向,按顺序执行各矩形框的指令。基本流程图:注:指令A、指令B、指令C可以是一条或多条指令。执行顺序:A—B—C。3.3结构化算法的描述方法3.3结构化算法的描述方法2.分支结构分支结构要对给定的条件进行判断,看是否满足给定的条件,根据条件结果的真假而分别执行不同的执行框。基本流程图有两种:注:

(1)虚线框表示可将分支结构看成一个矩形框。

(2)指令A、指令B可以是一条或多条指令,也可以是分支结构。3.3结构化算法的描述方法3.循环结构分支结构是在条件为真的情况下,重复执行某个执行框中的内容。基本流程图有两种:注:(1)虚线框表示可将循环结构看成一个矩形框。

(2)指令A称为循环体,可以是一条或多条指令,也可以是其他分支或循环结构。

(3)do_while结构可以转化成while结构。(1)while循环:(2)do_while循环:3.3结构化算法的描述方法循环结构的特点:①在循环体指令A中必须要有对条件的值进行修改的语句,使得经过有限次循环后,循环一定能结束。②while型循环中循环体可能一次都不执行,而do_while型循环则至少执行一次循环。③do_while型循环可以转化成为while型循环结构,但while型循环不一定能转化为do_while型循环。3.3结构化算法的描述方法关于结构化流程图的规则:1.可分别将顺序结构、分支结构、循环结构的基本流程图看成是一个执行框。2.任何两个按顺序的执行框可以合并为一个执行框。

反复运用规则1和规则2可得到结构化流程图的最简形式:特别提示3.3结构化算法的描述方法【例3-4】分析下面的流程图,是否符合结构化算法标准。运用规则3.3结构化算法的描述方法【例3-5】将例3-1的算法用流程图表示,分析其是否符合结构化的标准。从键盘输入3个数,找出其中最小的那个数,将其输出到屏幕。运用规则3.3结构化算法的描述方法

【例3-6】将例3-2所描述的问题用算法流程图来表示。从键盘输入两个整型变量a,b的值,按输入值从小到大的顺序输出到屏幕。算法流程图为:3.3结构化算法的描述方法【例3-7】将例3-3所描述的问题用算法流程图来表示。计算几何级数的和:sum=1+2+3+4+5+…+(n−1)+n。算法流程图为:3.3结构化算法的描述方法3.3.3伪代码伪代码是一种接近于程序语言的算法描述方法。特点:采用有限的英文单词作为伪代码的符号系统,按照特定的格式来表达算法,可读性好,方便将算法改写成计算机的程序源代码。伪代码的7个主要部分:(1)算法名称(2)指

温馨提示

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

评论

0/150

提交评论