第3章 C语言程序的控制结构(1)_第1页
第3章 C语言程序的控制结构(1)_第2页
第3章 C语言程序的控制结构(1)_第3页
第3章 C语言程序的控制结构(1)_第4页
第3章 C语言程序的控制结构(1)_第5页
已阅读5页,还剩94页未读 继续免费阅读

下载本文档

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

文档简介

1、第第3章章 C语言程序的控制结构语言程序的控制结构3.1 算法算法 3.2 C语句的分类语句的分类3.3 输入和输出语句输入和输出语句3.4 顺序程序控制结构顺序程序控制结构3.5 选择程序控制结构选择程序控制结构本章导读本章包括知识点:算法的描述方法数据的输入输出函数调用格式if语句及switch语句的使用3种循环结构break、continue和goto语句的作用常用算法:如递推法、穷举法等C程序的基本风格3.1 算法算法 3.1.1 3.1.1 算法的概念算法的概念3.1.2 3.1.2 算法的表示方法算法的表示方法3.1.1 算法的概念算法的概念著名的计算机科学家沃思(著名的计算机科学

2、家沃思(Nikiklaus Wirth)曾经提)曾经提出过:出过: 数据结构数据结构+ +算法算法=程序程序数据结构数据结构(data structure):即对数据的描述和组织):即对数据的描述和组织形式。形式。算法算法(algorithm):对操作或行为的描述,即操作步):对操作或行为的描述,即操作步骤。骤。广义地说,算法就是做某一件事的步骤或程序。广义地说,算法就是做某一件事的步骤或程序。 计算机解题的算法大致包括这两大类算法计算机解题的算法大致包括这两大类算法: 非数值运算算法和数值运算算法非数值运算算法和数值运算算法。算法特性算法特性 :有穷性有穷性。算法的步骤必须是有限的,每个步骤

3、都在有限的。算法的步骤必须是有限的,每个步骤都在有限的时间内做完,执行有限个步骤后终止。时间内做完,执行有限个步骤后终止。确定性确定性。算法中每一步骤都必须有明确定义,不允许有模。算法中每一步骤都必须有明确定义,不允许有模棱两可的解释,不允许有多义性。例如:棱两可的解释,不允许有多义性。例如:“如果成绩大于等如果成绩大于等于于9090分,则输出分,则输出A A;如果成绩小于等于;如果成绩小于等于9090分,则输出分,则输出B B”,当,当成绩为成绩为9090分时,既会输出分时,既会输出A A,又会输出,又会输出B B,这就产生了不确,这就产生了不确定性。定性。有效性有效性。算法的每一步操作都应

4、该能有效执行。如一个数。算法的每一步操作都应该能有效执行。如一个数被被0 0除就是无效不可行的,应避免。除就是无效不可行的,应避免。算法特性算法特性 没有输入或有多个输入没有输入或有多个输入。例如:求。例如:求1+2+3+100时,不需要输入任何信息就时,不需要输入任何信息就能求出结果能求出结果,如例如例1.4求已知两数之和;而要求已知两数之和;而要求求1+2+3+n时,必须从键盘输入时,必须从键盘输入n的值,的值,才能求出结果。才能求出结果。有一个或多个输出有一个或多个输出。算法的目的是为了求。算法的目的是为了求解,解,“解解”就是算法的输出。没有输出的就是算法的输出。没有输出的算法是没有意

5、义的。算法是没有意义的。3.1.2 算法的表示方法算法的表示方法 常用方法有:常用方法有:自然语言、传统流程图、自然语言、传统流程图、NS流程图、伪代码流程图、伪代码等等 1用自然语言表示算法用自然语言表示算法自然语言就是人们日常使用的语言,可以是汉语、自然语言就是人们日常使用的语言,可以是汉语、英语或其他语言。用自然语言表示算法,通俗易懂英语或其他语言。用自然语言表示算法,通俗易懂,但文字冗长,在表达上不够严格,引起理解上的,但文字冗长,在表达上不够严格,引起理解上的歧义性,不易转化为程序,描述复杂的算法不很方歧义性,不易转化为程序,描述复杂的算法不很方便。因此,除了很简单的问题外,便。因此

6、,除了很简单的问题外,一般不用自然语一般不用自然语言描述算法言描述算法。 用自然语言表示的求用自然语言表示的求1+2+3+6的算法如下:的算法如下:算法算法1:S1:计算:计算1+2得到得到3;S2:将第一步中的运算结果:将第一步中的运算结果3与与3相加得到相加得到6;S3:将第二步中的运算结果:将第二步中的运算结果6与与4相加得到相加得到10;S4:将第三步中的运算结果:将第三步中的运算结果10与与5相加得到相加得到15;S5:将第四步中的运算结果:将第四步中的运算结果15与与6相加得到相加得到21。用自然语言描述用自然语言描述1+2+3+10000的算法,适合吗?的算法,适合吗?算法算法2

7、:S1:定义循环变量:定义循环变量i=1,用于保存和的变量用于保存和的变量s,并置初值,并置初值为为0;S2:判断:判断i的值是否小于等于的值是否小于等于6,若是则执行,若是则执行S3,否则,否则跳转到跳转到S4执行;执行;S3:将:将i的值累加到的值累加到s,然后变量,然后变量i自身加自身加1,转到,转到S2执执行;行;S4:输出:输出s的值。的值。算法算法1是最原始的方法,最为繁琐,步骤较多,当加数是最原始的方法,最为繁琐,步骤较多,当加数较大时,比如较大时,比如1+2+3+10000,再用这种方法是行,再用这种方法是行不通的;算法不通的;算法2是比较简单的算法,且易于在计算机是比较简单的

