程序员之程序设计知识点三

企业动态
顺序结构用来描述一个计算或操作序列,表示从序列的第一个计算开始,顺序执行序列中的每个计算,直至序列的最后一个计算。

3.1 顺序结构

顺序结构用来描述一个计算或操作序列,表示从序列的***个计算开始,顺序执行序列中的每个计算,直至序列的***一个计算。通常,一个复杂的计算过程不能用一个简单的计算来表达,而需把复杂的计算描述成简单计算的序列。

1.复合语句

在C语言中,将顺序执行的语句序列,用花括号括起来,构成C语言的复合语句。在逻辑上视复合语句为单个语句,它也能用作其它结构语句的成分语句。在很多场合,复合语句内还会包含其它结构语句。

2.表达式语句

在顺序结构中,最频繁使用的是表达式之后接上一个分号。例如,在赋值表达式之后接上分号,完成用表达式的值更新某变量,习惯称这种表达式语句为赋值语句;在函数调用之后接上分号,完成指定的计算功能,习惯称这种表达式语句为函数调用语句。

3.2 常用输入输出库函数

最基本的输入输出库函数有字符输入函数、字符输出函数、格式输入函数和格式输出函数。

1.字符输入函数

字符输入函数getchar()的功能是从标准输入设备上(通常是键盘终端)读取一个字符。该函数没有参数,对它的每次调用,就返回下一个输入字符的ASCII代码值。例如,执行语句

ch=getchar();

使变量ch得到输入字符的ASCII代码值。一般情况下,这里的变量ch为char型或int型。当程序在输入字符后,用ch判定输入文件是否结束时,变量ch必须是int型的。这是因为文件结束标记值是-1,是int型的。程序中常用EOF表示当前读人字符是文件结束标记,常量名EOF在文件Stdio.h中被定义为-1。

2.字符输出函数

字符输出函数ptuchar()有一个字符的ASCII代码值参数,函数调用putchar (ch)的功能是将以出值为其ASCII代码的字符输出到标准输出设备(通常是终端显示屏)上。这里ch可以是char型或int型数据。

3.格式输入函数

格式输入函数scanf()的作用是从标准设备读人字符序列,按格式控制字符率所包含的格式解释输入字符序列,并将解释结果存储到对应的变量中。调用格式输入函数scanf()的一般形式为

scanf(格式控制字符串,变量地址,变量地址,……)

格式控制字符串是字符串表达式,通常是由一对双引号括起来的字符串常量,直接用于解释输入字符序列。格式控制字符率可以包含:

·空白类字符(空格符或制表符),它们使输入跳过空白类字符,直到遇到下一个非空白类字符。

·普通字符(不包括%),它们要求输入字符流中下一个字符与它相同。

·格式转换说明,以字符’%’开头至输入格式符结束的字符序列组成。格式转换说明引导对下一输入字符段进行转换。

格式转换说明的一般形式为

%[*][w][h/l/L]输入格式符

输入格式符共有14个,有12种不同输入格式,其中大纲要求掌握的7种输入格式符的意义见表3.1。用方括号括住的内容是输入格式修饰说明,可以缺省,它们的意义是:

(1)*--星号(赋值抑制符),对应的输入数据项按格式要求被输入,但结果不存储。带星号的格式转换说明不对应变量地址。用它来跳过一个输入数据项。

(2)--整型常数(域宽说明),表示输入数据项的字符段的有效字符数。若实际输入字符段的字符数小于W,以实际有效字符为准。

对于数值数据输入格式来说,输入域定义为从下一个非空白类字符起(因此可能跳过若干个空格符、制表符、换行符),到一个与数值数据相矛盾的字符,或直到输入了指定个数的字符数;对于字符率输入格式来说,输入域定义为从下一个非空白类字符起,输入非空白类字符,直至遇到空白类字符,或直到输入了指定个数的非空白字符。

(3) h/l/L长度修饰符,指明输入数据项的存储类型。

h 修饰格式符d,o,X时,表示输入的整数按短整型存储。

l 修饰格式符d,O,X时,表示输入的整数按长整型存储。

l 修饰格式符e,f时,表示输入的实数按double型存储。

缺省时,对于格式符d,o,x,表示输入的整数按int整型存储;对于格式符e,f,表示输入的实数是按float型存储。

