《C语言程序设计简明教程》-C语言程序设计简明教程课件_第1页
《C语言程序设计简明教程》-C语言程序设计简明教程课件_第2页
《C语言程序设计简明教程》-C语言程序设计简明教程课件_第3页
《C语言程序设计简明教程》-C语言程序设计简明教程课件_第4页
《C语言程序设计简明教程》-C语言程序设计简明教程课件_第5页
已阅读5页,还剩450页未读 继续免费阅读

下载本文档

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

文档简介

教材说明(续)本书所有的示例程序,都在vc++6.0和Eclipse+MinGW环境下调试通过。每章多数小节都提供了精心设计的思考题,每章后包含了多种类型的练习题。本书叙述简明、清晰,编程实例典型、有趣、实用。第1章C语言概述本章从总体上概观C语言首先通过一些较典型的实例分别介绍了C程序的基本组成、变量和表达式、函数的定义及标准函数scanf、printf的使用方法等入门知识。最后介绍开发了C程序的基本步骤和方法,目的是使读者尽快地了解C语言的语法基础,并根据实例程序学会自己编写简单程序。C语言的发展简介C语言是一种通用的、过程式的程序设计语言,广泛用于系统与应用软件的开发。具有高效、灵活、功能丰富、表达力强和较高的移植性等特点,在程序员中备受青睐。C语言的原型是ALGOL60。1963年,剑桥大学将ALGOL60语言发展成为CPL(CombinedProgrammingLanguage)语言。C语言的发展简介(续)1967年,剑桥大学的MartinRichards对CPL语言进行了简化,于是产生了BCPL语言。1970年,美国贝尔实验室的KenThompson将BCPL进行了修改,提炼精华,并为它起了有趣的名字“B语言”。在1972年,美国贝尔实验室的D.M.Ritchie在B语言的基础上最终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言。C语言的标准为了使UNIX操作系统推广,1977年DennisM.Ritchie发表了不依赖于具体机器系统的C语言编译文本《可移植的C语言编译程序》。1978年由美国电话电报公司(AT&T)贝尔实验室正式发表了C语言。同时由B.W.Kernighan和D.M.Ritchie合著了著名的《TheCProgrammingLanguage》一书。通常简称为《K&R》,也有人称之为《K&R》标准。C语言的标准(续)1989年,由美国国家标准化协会(AmericanNationalStandardsInstitute)在此基础上制定了一个C语言标准,常称为ANSIC,或C89。《标准修正案一》在1995年为C语言创建了一个新标准,这个标准引出了1999年ISO9899:1999的发表,通常称为C99,它是目前最新的C语言标准。C语言设计目标C语言设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。C语言也很适合搭配汇编语言来使用。C语言的设计影响了许多后来的程序设计语言,如C++、Objective-C、Java、C#等。C语言的主要特点C语言是一种结构化程序设计语言效率高:一般只比汇编程序生成的目标代码效率低10~20%。可移植性好:C语言是一种可移植性的语言,这意味着在一个系统编写的C语言程序可以直接或作很少修改就可以运行在其它系统中。C语言的主要特点简洁紧凑、灵活方便C89标准只有32个关键字,9种控制语句。程序书写形式自由,主要用小写字母表示。运算符丰富共有34种运算符。数据类型丰富C语法限制不太严格,程序设计自由度大思考题C语言的发明者是谁?是哪一年发明的?C语言的标准目前有哪些?C语言与Java、C++之间的关系如何?C语言有哪些特点?第一个C语言程序下面是一个在标准输出设备(stdout)上,输出"Hello,World"字符串的简单程序,通常作为初学程序设计语言时的第一个程序(可命名为hello.c)。例1.1输出"Hello,World"。程序清单及运行结果程序清单程序的运行结果为:Hello,World程序简要说明定义函数main,其中函数的头包括:函数类型为int(表示整数类型,简称整型),函数名为main,函数不含形式参数,写上void(void表示空类型、无类型)。函数体的第一个语句是调用系统预定义的标准函数printf(printformat),以字符串”HelloWorld\n”为实际参数,输出双引号中的字符串,其中'\n'用两个字符表示一个特殊符号换行符,表示换行。程序简要说明(续)标准函数printf声明在系统文件stdio.h中,因此程序的第一行通过#include指令包含stdio.h文件。第二个语句是返回语句(return语句),main函数返回整数值0表示程序正常结束,若返回非零表示异常。C语言程序的书写格式自由,各个语法单位之间必须加一个以上的空白符(空格或换行等)分隔。初学者一定要养成良好的编程风格在本书的所有例题中,函数头、函数体中的一段花括号、各语句应各占一行,且两条语句应缩进一个制表符,这样的格式使程序比较清晰。C语言程序的组成C语言程序都是由函数和变量组成。在C语言程序中包含一个或多个函数,每个函数完成特定的功能。main函数是必须的,程序从main函数开始执行,在main函数中直接或间接调用其它函数。函数的定义包括函数头和函数体。函数头包括三个部分:函数值类型、函数名和形式参数列表,其中函数名是必须的,形式参数列表写在一对圆括号中。C语言程序的组成(续)函数值类型和形式参数是可选的,若没有,则应按新的C语言标准,写上void。函数体包括在一对花括号中,其中可包括两个部分:声明部分和执行部分。声明部分用来定义或声明函数中将用到的若干变量和函数。执行部分包括实现指定功能的若干语句。声明部分在前,执行部分在后,它们之间可用空行分隔,以使函数更清晰。思考题若将字符串”Hello,world”输出5行,例1.1中的程序应如何修改?'\n'的作用是什么?将输出字符串”Hello”和”world”输出在不同的行上,例1.1的程序应如何修改?例1-2计算并输出半径为3的圆面积两种注释多行注释,用/*与*/括起来的若干行说明了程序的信息。它是以/*开始,以*/结束,其中可包含多行文本信息。单行注释,它是以//开始,直到一行结束,它可用来对单独的语句进行注释。注释不会影响程序的运行结果。正确的注释可帮助程序员或他人对程序的理解,必要的注释是一个良好的编程习惯。程序说明main函数的第一个语句将r定义为int的变量,并初始化为3(半径的值)。然后定义s为double的变量,其后将表达式3.1415926*r*r的值赋给s。最后将s的值以小数形式输出。printf包括两个参数,第一个参数指定输出格式,其中%f要求第二个参数的值以小数形式输出。定义圆周率π常量#definePI3.1415926例1.3计算并输出半径为3的圆面积修改后的程序至少有两个优点:清晰易读、更易于修改。思考题将例1.3中圆周率PI的值改为3.14,程序如何修改?求半径为3的球的表面积和体积,程序如何编写?利用scanf输入变量的值程序提示用户通过键盘输入半径的值,然后程序根据用户提供的半径计算并输出圆面积。在C语言中,实现用户输入通常调用标准函数scanf(格式化输入)。例1.4从键盘中输入圆的半径,计算并输出圆的面积。程序清单及运行结果程序的运行结果为(其中带下划线的8是用户输入,下同):r=:8201.061926程序说明scanf是格式化输入标准函数,此例中包括两个参数,第一个参数指定输入格式,其中%d要求输入十进制整数,第二个参数是r的地址,表示输入的十进制数存入r中。该程序的main函数体中包括变量定义和执行部分。执行部分又可以分为输入数据、处理数据(计算)和输出数据三个部分。这三部分是一般程序所具有的三个基本功能:输入、处理和输出。思考题将例1.4中scanf语句中的&r改为r,程序的运行结果是否相同?输入球的半径,计算并输出球的表面积和体积。自定义函数及使用对于比较复杂的任务,首先应将任务分解成若干个功能相对独立的简单任务,将这些简单任务用函数来实现。由主函数直接或间接调用这些函数,来完成复杂的计算任务。主函数只起作调度和控制作用,而不会自身实现所有的计算任务。例1.5自定义函数area及其使用方法程序的运行结果为:r:6113.097334思考题例1.5中函数area中若不定义变量s,函数将如何修改?分别编写计算球的表面积和体积的函数area和volume。在主函数中输入球的半径,分别调用函数area和volume计算并输出球的表面积和体积。开发C语言程序的步骤与方法问题分析知道程序要做什么,抽取出问题的数学模型。设计程序自顶向下、逐步求精分解。设计程序时主要考虑两个方面:选择求解的算法和数据结构。应考虑如何有效的组织数据,以利于对它们进行有效的处理。算法是求解问题的步骤和方法,选择较好的算法。可使用伪代码表述算法。开发C语言程序的步骤与方法(续)编写C语言程序伪代码程序翻译成C语言程序。满足C语言的语法要求。在计算机上编辑、编译、链接、运行C语言程序C语言源程序文件,文件的扩展名应为c。编译C语言源程序,扩展名为obj。链接程序将C语言标准库库文件链接起来,最终形成可执行程序,扩展名为exe。编辑、编译、链接、运行的过程图示