8、算法,且易于在计算机上执行操作。上执行操作。2用传统流程图表示算法用传统流程图表示算法流程图是一个描述程序的控制流程和指令执行情况的流程图是一个描述程序的控制流程和指令执行情况的有向图,用流程图表示算法,直观形象,易于理解。有向图,用流程图表示算法,直观形象,易于理解。美国国家标准化协会(美国国家标准化协会(ANSI)规定了一些)规定了一些常常用符号用符号如图所示如图所示 用传统流程图描述计用传统流程图描述计算算1+2+3+6的算法的算法 3用用NS结构化流程图表示算法结构化流程图表示算法19731973年美国学者年美国学者I.NassiI.Nassi和和B.SchneidermanB.Sch

9、neiderman提出了一种提出了一种新型流程图新型流程图NSNS结构化流程结构化流程图,这种流程图一方面图,这种流程图一方面取消取消了带箭头了带箭头的流程线,这样算的流程线,这样算法被迫只能从上到下顺序执法被迫只能从上到下顺序执行,避免了算法流程的任意行,避免了算法流程的任意转向,适于结构化程序设计;转向,适于结构化程序设计;另一方面,这种流程图另一方面,这种流程图节省节省篇幅篇幅,因而很受欢迎。,因而很受欢迎。用用NS流程图描述的计算流程图描述的计算1+2+3+6的算法的算法 4用伪代码表示算法 伪代码使用介于自然语伪代码使用介于自然语言和计算机语言之间言和计算机语言之间的文字和符号来描述

10、的文字和符号来描述算法。它使用起来灵算法。它使用起来灵活,活,无固定格式和规无固定格式和规范,无范,无图形符号图形符号,只要写出来自己或别只要写出来自己或别人能看懂就行,由于人能看懂就行,由于它与计算机语言比较它与计算机语言比较接近,便于向计算机接近,便于向计算机语言算法(即程序)语言算法(即程序)过渡。过渡。用伪代码描述的用伪代码描述的1+2+3+6算法算法如下:如下:begin /*算法开始算法开始*/1=i0=swhile i6 s+i=s i+1=i print send /*算法结束算法结束*/在程序设计中读在程序设计中读者可根据需要和者可根据需要和习惯任意选用。习惯任意选用。 3.

11、2 C语句的分类C语言的语句可分为语言的语句可分为5大类:大类:l控制语句控制语句l函数调用语句函数调用语句l表达式语句表达式语句l复合语句复合语句l空语句空语句1控制语句控制语句控制语句用来实现对程序流程的选择、循环、转向控制语句用来实现对程序流程的选择、循环、转向和返回等进行控制。和返回等进行控制。C语言中共有语言中共有9种控制语句,种控制语句,包括包括12个关键字,可以分为以下几类:个关键字,可以分为以下几类:l选择语句选择语句:ifelse和和switch(包括(包括case 和和default)。)。l循环语句循环语句:for、while和和dowhile。l转向语句转向语句:con

12、tinue、break和和goto。l返回语句返回语句:return。本章的本章的3.5、3.6和和3.7中将陆续介绍这些控制语句。中将陆续介绍这些控制语句。2函数调用语句函数调用语句函数调用语句是由一个函数调用加一个分号构成的语句。它的一般形式是: 函数名(实参表)函数名(实参表);例如:例如:printf(“This is a C Program”); /*用于输出双引号中的字符串*/c=getchar(); /*用于从键盘读入一个字符*/m=max(a,b,c); /*用于求取a、b、c三者之间的最大值并将结果赋给m*/3表达式语句表达式语句由一个表达式加上一个分号构成。由一个表达式加上

13、一个分号构成。如:如:A+; x=1; p+=q*4+5; y=42?6:1; 用一对花括号,把若干条语句括起来,用一对花括号,把若干条语句括起来,就形成了一条复合语句。形式如下:就形成了一条复合语句。形式如下:4复合语句复合语句复合语句的形式为:复合语句的形式为: 语句语句1;语句;语句2;语句语句n;例如:例如:z=x+y; z+; u=z/100; printf(“%f”,u); 花括号中的语句,可以是简单语句、空语句、复合语花括号中的语句,可以是简单语句、空语句、复合语句、流程控制语句,所有这些语句括在一起,在语法上看句、流程控制语句,所有这些语句括在一起,在语法上看成是一条语句,执行

14、时顺序执行花括号中的每条语句。复成是一条语句,执行时顺序执行花括号中的每条语句。复合语句多用于流程控制语句中。合语句多用于流程控制语句中。5空语句空语句仅仅以分号仅仅以分号“;”作为标识。作为标识。空语句的形式为:空语句的形式为: ;/*空语句空语句*/空语句本身没有实际功能,只是表示什么操作都不空语句本身没有实际功能,只是表示什么操作都不做。设置空语句的目的,一是在未完成的程序设计做。设置空语句的目的,一是在未完成的程序设计模块中,暂时放一条空语句,留待以后对模块逐步模块中,暂时放一条空语句,留待以后对模块逐步求精实现时再增加语句;二是实现空循环等待;三求精实现时再增加语句;二是实现空循环等

