全书配套课件:C程序设计与训练(第二版)李秉章_第1页
全书配套课件:C程序设计与训练(第二版)李秉章_第2页
全书配套课件:C程序设计与训练(第二版)李秉章_第3页
全书配套课件:C程序设计与训练(第二版)李秉章_第4页
全书配套课件:C程序设计与训练(第二版)李秉章_第5页
已阅读5页,还剩303页未读 继续免费阅读

下载本文档

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

文档简介

第1章C语言概述本章主要介绍C语言程序的结构和书写规则,以及VC6.0V2.0的基本操作。1.1程序设计语言

1.2算法的概念1.3C语言概述1.3C语言的语句和关键字1.4C程序的设计步骤与运行环境

[Return]1.1计算机语言和程序设计1.C语言的诞生与发展(1)在C语言诞生以前,系统软件主要是用汇编语言编写的。由于汇编语言程序依赖于计算机硬件,其可读性和可移植性都很差;但一般的高级语言又难以实现对计算机硬件的直接操作(这正是汇编语言的优势),于是人们盼望有一种兼有汇编语言和高级语言特性的新语言。(2)C语言是贝尔实验室于70年代初研制出来的,后来又被多次改进,并出现了多种版本。80年代初,美国国家标准化协会(ANSI),根据C语言问世以来各种版本对C语言的发展和扩充,制定了ANSIC标准(1989年再次做了修订)。本书以ANSIC新标准来介绍。(3)目前,在微机上广泛使用的C语言编译系统有visualstudioC、BorlandC等。虽然它们的基本部分都是相同的,但还是有一些差异,所以请大家注意自己所使用的C编译系统的特点和规定(参阅相应的手册)。本书选定的上机环境是VC6.0(windows操作系统)

2.C语言的特点

C语言同时具有汇编语言和高级语言的优势。(1)语言简洁、紧凑,使用方便、灵活。

(2)运算符极其丰富。(3)生成的目标代码质量高,程序执行效率高。(4)可移植性好(较之汇编语言)。(5)可以直接操纵硬件。

3.在C语言中,除实现顺序、选择和循环三种基本结构等的9条控制语句外,输入输出操作均由标准库函数(不是C语言的组成部分)来实现。所以学习C语言,不仅要学习这9条控制语句和各种运算符,而且要学习并掌握常用标准库函数的使用。[Return]

1.2算法的概念与表示方法

算法就是解决问题的方法(或思路)。对于同一个问题可以有不同的解题方法,也就是有不同的算法,一般应当选择方法简单、运算步骤少、运算快且占用内存小的算法。算法应具有以下几个特征:(1)可行性。指算法中的每一步都是计算机可以执行的,并能得到有效的结果。(2)确定性。指算法中的每一步必须有明确定义,不能有任何歧义。(3)有穷性。指算法必须在执行有限步后结束,而不能是无限的步骤,也不能陷入死循环。(4)可输入/输出信息。常用算法的流程图表示

(1)起止框:表示算法的开始或结束。(2)输入输出框:表示算法请求输入需要的数据或算法将某些结果输出。(3)处理框:表示算法的某个处理步骤。(4)判断框:对一个给定条件进行判断,根据判断结果决定如何执行其后的操作。判断框有一个入口,两个出口。(5)流程线:指出了算法的执行方向。(6)连接点:用于将画在不同地方的流程线连接起来。(7)注释框:对流程图中某些框的操作做必要的补充说明,1.3C语言概述1.2.1C语言程序的总体结构

一个完整的C语言程序,是由一个main()函数(又称主函数)和若干个其它函数结合而成的,或仅由一个main()函数构成。[案例1.1]仅由main()函数构成的C语言程序。/*案例代码文件名:AL1_1.C*//*功能:仅由main()函数构成的C语言程序示例*/main(){printf(“ThisisaCprogram.\n”);}程序运行结果:

ThisisaCprogram.[程序演示][案例1.2]由main()函数和1个其它函数max()构成的C语言程序。/*案例代码文件名:AL1_2.C*//*功能:由main()函数和1个其它函数max()构成的C语言程序示例*/intmax(intx,inty){return(x>y?x:y);}main(){intnum1,num2;printf(“Inputthefirstintegernumber:”);scanf(“%d”,&num1);printf(“Inputthesecondintegernumber:”);scanf(“%d”,&num2);printf(“max=%d\n”,max(num1,num2));}程序运行情况:

Inputthefirstintegernumber:6←┘Inputthesecondintegernumber:9←┘max=9[程序演示][案例1.3]改写[案例1.2],交换main()函数和max()函数的前后位置。源程序略。程序运行情况:

Inputthefirstintegernumber:6←┘Inputthesecondintegernumber:9←┘max=91.函数是C语言程序的基本单位。main()函数的作用,相当于其它高级语言中的主程序;其它函数的作用,相当于子程序。2.C语言程序总是从main()函数开始执行。一个C语言程序,总是从main()函数开始执行,而不论其在程序中的位置。当主函数执行完毕时,亦即程序执行完毕。习惯上,将主函数main()放在最前头。

1.2.2函数的一般结构

任何函数(包括主函数main())都是由函数说明和函数体两部分组成。其一般结构如下:

[函数类型]函数名(函数参数表)函数说明部分

{说明语句部分;执行语句部分;函数体部分

}

1.使用的语法符号约定

[...]──方括号表示可选(即可以指定,也可以缺省)

……──省略号表示前面的项可以重复

|──多(含2)中选1

2.函数说明由函数类型(可缺省)、函数名和函数参数表三部分组成,其中函数参数表的格式为:数据类型形参[,数据类型形参2……]例如,[案例1.2]中的函数max(),其函数说明各部分如图1-1所示。函数类型函数名函数参数表↓↓↓

intmax(intx,inty)

