配色: 字号:
《C语言程序设计项目式教程》02 绘制图形写字字帖
2023-05-24 | 阅:  转:  |  分享 
  
第 一 章第四章学习目标了解条件运算及表达式和函数在结构化程序设计中的重要意义理解在解决问题过程中抽象出规律的重要性掌握for语句及循环嵌套
以及程序功能设计掌握三种循环语句的区别、联系以及使用情况具有使用switch语句实现简单的菜单选择功能的能力学习路径任务一 使用
无参函数, 实现根据不同内容输出不同图形逻辑运算 (1)逻辑运算符的分类 C语言中的逻
辑运算符只有3个,即逻辑与(&&)、逻辑或(||)和逻辑非(!),其中逻辑与和逻辑或是双目运算符,逻辑非是单目运算符。逻辑运算
(2)逻辑运算符的优先级和结合性 三个逻辑运算符中,逻辑非“!”的优先级最高,具有右结合性,其次是
逻辑与“&&”,最后是逻辑或“||”,逻辑与和逻辑或都具有左结合性。它们的优先级为:!> && > ||。当一个复杂的表达式中既有
算术运算符、关系运算符,还有逻辑运算符时,它们之间的优先级如下: 算术运算符 > 关系运算符 > 逻辑运算符。条件运算
条件运算符是C语言中唯一的三目运算符,要求有三个运算对象。由条件运算符组成的表达式称为条件表达式。条件表达式的一般格式如下:
①条件表达式的求值规则为:若表达式1的值为真,则以表达式2的值作为条件表达式的值,否则以表达式3的值作为整个条件表达式的值。②条件
运算符?和:是一对运算符,不能分开单独使用。③条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值符。④条件运算符的结合性
是自右至左,例如条件表达式嵌套:a>b?a:c>d?c:d,应理解为a>b?a:(c>d?c:d)。表达式1? 表达式2: 表达
式3for和do-while语句 (1)for语句简介 C语言中的for语句使用最为灵活,它完全可以代替while
语句 。 其流程图和执行过程分析可以看出, 它相当于while循环中如下形式 f
or(表达式1;表达式2;表达式3) { 循环体 }表达式1;while(表达式2) {循环体表达式3;}for和do-while
语句 该语句的执行过程为:第一步:执行表达式1;第二步:求表达式2的值,若其值为true(非0),则执行一次循环体,若其值为f
alse,(0),则结束循环,转而执行循环体后面的语句;第三步:执行表达式3,然后转到第二步继续执行。 for
和do-while语句 “表达式1”可以省略,但若使用循环控制变量,则应事先赋初值。“表达式2”可以省略,则循环判断条件永为逻辑
真,循环体中没有其他退出语句,则循环将无终止地进行下去。“表达式3”可以省略,但一般应另外有使循环控制变量的值趋向循环结束值的语句
,以保证循环能正常结束。三个表达式都可省略,但分号不能省略表达式1中可以同时初始化多个变量,一般用逗号运算。表达式2可以是任意表达
式,只要其值为非零,就执行循环体。表达式3可以是任意表达式,例如:逗号表达式、函数调用等。for和do-while语句 (2)d
o-while语句 一般格式 例如,编写程序进行帐号与密码检查, 直到帐号和密码输入正确为止
do {循环体}while (表达式);for和do-while语句 (3)三种循环语句的比较三种循环一般情况下可以互相
代替。while和do-while循环语句中,循环变量初始化的操作应在while和dowhile语句之前完成;在while后面指
定循环条件;在循环体中包含使循环趋于结束的语句(如i++,或i=i+1等)。而for语句可以在表达式1中实现循环变量的初始化;表达
式2中是循环条件;表达式3中包含使循环趋于结束的操作,甚至可以将循环体中的操作全部放到表达式3中。for语句的功能更强,凡用whi
le循环能完成的,用for循环都能实现。while和do-while的区别有两点:①无论循环条件是否成立do-while语句的循环
体至少执行一次,而while语句的循环体可能一次都不执行;②while语句中,while()后面的分号可以有也可以没有,有和没有表
示的含义不一样,多数情况下有分号会出现逻辑错误;do-while语句中,while()后面必须有分号,没有则出现语法错误。 f
or和do-while语句 (4)嵌套 循环嵌套是指一个循环体内又包含另一个完整的循环结构,三种循环语句(while
循环、do-while循环和for循环)可以互相嵌套,并且可以多层嵌套。函数概述 (1)函数简介
C语言的结构有一个特点,它是由一个个被称为函数的程序块组成的。C源程序是由函数组成的。虽然在前面各章的程序中大都只有一个主函数m
ain),但应用程序往往是由多个函数组成。函数是C源程序的基本结构,通过对函数的调用实现特定的功能。C语言不仅提供了极为丰富的库函
数,还允许用户建立自己定义的函数。用户可把自己的算法编成一个个相对独立的函数结构,然后用调用的方法来使用函数。可以说C程序的全部工
作都是由各式各样的函数完成的。比如我们先前使用的输入输出函数等。函数概述 (2)函数的优势对于每一个函数单独编写和调试,可以简化程
序设计。函数的逻辑简单、明确,可以增加程序的可读性,方便维护与调试。采用函数编程,C语言程序易于实现结构化程序设计,从而使程序的层
次结构清晰。可以像搭积木一样,把不同函数进行相应组合,实现一个完整的应用程序。函数的重复使用,可以避免重复劳动,提高软件开发效率。
函数具有模块化功能,一个程序由功能不同的函数组成,可以分别编写,利于团队开发,能加快程序开发速度。当程序需要扩充新功能时,也不会涉
及整个程序的修改,从而使程序具有良好的可维护性和可用性。函数概述 (3)函数的分类根据函数的概念我们可以对函数进行分类,在C语言中
可从不同的角度对函数分类 从函数定义的角度看,函数可分为库函数和用户定义函数两种。①库函数由C系统提供,用户无须定义,
也不必在程序中作类型说明,只需在程序前包含有该函数原型的头文件即可在程序中直接调用。例如,在之前的示例中反复用到printf()
、scanf()、getchar()等函数均属此类。C语言提供了多种库函数,不仅数量多,而且有的还需要硬件知识才会使用,因此要想全
部掌握则需要一个较长的学习过程。应首先掌握一些最基本、最常用的库函数,再逐步深入。由于篇幅关系,本书只介绍了很少一部分库函数,其余
部分可根据需要查阅有关手册。函数概述 ①库函数
常用数学库函数