测试、调试和维护程序测试程序是在规定的条件下对程序进行操作,以发现程序错误,衡量程序的质量,并对其是否能满足设计要求进行评估的过程。若程序的运行结果不正确,则程序中存在逻辑错误(计算机行话称为bug),调试(debug)是寻找和修复程序错误的过程。犯错误是学习自然的一部分,但聪明的人应避免犯曾经犯过的错误。调试的基本步骤调试的基本步骤包括:(1)发现程序错误的存在;(2)以隔离、消除的方式对错误进行定位;(3)确定错误产生的原因;(4)提出纠正错误的解决办法;(5)对程序错误予以改正,重新测试。维护程序包括改正程序中的潜在错误、添加聪明的新功能等。集成开发环境较早期程序设计的各阶段用不同的软件处理。将编辑、编译、调试等功能集成在一个境中,称为集成开发环境(IntegratedDevelopmentEnvironment,缩写为IDE)。附录A介绍了利用VisualC++6.0集成开发环境开发C程序的方法。附录B介绍了用Eclipse开发C程序。这两种平台都很好,Eclipse更新颖一些。思考题解释术语:debug、IDE判断:开发C语言程序就是直接写出C语言程序,不需要进行问题分析和程序设计。判断:程序设计的关键是算法和数据结构。判断:由于C语言没学好,所以编不好程序。习题基本概念解释判断题编程题编写C程序,输出如下信息:Theonlywaytolearnanewprogramminglanguageisbywritingprogramsinit.第2章数据类型、运算符与表达式本章介绍C语言中最基本的语法单元,其中包括:标识符基本数据类型各种基本类型常量及其特性变量的定义与使用方法最后介绍了基本的运算符和相应的表达式。标识符标识符(英文单词为identifier):用来标识变量名、函数名等名称的有效字符序列。标识符由字母与数字、下划线组成,但其第一个字符必须为字母或下划线。在程序中自定义的标识符不要以下划线开头。如year、yes、age10都是合法的标识符,而10age、yes-and-no不是合法的标识符。标识符(续)注意标识符中大写字母与小写字母是有区别的,think、Think、tHink是不同的标识符。对于内部标识符,至少前31个字符是有效的。诸如if、int等C语言的关键字,不能用作自定义标识符。标识符的基本命名原则是:见名知意,如user_name、password、UserName。思考题标识符的作用是什么?标识符的有效字符包括哪些?下列字符序列是否是有效的标识符:123A123ifintzhangsan基本数据类型数据类型是按被定义变量的性质、表示形式、占据存储空间的多少和构造特点来划分的。在C语言中,数据类型可分为:基本数据类型构造数据类型指针类型空类型基本数据类型基本数据类型的主要特点是其值不可以再分解为其它类型。基本数据类型包括字符型、整型、单精度浮点型、双精度浮点型,分别用关键字char、int、float、double表示。基本数据类型数据的长度依赖于具体实现。基本数据类型可在基本数据类型的前面加一些限定符:short与long可以限定int,且int可省略。在C语言中,int、short、long的所占字节没有具体规定,但要满足关系:signed与unsigned可限定char或任何整型。signed表示最高位符号位,而unsigned表示无符号数,最高位不是符号位,经unsigned限定符限定的数不小于0。longdouble类型用于指定高精度的浮点数。表2.1基本数据类型及其取值范围