15、待;三是实现跳转目标点等。是实现跳转目标点等。例如:例如:int max(int a, int b) /*求两个整数的最大值求两个整数的最大值*/ ; / /* *此处的空语句表示在以后添此处的空语句表示在以后添加内容加内容,保证当前的程序正常运行保证当前的程序正常运行* */ /例如:例如:实现空循环实现空循环while( getchar()!=n); /*此语句表示只要从键盘此语句表示只要从键盘输入的字符不是回车键则重新输入输入的字符不是回车键则重新输入*/例如:例如:实现跳转到目标点实现跳转到目标点int i=0, sum=0;ex: ;sum+=i+;if( x100 ) goto e

16、x;空语句出现的位置是有限制的。预处理空语句出现的位置是有限制的。预处理命令、函数头和花括号命令、函数头和花括号“”之后都不之后都不允许出现空语句。允许出现空语句。注意注意3.3 输入和输出语句3.3.1 字符的输入和输出字符的输入和输出3.3.2 格式化输入和输出格式化输入和输出 C语言不提供输入和输出语句,输入和输出语言不提供输入和输出语句,输入和输出通过调用通过调用C的标准库函数来实现。的标准库函数来实现。C的标准函数库的标准函数库中提供许多用于标准输入和输出的库函数(附录中提供许多用于标准输入和输出的库函数(附录D),使用这些标准输入和输出库函数时,要用),使用这些标准输入和输出库函数

17、时,要用预编译命令预编译命令“#include”将有关的将有关的“头文件头文件”包括包括到用户源文件中。到用户源文件中。在调用标准输入输出库函数时,在调用标准输入输出库函数时,文件开头应有以下预编译命令:文件开头应有以下预编译命令: # include 或或 # include “stdio.h”其中,其中,h为为head之意,之意,std为为standard之意,之意,i为为input之意,之意,o为为output之意。之意。3.3.1 字符的输入和输出l计算机的控制台是键盘和显示器,从控制台输入和输出字符的最简单的函数是getchar()和putchar()。 1 1getchargetc

18、har函数函数使用格式使用格式:变量变量getchar( );功能:从键盘读入一个字符,返回该字符功能:从键盘读入一个字符,返回该字符的的ASCII值,可以将该结果赋值给字符变值,可以将该结果赋值给字符变量或整型变量,并自动将用户击键结果量或整型变量,并自动将用户击键结果回显到屏幕上。回显到屏幕上。2putchar函数函数使用格式使用格式:putchar(变量);(变量);功能:把字符写到屏幕的当前光标位置。功能:把字符写到屏幕的当前光标位置。例例3.1演示如何使用演示如何使用getchar()和和putchar()函数。函数。#include main( ) char c; c=getcha

19、r( ); /*从键盘读入一个字符,按回车键从键盘读入一个字符,按回车键结束输入,该字符被存入变量结束输入,该字符被存入变量c*/ putchar(c); getchar函数无参数,它从标准输入设备(键盘)上函数无参数,它从标准输入设备(键盘)上读入一个字符,直到输入回车键才结束,回车前的读入一个字符,直到输入回车键才结束,回车前的所有输入字符都会逐个显示在屏幕上。函数值为从所有输入字符都会逐个显示在屏幕上。函数值为从输入设备输入的第输入设备输入的第1个字符,空格、回车和个字符,空格、回车和Tab都能都能被读入。被读入。putchar函数的参数是待输出的字符,这个字符可以函数的参数是待输出的字

20、符,这个字符可以是可打印字符,也可以是转义字符。是可打印字符,也可以是转义字符。例如:例如:putchar(x42); /*输出字母输出字母B*/ putchar(0 x42); /*直接用直接用ASCII码值输出字母码值输出字母B*/ 注意注意3.3.2 格式化输入和输出l前面的前面的getchar和和putchar函数形式简单,函数形式简单,使用方便,但只能输入输出一个字符,且使用方便,但只能输入输出一个字符,且不能定制输入输出格式。格式化输入输出不能定制输入输出格式。格式化输入输出函数既能输入输出各种类型的数据,又能函数既能输入输出各种类型的数据,又能定制输入输出格式。定制输入输出格式。

21、 例例3.2从屏幕上输出一个整数。从屏幕上输出一个整数。#include main() int a,b; a=10; b=20; printf(output a and b:); /*输出双引号中的字符串输出双引号中的字符串*/ printf(a=%d ,b=%dn,a,b); /*输出输出a和和b的值的值*/输出结果是:输出结果是:output a and b:a=10,b=201printf函数函数l格式:格式: printf(格式控制字符串);(格式控制字符串);或或 printf(格式控制字符串(格式控制字符串 ,输出表列);,输出表列);l功能:向计算机系统默认的输出设备输出若功能:

22、向计算机系统默认的输出设备输出若干个任意类型的数据。干个任意类型的数据。例如:格式转换说明符例如:格式转换说明符printf(a=%d ,b=%dn,a,b);一般情况下,格式控制字符串包括两种数据,一种是一般情况下,格式控制字符串包括两种数据,一种是普通字符普通字符,这些字符在输出时,这些字符在输出时照原样输出照原样输出;另一种是;另一种是格式转换说明符格式转换说明符,用于控制要输出的内容,用于控制要输出的内容以何种方式以何种方式进行输出显示进行输出显示,格式转换说明符由,格式转换说明符由“%”开始开始,并以,并以一个格式字符结束。一个格式字符结束。 普通字符输出表列普通字符输出表列表31p