图1-1函数说明部分结构图注意:在旧标准中,函数可以缺省参数表。3.函数体在函数说明部分的下面、大括号(必须配对使用)内的部分。函数体一般由说明语句和可执行语句两部分构成:(1)说明语句部分说明语句部分由变量定义、自定义类型定义、自定义函数说明、外部变量说明等组成。

(2)可执行语句一般由若干条可执行语句构成。图1-2是[案例1.2]的main()函数体的示意图。/*主函数main()*/main(){intnum1,num2;变量定义部分

printf(“Inputthefirstintegernumber:”);scanf(“%d”,&num1);printf(“Inputthesecondintegernumber:”);可执行语句部分函数体

scanf(“%d”,&num2);printf(“max=%d\n”,max(num1,num2));}

图1-2函数体结构示意图

4.说明(1)函数体中的变量定义语句,必须在所有可执行语句之前。下面程序中变量定义语句“intmax;”的位置是非法的:main(){intx,y; /*变量定义语句:定义2个整型变量x、y*/x=3; /*可执行的赋值语句:将3赋值给变量x*/y=6; /*可执行的赋值语句:将6赋值给变量y*/intmax; /*变量定义语句:出现在可执行的赋值语句“x=3;”和“y=6;”之后,非法!*/max=x>y?x:y;printf(“max=%d\n”,max);}解决办法很简单,请读者自己思考。(2)如果不需要,也可以缺省变量定义语句。1.2.3源程序书写格式1.所有语句都必须以分号“;”结束,函数的最后一个语句也不例外。2.程序行的书写格式自由,既允许1行内写几条语句,也允许1条语句分写在几行上。例如,[案例1.2]的主函数main(),也可改写成如下所示的格式:……main(){intnum1,num2;printf(“Inputthefirstintegernumber:”);scanf(“%d”,&num1);printf(“Inputthesecondintegernumber:”);scanf(“%d”,&num2);printf(“max=%d\n”,max(num1,num2));}如果某条语句很长,一般需要将其分写在几行上。3.允许使用注释。C语言的注释格式为:/*……*/例如,在[案例1.1]和[案例1.2]中,以及本节其它部分给出的源程序中,凡是用“/*”和“*/”括起来的文字,都是注释。(1)“/*”和“*/”必须成对使用,且“/”和“*”、以及“*”和“/”之间不能有空格,否则都出错。

技巧:为避免遗漏必须配对使用的符号,例如注释符号、函数体的起止标识符(花括号)、圆括号等等,在输入时,可连续输入这些起止标识符,然后再在其中进行插入来完成内容的编辑。在起止标识符嵌套时,以及相距较远时,这样做更有必要。

(2)注释的位置,可以单占1行,也可以跟在语句的后面。(3)如果1行写不下,可另起1行继续写。(4)注释中允许使用汉字。在非中文操作系统下,看到的是一串乱码,但不影响程序运行。

[Return]1.4C程序的设计步骤与运行环境

1.运行一个C语言程序的一般过程2.VC的启动、退出与命令菜单3.编辑并保存一个C语言源程序4.编译、连接──单个源程序文件5.运行与查看结果6.编辑下一个新的源程序[Return]1.运行一个C语言程序的一般过程

VC6.0是一个集源程序编辑、编译、连接、运行与调试于一体、用菜单驱动的集成软件环境。运行一个C语言程序的一般过程:(1)启动VC,进入VC集成环境。(2)编辑(或修改)源程序。(3)编译。如果编译成功,则可进行下一步操作;否则,返回(2)修改源程序,再重新编译,直至编译成功。(4)连接。如果连接成功,则可进行下一步操作;否则,根据系统的错误提示,进行相应修改,再重新连接,直至连接成功。(5)运行。通过观察程序运行结果,验证程序的正确性。如果出现逻辑错误,则必须返回(2)修改源程序,再重新编译、连接和运行,直至程序正确。(6)退出VC集成环境,结束本次程序运行。[Return]2.VC的启动、退出与命令菜单

(1)启动VC6.0:启动VC6.0后,进入如下环境

(2)菜单栏的使用2.建立新的源程序文件

从菜单栏中选择“文件”|“新建”命令,新建C++SourceFile3.编辑源程序在下图所示窗口中输入源程序

4.编译源程序文件

源程序编辑完成后,点击“组建”按钮,源程序经过编译、连接后产生可执行程序sample1.exe。程序正确编译后的窗口见下图。

5.运行与查看结果

(1)运行当前正在编辑的源程序文件选择并执行Run|Run项(快捷键:^F9),程序运行结束后,仍返回到编辑窗口。当你认为自己的源程序不会有编译、连接错误时,也可直接运行(即跳过对源程序的编译、连接步骤)。这时,VC将一次完成从编译、连接到运行的全过程。(2)查看运行结果选择并执行Run|UserScreen项(快捷键:Alt+F5)。查看完毕后,按任一键返回编辑窗口。如果发现逻辑错误,则可在返回编辑窗口后,进行修改;然后再重新编译、连接、运行,直至正确为止。[Return]

5.运行程序编译连接正确后,单击图1-11编译工具栏中的“运行”按钮,运行可执行程序。通过键盘输入半径值2.5以及回车键后,出现如下运行结果:

第2章数据类型与表达式2.1C语言基本字符集和词汇2.2C语言数据类型

2.3常量

2.4变量

2.5运算符和表达式

*2.6指针类型

*2.7位运算符

*2.8类型转换

[Return]2.1C语言基本字符集和词汇2.1.1C语言基本字符集C语言基本字符集是ASCII码的子集,包括以下几类:(1)英文字母:26个小写英文字母a~z和26个大写英文字母A~Z共52个字符;(2)数字:分别为0~9共10个字符。(3)空白符:包括空格符、制表符、回车符等。空白符只在字符常量和字符串常量中起作用。在其他地方出现时,只起间隔作用,编译程序对它们忽略不计。因此在程序中使用空白符与否,对程序的编译不发生影响,但在程序中适当的地方使用空白符将增加程序的清晰性和可读性。(4)特殊字符:包括29个特殊字符。