思考题整数128、256最合适的数据类型分别是什么?表示10100合适的数据类型有哪些?常量与变量在程序执行过程中,其值不发生改变的量称为常量(constant)。按数据类型的不同,常量可分为整型常量、实型常量、字符常量和字符串常量。在程序执行过程中,其值可以改变的量称为变量(variable)。变量由系统分配特定的空间。基本数据类型的变量可分为整型变量、实型变量和字符变量,但C语言中没有字符串变量。整型常量在C语言中,使用的整型常量不仅有十进制表示,还有八进制、十六进制表示。十进制整常量没有前缀,其数码为0~9八进制整常量必须以0开头,数码取值为0~7十六进制整常量的前缀为0X或0x。其数码取值为0~9,A~F或a~f。长整型常量加大写字母”L”或小写字母”l”后缀来表示,无符号整数加”U”或”u”后缀来表示,后缀用大写字母不容易出错。例2.1整型常量的使用实型常量实型常量也称为实数或者浮点数。在C语言中,实数只采用十进制。浮点常量中必须包含小数点(如123.4)或指数(如1e-2、1E-2)或两者都包含,在没有后缀时类型为double。后缀f与F用于指定float常量,而后缀l或L则为longdouble常量。如圆周率可表示为3.1415926、0.31415926e+1、31.415926E-2。例2.2实型常量的使用看上去程序没有错误,但编译时可能会出现如下类似的警告错误:warningC4305:'initializing':truncationfrom'constdouble'to'float'。这是常出现的问题,避免这种错误的方法之一是在常量后加后缀,或者将类型由float改为double即可。字符常量字符常量是用单引号括起来的字符序列。字符常量是小整数,如:'A'的值为65,'0'的值为48。字符的书写形式有以下4种:单引号括住单字符,如:'x'。转义符表示,如:'\n'、'\\'。'\ooo'表示,其中ooo是1~3个8进制数字(0…7)。如'\101'、’\0’等。'\xhh'表示,其中hh是1~2个16进制数字(0…9,a…f,A…F)。如'\x41'等。例2.3字符型常量的使用

字符串常量字符串常量是用双引号括起来的由若干个字符(可以是0个)组成的字符序列,简称串常量或串。两边的双引号是串的定界符,不是字符串的一部分。在字符串中用'\"'表示双引号字符。字符串常量实际上是字符数组,在内部表示字符串时要用'\0'(ASCII码为0的字符)结尾,'\0'是字符串的结束标志。

字符串常量存储串的存储单元数比括在双引号中的字符数多一个。字符常量'a'和字符串常量"a"看上去都只有一个字符,但在内存中的存储情况并不相同:变量定义与初始化在C语言中,所有变量都必须先定义后使用。intradius;doublePI;doublearea;也可以将同一类型的变量定义集中在一起,变量名之间用逗号分隔。如:doublearea,PI;变量可在定义的同时进行初始化,如:doublePI=3.1415926;自动变量若没有初始化,其值不确定。例2.4变量定义与初始化程序编译时将出现警告错误:warningC4700:localvariable'x'usedwithouthavingbeeninitialized。算术运算符C语言运算丰富,运算符可分为以下几类:算术运算符、关系运算符、逻辑运算符、位操作运算符、赋值运算符、条件运算符、逗号运算符、指针运算符等。用这些运算符将运算对象(常量、变量、表达式等)连接起来的合法的式子称为表达式,最基本的表达式形式是常量和变量。表达式可分为算术、关系、逻辑、赋值表达式等多种类型。算术运算符算术运算包括加、减、乘、除、求余等运算,这5种运算符分别用+、-、*、/、%表示。算术运算的运算对象可以是整型、字符型和实型表达式,应注意的是当参与的运算对象均为整型时,除法运算的结果也为整型,舍去小数。表达式1/4为整型表达式,其值为0。表达式1./4为双精度型表达式,其值为0.25。求余运算(也称模运算)要求参与运算对象均为整型,结果等于两数相除后的余数,如表达式100%3的值为1。例2.5算术运算与算术表达式

思考题求球的体积的数学表达式为,对应的C语言表达式是什么?赋值运算符简单赋值运算符为=。其一般形式为:变量=表达式例如:x=3+4+5。赋值运算符的功能是先计算运算符左边的表达式的值,然后把表达式的值保存到左边的变量中。用赋值运算符连接的式子称为赋值表达式,其值为赋值后的变量的值。表达式x=3+4+5的值为12。赋值表达式也可以出现在赋值运算左边的表达式中,如:x=(a=5)+(b=8)赋值表达式复合的赋值运算符是把赋值运算和其它运算结合在一起,使得表达更简明。age=age+2age+=2后者更简明,它使变量age只写了一次。赋值运算符+=为一种复合的赋值运算符,除此以外,还包括-=、*=、/=、%=等等。注意复合赋值运算符的两个符号是一个整体,中间不能加空格或其它符号,如“+=”不能写为“+=”。思考题请分析下列程序段执行后变量age的值是什么?intage=10;age+=age*=3;关系运算符C语言的关系运算符有6种,分别是>、>=、<、<=、==、!=表示。其中>=、<=、==、!=运算符由两个符号组成,中间不能分开。应特别注意的是等于与不等于符号的写法,很容易将等于符号”==”错写成赋值运算符”=”。用关系运算符连接起来的式子成为关系表达式。若关系表达式成立,则其值为真(C语言中用1表示),不成立为假(用0表示)。表达式4>3的值为1,而4<3的值为0。例2.6关系运算符和关系表达式程序的运行结果为:111000010注意其中C语言表达式a>b>c与数学表达式a>b>c的形式相同,但含义不同,逻辑值也不等价。思考题表达式a=4与a==4有何区别?C语言中,逻辑真、假的值是什么?逻辑运算符C语言的逻辑运算是包括与运算、或运算、非运算,运算符分别为&&、||、!。其中运算符&&和||是双目运算符,运算符!为单目运算,只有一个运算对象。用逻辑运算符连接起来的式子称为逻辑表达式,如下面的表达式都是正确的逻辑表达式:(5>4)&&(4>3)!4逻辑运算符用逻辑运算符连接起来的表达式,在判断其逻辑值的规则是非零即真。4的逻辑值为真(即1),!4的值为假(即0)。运算符&&的运算规则是其两边的表达式同为真(非零即真)时为真(即1),否则为假(即0)。运算符||的运算规则是其两边的表达式只要不同时同为假就为真,否则为假。运算符!的运算规则是其右边的表达式为真,结果为假,否则为真。例2.7逻辑运算符和逻辑表达式程序的运行结果为:1101&&和||运算的次序&&和||运算的次序的规定,称为短路特性:由&&与||连接的表达式从左至右计算,并且一旦知道结果的真假值就立即停止计算。对于或运算,先求出逻辑运算符左边的表达式的值,若为真,则整个表达式的结果为真,不必对运算符右边的表达式再进行运算对与运算,若左边表达式的值为假,则不必对右边的表达式求值,整个表达式的结果为假。实例分析实例分析0&&(3+4)&&(5+6)4||(5+6)||(4+5)若某年能被4整除,同时满足不能被100整除,或者能被400整除,就是闰年。若用year表示年份,则判断闰年的一种逻辑表达式为:(year%4==0&&year%100!=0)||(year%400==0)思考题写出数学表达式a>b>c等价的C语言表达式,可以写出多种形式。自增与自减运算符自增、自减运算符的作用是使变量的值增1或减1,分别用++、--表示。n++完全等价于n=n+1或n+=1,n--完全等价于n=n-1或n-=1。++、--运算都可用作前缀,也可用作后缀,如:++n、n++。++n和n++都是使n的值增1,但两个表达式的值不同。计算表达式++n时,先将n自增,表达式的值为变量n自增后的值。计算表达式n++时,表达式的值为变量n自增前的值,然后n自增。例2.8自增、自减运算程序的运行结果为:n=6x=5n=6x=6思考题表达式n--与--n的值是否相同?若不同,相差多少?类型转换当操作数的类型不同,而且不属于基本数据类型时,需要类型转换,将操作数转化为所需要的类型。类型转换具有两种形式:自动类型转换和强制类型转换。当不同类型的数据进行二元运算时,系统会自动将“较低”的类型提升为“较高”的类型,运算的结果为较高的数据类型。基本类型的转换规则若某个操作数的类型为longdouble(double、float、long),则另一操作数也转换成longdouble(double、float、long)类型。将char、short操作数转换成int类型。赋值运算符两边类型不一样时,系统会自动将右侧表达式的类型转换成左侧的变量类型,然后再赋值。把较长的整数转换成较短的整数或字符时,超出的高位部分将丢掉。float→int:小数部分截取掉;float→int:是四舍五入还是截取取决于具体实现。强制类型转换强制类型转换需要使用强制类型转换运算符,格式如下:

(type)<expression>其中,type为类型描述符,如int,float等。<expression>为表达式。经强制类型转换运算符运算后,返回一个具有type类型的数值,这种强制类型转换操作并不改变操作数本身,运算后操作数本身未改变。例2.9类型转换的使用程序的运行结果为:11.1000003.1415003思考题表达式1+3/4*5+10.1的类型是什么?试分析类型自动转换过程。按位运算符C语言提供了6个按位运算符,分别是:&、|、^、<<、>>、~,它们分别称为按位与、按位或、按位异或、左移、右移、按位求反。这6个位操作运算符只能作用于整数操作数,是将操作数对应的机器数(设为32位二进制位补码形式)逐位进行运算。按位与运算按位与运算时,若两个操作数的对应二进制位同时为1,则结果为1,否则结果为0。按位或运算按位或运算时,若两个操作数的对应二进制位同时为0,则结果为0,否则结果为1。而按位异或运算时,若两个操作数的对应二进制位相同,则结果为0,否则结果为1。移位运算按位左移运算<<是将运算符左边的操作数左移运算符右边操作数指定的位数,如表达式8<<2是将8左移2位。而右移运算>>是将运算符左边的操作数右移运算符右边操作数指定的位数。按位求反按位求反~是将右边的操作数逐位取反,由1变成0,0变成1。如求~1是将1按位取反,将其转化为原码,再转化为十进制后为-1。计算过程为如下:按位运算符的特别作用每个按位运算符都有其特别的作用按位与常用于屏蔽某些位,如:n=n&0177,则n只保留最低8位。按位或用于设置某些位,如:x=x|0x10,将第7位设置为1。按位异或运算可以使某些特定的位翻转。<<与>>分别用于将左操作数左移与右移由右操作数所指定的位数。~用于求整数的反码,如:x=x&~077。例2.10位运算的使用程序的运行结果为:5253248328-2思考题求表达式13&20和-12|6的值。表达式3&5与3&&5的值是否相同?运算符的优先级与结合性运算符的优先级规定了相邻两个不同优先级运算符的优先次序。C语言规定,按优先级从高到低进行运算。优先级共分为15级,表2.2是按优先级从高到低顺序排列,同一优先级的运算符可能存在多个。表达式1+2*3的值为7,而不是9。运算符的结合性结合性包括两种:左结合性和右结合性,各运算符的结合性见表2.2。左结合性是运算对象先与左面的运算符结合。1+2+3的值为6,相当于(1+2)+3。右结合性是运算对象先与右面的运算符结合。赋值运算符采用右结合性,x=y=3的计算次序为:先计算表达式y=3,然后将表达式的值3赋给x,相当于x=(y=3)。表2.2运算符的优先级与结合性

运算符使用应注意问题按位运算&、^与|的优先级比关系运算==与!=的优先级低。C语言没有指定同一运算符的几个运算对象的计算次序(&&、||、?:、,这4个运算除外)。printf(“%d%d\n”,++n,power(2,n))结果依赖于编译器,因为++n与power(2,n)的计算次序不确定,这称为”副作用”,表达式a[i]=i++也同样存在副作用。习题基本概念解释单选题填空题判断题程序阅读题,写出运行的结果。编程题第3章程序流程控制控制流语句用于指定各个计算操作执行的次序。本章将详述C语言的各流程控制语句及使用方法。流程控制语句主要包括:用于选择判断的if-else和switch语句用于循环执行的while、do-while和for语句以及实现跳转的break和continue语句表达式语句、空语句与复合语句C语言的表达式之后加上分号”;”就变成表达式语句。如:age=18;i=i+2;printf("hello,world\n");C语言中,分号通常作为语句的结束符,甚至单独一个分号也可以作为一个语句,称为空语句。空语句不执行任何操作。复合语句用一对花括号”{”与”}”将一组声明语句和执行语句括起来组成一个复合语句,复合语句在语法上等价于单个语句。如:{age=18;i=i+2;printf("hello,world\n");}顺序结构复合语句的一对花括号中可以也可以不包含任何语句,称为空的复合语句。复合语句以右花括号”}”结束,其后不加分号。表达式语句、空语句、复合语句的特点是按书写顺序执行,写在前面的先执行,写在后面的后执行。这种程序结构称为顺序结构。思考题C语言的任何语句是否都以分号结束?空语句、空的复合语句是什么?if-else语句在C语言中实现选择结构的语句常用的一个语句是if-else语句,它是根据条件判断,选择执行语句,当条件成立时,执行一个语句,否则执行另一个语句。选择执行的语句可以是任何语句,包括复合语句和空语句。if-else的语法形式if-else的语法形式if(表达式)语句1else