常用其他库函数函数概述 ②用户自定义函数由用户按实际需要编写的函数。对于用户自定义函数,不仅要
在程序中定义函数本身,而且一般在主调函数模块中还必须对该被调函数进行类型说明,然后才能使用。从主调函数和被调函数间数据传送的角度看
又可分为无参函数和有参函数两种。①无参函数函数定义、函数说明及函数调用中均不带参数,主调函数和被调函数之间不进行参数传送。此类函数
通常用来完成一组指定的功能,可以返回或不返回函数值。②有参函数也称为带参函数。在函数定义及函数说明时都有参数,称为形式参数(简称为
形参)。在函数调用时也必须给出参数,称为实际参数(简称为实参)。进行函数调用时,主调函数将把实参的值传送给相应形参,供被调函数使用
。C语言的函数兼有其它语言中的函数和过程两种功能,从这个角度看,又可把函数分为有返回值函数和无返回值函数两种。①有返回值函数此类函
数被调用执行完后将向调用者返回一个执行结果,称为函数返回值。比如数学函数即属于此类函数。由用户定义的这种有返回值的函数,必须在函数
定义和函数说明中明确返回值的类型,有返回值的函数定义如下所示:②无返回值函数此类函数用于完成某项特定的处理任务,执行完成后不向调用
者返回函数值,这类函数类似于其它语言的过程。由于函数无须返回值,用户在定义此类函数时可指定它的返回为“空类型”,空类型的说明符为“
void”。函数声明 在一个函数中被调用的函数(即被调用函数)需要具备如下条件: (1)被调用的函数必须是已经存在的函数(是库函数
或用户自定义函数)。(2)如果使用库函数,一般应在文件开头用#include命令包含头文件。如果使用用户自己定义的函数,尤其是主调
函数在前,被调函数定义在后时,必须在主调函数中对被调用函数进行函数声明。函数声明,也称函数原型,其一般格式如下所示:函数的定义函数
的定义可以位于源程序中预处理命令(以#开始的命令)之后的任何位置。C语言函数定义ANSI格式如下:函数定义一般有两部分组成:函数首
部和函数体。函数首部包括:数据类型,是指函数的类型,即函数返回值的类型。函数可以有返回值,也可以没有返回值。若没有返回值时,数据类
型为void;若在函数首部没有“数据类型”项,则表示函数返回值类型为int。函数名,是指由用户定义的标识符,它应该符合标识符起名规
则,并且最好能“见名思义”。参数列表,在每个函数名的后面紧跟一对括号,注意:即使是无参函数该括号也不能缺省。若是有参函数,则分别声
明每一个形参,形参之间用逗号分隔。函数体,被一对花括号括起来,通过函数体中的语句来实现函数的功能。一般函数体又是由声明部分和执行部
分组成的。声明部分往往用于声明属于该函数的局部变量和该函数要调用的其他用户自定义函数。执行部分就是由各个所需的执行语句组成。 无参
函数的调用(1)函数调用过程 函数只有仅当被程序调用的时候,函数中的语句才会被执行。调用函数时,程序可以通过一个或多
个参数给它传递信息。参数是程序传递给函数的数据,函数可以使用这些数据执行任务。然后执行函数中的语句,完成被设计的任务。函数中的语句
执行完毕后,控制权将返回调用函数的地方。函数能够以返回值的形式将信息返回给程序。 无参函数的调用(2)函数调用形式 函
数调用的一般格式如下所示:在函数调用时应注意:① 函数名后的“实参表列”可以省略,但()不能省略。② 实参表列可以包含多个实参,各
参数间用逗号分隔。③ 实参与形参一一对应,实参与形参的个数应相等,类型应一致或相兼容,在调用函数时实参把值传递给对应的形参。④ 实
参表列中的参数可以是常量、变量、表达式或函数。在进行函数调用时,实参必须具有确定的值,以便把这些值传递给相应形参。因此应预先用赋值
、输入等方法使实参获得确定值。无参函数的调用(3)函数调用的方式 ①函数作为一个单独的语句。把函数调用作为一个语句,不要求函数有返
回值。一般格式如下所示②函数作为表达式中的一项出现在表达式中。函数出现在一个表达式中,要求函数带回一个确定的值。一般格式如下所示:
③函数作为调用另一个函数时的实参一般格式如下所示:任务二 使用有参函数,分别显示不同图形有参函数的调用(1)函数调用过程
所有程序都是从main()开始执行,遇到函数调用时,把当前断点地址压入堆栈,执行被调用函数,当被调用函数执行结束之后,由
堆栈中弹出主调函数断点地址,继续执行主调函数后面的语句.有参函数的调用(2)函数的调用形式 函数调用的一般格式如下
所示:在函数调用时应注意:① 函数名后的“实参表列”可以省略,但()不能省略。② 实参表列可以包含多个实参,各参数间用逗号分隔。③
实参与形参一一对应,实参与形参的个数应相等,类型应一致或相兼容,在调用函数时实参把值传递给对应的形参。④ 实参表列中的参数可以是
常量、变量、表达式或函数。在进行函数调用时,实参必须具有确定的值,以便把这些值传递给相应形参。因此应预先用赋值、输入等方法使实参获
得确定值。有参函数的调用(3)函数调用的方式 ①函数作为一个单独的语句。把函数调用作为一个语句,不要求函数有返回值。一般格式如下所
示:②函数作为表达式中的一项出现在表达式中。函数出现在一个表达式中,要求函数带回一个确定的值。一般格式如下所示:③函数作为调用另一
个函数时的实参一般格式如下所示:形参与实参函数的形参和实参具有以下特点:(1) 形参变量只有在被调用时才分配内存单元,在调用结束时
,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。(2) 函数调用是数据单向值传递,即只能把实参的值传送给形参,而不能把形
参的值反向地传送给实参。因此在函数调用过程中,形参的值可以发生改变,而实参的值不会随之变化。任务三 设计主菜单,由用户选择不同图
形switch语句 switch语句是开关语句,也称多分支选择语句,用来实现多分支选择结构。 其一般格式如下所示:
switch语句(1) switch后面括弧内的“表达式”只能是整型或字符型表达式。为什么?因为前面讲过,float和double
类型的值进行“等于”或“不等”的判断往往是没有意义的。(2) 每一个case的常量表达式的值必须互不相同。 (3) case语句必
须以冒号结尾。(4) 各个case和default的出现次序可以是任意的。 (5) 执行完一个case后面的语句后,流程控制转移到
下一个case继续执行。 (6) break语句:终止switch语句的执行,使流程跳出switch结构。例如:当score的值为
85时,s的值是8,则执行printf("B\n"),遇到break就不接着执行下面的语句,而是直接退出switch结构。 (7)
在case后面中虽然包含一个以上执行语句,但可以不必用花括弧括起来,会自动顺序执行本case后面所有的执行语句。当然加上花括弧也
可以。(8) 多个case可以共用一组执行语句。例如:当s的值为10和9时都执行同一组语句。(9) 在一个switch语句中,最多
只能有一个default子句。函数的返回值 函数的返回值是指函数被调用之后,执行函数体中的程序段所取得的并返回给主调
函数的值。例如:调用数学函数时都会取得相应的值。函数的值只能通过return语句返回主调函数。return语句的一般格式为:
return语句中的“()”可有可无。该语句的功能是计算表达式的值,并返回给主调函数。 在函数中允许有多个return语
句,但每次调用只能有一个return 语句被执行,因此只能返回一个函数值。若函数中没有return语句,则不能带回一个确定的、用户
所希望得到的函数值,而是带回的是一个不确定的值。函数值的类型和函数定义中函数的类型应保持一致,若两者不一致,则以函数类型为准,自动
进行类型转换。若函数值为int,在函数定义时可以省去类型说明。不返回函数值的函数,可用void定义为“空类型”,一旦函数被定义为空
类型后,就不能在主调函数中使用被调函数的函数值,否则系统报错。为了使程序有良好的可读性并减少出错,凡不要求返回值的函数都应定义为空
类型void。任务四 函数的嵌套调用 函数嵌套调用函数之间允许相互调用,也允许嵌套调用。main()是主函数,它可以调用其他函数
,而不允许被其它函数调用。函数嵌套调用是指在调用一个函数的过程中,又调用另一个函数。函数嵌套调用正好符合前面所说的结构化程序设计思
想,即顶层函数调用第二层函数,第二层函数再调第三层函数,……,直到最底层。 循环跳出语句(1)break语句break 语句有两种用途,可以使用它来终止 switch 语句中的 case 语句,保证多路分支情况的正确执行;也可以使用它来强迫程序立即退出一个循环,跳过正常的循环条件测试(相当于本层循环的断路)。当在 do…while、for、while 循环语句中遇到 break 语句,循环立即终止,程序转入循环后的下一条语句开始执行。 循环跳出语句(2)continue 语句continue语句有点像break语句,continue语句仅能用于循环语句中,但它并不能终止本层循环,而只是绕过本次循环,即continue只能跳过循环体中continue后面的语句,强行进入下一次的循环(相当于本次循环的短路)。任务总结 本项目通过 4 个任务,编写程序绘制由“”组成的不同图形,介绍设计C语言程序的一种最基本思路——学会找规律,以及理解函数在程序中的作用,并掌握三种循环语句的区别、联系以及使用情况。
献花(0)
+1
(本文系小磊老师原创)