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

下载本文档

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

文档简介

程序设计技术基础第1章概述1.1计算机的工作机制1.2程序与程序设计1.3算法与算法描述1.4C语言2026/3/1421.1计算机的工作机制1.1.1硬件结构1.1.2软件系统1.1计算机的工作机制1.1.1硬件结构冯·诺依曼计算机的硬件构成:控制器负责从内存中取指令并根据指令发出控制信号以引起其他部件的动作。运算器执行运算指令所规定的运算。寄存器主要用于记录下一条指令的内存地址、当前指令的执行状态以及暂时保存指令的计算结果。内存储器(简称内存)用于存储计算机程序。外部设备(简称外设)提供了计算机与外界的接口,主要用于计算机的输入/输出以及为计算机提供大容量的信息存储(简称外存)。1.1.2软件系统计算机软件是计算机系统中的程序以及相关文档。程序是对计算任务的处理对象(数据)与处理规则(算法)的描述;文档是为了便于人理解程序所需要的资料说明,供程序开发与维护使用。软件系统可以分为系统软件、支撑软件和应用软件。1.2程序与程序设计1.2.1程序设计范型1.2.2程序设计语言1.2.3程序设计步骤1.2程序和程序设计程序:一组计算机能识别和执行的指令只要让计算机执行这个程序,计算机就会自动地、有条不紊地进行工作计算机的一切操作都是由程序控制的,离开程序,计算机将一事无成计算机程序具有如下性质:(1)目的性:程序有明确的目的,在运行时能正确完成赋予它的功能。(2)分步性:程序为完成其复杂的功能,由一系列计算机能执行的步骤组成。(3)有限性:程序中所包含的步骤是有限的。(4)有序性:程序的执行步骤是有序的,不能随意改变这些步骤的执行顺序。(5)操作性:程序是对某些对象的操作,完成其有意义的功能。1.2.1程序设计范型程序设计范型是计算机编程中的基本风格和典范模式,是编程者在其所创造的虚拟世界中自觉不自觉采用的世界观和方法论。典型的程序设计范型有过程式(面向过程)、对象式(面向对象)、函数式以及逻辑式等。1.2.1程序设计范型1.过程式

过程式程序设计是一种以功能为中心、基于功能分解的程序设计范型。一个过程式程序由一些子程序构成,每个子程序对应一个子功能,它实现了功能抽象。子程序描述了一系列的操作,它是操作的封装体。NicklausWirth提出了如下的经典公式,刻画了过程式程序设计的本质特征。

程序=数据结构+算法1.2.1程序设计范型2.对象式

对象式程序设计是一种以数据为中心、基于数据抽象的程序设计范型。对象式程序设计通常称为面向对象程序设计。一个面向对象的程序由一些对象构成,对象是由一些数据及可施加于这些数据上的操作所构成的封装体。

面向对象程序可简单地表示成下面的公式:

程序=对象/类+对象/类+…

对象/类=数据+操作1.2.1程序设计范型3.函数式与逻辑式

函数式程序设计是围绕函数及函数应用来进行的,它基于递归函数理论和λ演算(λ演算即一套用于研究函数定义、函数应用和递归的形式系统),其中,函数也被作为值来看待。

逻辑式程序设计是把程序组织成一组事实和一组推理规则,它基于的是谓词演算。1.2.2程序设计语言程序设计语言是一个能完整、准确和规则地表达人们的意图,并用以指挥或控制计算机工作的“符号系统”。简单地说:人和计算机交流信息的、计算机和人都能识别的语言。计算机语言发展阶段:机器语言(由0和1组成的指令)汇编语言(用英文字母和数字表示指令)高级语言(接近于人的自然语言和数学语言)面向过程的语言

(非结构化的语言、结构化语言)面向对象的语言低级语言程序翻译的方式:编译方式

事先编好的一个称为“编译程序”的程序,将其放在计算机中。当高级语言源程序输入到计算机中时,编译程序便把源程序整个翻译成机器指令表示的目标程序。然后执行该目标程序,得到计算结果。解释方式

事先编好的一个称为“解释程序”的程序,将其放在计算机中。当高级语言源程序输入到计算机中时,解释程序将源程序的每一条语句逐句翻译,逐句执行,即边解释边执行。1.2.3程序设计步骤(1)问题分析(2)设计算法(3)编写程序(4)对源程序进行编辑、编译和连接(5)运行程序,分析结果(6)编写程序文档(1)问题分析对于接手的任务要进行认真的分析研究所给定的条件分析最后应达到的目标找出解决问题的规律选择解题的方法(1)问题分析(2)设计算法设计出解题的方法和具体步骤(1)问题分析(2)设计算法(3)编写程序(4)对源程序进行编辑、编译和连接(5)运行程序,分析结果结果错了,程序肯定错结果对了,程序未必对1.3算法与算法描述

1.3.1算法概念1.3.2算法描述1.3.3结构化程序设计思想一个程序主要包括以下两方面的信息:(1)对数据的描述。在程序中要指定用到哪些数据以及这些数据的类型和数据的组织形式这就是数据结构(datastructure)(2)对操作的描述。即要求计算机进行操作的步骤也就是算法(algorithm)1.3算法与算法描述数据是操作的对象操作的目的是对数据进行加工处理,以得到期望的结果著名计算机科学家沃思(NikiklausWirth)提出一个公式:

算法

+数据结构=程序一个程序除了算法和数据结构这主要要素外,还应当采用结构化程序设计方法进行程序设计,并且用某一种计算机语言表示算法、数据结构、程序设计方法和语言工具是一个程序设计人员应具备的知识算法是解决“做什么”和“怎么做”的问题程序中的操作语句,是算法的体现不了解算法就谈不上程序设计1.3.1算法概念广义地说,为解决一个问题而采取的方法和步骤,就称为“算法”对同一个问题,可以有不同的解题方法和步骤为了有效地进行解题,不仅需要保证算法正确,还要考虑算法的质量,选择合适的算法计算机算法可分为两大类别:数值运算算法非数值运算算法数值运算的目的是求数值解非数值运算包括的面十分广泛,最常见的是用于事务管理领域一个有效算法应该具有以下特点:(1)