语句2其中else部分是可选的。该语句执行时,首先计算表达式的值,若其值为真,则执行语句1;否则,若包含else部分,则执行语句2。例3.1输入两个整数,输出最大值。程序运行的结果为:num1,num2:128max=12对于例3.1,试思考下列问题:若求两个整数的最小值,程序该如何修改?若求三个整数的最小值,程序又该如何修改?若将输入的两个整数的按从小到大输出,程序如何修改?若将输入的三个整数的按从小到大输出,程序又如何修改?条件运算符条件运算符是一个三目运算符,参与运算的有三个表达式,表达式之间分别用”?”和”:”分隔,一般形式为:表达式1?表达式2:表达式3其求值规则为:先计算表达式1的值,若为真,则以表达式2的值作为整个条件表达式的值,否则以表达式3的值作为整个条件表达式的值。如表达式2<3?2:3的值为2,而表达式2>3?3:2的值为3。上例中给max赋值的语句可改为:max=num1>num2?num1:num2;if语句的嵌套当if语句的执行语句又是if语句时(这种情况称为if语句的嵌套),若内层的if语句缺省某个else部分时可能会产生歧义现象。如:if(n>0)if(a>b)z=a;elsez=b;在上面的语句中,else语句是与内层的if配对还是与外层的if配对?嵌套的if匹配原则C语言规定每一个else与最近的并且无else配对的if匹配。上面的if语句实际上是下面的结构:if(n>0)if(a>b)z=a;elsez=b;若要改变默认的配对方式,加花括号使else部分与所希望的if结合是较好的办法。多路判断的if语句对于多路判断的情况,可以用嵌套的if语句构成的序列来实现,这种嵌套的if语句的一般形式为:实际上,上面的语句外层是一个if语句,而每个else部分又是一个if语句。例3.2输出成绩的等级输入一个百分制成绩,输出该成绩的等级,规定:90分及以上为’A’80~89分为’B’70~79分为’C’60~69分为’D’60分以下为’E’程序清单

运行结果程序的运行结果为:Enterthetestscore(0-100):87Thegradeis:B试分析当程序运行时,输入分别是90、74、0时,程序的输出结果是什么。

思考题判断下列的语句是否有错:switch语句switch语句一般形式为:其中case后每一常量表达式都必须是整数值的常量或常量表达式,各语句序列可以包含多个语句,也可以没有任何语句。switch语句的执行过程switch语句的执行过程为:先计算switch后面的表达式的值然后与case后的整型常量表达式的值逐个相比较,当表达式的值与某个常量表达式的值相等时,立即执行其后的语句序列,并继续执行以下的所有语句序列,若在此过程中遇到break语句后则终止switch语句的执行;若表达式的值与所有case后的常量表达式均不相同,且default子句存在,则从default后的语句序列开始执行。注意break语句在switch语句中的作用是终止switch的执行,程序将转到switch语句后的语句继续执行。应注意:各case后的表达式必须各不相同若没有case条件满足,则从default后的语句序列开始执行若没有default子句且没有一个case后的常量表达式与switch表达式的值匹配,则语句不执行任何动作。default子句可省略,各case和default子句的先后顺序可以变动,一般default子句放在最后。例3.3输出扑克牌字符串将数字表示(1-13)的扑克牌用适当的字符串显示输出。程序的运行结果程序的运行结果为:12Queen分析上面的程序,当分别输入1、3、13时,程序的输出结果分别是什么?若将例3.3中的所有break语句去掉,程序的运行结果为:12QueenKing12例3.4输出成绩的等级输入一个百分制成绩,输出该成绩的等级,规定:90分及以上为’A’,80~89分为’B’,70~79分为’C’,60~69分为’D’,60分以下为’E’。采用switch语句进行多种情况的判断与处理。程序清单

思考问题试分析上述程序运行时分别输入100、80、50,其输出结果是是什么?请回答下列问题:(1)在switch语句中的判断表达式为什么是score/10,能否改为score或其它表达式?(2)为什么case10后没有写执行的语句系列,能否它与case9交换?(3)可否将其中的break语句都去掉,它们是否都是必须的?(4)若将default子句放到switch语句的最前面,再运行程序输入50,输出是什么?如何修改程序使结果正确?思考题下列switch语句是否有错?若有错,找出这些错误。doublescore;scanf(“%lf”,&score);switch(score){casescore>=90:grade=‘A’;case80<=score<90:grade=‘B’;}while语句while语句一般形式为:while(表达式)语句其中表达式是循环条件表达式,语句称为循环体。while语句的过程是:先计算循环条件表达式的值,若其值为真(非0)时,则执行循环体语句,若循环体执行过程中没有退出循环,则再次计算循环条件表达式的值,重复上述过程,直到循环条件表达式为假为止。例3.5计算1+2+…+100的值并输出

程序说明程序中定义了变量n和sum,其中sum用来存放累加和,所以其初始值为0,而n为每次加到累加和变量中的值,初始值为1,每循环一次,其中增加1,直到n的值大于100,循环结束。试分析以下问题:若计算1~100中的所有奇数和,程序该如何修改?循环体语句可否改为:sum+=n++;若要计算1~100的积(100!),程序该如何修改?注意:100!是一个很大的数。使用while语句应注意以下几点:循环体语句可以是任何语句,可以是简单语句、复合语句或空语句,当然也可以是while语句、if-else语句或其它语句。循环体一般应完成多个操作,因此通常情况下循环体是复合语句。while语句是先判断循环条件再执行循环体,若循环条件不成立,则循环体一次也不执行。若循环条件永真,除非循环体中包含跳出循环的语句(如break语句等),否则循环将不会结束,变成了无限循环(也称死循环)。思考题为了计算1+2+3+4+…+99+100的值,下列程序段是否有错?intn=1,sum=0;while(n<=100);sum+=n++;do-while语句若循环至少执行一次,可用do-while语句代替while语句。与while语句不同,do-while语句是先执行后判断,其一般形式为:do语句while(表达式);do-while语句的执行过程是:先执行循环体语句,若循环体语句执行过程中没有退出循环,则求条件表达式的值,若为真,则重复上述过程,直到条件表达式为假时终止循环。因此,do-while循环至少要执行一次循环体语句。注意,do-while语句必须以分号结束,分号不能省。例3.6计算并输出整数各位数字之和输入一个非负整数,计算并输出该整数各位数字之和,如:输入整数12345,则输出15。用do-while语句实现求和。思考题当程序运行若分别输入10、0、-2,程序的输出分别是什么?在此程序中,由于循环体完成了两个操作,因此循环体是一个复合语句,若去掉一对花括号,程序会出现什么错误?思考题:将例3.5用do-while语句实现。for语句for语句完全可以取代while语句,其一般形式为:for(表达式1;表达式2;表达式3)语句for语句的执行过程为:先求表达式1的值,然后求表达式2的值,若表达式2的值为真,则执行循环体语句,之后求表达式3,然后又回来计算表达式2的值,若其值为真,则继续上述循环,直到表达式2的值为假时结束循环,转到for语句后执行。for语句等价的while语句for语句等价于下列while语句(但循环体内包括continue语句时不一定等价):表达式1;while(表达式2){语句表达式3;}说明for语句的三个表达式都可以是任何表达式一般表达式1用于设置循环的初始条件,表达式2是循环条件,一般是关系表达式,表达式3用于改变循环条件。这三个表达式用分号进行分隔,它们都可省略,但分号必须保留。若表达式1和表达式3省略,则for语句就退化成了while语句。若省略表达式2,则循环条件永真。3个表达式可以都省略,如:for(;;);相当于:while(1);例3.7计算并输出1+2+…+100的值