23、rintf函数的格式转换说明符字符字符含义含义示例示例输出结果输出结果d(或(或i)十进制整数十进制整数int a=65;printf(“%d”,a);65u十进制无符号整数十进制无符号整数int a=65000;printf(“%u”,a);65000o八进制无符号整数八进制无符号整数int a=65;printf(“%o”,a);101x(或(或X)十六进制无符号整数十六进制无符号整数int a=65;printf(“%x”,a);41c单一字符单一字符int a=65;printf(“%c”,a);As字符串字符串printf(“%s”,”Hello”);Hellof小数形式的浮点小数小

24、数形式的浮点小数printf(“%f”,314.56);314.560000e(或(或E)指数形式的浮点小数指数形式的浮点小数printf(“%e”,314.56);3.145600e+002g(或(或G)e和和f中较短的一种中较短的一种printf(“%g”,314.56);314.56%百分号本身百分号本身printf(“%”);%说明:说明:“输出表列输出表列”是需要输出的一些数据。是需要输出的一些数据。可以是表达式,各可以是表达式,各个数据之间用逗号隔开。个数据之间用逗号隔开。 以下的以下的printf函数都是合法的:函数都是合法的:printf(I am a student.n);p

25、rintf(%d,3+2); 注意:注意: 输出数据的输出数据的数据类型数据类型与与格式转换说明符格式转换说明符必须必须顺序匹顺序匹配配,否则会引起输出错误。,否则会引起输出错误。如:如: printf(%d,314.56);printf( %d,%f,3.89 , 6); 错误错误!一般情况下,格式转换说明符与输出项个数相同。一般情况下,格式转换说明符与输出项个数相同。如果格式转换说明符的个数如果格式转换说明符的个数大于大于输出项的个数,则多余的格输出项的个数,则多余的格式将式将输出不定值输出不定值。如果格式转换说明符的个数。如果格式转换说明符的个数小于小于输出项输出项的个数,则的个数,则多

26、余的输出项不输出。多余的输出项不输出。例例3.3 有以下程序有以下程序#include main() int a666 , b=888; printf( %dn , a,b);程序的输出结果是()。程序的输出结果是()。A)错误信息)错误信息B)666C)888D)666,888思考:如果将输出思考:如果将输出语句改为语句改为 printf(“ %d,%dn”, a); 输出结果会怎样?输出结果会怎样?格式转换说明符的完整形式如下:% - 0 m.n l或或h 格式字符格式字符修饰字符修饰字符含义含义英文字母英文字母l修饰修饰d,u,o,x时,用于输出时,用于输出long型数据型数据修饰修饰f

27、,e,g时,用于输出时,用于输出long double型数据型数据英文字母英文字母h修饰修饰d,o,x时,用于输出时,用于输出short型数据型数据最小域宽最小域宽m指定输出项输出时所占列数,数据长度指定输出项输出时所占列数,数据长度m,左边补空格;否则按实,左边补空格;否则按实际宽度输出际宽度输出显示精度显示精度.n对于实数,指定小数位数(四舍五入)对于实数,指定小数位数(四舍五入)对于字符串,指定从字符串左侧开始截取的子串字符个数对于字符串,指定从字符串左侧开始截取的子串字符个数输出数据在域内左对齐(默认右对齐)输出数据在域内左对齐(默认右对齐)指定在有符号数的正数前加正号()指定在有符号

28、数的正数前加正号()0输出数值时,指定在左边不使用的空位置自动填输出数值时,指定在左边不使用的空位置自动填0在八进制和十六进制数前显示前导符在八进制和十六进制数前显示前导符0,0 x例例3.4 printf函数修饰符的使用。函数修饰符的使用。#include main() int a=123; float y=456.78; char ch=A; char s=Programing; /*s为字符数组为字符数组*/ printf(%7d,%-4d,%04dn,a,a,a); printf(%f,%8f,%8.1f,%.2f,%.2en,y,y,y,y,y); printf(%3cn,ch);

29、printf(%sn%12sn%8.5sn%2.5sn%.3sn,s,s,s,s,s); 程序输出结果程序输出结果 说明:在说明:在Visual C+中,调用中,调用printf函数时,函数时,float类型类型的参数是先转化为的参数是先转化为double类型再传递的,所以类型再传递的,所以%f可以可以输出输出float和和double两种类型的数据,两种类型的数据,不必用不必用%lf输出输出double类型的数据类型的数据。2scanf函数函数格式格式:scanf(格式控制字符串(格式控制字符串, 地址表列);地址表列);功能:从标准输入设备(键盘)输入若干个任功能:从标准输入设备(键盘)输

30、入若干个任意类型的数据。意类型的数据。例如:例如:scanf(%d,%f”, &a,&b); 地址表列地址表列格式控制字符串格式控制字符串 分隔符分隔符表33scanf函数的格式转换说明符字符字符含义含义d或或i输入十进制整数输入十进制整数u输入无符号十进制整数输入无符号十进制整数o输入八进制整数输入八进制整数x输入十六进制整数输入十六进制整数c输入一个字符,空白字符(包括空格、回车、制输入一个字符,空白字符(包括空格、回车、制表符)也作为有效字符输入表符)也作为有效字符输入S输入字符串,遇到第一个空白字符(包括空格、输入字符串,遇到第一个空白字符(包括空格、回车、制表符)时结

31、束回车、制表符)时结束f或或e输入实数,以小数或指数形式输入均可输入实数,以小数或指数形式输入均可%输入一个输入一个%地址表列地址表列是由若干变量的地址组成的列表,是由若干变量的地址组成的列表,参数之间用逗号隔开。函数参数之间用逗号隔开。函数scanf要求必须指要求必须指定定用来接收数据的地址用来接收数据的地址,否则,虽然编译程,否则,虽然编译程序不会出错,但会导致数据不能正确地读入序不会出错,但会导致数据不能正确地读入指定的内存单元。对普通变量而言,可以在指定的内存单元。对普通变量而言,可以在变量前使用变量前使用“”符号符号,用于取变量的地址,用于取变量的地址,而对于指针变量而言,直接使用指

32、针变量名而对于指针变量而言,直接使用指针变量名称即可。称即可。表表34scanf函数的修饰符函数的修饰符修饰字符修饰字符含义含义英文字母英文字母l修饰修饰d,i,u,o,x时,用于输入时,用于输入long型数据型数据修饰修饰f,e时,用于输入时,用于输入 double型数据型数据英文字母英文字母h修饰修饰d,i,o,x时,用于输入时,用于输入short型数据型数据域宽域宽m指定输入数据的宽度(列数),系统自动按此宽度截指定输入数据的宽度(列数),系统自动按此宽度截取所需数据取所需数据忽略输入修饰符忽略输入修饰符*抑制符,表示对应的输入项在读入后不赋给相应的变抑制符,表示对应的输入项在读入后不赋

33、给相应的变量量注:注:scanf函数没有精度函数没有精度.n修饰符,即用修饰符,即用scanf函数输函数输入实型数据时不能规定精度。入实型数据时不能规定精度。输入数据的输入数据的分隔符分隔符的指定:的指定:一般以一般以空格、空格、TAB或回车符或回车符作为分隔符(在格式作为分隔符(在格式控制符之间为空格、控制符之间为空格、TAB或无任何符号时);如:或无任何符号时);如:#include main()int a,b;scanf(%d%d,&a,&b);printf(a=%d,b=%d,a,b); 如要使如要使a为为12,b为为3,可用上述,可用上述3种分隔符中的任意种分隔符中的

34、任意一种进行输入一种进行输入 -演示演示其他字符作为分隔符其他字符作为分隔符:格式控制字符串中两个格式:格式控制字符串中两个格式控制符之间的字符为上述三种字符以外的字符时,控制符之间的字符为上述三种字符以外的字符时,输入数据时要输入数据时要原样输入原样输入。如果输入语句如果输入语句“scanf(“%d,%d”,&a,&b);”,要想在,要想在输入数据后使输入数据后使a=3,b=4,则应输入,则应输入“3,4”。此处用,。此处用,作为分隔符。作为分隔符。如果输入语句为如果输入语句为“scanf(%d%d,&a,&b);”(两个(两个%d之间有两个空格),之间有两个

35、空格), 输入时应在输入时应在3和和4间有两个间有两个以上空格。以上空格。l如果输入语句为如果输入语句为“scanf(a=%d,b=%d,&a,&b);”,应输入,应输入“a=3,b=4”。l如果输入语句为如果输入语句为“scanf(%d:%d:%d,&a,&b,&c);”,应输,应输入入“3 4 5”。在用。在用%c格式输入字符时格式输入字符时,空空格字符和格字符和“转义字符转义字符”都作为有效字符输入。都作为有效字符输入。l如果输入语句为如果输入语句为“scanf(”%c%c%c“,&c1,&c2,&c3);”, 若若输入输入

36、“a-b-c”,字符,字符a赋给赋给c1,-赋给赋给c2,字,字符符b赋给赋给c3。 要想要想c1、c2、c3分别为分别为a、b、c,该怎样输入?,该怎样输入?见下一页l#include lmain()lchar c1,c2,c3;lscanf(%c%c%c,&c1,&c2,&c3);lprintf(c1=%c,c2=%c,c3=%c,c1,c2,c3);ll输入输入abc再回车再回车格式输入输出的使用格式输入输出的使用l#includelmain()llchar c1,c2;lscanf(%3c%2c,&c1,&c2);lprintf(c1=%c,c2

37、=%cn,c1,c2);ll#includelmain()llchar c1,c2;lscanf(“%*c%3c%2c,&c1,&c2);lprintf(c1=%c,c2=%cn,c1,c2);l格式输入输出的使用格式输入输出的使用l#includelmain()llint a;lchar c1,c2;lscanf(“%d”,&a); /m是数组名,表示地址是数组名,表示地址lscanf(%*c%3c%2c,&c1,&c2);/用用*跳过上一个跳过上一个scanf输入的输入的回车字符回车字符l printf(a=%dn,a);lprintf(c1=%c,

38、c2=%cn,c1,c2);l例例3.5格式输入输出的使用。格式输入输出的使用。#include main()int a,b,k;float s,f;char c1,c2,m10;scanf(%d,%d,%f,%s,&a,&b,&s,m); /*m是数组名是数组名,表表示地址示地址*/scanf(%3d%*4d%f,&k,&f);scanf(“%*c%3c%2c”,&c1,&c2);/用用*跳过上一个跳过上一个scanf输输入的回车字符入的回车字符 printf(a=%d,b=%d,s=%f,m=%sn,a,b,s,m);printf(k

39、=%d,f=%f,c1=%c,c2=%cn,k,f,c1,c2);程序运行时的输入输出结果程序运行时的输入输出结果 注意注意从键盘输入数据的个数应该与函数中输入表列的项数相同,从键盘输入数据的个数应该与函数中输入表列的项数相同,当两者不相同时作如下处理:当两者不相同时作如下处理:如果输入数据个数如果输入数据个数少于少于scanf函数要求的个数时,函数将函数要求的个数时,函数将等待输等待输入入,直到满足要求或遇到非法字符为止。,直到满足要求或遇到非法字符为止。如果输入数据个数如果输入数据个数多于多于scanf函数要求的个数时,多余的数据将函数要求的个数时,多余的数据将留在缓冲区留在缓冲区作为下一

40、次输入操作的输入数据。作为下一次输入操作的输入数据。在输入数据时,遇到在输入数据时,遇到以下情况以下情况时时认为该数据结束认为该数据结束。l遇到遇到空格空格,或按,或按回车键回车键或按或按TAB键;键;l按按指定的宽度结束指定的宽度结束,如,如“%3d”,只取,只取3列;列;l遇到非法输入遇到非法输入。3.4 顺序程序控制结构顺序程序控制结构l顺序结构是结构化程序设计的三种基本结顺序结构是结构化程序设计的三种基本结构中最简单的一种程序组织结构,其特点构中最简单的一种程序组织结构,其特点是完全按照语句出现的是完全按照语句出现的先后顺序依次执行先后顺序依次执行。 BAAB(a)传统流程图)传统流程