有穷性。一个算法应包含有限的操作步骤,而不能是无限的。(2)

确定性。算法中的每一个步骤都应当是确定的,而不应当是含糊的、模棱两可的。一个有效算法应该具有以下特点:(3)

有零个或多个输入。所谓输入是指在执行算法时需要从外界取得必要的信息。(4)

有一个或多个输出。算法的目的是为了求解,“解”就是输出。没有输出的算法是没有意义的。(5)

有效性。算法中的每一个步骤都应当能有效地执行,并得到确定的结果。1.3.2算法描述常用的方法有:自然语言流程图N-S图伪代码1.

自然语言用自然语言表示通俗易懂,但文字冗长,容易出现歧义性用自然语言描述包含分支和循环的算法,不很方便除了很简单的问题外,一般不用自然语言2.

流程图(1)标准图符流程图描述的三种基本结构

顺序结构AB流程图描述的三种基本结构

选择结构ABYpNAYpN流程图描述的三种基本结构

循环结构①当型循环结构AYp1NYx<5N0x输出x的值x+1x输出1,2,3,4,5流程图描述的三种基本结构

循环结构②直到型循环结构AYp2NYx≥5N0x输出x的值x+1x输出1,2,3,4,5以上三种基本结构,有以下共同特点:(1)只有一个入口(2)只有一个出口一个判断框有两个出口一个选择结构只有一个出口(3)结构内的每一部分都有机会被执行到。也就是说,对每一个框来说,都应当有一条从入口到出口的路径通过它(4)结构内不存在“死循环”3.N-S图ABABYNpA当p1成立A直到p2成立顺序结构选择结构循环结构(当型)循环结构(直到型)例如

求5!的算法用N-S图表示为:直到i>51t输出t2it*iti+1i4.伪代码伪代码是用介于自然语言和计算机语言之间的文字和符号来描述算法用伪代码写算法并无固定的、严格的语法规则,可以用英文,也可以中英文混用例如

求5!的算法用为代码表示为:begin(算法开始)1

t2

iwhilei≤5{t*i

ti+1

i}printtend(算法结束)1.3.3结构化程序设计思想结构化程序设计强调程序设计风格和程序结构的规范化,提倡清晰的结构。结构化程序设计方法的基本思路是:把一个复杂问题的求解过程分阶段进行,每个阶段处理的问题都控制在人们容易理解和处理的范围内。结构化程序设计思想(1)结构化编码(2)结构化程序的特点(3)结构化程序的分析方法(4)模块化设计采取以下方法保证得到结构化的程序:(1)自顶向下;(2)逐步细化;(3)模块化设计;(4)结构化编码。1.4C语言

1.4.1C语言的特点

1.4.2C程序的基本结构

1.4.3C程序的执行过程1.4C语言C语言是国际上广泛流行的计算机高级语言。C语言的发展:BCPL语言B语言C语言精练、接近硬件,但过于简单,无数据类型具有多种数据类型最初的C语言只是为描述和实现UNIX操作系统提供一种工作语言而设计的。1983年,美国国家标准协会(ANSI)成立了一个委员会,根据C语言问世以来各种版本对C语言的发展和扩充,制定了第一个C语言标准草案(’83ANSIC)。1989年,ANSI公布了一个完整的C语言标准—ANSIX3.159-1989(常称ANSIC,或C89)。1990年,国际标准化组织ISO(InternationalStandardOrganization)接受C89作为国际标准ISO/IEC9899:1990,它和ANSI的C89基本上是相同的。1995年,ISO对C90作了一些修订,1999年,ISO又对C语言标准进行修订,在基本保留原来的C语言特征的基础上,针对应用的需要,增加了一些功能,尤其是C++中的一些功能,命名为ISO/IEC9899:1999。2001、2004年先后进行了两次技术修正(TC1和TC2)。

ISO/IEC9899:1999(及其技术修正)被称为C99。C99是C89(及1995基准增补1)的扩充。C11是最新标准,该标准更好的支持汉字函数名和汉字标识符,一定程度上实现了汉字编程。C语言是一种用途广泛、功能强大、使用灵活的过程性(procedural)编程语言,既可用于编写应用软件,又能用于编写系统软件。因此C语言问世以后得到迅速推广。(1)程序设计模块化。(2)函数方式操作。(3)数据类型多样化。(4)运算功能强。(5)存储类型丰富。(6)具有预处理能力。(7)程序简洁。1.4.1C语言的特点#include<stdio.h>intmain(){

printf(”ThisisaCprogram.\n”);return0;}函数的名字,表示主函数C程序必须有一个main函数1.4.2C程序的基本结构#include<stdio.h>intmain(){

printf(”ThisisaCprogram.\n”);return0;}

主函数类型#include<stdio.h>intmain(){

printf(”ThisisaCprogram.\n”);return0;}

函数体#include<stdio.h>intmain(){

printf(”ThisisaCprogram.\n”);return0;}

输出函数输出语句#include<stdio.h>intmain(){

printf(”ThisisaCprogram.\n”);return0;}

输出语句#include<stdio.h>intmain(){

printf(”ThisisaCprogram.\n”);return0;}

换行符#include<stdio.h>intmain(){

printf(”ThisisaCprogram.\n”);return0;}

当main函数执行结束前,将整数0作为函数值#include<stdio.h>intmain(){

printf(”ThisisaCprogram.\n”);return0;}