逗号运算符表达式sum=0也写到for语句中,表达式变为:n=1,sum=0。其中连接两个表达式n=1与sum=0是逗号运算符。逗号运算符的作用是将多个表达式连接起来,逗号运算表达式的值是最后一个表达式的值。若一个循环的循环体语句又是循环语句(可以是while、do-while或for语句),则称为多重循环,它用来解决较复杂的程序设计问题。例3.8输出下三角形式的九九乘法表

程序分析要求输出的九九乘法表包括9行,所以外循环控制变量i取值从1到9,而第i行共有i列,所以内循环控制变量j取值从1到i。函数printf中的一个输出格式”%-3d”是要求表达式i*j的值按十进制整数输出,”d”之前的”3”是指定输出的最小宽度,3之前的”-”是在指定宽度大于实际输出字符个数时左对齐,右边补空格。思考题下列程序段执行后sum的值多少?inti,j,sum=0;for(i=1;i<10;i++);for(j=1;j<i;j++);sum+=i+j;break与continue语句从循环语句中退出,除了使循环条件为假以外,还可以从循环体中退出。从循环体中退出循环较好的方法是使用break语句。在循环体中执行break语句后,程序立即从其所在循环层(while、do-while、for语句)中退出。例3.9判断一个整数是否是素数素数,亦称质数,是指在大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数。也就是说,只有两个正因数(1和自己)的自然数即为素数。判断正整数n是否是素数,按定义,可用2~n-1中的所有整数,依次判断它们是否能整除n,若其中某一个能整除n,则立即可断定n不是素数,不用继续判断了。只有2~n-1中的所有整数都不能整除n,n才是素数。源程序清单

程序的运行结果程序的运行结果为:Enteranumber(>0):1717isaprime.在例3.9中,若n能被d整除,则立即退出循环,因为它不是素数。for循环结束后若表达式d==n成立,则n是素数;否则,n不是素数。printf函数中的格式%s要求对应的参数是字符串。continue语句continue语句是结束本次循环(不再执行循环体中当前语句后面的语句),进入下一次循环。例3.9中的循环体语句可改为下面的形式,功能完全相同:if(n%d!=0)continue;elsebreak;思考题若要求100~1000中的所有素数,程序将如何修改?若将if语句中的条件表达式改为n%d!=0,分析程序存在什么逻辑错误。goto语句goto语句可以跳转到函数内任何有标号的地方。应将goto语句转向的语句前加上标号。标号由标识符后跟冒号组成。标号可在任何语句的前面,但要与相应的goto语句位于同一函数内。由于goto语句的随意滥用可能使程序难于理解,因此建议尽量不用goto语句。例3.10goto语句的使用

习题基本概念解释选择题填空题判断题程序阅读题,写出运行结果程序填空题编程题第4章数组数组是具有同类型的多个数据所组成的数据结构,按顺序存放,按下标直接存取。数组中的数据具有相同的数组名,每个数据称为数组元素或下标变量。按独立参数(维数)的不同,数组可分为一维数组、二维数组和多维数组。若按数组元素的类型不同,数组又可分为整型数组、字符数组等类别。一维数组一维数组是最简单的数组类型,只有一个独立参数。为了使用数组,必须先进行定义。一维数组的定义形式为:数据类型数组名[元素个数];其中数据类型是任何类型。数组名必须是有效的标识符。方括号中元素个数表示数组中元素的个数,称为数组的长度或大小。一维数组的定义如下面定义a为包含10个数组元素的一维int数组:inta[10];为程序中便于修改数组的长度,一种较好的做法是将其定义为符号常量,上面的数组定义变成下面的形式:#defineN10inta[N];一维数组元素一维数组元素的一般表示形式为:数组名[下标]其中下标是整型表达式,数组元素也称为下标变量。C语言规定下标从0开始,它们按下标从小到大顺序存放。应注意的是,下标可以超出这个范围,如对上面的数组a,可指定元素a[11]、a[-1]等,不是有效的数组元素。例4.1一维数组的定义及元素使用

思考题若将例4.1中最后一个for循环的循环条件改为i>=-1,程序会出现什么问题。一维数组的初始化数组初始化是指在数组定义时给数组元素赋初值,一般形式为:数据类型数组名[元素个数]={表达式1,表达式2,…,表达式n};下面的数组定义及初始化是合法的:#defineN10inta[N]={0,1,2,3,4,5,6,7,8,9};一维数组的初始化当初始化表达式的个数少于数组元素个数时,按下标顺序依次给各数组元素赋初值,没被赋初值的数组元素的值为0。如下面的定义:inta[10]={0,1,2,3,4};将所有数组元素初始化为0,可定义为:inta[10]={0};只能给元素逐个赋值,不能给数组整体赋值。一维数组的初始化(续)当定义数组时,若给全部元素赋初值时,则可不指定数组元素的个数。因此下面两种定义形式是等价的:inta[5]={1,2,3,4,5};inta[]={1,2,3,4,5};值得注意的是,自动一维数组未初始化时,各元素的值是不确定的。算法+数据结构=程序著名的计算机科学家NiklausWirth有一句名言:Algorithms+DataStructures=Programs。算法是指完成一个任务所需要的具体步骤和方法。数据结构是计算机中存储、组织数据的方式。程序的灵魂是算法,数据结构是算法的加工对象。例4.2顺序查找从一组无序整型数据(如学号、身份证号、课程成绩等)中查找某个给定值x是否存在。数据结构:数组是一种重要的组织数据的方法,本例采用一维整型数组存放数据集。算法:顺序查找。具体方法是:从第一个到最后一个数组元素,依次与给定值x比较,若某个元素与x相等,则找到,显示找到的信息及元素的下标;若所有元素都不与x相等,则找不到,显示找不到的信息。程序清单程序的运行结果程序的运行结果为:Input6integer:286389nomatch!程序中第一个for语句是用来从键盘输入各数组元素的值,&a[i]是元素a[i]的地址。本程序按从左到右的次序(下标从0到N-1)顺序查找,是否可以从右到左查找(下标N-1从到0),程序该如何修改。例4.3折半查找数据结构:采用一维整型数组存放数据集,数组元素是有序的(从小到大)。算法:折半查找。具体方法见题目前的分析。程序清单冒泡排序(BubbleSort)基本思想依次(从左到右,或从右到左)比较数组中待排序的每一对相邻元素,若不满足顺序关系(从小到大或从大到小)则交换,这一过程称为一趟。这一趟结束后,至少增加了一个已排好序的元素。重复上述过程,直到无须再交换即排序完成为止(若数组有n个元素,排序最多需要n-1趟)。这个算法是因为较小的元素会经交换慢慢上”浮”到数组的前面而得名。例4.4利用冒泡法排序随机产生10个100以内的整数,利用冒泡法对随机产生的10个整数由小到大排序,输出排序后的结果。数据结构:采用一维整型数组存放数据集。算法:冒泡排序法。具体方法见题目前的分析。程序清单