41、图 (b)NS流程图流程图 程序自上而下执行,先执行程序自上而下执行,先执行A A块,再执行块,再执行B B块。块。 顺序结构的程序主要由顺序结构的程序主要由4部分部分组成:组成:变量说明部分。变量说明部分。数据输入部分。数据输入部分。运算部分。运算部分。运算结果输出部分。运算结果输出部分。例例3.6将任意小写字母转换为将任意小写字母转换为对应的大写字母并输出。对应的大写字母并输出。#include main()char c;c=getchar();c=c-32;putchar(c);程序运行时,若输入:程序运行时,若输入:h 则输出:则输出:H思考:如何判断输入的字符思考:如何判断输入的字符

42、是否为小写字母?(将在是否为小写字母?(将在3.5中讲解)中讲解)例例3.7从键盘输入两个变量的值,交换这两从键盘输入两个变量的值,交换这两个变量的值,并输出。个变量的值,并输出。l分析分析:假如我们将输入的两个变量定义为:假如我们将输入的两个变量定义为x和和y,如果通过如果通过“x=y ; y=x;”来实现交换,则当执行来实现交换,则当执行“x=y ;”时,将时,将y的值复制给的值复制给x,此时,此时x和和y的值相的值相等,等,x原来的值丢失,再执行原来的值丢失,再执行“y=x;”时,将新的时,将新的x值复制给值复制给y,结果,结果x和和y的值相等,都为原来的值相等,都为原来y的的值。为了不