2.1C语言基本字符集和词汇2.1.2词汇C语言的词汇包括关键字、标识符、运算符和分隔符等。1.关键字关键字又称为保留字,是C语言预先声明的具有特定意义的单词。用户不能将这些关键字用作自定义的标识符。C语言常用关键字可分为以下几类。数据类型关键字,包括char、double、float、int、long、short、unsigned、union、void、enum、signed、struct等;控制语句关键字,包括do、break、case、continue、for、goto、return、else、default、if、while、switch、extern等;存储类型关键字,包括auto、register、static;其他关键字,有const、sizeof、typedef、volatile、inline。

2.1C语言基本字符集和词汇2.标识符标识符是编程人员声明的单词,用来表示各种程序对象(如变量、类型、函数、文件等)的名字。在C语言中标识符的构成规则如下:(1)以字母或下划线“_”开头,后接字母、数字、下划线组成的字符序列。(2)大小写字母含义不同。例如,Name和name是两个不同的标识符。习惯上,一般用小写字母表示变量名,所有字母大写表示符号常量名,虽然这不是必须的,但它可以增加程序的可读性。(3)标准C不限制标识符的长度,可由1个字符构成,也可由若干个字符构成,但其最大长度受各种版本的C语言编译系统限制。我们在编写程序时可不考虑这一限制,因一般的编译系统都支持长标识符。

2.1C语言基本字符集和词汇2.标识符依照上述规则,下列标识符是合法的。sum,area,Number_of_moves,number_of_moves,j3_1,count1下列标识符是不合法的。3xy (以数字开头)x2+y3(出现非法字符“+”)@Mn3 (出现非法字符“@”) max–b2(出现非法字符“–”)$xz_1238(出现非法字符“$”)M.J.ttY(出现非法字符“.”)

2.1C语言基本字符集和词汇2.标识符标识符命名时需要注意:(1)标识符命名时做到“见名知义”,如PI、name、count、max等,以便于阅读和理解。(2)尽量避免使用会引起混淆的字符。如字母“O”和数字“0”,字母“I”、“l”和数字“1”,字母“z”和数字“2”等都易混淆。(3)不能把关键字用作标识符。(4)在C语言中,还有一类具有特定含义的标识符,它们主要用作C语言的预处理命令,因此,人们习惯上也把它们看成关键字,不作一般标识符使用,它们是:define、include、undef、ifdef、ifndef、endif。(5)C语言提供了大量的标准库函数,每一个函数都对应一个函数名,例如库函数sin、printf、scanf等。不应将这些函数名定义为一般标识符来使用。

2.1C语言基本字符集和词汇3.运算符运算符是用来表示某种运算的符号,多数运算符由一个字符组成,也有的由多个字符组成。C语言中有44个运算符,分为15种优先级和两种结合性,详见附录B。4.分隔符分隔符是用于分隔单词或程序正文,一般不表示任何实际的操作,仅用于构造程序。C语言中常用的分隔符是空格、制表符、逗号和换行符等。

[Return]2.2C语言数据类型在C语言中,凡是数据都必须有类型,必须在使用前进行类型说明。[Return]

2.3常量

在程序运行过程中,其值不能被改变的量称为常量。

常量的分类

(1)整型常量(2)实型常量(3)字符常量。(4)符号常量。2.3.1整型常量C语言中的常量有三类:数、字符和字符串。由于它们本身已经隐含了数据类型,所以使用时不必事先进行类型说明就可以直接使用。整型常量简称整数,C语言中整型常量可以用三种数制来表示:(1)十进制整数:以日常所用的十进制整数形式给出,数码取值为0~9。如154、-65、523。(2)八进制整数:以数字0开头的数是八进制数,数码取值为0~7。如十进制数39,用八进制表示为047。(3)十六进制整数:以0x(数字0和字母x)或0X开头的数是十六进制数,其数码取值为0~9、A~F或a~f。如0x1A23、0X2b。2.3.2实型常量通常,在计算机科学中,把带小数的数称为实数。C语言中的实数有float(单精度)实数和double(双精度)实数,它们在计算机内存中是以浮点数形式存放的,故又称为浮点数。实型常量只能用十进制形式表示,不能用八进制和十六进制形式表示。实型常量有两种表示方法:(1)十进制数形式:由数码0~9、小数点及正负号组成,如3.1415926,-0.12等都是合法的实数。(2)指数形式:由十进制数a,加阶码标识“e”或“E”以及阶码n组成。一般形式为:aEn或aen其中,a为实数,n为阶码,“e”或“E”两边必须有数字。2.3.3字符型常量字符型常量是用一对单引号括起来的单个字符构成,例如,'a','b','1'等都是有效的字符型常量。在C语言中,字符是用其对应的ASCII码值来表示,一个字符占一个字节。例如,字符常量'0'、'A'、'a'的ASCII码值分别是48、65、97,它们对应的存储单元的内容分别为48、65、97。C语言还使用一种特殊形式的字符型常量,这就是以反斜杠'\'开头,后跟一个或几个字符,它们不再具有字符原有的意义,而具有特定含义,故将其称为“转义”字符。转义字符常用来表示那些用一般方式无法表示的控制字符。例如,用'\n'表示换行字符,它的ASCII码值为10。常见的转义字符如表2-2所示。在字符常量中要使用单引号和反斜杠时,必须用转义字符表示,即在这些字符前加上反斜杠,例如'\\'、'\''。2.3.4字符串常量C语言中,除了允许使用字符常量以外,还允许使用字符串常量。在编写程序时使用一对双引号括起来的字符串序列就是字符串常量,注意,这里的双引号仅起定界符的作用,并不是字符串中的字符。以下均是字符串常量:"Iamastudent."、"CHINA"、"a"、"123.4"等。字符串常量在内存中存储时,除了一个字符占用一个字节外,还会自动在其尾部增加一个转义字符'\0',用这个特殊的字符作为字符串结束的标识。或者说,若干个字符后有了结束标识'\0',才称为C语言的字符串。例如,字符串"computer"包含8个字符,但其在内存中占用9个字节,最后一个字节就是存放字符串结束标识符'\0'。用它来表示本字符串到此为止,之后的内容不属于本字符串。computer\0图2-2字符串常量在内存中的表示2.3.5符号常量以上几种常量一般从字面上即可判别,所以又统称为字面常量或直接常量。在C语言中还可以用一个标识符来代表一个常量,称之为符号常量。符号常量在使用之前必须先定义。在C语言中,使用宏定义命令#define定义符号常量。其一般形式为:#define标识符常量表达式#definePI3.14[Return]2.4变量所谓变量是指在程序运行过程中其值可以发生变化的一种数据对象。每一个变量都用一个标识符来表示,该标识符称为变量名。每个变量都属于某个确定的数据类型,在内存中占据一定的存储单元,在该存储单元中存放变量的值,因此,变量具有如下属性:(1)地址(2)变量名(3)变量值(4)类型