程序说明函数rand返回0~RAND_MAX的随机值。先用srand()设定随机数种子(默认值为1),通常用time(0)作为seed的参数。系统函数srand和rand的原型声明在stdlib.h中,time的声明在time.h中。冒泡排序最多需要n-1趟,依赖于待排序数据的状态。试修改上述程序,使其可以处理提前结束排序的情况。思考题下列定义数组的方法是否有错?intn;scanf(“%d”,&n);inta[n];若数组元素未初始化,其值是否为0?inta[4];a数组定义的元素包括a[0]到a[4]。折半查找、冒泡排序的基本思想是什么?默写这两个算法。二维数组二维数组定义的一般形式是:数据类型数组名[整型常量表达式1][整型常量表达式2]其中整型常量表达式1是第一维下标的长度,通常称为数组的行数,整型常量表达式2是第二维下标的长度,称为数组的列数。数组元素的个数是两个常量表达式之乘积。二维数组的定义下列是定义一个3行4列的二维整型数组a:inta[3][4];与一维数组的定义类似,为程序中便于修改二维数组的行数和列数,一种较好的做法是将其定义为符号常量,上面的数组定义变成下面的形式:#defineM3#defineN4inta[M][N];二维数组元素二维数组元素是双下标变量,其一般形式为:数组名[行数][列数]其中行数和列数都是整型表达式。C语言规定下标从0开始,第一个元素为a[0][0],最后一个元素为a[2][3],而不是a[3][4],下标越界不会出现语法错误。C语言规定,内存中二维数组元素是按行序为主序顺序存放。例4.5二维数组的定义及其元素使用

二维数组的初始化二维数组的初始化可不分行初始化,也可分行初始化,也可部分初始化。二维数组初始化包括以下几种形式:不分行初始化,则按按行序为主序顺序存放到数组元素中,如:inta[2][3]={1,2,3,4,5,6};//完全初始化intb[2][3]={1,2,3,4};//部分初始化二维数组的初始化(续)intc[2][3]={0};//全部初始化为0intd[][3]={1,2,3,4,5,6};//不指定行数,实际上为2行当元素较多时,不分行初始化使程序员不易看清各元素的初始化值。此时分行初始化较好,如:floatx[2][3]={{1,2,3},{5,6,7}};//分行完全初始化longy[2][3]={{1,2},{5,6}};//分行部分初始化intz[][3]={{1},{2},{4}};//不指定行数,实际上为3行自动二维数组未初始化时,各元素的值是不确定的。例4.6矩阵中最大元素的值及其位置输入一个3行4列的矩阵,计算所有元素的平均值,并输出其中最大元素的值及其位置。程序清单(续)

例4.7输出某年某月的天数输入某年的年份及某月的月份(1~12),输出该年该月的天数。思考题二维数组用来表示闰年和平年的月份简化了算法的复杂性,若只用一维数组表示平年的月份,实现例4.7中的程序。字符数组用来存放字符数据的数组称为字符数组。下面分别定义了一个一维字符数组和二维字符数组:charc[10];chard[5][10];字符数组同样允许在定义时初始化,方法与一般数组的初始化相同,但各初始化表达式的值为字符。字符数组(续)charword[]={'H','e','l','l','o','!'};字符数组word的长度为初始化表达式的个数:6。通常字符数组用来存字符串。字符串的结束符是字符'\0'(不记入字符串的长度)。下列三种给字符数组初始化的作用是等效的,最后一种形式最好:chars[]={'a','l','g','o','r','i','t','h','m','\0'};chars[]={"algorithm"};chars[]="algorithm";例4.8计算并输出字符串的长度字符串处理操作都是遇’\0’而止。例4.9输出1~12月的英文单词程序中monthname的列数定义为20,请思考,20是否太大,造成较多的空间浪费?可否改成10、8?最合适的值是什么?思考题字符串的结束标志是什么?字符串处理时有什么特点?字符串标准库函数简介ANSI标准定义了C语言的标准库函数,按功能的不同,可分为标准输入输出函数、数学函数等等,每类函数都声明在其头文件中,如stdio.h、math.h。C语言程序都离不开标准库函数的调用。在调用标准库函数时,只需要用#include指令包含其头文件即可。#include<math.h>字符串处理标准函数C语言提供了丰富的字符串处理函数,主要声明在string.h中,大致可分为字符串的输入、输出、合并、比较、复制等几种类型,使用这些函数可大大简化有关字符串操作程序的编程。串输入、输出函数:这类函数定义在stdio.h中,除了前面用过的scanf和printf外,还包括专门输入串的函数gets和输出串的函数puts。字符串操作函数chars[80];gets(s);//与scanf不同的是,不以空格而是以换行符(但不包含换行符)作为输入结束,并将换行符转化为’\0’。puts(s);//等价于printf("%s\n",s);字符串操作函数定义在string.h中,包括串的连接、复制、比较、求串长等函数。chars1[20]="computer",s2[10]="science";strcat是字符串连接函数,函数调用strcat(s1,s2)把s2中的串连接到s1中串的后面,并删去s1后的串标志’\0’。注意s1应足够长,否则不能全部装入被连接的字符串。字符串操作函数strcpy是字符串复制函数,函数调用strcpy(s1,s2)是把s2中的串复制到s1中。串结束标志’\0’也一同拷贝。strcmp是字符串比较函数,strcmp(s1,s2)是从左到右依次比较两个串中的对应字符,并返回比较结果。若两个串相当,则返回0;s1大于s2,返回值为正数;否则返回值为负数。strlen是求串长函数,表达式strlen(s1)是计算并返回串s1的长度(不含字符串结束标志‘\0’)。例4.10字符串标准函数的使用程序的运行结果为:computerscience87-1157-10思考题指出下列语句有哪些错误?chars[6]=“ok”;s=“123”;s+=“45”;if(s==“123”)printf(“ok”);习题基本概念解释单选题填空题阅读程序,写出程序的运行结果程序填空题编程题第5章函数与程序结构对于较大规模的计算任务,通常是将较大的计算任务分解成若干个规模较小且相对独立的子任务,它们分别用单独的函数来实现。由main函数直接或间接调用其它函数完成计算任务。本章通过典型实例讨论函数及程序的结构,主要内容包括函数、外部变量、静态变量、初始化、递归等。C语言程序的结构C语言程序是变量定义和函数定义的集合。组成C语言程序的函数不必放在都一个源程序文件中,它们可存放在多个源文件中。程序执行时总是从main函数开始,完成对其它函数的调用后再返回到main函数。一个C源程序必须有且仅有一个main函数。所有函数在定义时是平等的,一个函数并不从属于另一函数,即函数不能嵌套定义。函数定义形式自定义函数的形式为:返回类型函数名(形式参数声明表){