43、使值。为了不使x原来的值丢失,必须在执行原来的值丢失,必须在执行“x=y ;”之前,先把之前,先把x的值放到一个临时变量的值放到一个临时变量(temp)中保存起来,在执行了)中保存起来,在执行了“x=y;后后”,再,再把保存在临时变量中的值赋给把保存在临时变量中的值赋给y(通过(通过“y=temp;”来实现)。来实现)。如果有红、黄、绿三种颜色的篮子,其中红色篮子装苹果,绿色篮子装香蕉,想要交换这两个篮子的水果,使得红色篮子装香蕉,绿色篮子装苹果,怎么办?程序代码:程序代码:#include main()int x,y,temp;scanf(%d,%d,&x,&y);print

44、f(Before change:x=%d y=%dn,x,y);temp=x;x=y;y=temp;printf(after change:x=%d y=%dn,x,y);思考:如果不用临时变量,能否使两个变量得到交换呢?思考:如果不用临时变量,能否使两个变量得到交换呢?例例3.8从键盘任意输入一个三位数,要求输从键盘任意输入一个三位数,要求输出这个数的逆序数。如:输入出这个数的逆序数。如:输入123,输出,输出321。l分析分析:要输出逆序数,则要将原数的个位、:要输出逆序数,则要将原数的个位、十位和百位数分离出来,再用十位和百位数分离出来,再用“个位个位*100+十位十位*10+百位百位”