2.4变量

在C语言中,变量一定要先定义后使用。定义变量的一般形式如下。类型变量名表;这里,类型必须是C语言的有效数据类型。变量名表是一个或多个标识符,中间用逗号隔开,最后用分号表示变量定义结束。以下是定义变量的例子:inti,j,num; //说明i、j、num为整型变量floata,b,sum; //说明a、b、sum为实型变量charc,ch; //说明c、ch为字符型变量2.4.1整型变量1.整型变量在内存中的存放形式数据在内存中是以二进制形式存放的。例如,定义了一个整型变量i:inti;将十进制数9赋值给变量i:i=9;2.整型变量的分类整型变量的基本类型符为int,可以根据数值的范围将变量定义为基本整型、短整型或长整型。在int之前可以根据需要加上修饰符:short(短型)或long(长型)。对这三种类型都可以加上修饰符unsigned以指定其为“无符号数”。如果加上修饰符signed,则表示“有符号数”。默认为有符号数(signed)。有符号基本整型 [signed]int有符号短整型 [signed]short[int]有符号长整型 [signed]long[int]无符号基本整型 unsignedint无符号短整型 unsignedshort[int]无符号长整型 unsignedlong[int]3.整型变量的定义与使用 C语言规定在程序中要用到的变量必须先定义后使用。【例2-3】整型变量的定义与使用。#include<stdio.h>intmain(){inta,b; //定义有符号整型变量a和b longc; //定义有符号长整型变量c unsignede; //定义无符号整型变量ea=-1;b=523;c=623789;e=89;printf("a=%d,b=%d,c=%ld,e=%u\n",a,b,c,e); return0;}4.整型变量的初始化程序中常需要对一些变量预先设置初值,称为变量初始化。C语言允许在定义变量的同时对变量初始化。如:inta=3; //相当于inta;a=3;inta,b,c=5;//可以部分初始化变量,它相当于inta,b,c;c=5;inta=3,b=3,c=3; //它相当于inta,b,c;a=b=c=3;//但不能写成inta=b=c=3;它相当于inta;a=(b=(c=3));而b和c未定义2.4.2实型变量实型变量分为单精度型(float)、双精度型(double)和长双精度型(longdouble)三类。ANSIC并未规定每一种数据类型的长度、精度和数值范围。表2-4列出了TC3.0和VC++6.0定义的实数类型和取值范围。2.4.2实型变量对每一个实型变量应在使用之前加以定义和初始化。如:floatx,y;floatm=12.8;doublemin;longdoublet;2.4.3字符型变量字符型变量用来存放字符常量,一个字符变量只能存放一个字符。表2-5列出了TC3.0和VC++6.0定义的字符类型和取值范围。字符变量定义形式如下:charc1,c2;定义c1、c2为字符型变量,在内存中各占一个字节,可以分别存放一个字符。下面是对c1、c2赋值:c1='a';c2='b';也可以在定义字符变量的同时为其赋值,如:charc1='a',c2='b';[Return]2.5运算符和表达式2.5.1C语言运算符与表达式简介

1.运算符在程序中对变量或常量进行处理的符号称之为运算符。2.表达式表达式是用运算符和括号把操作数连接起来所形成的式子。操作数可以是常量、变量和函数。每个表达式不管多么复杂,都能依据运算符的优先级、结合性以及数据类型转换规则计算出唯一的值。该值的类型就是表达式的类型。C语言表达式依据其的可分为:算术表达式、赋值表达式、关系表达式、逻辑表达式、条件表达式和逗号表达式等。其中关系表达式、逻辑表达式将在第4章介绍。2.5运算符和表达式2.5.2算术运算符和算术表达式

1.算术运算符2.5运算符和表达式2.5.2算术运算符和算术表达式

2.算术表达式和运算符的优先级与结合性2.5运算符和表达式2.5.2算术运算符和算术表达式

3.自增、自减运算符2.5运算符和表达式2.5.2算术运算符和算术表达式