3.3 常用输入格式符表中格式符的意义

d 输入十进制形式的整型数据

O 以人进制形式输入整型数据

X 以十六进制形式输入整型数据

C 输入字符数据

S 输入字符串

e,f 输入实型数据

说明:

(1)格式控制字符率之后给出的是变量地址,而不是变量名(除非是指针)。如要为整型变量n输入数据,写成

scanf(”%d", n)是不正确的,应写成 scanf(”% d”,&n)

(2)如果在格式控制字符串中除格式转换说明和空白符之外,还有其它字符,则在输入数据时应输入与这些字符相同的字符。例如,

scanf(”%d, %d’’,&i, &j)

则在为i,j输入数据时,紧接在***个整型数据之后,需要有一个逗号字符,如输入

1,2

是正确的;而输入

1 2

等其它形式都是不正确的。

(3)在用”%c ”格式转换说明输入字符时,空白类字符和用转义字符表示的字符都能作为有效字符输入。要输入一串空白类字符之后的***个非空白类字符,可采用格式”% C”。格式字符率中的空格符使输入跳过空白类字符到***个非空白类字符,然后被C格式输入。

(4)为整型变量输入整数时,若变量类型为短整型,则必须在格式符之前加长度修饰说明h;若变量类型为长整型,则必须在格式符之前加长度修饰说明1。

(5)输入数值数据时,输入字符流中的前导空白类字符会被自动跳过,从空白类字符后的数值数据字符开始输入。构成数值数据的字符被输入转换成计算机的内部表示,并存储结果。

若***个非空白类字符不能构成数值字符,则立即结束输入。

(6)S格式用来输入字符串,对应的变量地址为字符列表(数组)的首地址,该数组必须大到足以容纳可能输入的最长字符串。在输入字符流中,跳过前导的空白类字符,以非空白类字符开始,以后随的***个空白类字符结束的非空白类字符的字符序列作为一个字符串。scanf()函数在输入的字符序列之后自动添加字符率结束标记符'\0'(因此,存储输入字符序列的字符数组的长度必须比实际最长字符串的字符数多1)。

(7)e,f格式用未输入实数,对应的数据存储地址为实型数据存储地址。如格式转换说明中含有长度修饰说明1,则为double型变量地址;若无长度修饰说明,则为float型变量地址。输入数据的字符序列是由正负号(可有可无)、十进制数字串、带小数点的小数部分(可有可无)。以e或E开头的指数部分(可有可无)组成。

(8)在跳过前导空白符后,正在输入数值数据和字符串时,遇以下情况,就认为该数据结束:

·遇空白类字符:空白符、制表符、换行符。

·已读人由有效字符数所指定的字符数。如”%4d多至4个数字符。

·对于输入数值数据,下一个字符不能构成正确的数据格式。如

scanf(”%d%C%f,&i,&c,&x)

假定变量i,c,x分别为int型、char型和float型。若输入字符列为:

123a123x. 26

则变量i为123,变量c为字符a,变量x为123.0。

(9)输入数据时,将字符流转换成内部表示后,存储到对应变量中。例如,

scanf(”%3d%*4d%d”,&i, &j)

如输入字符行为

123456 78

将使变量i=123,j=78。其中数据456因赋值抑制符*的作用被跳过。一般从键盘读入数据,不指定输入数据项的有效字符数,数据项与数据项之间用空白符,或制表符,或回车符分隔。

4.格式输出函数

格式输出函数printf()的作用是将输出项接指定的格式排版输出到标准设备上(通常是终端显示屏)。调用printf()函数的一般形式为

printf(格式控制字符串,表达式,表达式,……)

其中格式控制字符率是字符串表达式,通常是由用一对双引号括起来的字符串常量。它包含三类字符:普通字符、转义字符和格式转换说明,它们的作用分别如下:

(l)普通字符,要求按原样输出。

(2)转义字符,要求技转义字符的意义输出,如’\n’,表示输出时回车换行,’\b’表示退格等。

(3)格式转换说明,以字符%开头至格式符结束的字符列组成,其一般形式为

%[-」「+」「」[#」「W][.p][h/l/L]输出格式符

其中用方括号括住的内容是格式修饰说明,可以缺省(不出现),如"%d"、"% 7.5f"等。每个格式转换说明对应一个输出项,输出项可以是常量、变量或表达式。格式转换说明的作用是将对应输出项的内容按格式符要求产生出字符列,并按格式修饰说明排版输出。

输出格式符共有16个,有12种不同的格式,考试大纲只要求掌握表3.2所列的九种。

3.4 常用输出格式符表中格式符的意义

d或i 整型数据以十进制形式输出

o 无符号整型数据以八进制形式输出

X 无符号整型数据以十六进制形式输出

U 元符号整型数据以十进制形式输出

C 字符的ASCll码数据,输出对应的字符

S 输出字符串

f 以“整数部分.小数部分”形式输出实型数据

e 以[-]n.nnnnne±xx输出实型数据

g 以f或e格式输出

说明:

(1)x格式符同。格式符一样,把符号位作为数的一部分输出。对于x格式,用字符a、b、c、d、e、f(或A、B、C、D、E、F)表示9之后的六个十六进制数字符。

(2)一个整数,只要它的位在0-255范围内,也可以用字符形式输出,输出以该整数为ASCII代码的字符。反之,一个字符数据也可以用整数形式输出,输出该字符的ASCII代码值。

(3)f、e和g格式符用于输出实型数据,格式转换时有四舍五人处理。对于f格式,小数点后的数字个数可由格式修饰说明p指定,若p为0,不显示小数点。用e格式输出时,对于非0实数,小数点前有一位非零数字,输出格式中的有效位数可由格式修饰说明p指定;字符e(或E)之后是指数,指数部分至少包含两个数字。若输出值的绝对值不小于 1E+100,则指数部分多于两位数字。

g格式能根据表示数据所需字符的多少自动选择f格式或e(或E) 格式输出实数,选择是以输出时所需字符数多少为标准。

格式修饰说明有七种,教材只介绍其中四种,它们的意义分别说明如下:

(1)W域宽说明,W是一个十进制整数,表示输出字段的字符数。若转换后需要的字符个数比给出的W多,则以实际需要为准;若转换后需要的字符数比W少,就在左边用填充字符补足(若给出左边对齐标志(-),则在右边补填充字符人通常用空白符作填充字符,若十进制整数W之前有前导0(此0不表示以八进制数给出字段宽度),则以字符0作填充字符。

(2)- 左对齐标志,当转换后字符个数少于W时,在W所限定的字段宽度内,转换所得字符列左对齐,右边补填充符。缺省时,右对齐,左边补填充符。

(3).p,其中p也是十进制整数。

对于g或e格式输出,p指明输出精度(有效数字位数),可以缺省,缺省值依赖于系统的规定(下面的例子设p的缺省值为6)。

对于f格式输出,p指明输出字符列的小数点之后的数字个数,可以缺省。

对于S格式输出,p指明最多输出字符率的前p个字符,多余截断。缺省时,字符串的内容全部输出。

对于d.i、O、u、x和X,表示至少出现的数字个数。

同域宽说明一样,p也可以是字符*,而实际值由后面一个输出项的整数值给出,若该值为负值,相当于没有给出p。

#p#

(4) l指明输出项的类型。

长度修饰符l用于格式符d、i、o、u、X,表示对应的输出项是长整型或无符号长整型。

以下是格式输出的一些例子。例如,

int i=1234; long j=1234567L;

printf(”%d,%+6d,%06d,%-6d, %5ld”,i,i,i,i,j)

将输出:

1234,+1234,00l234,1234,1234567

注意:对于long型数据输出,必须在格式符之前有长度修饰符l,表明输出long型数据。

若 int k=045;long p=-1L;printf(”%#o,%4o,%6lo”,k,k,p)

将输出:

045, 45, 37777777777

而printf("%#x,%4x,%6lx”,k,k,p)将输出:

0x25, 25, FFFFFFFF

若 unsigned int u= 65535u;prinif(”%d,%4u,%ln’,u,u,p)

将输出:

-l, 65535, 4294967295

若 char ch1= 045, ch2=’a’;printf(”%c,%-3c,%2c”,ch1,ch2,ch2)

将输出:

%,a, a

若 char s[]==”ABCDEF’;printf(”%3s,%4.2s,%-7.4s,%.5s”,s,s,s,s)

将输出:

ABCDEF, AB, ABCD, ABCDE

若 float f=123.4567f; double d=123.456789;

printf(”%.4f,%8.3f,%-7.2f,%.7f",f,f,f,d)

将输出:

123.4567, 123.457, 123.46, 123.4567890

而 printf(”%.6e,%10.2e,%-10.2e,%.2e,%.9e”,f,f, f,f,d)

将输出:

1.23457e+02, 1.2e+02,1.2e+02,l.2e+02, 1.23456789e+02

注意:实型数据的有效位数,不要以为凡是打印(显示)的数字都是准确的。一般地,float型只有7位有效数字,double型有15位有效数字。实际上,因计算过程中的误差积累,通常不能达到所说的有效位数。

另外,要注意%g格式的特殊性,当它选择“整数部分.小数部分”形式时,因格式修饰说明.p在e格式中的意义是指明精度,所以p的值是整数部分位数与小数部分位数之和(不是f

格式中的小数位数)。如有

float g1=12.34f,g2=0.0f;

double d=123.456789, g=123456.789;

printf("%g,%G",g1,g2);

printf("%f,%g,%g,%g,%.8g"’,g1,g1,d,g,g)

将输出:

12.34,0

12.340000,12.34,123.457,123457,123456.79

 3.5 选择结构

选择结构有单分支选择结构、双分支选择结构和多分支选择结构。C语言提供相应的if语句和switCh语句分别用来描述这些选择结构。

1.单分支选择语句

单分支选择语句有以下形式:

if(表达式)

语句

这种形式的语句执行过程是:

(1)计算表达式的值;

(2)测试表达式的值。若表达式的值非0,则执行它的成分语句,并结束单分支选择的执行;若表达式的值为0,则立即结束单分支选择的执行。

2.双分支选择语句

汉分支选择语句有以下形式:

if(表达式)

语句1

else

语句2

双分支选择语句根据给定的选择条件表达式值为非0或为0两种情况,从两个供选择的成分语句中自动选取一个成分语句执行。双分支选择语句的执行过程是:

(1)计算表达式的值;

(2)测试表达式的值并选择执行语句。若表达式的值非0,则执行语句1,并结束双分支选择语句;否则执行语句2,并结束双分支选择语句。

注意;无论条件表达式的值为何值,只能执行语句1或语句2中的一个。当双分文选择语句中的else之后的语句2为空语句时,就变成单分支选择语句。

单分文选择语句和双分支选择语句统称且语句。在if语句中的语句、语句1和语句2可以是任何语句。当它们中的某一个需用语句序列描述时,必须将这语句序列写成复合语句。当它们中的某一个又是if语句时,就呈现嵌套的if语句形式。这时应注意else与if的对应关系。C语言约定else总是与它前面最接近的if对应。

为正确书写if语句,特别说明以下几点:

(1)若if语句中的语句、语句1、语句2是一个简单语句,则这些简单语句之后会有一个分号,这是C语言对这些简单语句的要求。

(2)若if语句中的语句、语句l、语句2要用语句序列(即为顺序结构)来实现,则必须将它们改写成复合语句,即逻辑上把它们变成一个语句。

(3) 在if语句中,每个else总要与它前面的if对应,不可能出现没有对应if的else。

多分支选择语句

多分支选择结构通常有 n(>2)个不同情况和 n+1个供选择的分支。多分支选择结构也可用前叙述的嵌套if语句来描述,但因if语句嵌套深度太多不便于程序编写,也不便于理解,为此C语言专门提供了一种实现多分支选择结构的语句,这就是switCh语句。它的一般形式是:

switeh(表达式){

case常量表达式 1:语句序列 1

case常量表达式 1:语句序列 2

case常量表达式 n:语句序列 n

defalt:语句序列 n+1

}

对switeh语句需说明以下几点:

(1)switch后面括号内的表达式只限于是整型表达式或字符型表达式或枚举型表达式。

(2)case后的常量表达式称为情况前缀,要求所有常量表达式的值互不相同,并与switch后面括号内的表达式值的类型相一致。

(3)语句序列由任意条合法的C语句构成,也可以没有语句。

(4)情况前缀default可以缺省,但至多出现一次,习惯总是将它写在全部情况前缀之后,如有必要也可写在某case之前。

switch语句的执行过程解释如下:

先计算表达式的值,以该值依次与各case之后的常量表达式的值比较,按下列规则,选择执行的入口:

如果表达式的值等于某个常量表达式的值,switch语句就从该常量表达式之后的语句序列的***个语句开始执行,然后一直向下执行,或自动依次进入后继常量表达式之后的语句序列继续执行(如没有 break语句),或执行完语句序列 n+1,结束 switch语句的执行;或在执行某个语句序列过程中遇到转出该switch语句的语句(如break语句),就停止向下执行,结束switch语句的执行。

如果没有相匹配的常量表达式,就从以default为情况前缀的语句序列开始执行。

如果没有相匹配的常量表达式,也没有defaul情况前缀,则该switch语句的这次执行立即结束。

由上述解释可知,“case常量表达式”只是起语句序列入口的作用。在执行switch语句时,根据switch之后的表达式的值找到与该值匹配的入口,就从此人口处开始执行,只要未遇到转出该switch语句的break语句或goto语句,就一直向下执行,也不再理会经过的case后的常量表达式。

如果要使各种情况互相排斥,仅执行各case所对应的语句序列,最常用的办法是使用break语句,各语句序列都以break语句结束。在switch语句中,执行break语句将使控制转向switch语句的后继语句。

由于switch语句的表达式不允许是实型的,当应用于实型值选择情况时,通常需作以下处理:将实表达式乘上一个适当的比例因子,使较大的实表达式值映照到一个较小的范围上,然后再将它转换到整型。

循环结构

循环计算用循环结构来描述。C语言提供三种描述不同循环结构的语句,它们是while语句、do-while语句和for语句。

1.while语句

while语句用来描述while型循环结构,它的一般形式为

while(表达式)

语句

while语句的执行过程是:

(1)计算while之后的表达式的值;

(2)测试表达式的值,当值为非 0时,转步骤 3;如值为 0,则结束while语句;

(3)执行while语句的循环体,并转步骤1(从而构成循环)。

一般来说,为使while语句的执行能正常结束,如控制循环的条件表达式包含有变量,循环体的执行应能更新这些变量的值,使表达式的值会变为0。有时,很难直接写出while后的条件,这时可以简单地写上 1,而在循环体中含有当某条件满足时,执行如 break语句那样的控制转移语句,使控制跳出while循环,即呈以下结构形式:

while(1){

...

if(表达式)break;

...

}:

2.do-while语句

do-while语句用来描述do-while型循环结构,它的一般形式为;

do

语句

while(表达式);

其中的语句是do-while语句的循环体。do-while语句的执行过程是:

(1)执行do-while语句的循环体;

(2)求 while之后的表达式的值;

(3)测试表达式的值,当值为非0,转步骤1(从而构成循环);如值为0,则结束do-while语句。

与while语句一样,当循环体由多个语句组成时,必须把它们书写成复合语句。有些用while语句描述的循环计算,也能用do-while语句描述。然而,并非总是如此。两者的重要区别在于:执行循环体时,对作为循环条件的表达式的求值和测试的时间不同。while语句对作为循环条件的表达式求值和测试在执行循环体之前,而do-While语句对作为循环条件的表达式求值和测试在执行循环体之后。对于do-while语句,它的循环体至少被执行一次,而while语句的循环体在作为循环条件的表达式值一开始就为0的情况下,就一次也未被执行。如能保证while语句中的作为循环条件的表达式在***次被求值后,总是非0,则把该循环条件移至循环体执行之后求值和测试,能起同样的控制作用。在这种情况下,while语句就能改写成如while语句。如 while语句中的作为循环条件的表达式值可能初次求值就为 0时,则它不能简单地改写成do-while语句。另外要特别指出,分号是do-while语句的结束符,不能省略。

for语句

for语句是C语言中最灵活、使用最广泛的循环结构语句。如以最一般意义下考虑循环,一个完整的循环应包含对有关变量赋初值部分、控制循环的条件、一个要循环计算的操作、每次循环后对有关变量的修正等四部分组成。拉语句就是从这一般意义下表达循环结构的语

句。for语句的一般形式为

for(表达式1;表达式2;表达式3)

语句

其中的语句是for语句的循环体。输语句的执行过程是:

(1)计算表达式1;

(2)计算表达式 2的值,并测试其值为 0或非 0。若值为非 0,转步骤 3;否则结束 for语句;

(3)执行循环体;

(4)计算表达式3;

(5)转向步骤2。

for语句的一般形式也可等价地用以下形式的while语句来表达:

表达式1;

while(表达式2) {

语句

表达式3;

}

由for语句的执行过程可知,for语句的表达式1的作用是对控制循环的有关变量赋初值;表达式2是控制循环的条件;表达式3用于修正有关变量;语句是循环体。所以for语句按各部分的功能,可以形象地写成以下形式:

for(赋初值的表达式;控制循环条件的表达式;修正变量的表达式)

完成循环计算的语句

正确使用for语句,需注意以下几种情况:

(1) for语句的一般形式中,表达式1、表达式2和表达式3都可以省略。如表达式1省略,表示该for语句没有赋初值部分,或前面的程序段已为有关变量赋了初值,或确实没有特别的初值;如表达式2省略,表示循环条件永远为真,可能循环体内有控制转移语句转出缺语句;表达式3省略,表示没有修正部分,对变量的修正已在循环体内一起完成。不管表达式1、表达式2和表达式3省略情况如何,其中两个分号都不能省略。对于三个表达式都省略情况,for语句呈以下形式:

for(;;)

语句

(2)表达式l、表达式2和表达式3都可包含逗号运算符由多个表达式组成。

4. break语句

break语句除能用于switch语句外,还常用于循环语句中。执行循环结构中的break语句,控制就从包含它的循环结构中退出。break语句通常与if语句结合,构成一个结束循环的条件。

5.continue语句

continue语句只用于循环语句中。通常复杂的循环计算中,循环语句的循环体是一个语句序列,中间会有一个包含continue语句的且语句。当指定的条件成立时,continue语句就被执行,这时continue语句之后的语句就不再执行,控制立即进入下一轮循环。

6. 语句标号和goto语句

C程序的语句之前都可插入标识符和冒号,该标识符即为其后语句的标号。如

strat:X= 0;

标识符Start就是语句“x=0;”的标号。

goto语句(goto标号;)是一种无条件转移语句,其意义是将程序的控制转到以所指定的标号命名的语句处。goto语句通常出现在if语句内,实现当某种条件出现时,需要改变正常的顺序执行控制流程。由于goto语句过份的随意使用会给程序的理解带来很大的困难,所以一般强调不使用goto语句来编程。只有当一个多重循环的最内层,当发现某种特别的情况需要结束整个多重循环,这时可用goto语句让程序执行从最内层直接转到外层循环之外。注意,break语句只能跳出包含它的一层循环。

7.用goto语句构成循环

在早先非结构化程序设计中,由于语言提供的控制结构的结构性差,常用goto语句构成循环。但在结构化程序中,不再用goto语句构成循环。考生掌握这个知识是要求考生能将goto语句构成的循环改写成结构化控制结构描述的循环。

 

【编辑推荐】

  1. 程序员之程序设计知识点三
  2. 程序员之程序设计知识点五
  3. 程序员之程序设计知识点四
  4. 更多软考资料请点击51CTO软考专题
责任编辑:张攀 来源: 考试大
相关推荐

2011-01-07 10:54:39

程序员

2010-12-27 10:08:22

程序员

2010-12-30 10:18:54

程序员

2011-01-05 14:53:53

程序员

2010-12-24 10:23:50

程序员

2011-01-28 10:53:18

程序员

2011-01-18 11:41:26

程序员

2010-12-23 11:18:16

程序员

2011-01-14 11:03:32

程序员

2019-10-17 15:10:33

PHP程序员Linux

2021-05-05 11:32:36

MySQL数据库索引

2014-10-30 10:09:44

程序员程序设计师

2019-07-15 12:40:02

Linux基础知识程序员

2018-04-23 09:16:47

程序员知识体系

2014-04-16 11:39:52

2009-07-15 09:29:24

Java程序员

2015-03-10 14:28:46

程序员编程知识经验总结

2012-03-06 09:22:46

程序员

2013-08-20 09:33:59

程序员

2011-07-05 16:05:43

面向对象编程
点赞
收藏

51CTO技术栈公众号