45、求出逆序数。个位数字可求出逆序数。个位数字可用对用对10求余得到,如求余得到,如123%103;最高位;最高位百位数字可用对百位数字可用对100整除得到,如整除得到,如123/1001;中间位的数字既可通过将其变换为最;中间位的数字既可通过将其变换为最高位再整除的方法得到,如(高位再整除的方法得到,如(1231*100)/102;也可通过将其变换为最低位再求;也可通过将其变换为最低位再求余得到,如(余得到,如(123/10)%10=2。 灵活应用/10和%10程序源代码如下:程序源代码如下:#include main()int x,y,b0,b1,b2; /*变量声明变量声明*/printf(

46、Please enter an integer x:); /*提示用户输入一提示用户输入一个整数个整数*/scanf(%d,&x); /*输入一个整数输入一个整数*/b0=x%10; /*求最低位求最低位*/b1=(x/10)%10; /*求中间位求中间位*/b2=x/100; /*求最高位求最高位*/y=b0*100+b1*10+b2; /*求逆序数求逆序数*/printf(y=%dn,y); /*输出逆序数输出逆序数*/程序的运行结果如下:程序的运行结果如下:Please enter an integer x:123 y=321思考:是否还有其他方法分离个位、十位和百位数?思考:是

47、否还有其他方法分离个位、十位和百位数?3.5 选择程序控制结构l对于要先做判断再选择的问题就要使用选对于要先做判断再选择的问题就要使用选择结构(也称为分支结构)。选择结构的择结构(也称为分支结构)。选择结构的执行是依据一定的条件选择执行路径,而执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。不是严格按照语句出现的物理顺序。 如:在数学中,要计算如:在数学中,要计算x x的绝对值,根据绝对值定义,的绝对值,根据绝对值定义,当当x=0 x=0时,其绝对值为时,其绝对值为x x,而,而x0 x0时其绝对值是为时其绝对值是为- -x x。 选择结构分支条件通常用选择结构分支条件通常

48、用关系表达式关系表达式或或逻辑表达式逻辑表达式来表示,实来表示,实现程序流程的语句由现程序流程的语句由C C语言的语言的ifif语句语句或或switchswitch语句语句来完成来完成 图图38 选择结构流程图选择结构流程图图图3 38 8表示,当条件表示,当条件P P为真(成立)时执行为真(成立)时执行A A框,否则框,否则执行执行B B框。无论框。无论P P是否成立,只能执行是否成立,只能执行A A框或框或B B框之一,框之一,不可能既执行不可能既执行A A框又执行框又执行B B框。无论走哪条路径,在执框。无论走哪条路径,在执行行A A框或框或B B框之后,都脱离本选择结构。框之后,都脱离

49、本选择结构。3.5.1 if语句1单分支结构单分支结构2双分支结构双分支结构3多分支结构多分支结构1单分支结构单分支结构if形式:形式: if(表达式)语句(表达式)语句S图图39单分支结构的流程图单分支结构的流程图l执行过程执行过程:系统首先:系统首先计算表达式的值,如计算表达式的值,如果表达式结果不为果表达式结果不为0,则执行语句则执行语句S,否则,否则跳过语句跳过语句S,继续执,继续执行其后的其他语句。行其后的其他语句。l说明说明:l“if if”是是C C语言的关语言的关键字;键字;“表达式表达式”可以可以任意合法的任意合法的C C语言表达语言表达式,可以是关系表达式式,可以是关系表达

50、式或逻辑表达式,也可以或逻辑表达式,也可以是任意的数值类型(包是任意的数值类型(包括整型、实型、字符型括整型、实型、字符型等);表达式两侧的括等);表达式两侧的括号不能省略。号不能省略。l语句语句S S可以是一条语可以是一条语句,也可以是任意合法句,也可以是任意合法的复合语句,其位置比的复合语句,其位置比较灵活,可以直接出现较灵活,可以直接出现在在if if同一行的后面,也同一行的后面,也可以出现在可以出现在if if的下一行的下一行。 ifif(表达式)语句(表达式)语句S S例例3.9 写出以下程序执行后的输出结果写出以下程序执行后的输出结果#include main( ) int a=4

51、, b=3, c=5, t=0; if (ab) t=a; a=b; b=t; if (ac) t=a; a=c; c=t; printf ( %d %d %dn , a, b, c);输出结果为:输出结果为:5 0 3 和if的控制语句l分析分析:程序第一行在定义:程序第一行在定义a、b、c、t四个四个变量的同时进行了初始化。接下来第一个变量的同时进行了初始化。接下来第一个if语句的表达式语句的表达式ab为假(为假(0),),if其后的语其后的语句句“t=a;”不执行,值得注意的是不执行,值得注意的是“a=b; b=t;”不属于不属于if的语句,将被执行,执行后的语句,将被执行,执行后a值为

52、值为3,b值为值为0;然后第二个;然后第二个if语句的表达语句的表达式式ac为真,则执行语句为真,则执行语句“t=a;”,t值变为值变为3,接着执行,接着执行“a=c;”,a值变为值变为5,再接着,再接着执行执行“c=t;”,c值变为值变为3;因此,输出结果;因此,输出结果为:为:5 0 3。例例3.10计算并输出一个整数的绝计算并输出一个整数的绝对值。对值。分析分析:计算一个整数的绝对值的关键就是判断该数:计算一个整数的绝对值的关键就是判断该数是否小于是否小于0。#include main()int x,y;scanf(%d,&x); /*输入一个整数输入一个整数*/y=x; /*x

53、大于等于大于等于0时时,y=x*/if(x0)y=-x; /*若若xb) max =a;else max=b;将例将例3.10用双分支结构实现,程序代码如下:用双分支结构实现,程序代码如下:#include main() int x,y; scanf(%d,&x); /*输入一个整数输入一个整数*/ if(x0) y=-x; /*若若x0成立成立,y=-x,否则否则y=x*/ else y=x; printf(y=%dn,y);例例3.11从键盘读入一个字符,以从键盘读入一个字符,以与原来不同的形式进行输出。与原来不同的形式进行输出。l分析分析:该题的意图是实现英文字符的输入:该题的意

54、图是实现英文字符的输入输出,所谓与与原来不同的形式是指原来输出,所谓与与原来不同的形式是指原来输入的是小写字母,则转换为对应的大写输入的是小写字母,则转换为对应的大写字母并输出;原来输入的是大写字母则转字母并输出;原来输入的是大写字母则转换为对应的小写字母并输出。换为对应的小写字母并输出。 程序实现的步骤是程序实现的步骤是:从键盘输入一个英文字符;从键盘输入一个英文字符;判断该英文字符的大小写,并转换成对应的字母;判断该英文字符的大小写,并转换成对应的字母;输出转换后的英文字符。输出转换后的英文字符。l该题的关键问题是怎样将判断字符的大小写状态该题的关键问题是怎样将判断字符的大小写状态和实现转

55、换。有和实现转换。有两种方式两种方式实现:实现:一种是根据一种是根据ASCII码进行判断和转换码进行判断和转换,小写字母比对应的大,小写字母比对应的大写字母的写字母的ASCII码大码大32。另一种方式是利用字符另一种方式是利用字符处理函数处理函数isupper(ch)判断判断ch是否为大写字母是否为大写字母,是则返回是则返回1,否则返回,否则返回0;islower(ch)函数判断函数判断ch是否为小写字母,是则返回是否为小写字母,是则返回1,否则返回,否则返回0;toupper(ch)函数将函数将ch转换为大写,转换为大写,tolower(ch)函数将函数将ch转换为小写。注意,使用这四个函数

56、需转换为小写。注意,使用这四个函数需要包含头文件要包含头文件ctype.h。 用第一种方式实现的程序如下:用第一种方式实现的程序如下:#include main() char ch; ch=getchar(); /*从键盘输入一个英文字符从键盘输入一个英文字符*/ if(ch=a&ch=z) /*判断判断ch是否为小写字母是否为小写字母*/ ch=ch-32; /*ch为小写字母,将其转换为大写为小写字母,将其转换为大写*/ else ch=ch+32; /*ch为大写字母,将其转换为小写为大写字母,将其转换为小写*/ putchar(ch); /*输出输出ch*/运行时,输入:运行时

57、,输入:a 输出:输出:A思考:用字符处理函数怎样实现程序?思考:用字符处理函数怎样实现程序?3多分支结构多分支结构if-else-if形式:形式:if(表达式(表达式1)语句)语句S1else if(表达式(表达式2)语句)语句S2else if(表达式(表达式n)语句)语句Snelse语句语句Sn+1l执行过程执行过程:if-else-if结构结构实际上是由多个实际上是由多个if-else结结构组合而成的,系统首先构组合而成的,系统首先计算表达式计算表达式1,其值为真,其值为真(不为(不为0)时,执行语句)时,执行语句S1;否则,计算表达式;否则,计算表达式2,其值为真(不为其值为真(不为

58、0)时,执)时,执行语句行语句S2;如果如果if 后的后的所有表达式都不为真,则所有表达式都不为真,则执行语句执行语句Sn+1,并结束整,并结束整个分支结构。选择结构执个分支结构。选择结构执行完成后继续执行其后的行完成后继续执行其后的其他语句。其他语句。else是对哪个是对哪个if的否定,的否定,else if中的中的if是对哪个范围的划是对哪个范围的划分分借助数轴来理解借助数轴来理解图图3 311 11 双分支结构的流程图双分支结构的流程图例例3.12从键盘输入从键盘输入x的值,并通过的值,并通过如下的数学关系式求出相应的如下的数学关系式求出相应的y值。值。010001xxxy分析分析:该题

59、的意图是根据输入的:该题的意图是根据输入的x值,判断值,判断x所属的所属的区间,求出区间,求出y值并输出。程序实现的步骤是:值并输出。程序实现的步骤是:从键盘输入一个数;从键盘输入一个数;判断判断x所属的区间,求出所属的区间,求出y值;值;输出结果。输出结果。#include main( ) int x, y; scanf (%d,&x) ; if (x0) y= -1; else if (x=0) y=0; else y=1; printf (y=%dn , y);注意注意:在表示相等条:在表示相等条件时,必须用件时,必须用“=”,不能用,不能用“” 例例3.13根据输入的成绩等级打

60、印出评语,根据输入的成绩等级打印出评语,等级与评语的对应关系如下表:等级与评语的对应关系如下表:等级等级评语评语4Excellent3Good2Average1Poor0Failing分析分析:该题通过输入成绩的:该题通过输入成绩的等级(等级(0 04 4级),转换为对级),转换为对应的评语,是典型的多分支应的评语,是典型的多分支结构,可以用结构,可以用if-else-ifif-else-if结构实结构实现。具体实现步骤为:现。具体实现步骤为:输入成绩等级的数字;输入成绩等级的数字;对输入的数字进行判断,对输入的数字进行判断,得到对应的评语;得到对应的评语;输出结果。输出结果。#include main()int grade;printf(Please input grade:);scanf(%d,&grade);if(grade=4)printf(Excellent);else if(grade=3)printf(Good);else if(grade=2)printf(Average);els

温馨提示

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

评论

0/150

提交评论