4.sizeof运算符sizeof运算符可操作的数据对象可以是表达式,也可以是类型名,其形式如下:sizeof(数据类型标识)sizeof表达式2.5运算符和表达式2.5.3赋值运算符和赋值表达式1.赋值运算符赋值运算符(=)的作用是将其右边表达式的值赋给左边的变量。赋值号左边一定是变量,右边是表达式。如:a=3;r=x%y;2.5运算符和表达式2.5.3赋值运算符和赋值表达式2.复合赋值运算符在C语言中,可以在赋值运算符之前加上其他运算符,构成复合赋值运算符。复合赋值运算符共有10种,分别是:+=-=*=/=%=<<=>>=&=^=|=前5个运算符是由算术运算符和赋值运算符结合在一起构成的复合赋值运算符;后5个运算符是由位运算符和赋值运算符结合在一起构成复合赋值运算符。(1)x+=3; 等价于x=x+3;(2)y*=y+z;等价于y=y*(y+z);(3)x%=3; 等价于x=x%3;(4)i<<=3; 等价于i=i<<3;2.5运算符和表达式2.5.3赋值运算符和赋值表达式3.赋值表达式由赋值运算符将一个变量和一个表达式连接起来的式子称为赋值表达式,其一般形式为:变量=表达式赋值表达式的作用是将赋值运算符右边的表达式的值赋给左边的变量。C语言规定,赋值运算是右结合性,即从右至左进行运算,因此表达式x=(y=8)中的括号可以省略,写成:x=y=8。2.5运算符和表达式2.5.4逗号运算符和逗号表达式逗号运算符“,”是C语言中一个比较特殊的运算符,它的作用是将若干个表达式连接起来。其基本信息如表2-10所示。逗号表达式的一般形式为:表达式1,表达式2,表达式3,…,表达式n例如:a=3,b=5,c=a*b它是由三个独立的表达式结合而成的。整个逗号表达式的值是15,a的值是3,b的值是5,c的值是15。2.5运算符和表达式2.5.5条件运算符和条件表达式条件运算符“?:”是C语言中唯一的三目运算符,即有三个操作数参与运算。其基本信息如表2-11所示。由条件运算符组成条件表达式的一般形式为:表达式1?表达式2:表达式3其求值规则为:如果表达式1的值为真,则以表达式2的值作为条件表达式的值,否则以表达式3的值作为条件表达式的值。条件表达式通常用于赋值语句之中,例如一个条件表达式如下:max=(a>b)?a:b;[Return]2.6指针类型2.6.1字符常量指针是C语言中一个非常重要的概念,也是C语言的一个重要特色。指针是一种很特殊的数据类型,其实它既不是简单类型也不是构造类型。利用指针变量可以表示各种数据结构;可以方便地使用数组和字符串;并能象汇编语言一样处理内存地址,使得程序员能编写出精练而高效的程序。指针的这些特点和用途对于设计系统软件和应用程序是非常必要的。正确地使用指针,可以编写出简洁、紧凑、高效的程序。[Return]2.7位运算符在很多应用中,常常要求在二进制位(bit)一级进行运算。位运算是指对操作数的各二进制位进行运算,C语言提供了六种位运算符,它们是:

(1)&:按位与;(2)|:按位或;(3)^:按位异或;(4)~:按位非;(5)<<:左移;(6)>>:右移。[Return]2.8类型转换2.8.1自动类型转换1.赋值运算中的类型转换2.混合运算中的类型转换2.8.2强制类型转换【例2-12】强制类型转换示例。#include<stdio.h>intmain(){floatx; inti; x=13.62; i=(int)x; printf("x=%f,i=%d\n",x,i); return0;}【例2-13】已知变量x和y的类型为float,变量a和z的类型为整型,x、y、a的值分别是3.2、3.9、10,求表达式z=x+a%3*(int)(x+y)%2/4的值。解:(1)求a%3,其值为1,表达式变为x+1*(int)(x+y)%2/4;(2)求(x+y),其值为7.1,表达式变为x+1*(int)(7.1)%2/4;(3)求(int)(7.1),其值为7,表达式变为x+1*7%2/4;(4)求1*7,其值为7,表达式变为x+7%2/4;(5)求7%2,其值为1,表达式变为x+1/4;(6)求1/4,其值为0,表达式变为x;(7)x值为3.2,因此,表达式x+a%3*(int)(x+y)%2/4的值为3.2;(8)z=x+a%3*(int)(x+y)%2/4,z的类型为int,自动将x+a%3*(int)(x+y)%2/4的类型转换为整型,因此,变量z的值是3。[Return]第3章基本语句与顺序结构程序设计3.1语句3.2数据输入与输出3.3顺序结构程序设计3.4顺序结构程序设计举例[Return]3.1语句语句是构成高级语言源程序的基本单位。C语言中的语句是以分号结束的一段字符构成,例如:printf(“Goodmorning!\n”);C语言中语句分为简单语句和结构语句,如图3-1所示。

1.简单语句(1)空语句。只有一个分号的语句就是空语句,它什么也不做。写法如下:;(2)表达式语句。在任何一个表达式后面加上一个分号就构成一条表达式语句,它是C语言程序中最常用的语句。例如:

a=3+x; (赋值表达式语句) ++i; (算术表达式语句)(3)return语句。return语句用于函数的返回。(4)break语句。break语句用于退出循环结构或switch结构。(5)continue语句。continue语句用于循环结构中,其作用是结束本次循环。(6)goto语句。尽管在编写程序时不提倡使用goto语句。(7)函数调用语句。由函数调用加一个分号构成一条语句。2.结构语句(1)复合语句。复合语句是用符号“{”和“}”把若干有序的语句组合在一起而构成的。例如:{ intt; t=a; a=b;

b=t;}

在逻辑上将复合语句看成是一条语句。要注意的是,在复合语句括号“}”外不需要再加分号。(2)选择结构与循环结构语句----程序的流程控制语句。[Return]3.2数据输入与输出3.2.1数据输入输出的概念在计算机中,输入输出(I/O)是以计算机主机为主体而言的。若从主机向输出设备(如:显示器、打印机等)输出数据,称为“输出(Output)”。而从输入设备(如键盘、鼠标等)向计算机传输数据,则称为“输入(Input)”。C语言中没有定义任何处理输入输出的关键字,程序的输入输出都是使用系统库函数完成。C语言的输入输出系统包括了许多函数,这些函数的有关信息在文件stdio.h(标准输入输出库,文件名后缀中的“h”是header的缩写)中说明。在使用系统库函数时,要在程序文件的开头用预处理命令“#include”把有关文件包含在本程序中。形式如下:#include"头文件"

或#include<头文件>