表示语句结束用到函数库中的输入输出函数时C语言程序的结构特点:1.函数是C程序的基本单位一个C程序是由一个或多个函数组成的必须包含一个main函数(只能有一个)每个函数都用来实现一个或几个特定功能被调用的函数可以是库函数,也可以是自己编制设计的函数C语言程序的结构特点:2.函数由函数首部和函数体两部分组成:函数首部intmax(intx,inty)函数的第1行函数类型函数名参数类型参数名C语言程序的结构特点:2.函数由函数首部和函数体两部分组成:函数首部intmax(intx,inty)若函数无参,在括弧中写void或空括弧intmain(void)或intmain()C语言程序的结构特点:2.函数由函数首部和函数体两部分组成:函数体声明部分定义在本函数中所用到的变量对本函数所调用函数进行声明执行部分:由若干个语句组成,指定在函数中所进行的操作可以没有声明部分C语言程序的结构特点:2.函数由函数首部和函数体两部分组成:函数体voiddump(){}可以是空函数C语言程序的书写格式与规则

(1)C程序中,每条语句和声明的最后,以分号为结束标志。(2)任何变量必须先定义类型,然后才能使用。(3)C语言程序一般都使用小写英文字母,x与X代表不同含义。(4)C语言程序的书写格式比较自由,允许一行、或多行书写。(5)C程序中,有两种形式的注释。C语言允许用两种注释方式://:单行注释可单独占一行可出现在一行中其他内容的右侧/*……*/:块式注释可包含多行1.4.3C程序的执行过程1.上机输入和编辑源程序(.c文件)2.对源程序进行编译(.obj文件)3.进行连接处理(.exe文件)4.运行可执行程序,得到运行结果编辑程序编译程序连接程序库函数源程序文件名.c目标程序文件名.obj可执行程序文件名.exe编译连接其他目标文件出错出错出错执行结果C编译系统2026/3/1468

1.硬件结构、软件系统2.程序设计范型、程序设计语言、程序设计步骤3.算法及其特点、算法描述、结构化程序设计思想4.C语言特点、C程序基本结构、C程序执行过程本章小结注意本章节知识点!!2026/3/1469

通过对本章的学习,对C语言程序有了初步的认识,通过上机调试简单的C语言程序,体会学习C语言程序的快乐。

学习C语言最重要的是领会程序设计要旨,领会计算思维,掌握常用算法,多多编程,在不断地实践中培养和提高程序设计的能力。本章小结注意本章节知识点!!

程序设计技术基础第二章C语言程序的数据描述及数据运算2.1C语言的基本元素2.2初识数据类型2.3C语言的运算符和表达式2.4类型转换2026/3/14712.1.1字符集字符是组成语言的最基本的元素。C语言字符集(即ASCII字符集)由字母、数字、空格、标点和特殊字符组成(见附录B)。主要分为以下几类:(1)大小写英文字母:a~z,A~Z;(2)数字:0~9;(3)键盘符号:见书表2-1所示;(4)转义字符:以字符“\”开头,后跟一个或几个字符的字符序列,通常用来表示键盘上的控制符或特殊符号。见书表2-2所示;2026/3/14722.1.2关键字所谓“关键字”就是已被C语言编译工具本身使用,不能用作其它用途使用的字。主要用于构成语句,进行存储类型和数据类型定义。所有的关键字均由小写字母组成。根据关键字的作用,可分为数据类型关键字、控制语句关键字、存储类型关键字、其它关键字四类。2026/3/14732026/3/1474short、int、long、signed、unsigned、float、double、char、struct、enum、union、void数据类型关键字if、else、switch、case、default、for、do、while、break、continue、goto、return控制语句关键字auto、static、extern、register存储类型关键字const、sizeof、typedef、volatile其它关键字关键字2.1.3标识符所谓“标识符”是用户自己定义的一种字符序列,在计算机高级语言中,用来表示程序中需要辨认的对象名称。C语言规定,标识符是由字母或下画线开头的字母、数字、下画线组成的一串符号。下面列出的标识符是合法的:sum,day1,Yang,_total,MONTH,Student_name_2下面是不合法的标识符:2_day,list.er,$234,#3Df,last-3<42026/3/14752026/3/1476在标识符中,大写字母和小写字母表示两个不同的字符。C语言规定,用户选取的标识符不能是C语言规定的关键字。标识符的命名应尽量有相应的意义,以便阅读理解,做到“见名知意”。即选取有含义的英文单词或其缩写作为标识符,例如:sum,num等。2.2初识数据类型指定数据类型,主要是为了对数据分配存储单元,包括存储单元的长度(占多少字节)以及数据的存储形式。对不同数据类型的数据分配不同的存储单元长度和存储形式。不同数据类型的数据对应的运算种类也不同。在C语言中,数据类型可分为:基本数据类型、构造数据类型、指针类型、空类型四大类。2026/3/14772.2初识数据类型2026/3/14782.2.1常量和变量数据按其取值是否可以改变分为常量和变量两种。1.常量

在程序执行过程中,其值不发生改变的量称为常量。它们可与数据类型结合起来进行分类。在程序中,常量是可以不经说明而直接引用的。2026/3/1479常用的常量有以下几类:(1)字面常量(直接常量):

①整型常量:100、0、-15;

②实型常量:12.34、-0.5、3.24e5、-0.34E-6;

③字符型常量:'A'、'8'、'#'、'\t'、'\n'、'\101'、'\x41';(2)字符串常量:由一对双引号("")括起的字符序列。例如:"BOY","Cprogram","12.5"等。2026/3/1480常用的常量有以下几类:(3)符号常量:用#define命令,指定用一个符号名称代表一个常量。符号常量在使用之前必须先定义。符号常量定义的一般形式为:

#define标识符常量经过定义,以后在程序中所有出现该标识符的地方均代表该常量。2026/3/14812026/3/1482#definePI3.14159#include<stdio.h>intmain(){doublec,r;r=5;c=2*PI*r;printf("c=%lf\n",c);return0;}【例2-1】求圆的周长定义符号常量PI定义变量c、r用PI代替3.14159程序运行的结果为:c=31.4159002026/3/1483使用符号常量的好处书写简单不易出错。使用符号常量的好处含义清楚。使用符号常量的好处修改程序方便。2.2.1常量和变量2.变量在程序运行过程中,其值可以变化的量,称为变量。每一个变量都有一个名字,称为变量名,以便被引用。一个变量在内存中占据一定的存储空间,在该存储空间中存放一个属于某种数据类型的数据,称为变量的值。变量必须先定义,后使用。变量的定义一般放在函数体的开头部分。2026/3/14842.2.1常量和变量定义变量的一般形式为:

类型说明符

变量名标识符,变量名标识符,...;注意:类型说明符与变量名标识符之间要用空格隔开,变量名标识符之间用逗号隔开,末尾必须加分号。2026/3/1485在定义时指定该变量的名字和数据类型。在此请注意区分变量名和变量值这两个不同的概念,如下图中a是变量名,3是变量a的值,即存放在变量a的内存单元中的数据。变量名实际上是以一个名字代表的一个存储地址,在对程序编译连接时由系统给每一个变量名分配对应的内存地址。在程序运行时从变量中取值,实际上是通过变量名找到相应的内存地址,通过内存地址,从其相对应的存储单元中读取数据。2026/3/14862026/3/1487#include<stdio.h>intmain(){intm;/*定义变量m*/m=23;/*给变量m赋值为23*/printf("thefirstvalueis:%d\n",m);/*输出此时m的值*/m=-46;/*给变量m赋值为-46*/printf("thesecondvalueis:%d\n",m);/*输出此时m的值*/return0;}【例2-2】变量举例

程序运行结果:thefirstvalueis:23thesecondvalueis:-462026/3/1488保证程序中变量名使用得正确。在编译时为每一个变量分配相应的存储单元。指定每一变量属于某一种类型,这就便于在编译时检查该变量所进行的运算是否合法。变量要“先定义,后使用”,这样做的目的2.2.2整型数据1.整型常量C语言中的整型常量习惯用我们所熟悉的十进制数来表示,但是实际上它们都是以二进制形式存储在计算机内存中的。二进制数表示不直观不方便,因此有时也将其表示为八进制数和十六进制数,编译器会自动将其转换为二进制形式存储。2026/3/1489(1)整型常量的前缀:①十进制整常数:十进制整常数没有前缀。其数码取值为0~9。例如:17、-31。②八进制整常数:八进制整常数必须以数字0开头,即以0作为八进制数的前缀。其数码取值为0~7。例如:021。③十六进制整常数:十六进制整常数以0X或0x开头,即以0X或0x作为前缀。其数码取值为0~9,A~F或a~f。例如:0x11。请注意在程序中是根据前缀来区分各种进制数的,因此在书写常数时不要把前缀弄错造成结果的不正确。2026/3/1490(2)整型常量的后缀整型常量有基本整型和长整型、无符号数和有符号数之分。如果要表示的数超过了上述取值范围,就必须用长整型数来表示。长整型数是用后缀“L”或“l”来表示的。无符号数也可用后缀表示,整型常数的无符号数的后缀为“U”或“u”。2026/3/1491不同类型的整型常量的表示形式:①有符号整型常量:默认的整型(int)定义为有符号数。如:-31、17、021。②无符号整型常量:不能表示小于0的数。如:17u、021u、0x11u。③有符号长整型常量如:65536L、0200000L、0x10000L。④无符号长整型常量:要用后缀LU、Lu、lU、lu来表示。如:65536LU、0200000LU、0x10000LU。2026/3/14922.整型变量

数据的表示方法有多种多样,但是所有数据在内存中都是以二进制形式存放的。在对程序编译连接时系统会给每个变量分配一个内存空间。2026/3/1493(1)整型变量的类型①有符号基本型:类型说明符为int。②有符号短整型:类型说明符为shortint或short。③有符号长整型:类型说明符为longint或long。④无符号基本型:类型说明符为unsignedint。⑤无符号短整型:类型说明符为unsignedshortint或unsignedshort。⑥无符号长整型:类型说明符为unsignedlongint或unsignedlong。2026/3/14942026/3/1495#include<stdio.h>intmain(){printf("各种数据类型长度:\n");printf("整型:---------------%d\n",sizeof(int));printf("长整型:-------------%d\n",sizeof(long));printf("短整型:-------------%d\n",sizeof(shortint));return0;}【例2-3】各种数据类型的长度

由于同种数据类型在不同的平台其占字节数不尽相同,可以使用关键字“sizeof”来获得变量或者数据类型的长度。程序运行结果:各种数据类型长度:整型:---------------4长整型:-------------4短整型:-------------2(2)整型变量的定义和整型变量赋初值

例如:shortx,y,z;/*定义x、y、z为短整型变量*/longm,n;/*定义m、n为长整型变量*/unsignedinta,b;/*定义a、b为无符号整型变量*/2026/3/1496C语言中经常要对一些变量赋初值,以便使用变量。给变量赋初值的方法有以下两种。①定义变量的同时赋初值。例如:longa=37000000;/*定义a为长整型变量,并赋初值为37000000*/也可以给被定义的变量的一部分赋初值。例如:shortm=8,n,t;定义了三个整型变量m、n、t,只对m赋初值8。2026/3/1497如果对几个变量赋同样的初值,应该这样表示:inta=5,b=5,c=5;表示变量a、b、c的初值都为5,而不能写成:inta=b=c=5;错!2026/3/1498②先定义,再赋初值。例如:intx,y,z;/*定义x、y、z为整型变量*/y=45;/*给变量y赋初值45*/z=6;/*给变量z赋初值6*/并不是所有定义的变量都要赋初值,可以只给其中的某些变量赋初值。2026/3/1499(3)整型数据在计算中遇到的问题由前面的知识我们知道,不同的数据类型都有各自的取值范围。如果在程序运算过程中结果超出取值范围,会出现什么情况呢?2026/3/141002026/3/14101#include<stdio.h>intmain(){shortintm,n;m=32767;n=m+1;printf("m=%d\nn=%d\n",m,n);return0;}【例2-4】整型数据的溢出数据类型选择不正确,会产生溢出错误。程序运行结果为:m=32767n=-327682.2.3实型数据1.实型常量