声明部分执行部分}在函数的定义中,除了函数名、圆括号和花括号不能省外,其它部分都可缺省。函数定义形式说明函数定义形式中的首行称为函数头,下面的部分为函数体。函数体中可包含声明部分和语句序列。其中声明部分包括本函数的若干变量定义及被本函数所调用但在其它地方定义的变量或函数的声明。执行部分是实现函数功能的语句序列。语句序列最后执行的语句通常是return语句。return语句return语句的一般形式为:return表达式;return语句的表达式也可以省略,则只将程序流程返回到主调函数,不返回值。此时,函数定义的返回类型为void,表示该函数无返回值。形式参数声明表若形式参数声明表中无任何形式参数,则用void表示。在形式参数声明表中列出形式参数(简称形参),参数声明包括参数的数据类型及参数变量名(类型与变量名之间可用空格分隔),各参数声明之间用逗号间隔。调用函数时,必须给定各形式参数对应的表达式,称为实参表达式(简称实参),要求实参与形参的类型一致或相容。例5.1自定义函数自定义求两个整数的最大值函数max,这两个整数作为max函数的形式参数,主函数中输入两个整数,调用max函数输出它们的最大值。程序的运行结果为:num1,num2:48max=8思考题下列程序有什么错误:intmain(void){intmax(intn1,intn2){max=n1>=n2?n1:n2;}printf(“%d\n”,max(2,4));return0;}函数的声明函数之间只存在着调用和被调用的关系。若被调用可以出现在调用函数之前,在调用函数不必对被调用函数进行声明,否则应加以声明。函数声明的方法很简单,一种方法是只要将函数头加分号(称为函数的原型,functionprototype)即可,而且还可以去掉或改变参数表中的变量名。max函数的声明上例中max函数的声明可采用如下的多种形式:intmax(intn1,intn2);intmax(int,int);intmax(intn,intm);无论调用函数与被调用函数是什么位置关系,在调用函数之前,对被调函数进行声明是一个好的编程习惯。例5.2自定义函数isPrime判断素数自定义函数isPrime判断一个正整数是否是素数,主函数调用isprime函数输出2~20中的所有素数。intisprime(intn)的另一种形式可以比较发现,后一种形式更容易理解,在这个函数中,包括两个return语句,不是素数时返回0,否则返回1。思考题函数的声明什么情况下可以省略?返回值为非整型值的函数函数可以没有返回值,此时其返回类型为空,则声明为void,若参数声明表也没有参数,则用void表示。例5.3无返回值的函数程序的运行结果为:CProgrammingisfun.CProgrammingisfun.CProgrammingisfun.例5.4power函数计算m的n次幂power函数计算m的n次幂,并返回结果给主函数。程序的运行结果为:64 64000000128 1280000000256 25600000000512 512000000000思考题将例5.4中power函数的返回类型改为int,会出现什么问题?数组作为函数的参数将数组名作为函数参数,实际上是把数组的起始地址传递给函数。数组作为形式参数时,通常无需指定数组的长度,而用另一个变量指定数组的长度。如下面两种形式作为函数头时是等价的:intf(inta[],intn)intf(inta[10],intn)例5.5自定义冒泡排序函数冒泡排序程序,将冒泡排序单独写一个函数来实现。程序的运行结果为:126837367812程序说明对冒泡排序算法作了一些改进,若一趟结束时没有交换,表明数组中的元素已经有序,排序已结束,则终止外循环的执行。应注意的是,在调用这些函数中,形参数组对应的实参是数组名,而不是具体的数组元素,是将数组的起始地址传递给被调用函数。思考题对于例5.5中的函数bubbleSort,是否可以按如下的方式调用:inta[]={0,1,2,3};bubbleSort(a[4],4);函数的嵌套调用C语言中一个函数可以调用另一个函数来完成自己的任务,这样的关系若继续进行下去,则成为嵌套调用。例5.6定义函数gcd(m,n)和lcm(m,n),分别是求两个正整数m,n的最大公约数和最小公倍数。在主函数中输入两个正整数,分别调用gcd和lcm输出它们的最大公约数和最小公倍数。定义函数gcd(m,n)和lcm(m,n)程序的运行结果为:inputm,n:68gcd(6,8)=2lcm(6,8)=24欧几里得算法(Euclideanalgorithm)上面程序中求两个正整数的最大公约数的算法是辗转相除法。辗转相除法,又名欧几里得算法(Euclideanalgorithm)是求两个正整数之最大公约数的算法。它是利用如下两个性质来确定

m和n的最大公约数:(1)若r是m÷n的余数,则gcd(m,n)=gcd(n,r)。(2)m

和其倍数之最大公约数为m。算法的执行步骤为:思考题函数的嵌套调用是指什么?main函数可以调用其它函数,其它函数是否可以调用main函数?函数的递归调用函数之间不仅可以相互调用,而且函数还可以直接或间接调用自己,这称为函数的递归(recursion)调用。递归通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,只需较少的代码便可描述解题过程。在使用递归策略时,必须有递归结束条件,称为递归出口,否则就变成了无限递归。无限递归的典型描述是老和尚讲故事。用递归方法求阶乘计算一个非负整数n的阶乘(factorial),可用递归定义来计

温馨提示

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

评论

0/150

提交评论