区别:用尖括号形式时,编译系统在存放C库函数头文件的目录中寻找要包含的文件,这称为标准方式。用双引号形式时,系统在用户当前目录中寻找要包含的文件,若找不到,再按标准方式查找(即再按尖括号的方式查找)。3.2.2字符数据的输入输出函数单个字符的输入──getchar()函数[例]说明getchar()函数的格式和作用。/*功能:说明getchar()函数的格式和作用。*/#include"stdio.h" /*文件包含*/main(){charch;printf("Pleaseinputtwocharacter:");ch=getchar(); /*输入1个字符并赋给ch*/putchar(ch);putchar('\n');putchar(getchar()); /*输入一个字符并输出*/putchar('\n');}

程序运行情况如下:

Pleaseinputtwocharacters:ab↙ab1.getchar()函数的格式:getchar();2.getchar()函数的作用:从系统隐含的输入设备(如键盘)输入一个字符。另外,从功能角度来看,scanf()函数可以完全代替getchar()函数。(1)getchar()函数只能用于单个字符的输入,一次输入一个字符。(2)程序中要使用getchar()函数,必须在程序(或文件)的开头加上编译预处理命令:

#include"stdio.h“3.2.2字符数据的输入输出函数单个字符的输出──putchar()函数[例1]putchar()函数的格式和使用方法。/*功能:说明putchar()函数的格式和使用方法。*/#include"stdio.h" /*编译预处理命令:文件包含*/main(){charch1='N',ch2='E',ch3='W';putchar(ch1);putchar(ch2);putchar(ch3); /*输出*/

putchar('\n');putchar(ch1);putchar('\n'); /*输出ch1的值,并换行*/

putchar('E');putchar('\n'); /*输出字符'E',并换行*/

putchar(ch3);putchar('\n');}

程序运行结果如下:

NEWNEW1.putchar()函数的格式:

putchar(ch);

其中ch可以是一个字符变量或常量,也可以是一个转义字符。

2.putchar()函数的作用:向终端输出一个字符。(1)putchar()函数只能用于单个字符的输出,且一次只能输出一个字符。另外,从功能角度来看,printf()函数可以完全代替putchar()函数。(2)在程序中使用putchar()函数,务必牢记:在程序(或文件)的开头加上编译预处理命令(也称包含命令),即:

#include"stdio.h"

表示要使用的函数,包含在标准输入输出(stdio)头文件(.h)中。3.2.3格式化输入与输出函数printf()和scanf()是最常用的输入输出函数,它们可以在程序设计者的控制下以各种格式分别实现数据的输出和输入操作。1.printf()函数[例2]已知圆半径radius=1.5,求圆周长和圆面积。

main()

{floatradius,length,area,pi=3.1415926;

radius=1.5;

length=2*pi*radius; /*求圆周长*/

area=pi*radius*radius; /*求圆面积*/

printf(“radius=%f\n”,radius); /*输出圆半径*/

printf(“length=%7.2f,area=%7.2f\n”,length,area); /*输出圆周长、面积*/

}

程序运行结果如下:

radius=1.500000length=9.42,area=7.07 printf()函数的一般格式如下:printf("格式字符串"[,输出项表]);

1.格式字符串。“格式字符串”也称“转换控制字符串”,可以包含三种字符:(1)格式指示符。格式指示符的一般形式如下:%[标志][宽度][.精度][F|N|h|L][类型]

常用的标志字符如表3-1所示,常用的宽度指示符如表3-2所示,常用的精度指示符如表3-3所示,长度修饰符如表3-4所示,类型转换字符如表3-5所示。

(2)转义字符例如,[例1]中printf()函数中的'\n'就是转义字符,输出时产生一个“换行”操作。(3)普通字符──除格式指示符和转义字符之外的其它字符。格式字符串中的普通字符,原样输出。例如,[例2]中“printf("radius=%f\n",radius);”语句中的“radius=”,“printf("length=%7.2f,area=%7.2f\n",length,area);”语句中的“length=”、“area=”等都是普通字符。

2.输出项表输出项表是可选的。如果要输出的数据不止1个,相邻2个之间用逗号分开。下面的printf()函数都是合法的:(1)printf("Iamastudent.\n");

(2)printf("%d",3+2);

(3)printf("a=%fb=%5d\n",a,a+3); 必须强调:“格式字符串”中的格式指示符,必须与“输出项表”中、输出项的数据类型一致,否则会引起输出错误。格式指示符

输出不同类型的数据,要使用不同的类型转换字符。

1)类型转换字符d──以带符号的十进制整数形式输出。

[例3]类型转换字符d的使用。main(){intnum1=123;longnum2=123456;/*用3种不同格式,输出int型数据num1的值*/printf("num1=%d,num1=%5d,num1=%-5d,num1=%2d\n",num1,num1,num1,num1);/*用3种不同格式,输出long型数据num2的值*/printf("num2=%ld,num2=%8ld,num2=%5ld\n",num2,num2,num2);printf("num1=%ld\n",num1);} [程序演示]程序运行结果如下:num1=123,num1=□□123,num1=123□□,num1=123num2=123456,num2=□□123456,num2=123456num1=16908411 对于整数,还可用八进制、无符号形式(%o(小写字母o))和十六进制、无符号形式(%x)输出。对于unsigned型数据,也可用%u格式符,以十进制、无符号形式输出。所谓无符号形式是指,不论正数还是负数,系统一律当作无符号整数来输出。例如,printf("%d,%o,%x\n",-1,-1,-1);2)类型转换字符f──以小数形式、按系统默认的宽度,输出单精度和双精度实数。[例4]类型转换字符f的使用。main(){floatf=123.456;doubled1,d2;d1=1111111111111.111111111;d2=2222222222222.222222222;printf("%f,%12f,%12.2f,%-12.2f,%.2f\n",f,f,f,f,f);printf("d1+d2=%f\n",d1+d2);} [程序演示]