实型常量也称为实数或者浮点数。在C语言中,实数只采用十进制。它有两种形式:十进制小数形式和指数形式。(1)十进制小数形式。由数码0~9和小数点组成。例如:0.0、25.0、0.13、300.、-.5等均为合法的实数。注意,必须有小数点。2026/3/14102(2)指数形式:由十进制数,加阶码标志“e”或“E”以及阶码(只能为整数,可以带符号)组成。因为程序编辑时不能输入上下角标,所以用e或E代表以10为底的指数。e的左边是数值部分,不能省略;e的右边是指数部分,也不能省略。指数的一般形式为:aEn(a为十进制数,n为十进制整数阶码)如:3.4e-6(相当于3.6×10-6)、-2.5e5(相当于-2.5×105)、-3e-4(相当于-3×10-4)、6E3(相当于6×10-3)等。2026/3/141032.实型变量(1)实型变量的类型

实型变量分为:单精度(float型)、双精度(double型)和长双精度(longdouble型)三类。下表为各类实型数据的特点。2026/3/14104数据类型字节数(二进制数位数)有效数字位数取值范围float4(32)6~7(十进制)-3.4×10-38~3.4×1038double8(64)15~16(十进制)-1.7×10-308~1.7×10308longdouble64/80/96与编译器有关与编译器有关(2)实型变量的定义实型变量在使用前也必须加以定义。例如:floata,b;/*a、b为单精度型变量*/doublex,y;/*x、y为双精度型变量*/(3)实型数据在计算中遇到的问题用有限的存储单元不可能完全精确地存储一个实数。2026/3/141052026/3/14106#include<stdio.h>intmain(){floata;doubleb;a=123456.789e4;b=123456.789e4;printf("a=%f\nb=%lf\n",a,b);return0;}【例2-5】舍入误差将a、b的值以小数形式输出浮点数程序执行的结果为:a=1234567936.000000b=1234567890.000000由于舍入误差的原因,进行计算时要避免一个较大实数和一个较小实数相加减。2.2.4字符型数据1.字符常量(1)普通的字符常量普通的字符常量是用单引号(')括起来的一个字符。如'a'、'b'、'='、'+'、'?'等都为字符常量。字符常量只能是一个字符,但并不是用单引号括起来的任意一个字符,程序都能识别。例如代表圆周率的π在程序中是不能识别的,只能使用系统的字符集中的字符,目前大多数系统采用ASCII码字符集中的字符。2026/3/14107字符常量是以整数形式(字符的ASCII代码)存放在内存单元中的。例如:

大写字母'A'的ASCII代码是十进制数65,二进制形式为1000001。

数字字符'1'的ASCII代码是十进制数49,二进制形式为0110001。需要注意的是:字符'1'和整数1是不同的概念。2026/3/14108(2)特殊的字符常量——转义字符ASCII码字符集中的不可显示的字符就可以用转义字符来表示。例如:退格(以'\b'表示)、回车(以'\r'表示)等。转义字符是可以用于控制等的特殊符号,不同于字符原有的意义,故称“转义”字符。例如,在前面各例题中printf函数中用到的“\n”就是一个转义字符,其意义是“换行”。2026/3/14109使用转义字符时需要注意以下问题:①转义字符中只能使用小写字母,每个转义字符只能看作一个字符。②在C程序中,使用不可打印字符时,通常用转义字符表示。③'\v'垂直制表和'\f'换页符对屏幕没有任何影响,但会影响打印机执行响应操作。④转义字符'\0'表示空字符NULL,它的值是0。而字符'0'的ASCII码值是48。因此,空字符'\0'不是字符'0'。另外,空字符不等于空格字符,空格字符的ASCII码值为32。2026/3/14110使用转义字符时需要注意以下问题:⑤转义字符也可以出现在字符串中,但只作为一个字符看待。⑥如果“\”之后的字符和它不构成转义字符,则“\”不起转义作用将被忽略。如:printf(″a\Nbc\nDEF\n″);输出:aNbcDEF2026/3/141112026/3/14112#include<stdio.h>intmain(){printf("C\tC++\tJava\n\"C\"firstappeared!\n");return0;}【例2-6】转义字符的应用程序运行结果为:CC++Java"C"firstappeared!2.字符变量字符变量是用数据类型符char定义字符变量的。字符变量中存放的是字符常量,其取值是字符常量,即单个字符。定义字符变量的一般形式为:char标识符1,标识符2,…,标识符n;

例如:charc1,c2,ch;c1='A';c2='B';2026/3/14113

字符变量实际上是一个字节的整型变量,虽然称为字符变量,但是可以把0~127之间的整数赋给一个字符变量。例如字符‘A’的十进制ASCⅡ码是65,字符‘B’的十进制ASCⅡ码是66。对字符变量c1、c2赋值:c1=‘A’;c2=‘B’;,实际上是在变量c1、c2的两个内存单元中存放整数65和66的二进制代码,如下图所示。2026/3/14114

字符型数据有无符号和有符号之分,其存储空间和值的范围如下表所示。2026/3/14115类型字节数取值范围有符号字符型(signedchar)1-128~127即-27~(27-1)无符号字符型(unsignedchar)10~255即0~(28-1)3.字符变量与整型变量的互换由于字符型数据与整型数据在存储方式上的相似性,使得两者之间可以通用。因此C语言允许对整型变量赋予字符值,也允许对字符变量赋予整型值。在输出时,允许把字符变量按整型形式输出,也允许把整型变量按字符形式输出。但是,由于整型变量占2个或4个字节,字符变量占1个字节,当整型量按字符量处理时,只有低8位数据参与处理,也就是说,字符变量只能表示0~255之间的整数。2026/3/14116需要注意的是,对于值为128~255这一部分,最高位为1,用“%d”格式输出的数值会得到负数。例如:chara=158;printf("%d\n",a);

运行后的结果为-98。这时可以将变量定义为无符号字符变量,使最高位不表示符号。例如:

unsignedchara=158;printf("%d\n",a);运行结果为158。2026/3/141172026/3/14118#include<stdio.h>intmain(){charc1,c2;intm,n;c1=65;c2=66;m='a';n='b';printf("%c%c\n",c1,c2);printf("%d%d\n",c1,c2);printf("%d%c\n",m,m);printf("%d%c\n",n,n);return0;}【例2-7】字符数据与整型数据互换将整数65赋给字符变量c1将整数66赋给字符变量c2将字符a赋给整型变量m

将字符b赋给整型变量n程序运行结果为:AB656697a98b2026/3/14119#include<stdio.h>intmain(){charch1,ch2,ch3,ch4;ch1='a';ch2='B';printf("ch1=%c,ch2=%c\n",ch1-32,ch2+32);printf("ch3=%c,ch4=%c\n",'a'-32,'B'+32);return0;}【例2-8】字符数据的算术运算字母的大小写转换程序运行结果为:ch1=A,ch2=bch3=A,ch4=b2.3C语言的运算符和表达式C语言的特点之一就是运算符多,涉及的运算范围广,把除了控制语句和输入输出以外几乎所有的基本操作都作为运算处理,例如将赋值符“=”作为赋值运算符、方括号作为下标运算符等。C语言的运算符在使用时形式和规则也是多样的。2026/3/141202.3.1运算符及表达式的分类1.根据运算符所需要的操作对象(操作数)的个数,运算符可分为:2026/3/14121类型作用运算符举例单目运算符仅对一个运算对象进行操作!~++--sizeof双目运算符对两个运算对象进行操作+-*/%<<=>三目运算符对三个运算对象进行操作?:2.根据运算符的功能分类可分为:2026/3/14122类型作用运算符算术运算符用于各类数值运算正值(+)、负值(-)、加(+)、减(-)、乘(*)、除(/)、求余(或称模运算,%)自增、自减运算符自增1、自减1自增(++)、自减(--)关系运算符用于比较运算大于(>)、小于(<)、等于(==)、大于等于(>=)、小于等于(<=)、不等于(!=)逻辑运算符用于逻辑运算与(&&)、或(||)、非(!)位操作运算符按二进制位进行运算位与(&)、位或(|)、位非(~)、位异或(^)、左移(<<)、右移(>>)2.根据运算符的功能分类可分为:2026/3/14123类型作用运算符赋值运算符用于赋值运算分为简单赋值(=)复合算术运算赋值(+=、-=、*=、/=、%=)复合位运算赋值(&=、|=、^=、>>=、<<=)条件运算符用于条件求值?:逗号运算符用于把若干表达式组合成一个表达式,指针运算符用于取内容和取地址*、&特殊运算符用于特殊运算括号()、下标[]、成员(->、.)3.表达式和运算符的优先级、结合性①表达式:是由常量、变量、函数和运算符组合起来的式子,是求值的规则。表达式求值按运算符的优先级和结合性规定的顺序进行。一个表达式有一个值及其类型,它们等于计算表达式所得结果的值和类型。②运算符的优先级:C语言中,运算符的运算优先级共分为15级。1级最高,15级最低。在表达式中,优先级较高的先于优先级较低的进行运算。而在一个操作数两侧的运算符优先级相同时,则按运算符的结合性所规定的结合方向处理。2026/3/141243.表达式和运算符的优先级、结合性③运算符的结合性:C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。例如算术运算符的结合性是自左至右,即先左后右。而自右至左的结合方向称为“右结合性”。最典型的右结合性运算符是赋值运算符。一般单目运算符、三目运算符、赋值运算符及其扩展运算符的结合性是“右结合”;其余运算符的结合性是“左结合”。2026/3/141252.3.2算术运算符及算术表达式1.算术运算符(1)正值运算符“+”:为单目运算,如+a,+1等。(2)负值运算符“-”:为单目运算,如-a,-1等。(3)加法运算符“+”:为双目运算符,即应有两个量参与加法运算。如a+b,1+2等。(4)减法运算符“-”:为双目运算符,即应有两个量参与减法运算。如a-b,5-3等。2026/3/14126(5)乘法运算符“*”:为双目运算。注意乘号用“*”表示,且不能省略。例如:数学式4ac应该写成4*a*c。(6)除法运算符“/”:为双目运算。参与运算量均为整型时,结果也为整型——向零取整。如:1/2的值是0,而不是0.5,不会四舍五入,只取整数部分的值(整除)。如果运算量中至少有一个是实型,则结果为双精度实型。如:1.0/2的值是0.5。(7)求余运算符(模运算符)“%”:为双目运算。求余运算的结果等于两数相除后的余数。要求参与运算的量均为整型。有负整数参与运算的情况下,一般的处理原则为:先按其绝对值求余数(|r|%|s|),然后取被除数r的符号作为余数的符号。2026/3/141272026/3/14128#include<stdio.h>intmain(){printf("-3/5=%d, -3./5=%f\n",-3/5,-3./5);printf("9%%4=%d,4%%-7=%d,-4%%7=%d\n",9%4,4%-7,-4%7);return0;}【例2-9】算术运算举例程序运行结果为:-3/5=0,-3./5=-0.6000009%4=1,4%-7=4,-4%7=-42.算术表达式用算术运算符和括号将运算对象(也称操作数)连接起来的、符合C语法规则的式子,称为算术表达式。在表达式中可以使用一对“()”或多对“()”运算符改变运算的优先顺序。运算对象可以是常量、变量、函数等。例如:a*b/(c-(1.5+a))是合法的C算术表达式a*b/[c-(1.5+a)]是不合法的C算术表达式2026/3/14129【例2-10】使用公式C=(F-32)计算华氏温度与摄氏温度转换。用算术表达式将公式表达出来。则表达式可以写成:C=5.0/9*(F-32)但不能写成:C=5/9*(F-32)这样写,5/9的值为0。因此,导致最后的计算结果为0。2026/3/141302.3.3自增、自减运算符及自增、自减表达式