程序运行结果如下:

123.456001,□□123.456001,□□□□□□123.46,123.46□□□□□□,123.46d1+d2=3333333333333.333010

本例程序的输出结果中,数据123.456001和3333333333333.333010中的001和010都是无意义的,因为它们超出了有效数字的范围。对于实数,也可使用格式符%e,以标准指数形式输出:尾数中的整数部分大于等于1、小于10,小数点占一位,尾数中的小数部分占5位;指数部分占4位(如e-03),其中e占一位,指数符号占一位,指数占2位,共计11位。也可使用格式符%g,让系统根据数值的大小,自动选择%f或%e格式、且不输出无意义的零。3)类型转换字符c──输出一个字符(只占一列宽度)。[例5]类型转换字符c的使用。main(){charc='A';inti=65;printf("c=%c,%5c,%d\n",c,c,c);printf("i=%d,%c",i,i);}程序运行结果如下:

c=A,□□□□A,65i=65,A [程序演示]

需要强调的是:在C语言中,整数可以用字符形式输出,字符数据也可以用整数形式输出。将整数用字符形式输出时,系统首先求该数与256的余数,然后将余数作为ASCII码,转换成相应的字符输出。4)类型转换字符s──输出一个字符串。[例6]类型转换字符s的使用。main(){printf("%s,%5s,%-10s","Internet","Internet","Internet");printf("%10.5s,%-10.5s,%4.5s\n","Internet","Internet","Internet");} [程序演示]程序运行结果如下:Internet,Internet,Internet□□,□□□□□Inter,Inter□□□□□,Inter注意:系统输出字符和字符串时,不输出单引号和双引号。使用说明(1)printf()可以输出常量、变量和表达式的值。但格式控制中的格式说明符,必须按从左到右的顺序,与输出项表中的每个数据一一对应,否则出错。例如,printf("str=%s,f=%d,i=%f\n","Internet",1.0/2.0,3+5,"CHINA");是错误的。(2)格式字符x、e、g可以用小写字母,也可以用大写字母。使用大写字母时,输出数据中包含的字母也大写。除了x、e、g格式字符外,其它格式字符必须用小写字母。例如,%f不能写成%F。(3)格式字符紧跟在“%”后面就作为格式字符,否则将作为普通字符使用(原样输出)。例如,“printf(”c=%c,f=%f\n“,c,f);”中的第一个c和f,都是普通字符。2.scanf()函数scanf()函数是用来从外部输入设备向计算机主机输入数据的。

scanf()函数的一般格式

[例7]已知圆柱体的底半径radius=1.5,高high=2.0,求其体积。

main()

{floatradius=1.5,high=2.0,pi=3.14159,vol;

vol=pi*radius*radius*high;/*求体积*/

printf(“vol=%7.2f\n”,vol); /*输出求出的体积*/

} [程序演示][例8]已知圆柱体的底半径为radius,高为high,求其体积。/*功能:说明函数scanf()的格式及作用。*/main(){floatradius,high,vol,pi=3.1415926;printf("Pleaseinputradius&high:");scanf("%f%f",&radius,&high); /*从键盘输入两个实数赋给变量r,h*/vol=pi*radius*radius*high;printf("radius=%7.2f,high=%7.2f,vol=%7.2f\n",radius,high,vol);} [程序演示]程序运行结果如下:

Pleaseinputradius&high:1.5□2.0↙radius=□□□1.50,high=□□□2.00,vol=□□14.14

在程序中给计算机提供数据,可以用赋值语句,也可以用输入函数。在C语言中,可使用scanf()函数,通过键盘输入,给计算机同时提供多个、任意的数据。scanf()函数的一般格式scanf("格式字符串",输入项首地址表);(1)格式字符串。格式字符串可以包含3种类型的字符:格式指示符、空白字符(空格、Tab键和回车键)和非空白字符(又称普通字符)。格式指示符与printf()函数的相似,空白字符作为相邻2个输入数据的缺省分隔符,非空白字符在输入有效数据时,必须原样一起输入。(2)输入项首地址表──由若干个输入项首地址组成,相邻2个输入项首地址之间,用逗号分开。输入项首地址表中的地址,可以是变量的首地址,也可以是字符数组名或指针变量。变量首地址的表示方法:&变量名其中“&”是地址运算符。例如,[案例3.7]中的“&radius”是指变量radius在内存中的首地址。

2.scanf()函数的功能:从键盘上接收格式化输入。运行[案例8]的程序时,从键盘上输入2个实数,分别存入&radius、&high起始的存储单元中,即输入两个实数分别赋给radius和high。格式指示符格式指示符的一般形式为:%[*][宽度][F|N][h|l]类型字符

1)类型字符类型字符如表3-6所示。例如,在[例8]的scanf()函数语句中,格式字符串“%f%f”。

2)宽度n

指定该项输入数据所占列数为n。换句话说,读取输入数据中相应的n位,但按需要的位数赋给相应的变量,多余部分被舍弃。例如,scanf("%3c%3c",&ch1,&ch2);printf("ch1=%c,ch2=%c\n",ch1,ch2);

假设输入“abcdefg”,则系统将读取的“abc”中的“a”赋给变量ch1;将读取的“def”中的“d”赋给变量ch2,所以printf()函数的输出结果为:ch1=a,ch2=d。3)赋值抑制字符*表示本输入项对应的数据读入后,不赋给相应的变量(该变量由下一个格式指示符输入)。例如,scanf("%2d%*2d%3d",&num1,&num2);printf("num1=%d,num2=%d\n",num1,num2);

假设输入“123456789”,则系统将读取“12”并赋值给num1;读取“34”、但舍弃掉(“*”的作用);读取“567”并赋值给num2。所以,printf()函数的输出结果为:num1=12,num2=567。

4)类型修饰符──F、N、h、l。其含义与printf()中的一样,分别为远指针、近指针、短整型和长整型。数据输入操作

1)如果相邻2个格式指示符之间,不指定数据分隔符(如逗号、冒号等),则相应的2个输入数据之间,至少用一个空格分开,或者用Tab键分开,或者输入1个数据后,按回车,然后再输入下1个数据。例如,scanf("%d%d",&num1,&num2);

假设给num1输入12,给num2输入36,则正确的输入操作为:12□36↙

或者:12↙36↙

注:使用“↙”符号表示按回车键操作,在输入数据操作中的作用是,通知系统输入操作结束。2)“格式字符串”中出现的普通字符(包括转义字符形式的字符),务必原样输入。例如,scanf("%d,%d",&num1,&num2);

假设给num1输入12,给num2输入36,正确的输入操作为:12,36↙

另外,scanf()函数中、格式字符串内的转义字符(如\n),系统并不把它当转义字符来解释,从而产生一个控制操作,而是将其视为普通字符,所以也要原样输入。例如:scanf("num1=%d,num2=%d\n",&num1,&num2);

假设给num1输入12,给num2输入36,正确的输入操作为:

num1=12,num2=36\n↙

提高人机交互性建议:为改善人机交互性,同时简化输入操作,在设计输入操作时,一般先用printf()函数输出一个提示信息,再用scanf()函数进行数据输入。例如,将scanf("num1=%d,num2=%d\n",&num1,&num2);改为:

printf("num1=");scanf("%d",&num1);printf("num2=");scanf("%d",&num2);3)输入数据时,遇到以下情况,系统认为该数据结束:(1)遇到空格,或者回车键,或者Tab键。(2)遇到输入域宽度结束。例如“%3d”,只取3列。(3)遇到非法输入。例如,在输入数值数据时,遇到字母等非数值符号(数值符号仅由数字字符0-9、小数点和正负号构成)。4)使用格式说明符“%c”输入单个字符时,空格和转义字符均作为有效字符被输入。例如,scanf("%c%c%c",&ch1,&ch2,&ch3);printf("ch1=%c,ch2=%c,ch3=%c\n",ch1,ch2,ch3);

假设输入:A□B□C↙,则系统将字母'A'赋值给ch1,空格'□'赋值给ch2,字母'B'赋值给ch3。

[Return]3.3顺序结构程序设计在顺序结构程序中,各语句(或命令)是按照位置的先后次序,顺序执行的,且每个语句都会被执行到。

[例1]输入任意三个整数,求它们的和及平均值。

/*功能:设计一个顺序结构程序,求三个整数的和及平均值。*/

main()

{intnum1,num2,num3,sum;

floataver;

printf("Pleaseinputthreenumbers:");

scanf("%d,%d,%d",&num1,&num2,&num3);/*输入三个整数*/

sum=num1+num2+num3; /*求累计和*/

aver=sum/3.0; /*求平均值*/

printf("num1=%d,num2=%d,num3=%d\n",num1,num2,num3);

printf("sum=%d,aver=%7.2f\n",sum,aver);

} 思考题:能否将“aver=sum/3.0;”中“3.0”改为“3”?[例2]求方程ax2+bx+c=0的实数根。a,b,c由键盘输入,a≠0且b2-4ac>0。/*功能:设计一个顺序结构程序,求方程的根。*/#include"math.h" /*为使用求平方根函数sqrt(),包含math.h头文件*/main(){floata,b,c,disc,x1,x2;printf("Inputa,b,c:");scanf("%f,%f,%f",&a,&b,&c); /*输入方程的三个系数的值*/disc=b*b-4*a*c; /*求判别式的值赋给disc*/x1=(-b+sqrt(disc))/(2*a);x2=(-b-sqrt(disc))/(2*a);printf("\nx1=%6.2f\nx2=%6.2f\n",x1,x2);} [程序演示][例3]从键盘输入一个小写字母,要求用大小写字母形式输出该字母及对应的ASCII码值。

#include"stdio.h"main(){charc1,c2;printf("Inputalowercaseletter:");c1=getchar();putchar(c1);printf(",%d\n",c1);c2=c1-32; /*将大写字母转换成对应的小写字母*/printf("%c,%d\n",c2,c2);} [程序演示]程序运行情况如下:

Inputalowercaseletter:a↙a,97A,65

在顺序结构程序中,一般包括以下几个部分:

1.程序开头的编译预处理命令。在程序中要使用标准函数(又称库函数),除printf()和scanf()外,其它的都必须使用编译预处理命令,将相应的头文件包含进来。。

2.顺序结构程序的函数体中,是完成具体功能的各个语句和运算,主要包括:(1)变量类型的说明。(2)提供数据语句。(3)运算部分。(4)输出部分[Return]3.4顺序结构程序应用举例【例1】写出下面程序的输出结果#include<stdio.h>intmain(){ inta=4,b=7,c=-5;floatx=12.3456,y=-246.135; charch='B'; longn=7654321;unsignedu=65535; printf("%d\t%d\t%d\n",a,b,c);//A printf("%3d%3d%3d\n",a,b,c);//B printf("%f,%f\n",x,y);//C printf("%8.2f,%8.2f,%4f,%4f\n,%3f,%3f\n",x,y,x,y,x,y);//D printf("%e,%10.2e\n",x,y);//E printf("%c,%d,%o,%x\n",ch,ch,ch,ch);//F printf("%ld,%lo,%lx\n",n,n,n);//G printf("%u,%o,%x,%d\n",u,u,u,u);//H printf("%s,%7s\n","Over!","Thanks");//I return0;}【例2】分析下列程序中运行结果。#include<stdio.h>intmain(){ inta=2,b=4,c=6; a+=b+=c;//A行

printf("%d\n",a<b?b:a);//B行

printf("%d\n",a<b?a++:b++); //C行

printf("%d,%d\n",a,b); //D行

printf("%d\n",c+=a>b?a++:b++); //

温馨提示

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

评论

0/150

提交评论