自增(++)、自减(--)运算符是单目运算符,具有右结合性。其作用是使变量的值加1或减1。它的优先级高于双目算术运算符,与单目算术运算符同级。如表下所示。2026/3/14131运算符名称用法含义++自增运算符(单目)i++后置自增,先使表达式的值为i的值,i的值再加1++i前置自增,i的值先加1,再使表达式的值为i的值--自减运算符(单目)i--后置自减,先使表达式的值为i的值,i的值再减1--i前置自减,i的值先减1,再使表达式的值为i的值

实际上i++和++i就相当于“i=i+1”;i--和--i就相当于“i=i-1”。在做i=i+1或i=i-1这两种操作时,变量i被称为“计数器”,用来记录完成某一操作的次数。C语言为这种计数器操作提供了两个更为简洁的运算符,即i=i+1可写成i++或++i;i=i-1可写成i--或--i。2026/3/14132使用自增、自减运算符时应注意以下几点:(1)注意运算符的操作对象。自增、自减运算符的操作对象只能是变量,而不能是常量或表达式。例如:6--、++(a*2)、++(-i)都是错误的。因为自增、自减运算符具有对操作对象重新赋值的功能,而常量、表达式无存储单元可言,当然不能被赋值做自增、自减运算。2026/3/14133(2)区分前置形式、后置形式的意义。即前置运算是“先变后用”,而后置运算是“先用后变”。①若不赋值,则变量前置自增自减和后置自增自减结果相同。例如:intx=8;x++;printf(″x=%d″,x);/*运算结果:x=9*/intx=8;++x;printf(″x=%d″,x);/*运算结果:x=9*/2026/3/14134②若有赋值,则被赋值的变量的值不同。例如:intx=8,y;y=x++;printf(″x=%d,y=%d″,x,y);/*运算结果:x=9,y=8*/intx=8,y;y=++x;printf(″x=%d,y=%d″,x,y);/*运算结果:x=9,y=9*/2026/3/14135(3)自增自减运算常用于循环语句中,使循环变量自动加(减)1;也用于指针变量,使指针指向下一个地址。(4)注意运算符的副作用。例如i+++j,是理解为(i++)+j呢?还是理解为i+(++j)呢?初学者应谨慎使用++和--运算符。程序清晰易读,不致引起歧义。2026/3/141362.3.4赋值运算符及赋值表达式

在C程序中最常用到的是赋值运算,赋值运算中的赋值运算符用于给变量赋值,它是双目运算符,优先级仅高于逗号运算符,具有右结合性。赋值运算符包括基本赋值运算符和复合赋值运算符两种。2026/3/141371.基本赋值运算符赋值符号“=”就是基本赋值运算符。赋值运算符的作用:将运算符右端的值赋给运算符左边的变量,实际上是将特定的值写到变量所对应的内存单元中。例如a=3,就是把3赋给变量a。2026/3/141382.复合赋值运算符在赋值号“=”之前加上其他运算符,可以构成复合赋值运算符,如表2-7所示。C语言采用这种复合运算符可以简化程序,以便提高效率。2026/3/14139运算符名称用法等价于+=加赋值运算符a+=3a=a+3-=减赋值运算符a-=4a=a-4*=乘赋值运算符a*=9a=a*9/=除赋值运算符a/=5a=a/5%=取余赋值运算符a%=6a=a%6使用复合赋值运算符时要注意:①复合运算符在书写时,两个运算符之间不能有空格。②如果运算符右边是一个表达式,则相当于它有括号。例如以下3种写法是等价的:x%=y+3等价于x%=(y+3)等价于x=x%(y+3)。

不要理解成x=x%y+3。2026/3/141402026/3/14141#include<stdio.h>intmain(){inta=8;a+=a*=a/=a-6;printf("a=%d\n",a);return0;}【例2-11】复合赋值运算符举例相当于a=a/(a-6);a=a*a;a=a+a程序运行结果为:a=323.赋值表达式由赋值运算符将一个变量和一个表达式连接起来的式子称为“赋值表达式”。赋值表达式的一般形式为:

变量=表达式2026/3/14142说明:(1)运算符的左侧只能是一个变量或赋值表达式,不能是常量或其它表达式,而右侧可以是常量、赋过值的变量或表达式。赋值表达式的作用是将运算符右端表达式的值赋给运算符左边的变量。因此赋值表达式具有计算和赋值的双重功能。例如下列表达式是错误的:5=a、3=a+b、x+y=5*6、c=a+b=32026/3/14143(2)一个变量可以先后被多次赋值,后来赋的值总将变量中原有的值覆盖,变量仅保存最后一次的赋值。(3)赋值表达式不同于数学上的“等式”。a=b和b=a在数学上是等价的,但在C语言中a=b表示将变量b的值赋给变量a,而b=a正相反。(4)在赋值表达式中的“表达式”又可以是一个赋值表达式。例如:a=b=8表达式中有两个“=”运算符,优先级相同,因为具有右结合性,所以先算b=8,赋值表达式b=8的值为8,再将8赋给a。2026/3/14144(5)赋值运算符的优先级和结合性决定了赋值表达式的值。例如:a=3+2表达式中有“+”和“=”两个运算符,因为“+”的优先级高于“=”,所以先完成加法,再将5赋值给a。又如:a=(b=5)/(c=2)表达式中有()、=、/运算符,其中“()”优先级最高,先算(b=5),再算(c=2),然后进行除法运算结果为2,最后把2赋给a。运算完后,b的值为5,c的值为2,a的值为2,赋值表达式的值为2。再如:(x=4*5)=8+9先执行括号内的表达式,将20赋给x,然后计算表达式8+9,值为17,然后,17赋给x。最后整个表达式的结果为17。注意:赋值表达式在运算符左侧时必须加括号。2026/3/141454.赋值过程中的类型转换如果赋值运算符两侧的类型一致,则直接进行赋值。如果赋值运算符两侧的类型不一致,在赋值时系统将自动进行类型转换,即把赋值运算符右边的类型换成左边的类型。转换规则如下:(1)实型与整型转换①将实型数据(包括单、双精度)赋给整型变量时,舍弃其小数部分,然后赋给整型变量。这里要注意变量的类型(short、int、long)以及相应的数值范围,避免赋值后数据溢出。2026/3/14146例如:floatf=65539.45;shorti;i=f;执行i=f后,i舍弃小数部分,由于65539超出了short类型的取值范围-32768~32767,会出现溢出问题。②将整型数据赋给实型变量(包括单、双精度)时,数值不变,补足有效位,然后以浮点数形式存储到变量中。2026/3/141472026/3/14148#include<stdio.h>intmain(){intm;floatx;m=4.53;x=15;printf("m=%dx=%f\n",m,x);return0;}【例2-12】实型与整型数据的类型转换程序运行结果为:m=4x=15.000000(2)单、双精度实型转换①将一个double型数据赋给float型变量时,取其前面的6~7位有效数字,截断时进行四舍五入操作,然后存储到float类型变量中。但要注意数值范围,可能出现溢出错误。例如:

floatf;doubled=123.456789e100;/*指数为100,超过了float数据的最大范围*/f=d;/*f无法容纳如此大的数据,会出现溢出*/②将一个float型数据赋给double型变量时,数值不变,有效位数扩展到15~16位,在内存中用8个字节存储。2026/3/14149(3)字符型与整型(short、int、long)①整型数据赋给char型变量时,只保留其最低8位,高位部分舍弃。2026/3/141502026/3/14151#include<stdio.h>intmain(){shorti=345;charc;c=i;printf("c=%d\n",c);return0;}【例2-13】将整型数据赋给字符型变量程序运行结果为:c=89②将字符型数据赋给整型变量时,由于字符数据只占1个字节,而整型变量占2个或4个字节。所以,将字符数据(8位)放到整型变量的低8位中。如果字符数据的最高位为0,则整型变量的高位全部补0。如果最高位为1,则整型变量的高位全部补1。这样可以保证数值不会发生变化。如果用的是unsignedchar型变量或数据来赋值的话,则一律将整型变量的高位补0。2026/3/141522026/3/14153#include<stdio.h>intmain(){shorti;charc='A';i=c;printf("i=%d,c=%d\n",i,c);return0;}【例2-14】将字符型数据赋给整型变量A的ASCII码是十进制数65,二进制形式1000001,最高位置0程序运行结果为:i=65,c=65C=25(4)整型与整型(short、int、long)和“字符型与整型”相似,当赋值号两边的长度(字节数)不同时,则有“长(字节数多的数据类型)到短(字节数少的数据类型),要截断,舍弃高位部分;短到长,不变样,再用0或1补充高位”。2026/3/141542026/3/14155#include<stdio.h>intmain(){shorti=-234;intm;m=i;printf("m=%d,i=%d\n",m,i);return0;}【例2-15】整型之间的类型转换2字节short短整型数据赋给4字节int型变量时,符号位填充到高位字节程序运行结果为:m=-234,i=-234(5)unsigned型整数与unsigned型整数将一个unsigned型数据赋给一个占据同样长度存储单元的signed(有符号)型整型变量时(如:unsigned→int、unsignedlong→long,unsignedshort→short),将unsigned型数据原值照赋到signed型整型变量中,内部的存储方式不变,但输出值却可能改变,将signed型整型变量的最高位解释为符号位。将一个signed型数据赋给长度相同的unsigned型变量时,原样赋值,内部存储形式不变,但输出时是无符号数据。2026/3/141562026/3/14157#include<stdio.h>intmain(){charch1='A',ch2;inta,b,c=322;floatx,y=7.93;a=y;x=c;b=ch1;ch2=c;printf("a=%d,x=%f,b=%d,ch2=%c\n",a,x,b,ch2);return0;}【例2-16】类型转换程序运行结果为:a=7,x=322.000000,b=65,ch2=B2.3.5逗号运算符及其表达式在C语言中逗号“,”也是一种运算符,称为逗号运算符,它是C语言特有的双目运算符。逗号运算符优先级最低,具有左结合性。其功能是把两个表达式连接起来组成一个表达式,称为逗号表达式。两个表达式的值分别计算,整个表达式的值是最后一个表达式的值。2026/3/14158当以多个逗号将多个表达式分开时,就形成复合逗号表达式。这些表达式的值自左向右依次分别计算,最后一个表达式的值是整个逗号表达式的值,其类型是整个逗号表达式的类型。逗号表达式一般形式为:

表达式1,表达式2,……,表达式n2026/3/14159有关逗号表达式需要注意以下几点:(1)逗号表达式又可以和另一个表达式组成一个新的逗号表达式。例如:(m=5,3*m),m+6

表达式1是(m=5,3*m),表达式2是m+6。先将5赋值给m,再计算3*m得15,m的值不变,最后计算m+6,得11。整个表达式的值是11。2026/3/14160(2)并不是所有出现的逗号都作为逗号运算符。函数的参数之间也是用逗号分隔的。例如:printf("%d,%d,%d\n",(a,b,c),a,b)

其中“(a,b,c)”是一个逗号表达式,它的值是变量c的值,而后面的两个逗号是参数的分隔符。(3)程序中使用逗号表达式,通常是要分别求逗号表达式内各表达式的值,并不一定要求整个逗号表达式的值。例如两数交换算法:t=a,a=b,b=t;这样可以简化书写,提高程序运行效率。2026/3/141612026/3/14162#include<stdio.h>intmain(){inta=2,b=4,c=6,m,n,k;n=(m=a+b),(b+c);printf("m=%d,n=%d\n",m,n);printf("k=%d\n",k=(m=m+100,10+m));return0;}【例2-17】逗号表达式程序运行结果为:m=6,n=6k=1162.4类型转换

在C语言中,各种不同类型的数据可以混合运算。当表达式中

温馨提示

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

评论

0/150

提交评论