C语言之顺序结构

该章内容:这章咱们学习三大结构之一:顺序结构,它是程序从上往下顺序执行,是程序运行最简单的方式。printf和scanf函数使用和特例是必考知识。本章是考试的重点章节。

学习方法:从简单的顺序结构题目入手,逐步把难度加大,对比记忆printf和scanf函数。函数

第一节 表达式与语句

知识点:语句和表达式之间的联系;分号的使用;复合语句学习

重要程度:★★★spa

一、表达式与语句3d

 “ 表达式 “ + ” “ =  ”语句 ”。例如:ci

赋值表达式字符串

赋值语句io

算术表达式编译

算术语句table

自加表达式class

自加语句

x=9

X=9;

x+y

x+y;

i++

i++;

从图中能够很清楚的看见,表达式和语句的区别就是一个有分号,一个没有分号。这个分号是考试的重点,尤为是在上机考试的改错题目,最喜欢不写分号,咱们要加一个分号!

 

二、空语句与复合语句

;

一、这个分号也是一个语句,称为“空语句”。“空语句”表示程序执行时不产生任何动做。注意:随意使用空语句会致使逻辑上出现错误,须要慎用。

二、所谓复合语句,就是把好几个语句复合到一块儿,那么用什么符号把多个语句复合到一块儿来?咱们要记住是用花括号“{”把多个语句括起来组成了一个复合语句。

复合语句具体形式:{语句1;语句2;…… 语句n;}

 

三、顺序结构

程序中的多个语句按照语句从上往下出现的前后次序顺序逐条执行,这种执行方式是最基本的执行方式,称为顺序结构,是三大基本结构之一。

记住一句话:看到顺序结构就想到从上往下。

 

 

第二节 数据输出

考  点:pirntf函数的使用;printf两个参数的使用方法;格式说明符号对应的意思;

重要程度:★★★★(每一年必考)

printf函数和scanf函数都是库函数,printf和scanf都不是关键字,他们只是预约义标识符。

 

一、printf函数第一个参数讲解

1printf("x=%d,y=%d",1,2);

第一个部分是用双引号括起来!第二部分是两个数据“1,2”,数据之间是用逗号隔开的。

第一部分的双引号中就有两种信息:一种是原样输出一种是格式说明。其中原样输出的说明信息是“x= ,y= ”,包括第一个%d以后的逗号也是原样输出。双引号中还有两个%d,这两个%d就是格式转换说明,用于指定第二部分数据“1,2”的输出格式为整型。这里第一个“%d”对应第一个数字1,第二个“%d”对应第二个数字2,所以咱们能够在屏幕上看到:x=1,y=2。

 

2printf(“the result is %d”,123);

这个程序中运行结果是能够在屏幕上看到:the result is 123。那么原样输出的说明信息是“the result is”,第一个部分的%d是要把输出数据列表的123以整型的格式输出。

 

3printf("x=%d,y%d",1,2);

这个程序运行的结果是能够在屏幕上看到:x=1,y2。那么咱们能够看到比例一中的第一部分,咱们少了个等号“=”,因此咱们在输出时候,原样输出的信息就没有等号“=”。

   

二、printf函数第二个参数讲解

printf函数第二个参数能够是常量数据,也能够是变量,也能够是表达式。

4printf("x=%d",1);      输出数据列表是常量    屏幕显示:x=1

   printf("x=%d",x);    输出数据列表是变量        若x为9,屏幕显示:x=9

printf("x=%d",x+y);   输出数据列表是表达式      若x+y为12,屏幕显示:x=12

 

第二个要记住的:各个数据之间用逗号分隔开。

 

第三个要记住:输出数据的个数与输出控制中的格式转换说明的个数相等,而且在顺序上要一一对应且类型匹配。注意一点:若是类型不匹配,这时系统并不报错,但不能获得正确的结果。

 

5printf("%d,%f",9.87,2);

这里是不会报错的,可是得不到正确的结果,由于,第一个格式说明“%d”表示要把输出数据按整数形式输出,而它对应要输出数据倒是实数9.87,对应出错了。第二个格式说明“%f”是要把输出数据按实数形式输出,而第二个要输出的数据倒是整数2,显然不匹配。

 

在输出控制中,格式说明的个数(也就是第一部分%d的个数)应与第二部分输出项的输出数据个数相同。

 

状况一:格式说明的个数 < 输出项的个数。处理方式:多于的输出项不予输出;

状况一的例子:printf("%d,%d",2,3,4);的输出结果为2,3。数据4不会被输出。

状况二:格式说明的个数 > 输出项的个数,处理方式:对多于的格式说明将输出不定值。

状况二的例子:printf("%d,%d",2);的输出结果为2,772。第二个数据是不定值。

6有如下程序(常考题型)

main( )

{     int a=888,b=999;

       printf("%d\n",a,b);

}

程序运行后的输出结果是

A)错误信息     B)999        C)888      D)888,999

分析:在printf语句中,格式控制的格式说明只有一个“%d”,可是而输出列表项有两项“888,999”,即a和b。因为只有一个%d,输出的结果只有一个,即printf函数的第二部分中第一个出现的变量a的值。则正确的答案是:C。

 

 

三、printf函数中的格式说明

前面的例子中屡次出现了由“%”加上一个字符的组成的格式转换说明,它是做为printf的输出控制的。这个是必定要牢记的,是考试的重点!

表1  格式说明对应的输出数据格式

格式说明

输出数据格式

%d或%i

输出有符号的十进制整型数

%f

输出单精度或双精度数且小数点后有6位小数数位

%c

输出一个字符

%o

输出八进制无符号形式整型数(不带前导0)

%x或%X

输出十六进制无符号形式整型数(不带前导0x或0X)

%#o

输出八进制无符号形式整型数(带前导0)

%#x或%#X

输出十六进制无符号形式整型数(带前导0x或0X)

%u

输出无符号的十进制整数

%e或%E

以[-]m.ddddde±xx或[-]m.ddddde±XX的形式输出单精度或双精度数。d的个数由精度决定。系统隐含的精度为6, d的个数隐含为5。

 

说明:

1) 对于长整型数据的输出,必定要在%和d之间加上英文小写字母l,即格式%ld。

2) 对于双精度数据的输出,必定要在%和f或e之间加上英文小写字母l, 即格式%lf或%le。

3) 用表1所列出的格式说明时,系统自动决定输出数据所占的宽度,并采用右对齐的方式。

 

常考题型:

7 如有如下程序段(注意:n所赋的是八进制数)

int x=32767,y=032767;

printf("%d,%o\n",x,y);

执行后输出结果是

A) 32767,032767  B) 32767,32767       C) 32767,77777              D) 32767,077777

分析:整型变量x和y分别存放的是十进制整数32767和八进制整数32767。在printf语句中,把x和y两个变量分别按%d(十进制有符号的形式)和%o(八进制无符号形式)形式输出。那么获得的结果应该是32767,32767,即答案B正确。

 

8同例7类似,只是在printf函数中的%o之间加上#,变为%#o。

int x=32767,y=032767;

printf("%d,%#o\n",x,y);

那么该例子获得的结果为:32767,032767, 能够看到%o与%#o之间的区别。就是一个不要输出八进制中前导的0,而另一个是要输出前导的0。

 

9如有如下程序段

int i=0xabc,j=0xabc;

i-=j;

printf("%X\n",i);

printf("%#X\n",i);

执行后输出结果是

A) 0X0       B) 0x0         C) 0         D) 0XABC

0                    0         0x0       0xABC              

分析:第一行:整型变量i和j里面存放的都是十六进制整数abc。第二行:执行i-=j;语句,i值变为0。第三行:在printf语句中,把i存放的整数0以%X(十六进制无符号形式)形式输出,获得的结果是0,第四行:把i存放的整数0以%#X形式输出,获得的结果是0x0。因此正确答案是C。

 

10若变量a,b已定义为int类型并赋值22和66,要求用printf函数以a=22,b=66的形式输出,请写出完整的输出语句______。

分析:根据题目要求,变量a、b要求以int类型输出,从表1中可知:输出时应使用格式说明%d来对应整型,同时输出的形式为a=21,b=55,那么也就是有一部分的内容要原样输出。这些内容是“a= ,b=”,因此在输出控制的双引号内,咱们写上代码“a=%d,b=%d”。最后,整个须要输出语句为:printf("a=%d,b=%d",a,b);

 

重要说明:(考得不多)

1) 在%和格式字符之间加入一个整数来控制输出数据所占的宽度,如%5d,

状况一:整数指定的宽度大于实际输出数据的宽度。处理方式:数据的输出采用右对齐的方式,左边自动补空格;

状况二:整数指定的宽度小于实际输出数据的宽度。处理方式:以输出数据的实际宽度输出。

表2举例说明了未指定宽度和指定宽度时的对比结果。

表2  未指定宽度和指定宽度时的输出数据对比结果(“ ”表明空格)

输出语句

输出结果

printf("%d",625);

625

printf("%2d",625);

625

printf("%5d",625);

  625

printf("%f",1.25);

1.250000

printf("%6f",1.25);

1.250000

printf("%12f",1.25);

    1.250000

说明:在输出时,小数点占一位,对于float和double类型必定要保证小数后是六位,不足的补0。

2) 在%和格式字符f之间加入“整数1.整数2”来控制输出数据的格式时,如%3.2f。

“整数1”指定整个输出数据占的总宽度。“整数2”指定输出实数的小数部分的个数。

状况一:当实际输出数据的小数个数 > “整数2”指定的个数时。处理方式:截去多余的数据,并对截去的第一位小数作四舍五入处理。

状况二:当实际输出数据的小数个数 <“整数2”指定的个数时。处理方式:在小数的右边添0 补足。

重要的一句话:碰到“整数1.整数2”形式,首先用“整数2”处理小数部分,处理完后,在用“整数1”处理整个数据,包括已经处理好的小数部分。

表3  “%整数1.整数2f”的输出格式(“ ”表明空格)

输出语句

输出结果

printf("%3.3f",3.1415);

3.142

printf("%3.5f",3.1415);

3.14150

printf("%9.5 f",3.1415);

  3.14150

printf("%3.0 f",3.1415);

  3

 

3%o和%#o之间及%x和%#x之间的区别。有#号的时候,八进制要输出前导0,十六进制要输出前导0x,可是有一点:输出前必定要把十进制转换成须要输出的十六进制或者八进制。(注意:#号对其它格式字符一般不起做用)。

表4  输出的八进制数、十六进制数前分别添加0、0x

输出语句

输出结果

printf("%o",254);

376

printf("%#o",254);

0376

printf("%x",254);

fe

printf("%#x",254);

0xfe

 

其它使用说明:

1) 输出“%”字符的方法,应该在格式控制中用两个连续的“%”,即“%%”来表示,也就是要

在格式控制中出现两个连续的“%”。

 

11printf("%%d",255);不会输出整数255。由于“%%”的意图是要输出一个“%”,这个时候“d”会看成一个字符按原样输出。同时,因为这时由于没有格式说明,整数254没法输出到屏幕上。输出到屏幕上的结果为“%d”。

12printf("%%%d",255); “%%”意图输出一个“%”,后面的“%d”是格式说明,对应后面的255。那么这个时候输出的结果是为%255。

 

2) 注意格式说明会致使结果不一样。

printf(“%d”,65);  把65以整型输出,获得结果是65。

printf(“%c”,65);  把65以字符形式输出,获得结果是大写字母A。

 

3) int的输出的格式说明:%d

  float输出的格式说明:%f

  char 输出的格式说明:%c

  字符串输出的格式说明:%s

  double 输出的格式说明:%lf

  long  int 输出的格式说明:%ld

 

 

第三节 数据输入

考  点:scanf函数的使用;scanf两个参数的使用方法;格式说明符号对应的意思;

重要程度:★★★★

一、scanf函数的具体介绍

scanf函数的功能:使变量得到数值。

1)“输入控制”的含义与printf函数的“输出控制”相同,其做用是指定输入时的数据转换格式。

2)“输入数据列表”的含义:是一个或者多个合法的地址表达式。

 

二、scanf函数中的格式说明

scanf函数与printf函数的格式说明有很大的相同之处:

表5  格式说明对应的输入数据格式

格式说明

输入数据格式

%d

输入十进制整型数

%i

输入整型数,输入时可带前导0的八进制整数和带前导0x的十六进制整数

%c

输入一个字符

%o

输入一个八进制整型数

%x

输入一个十六进制整型数

%u

输入一个无符号的十进制整型数

%f

以带小数点的形式或指数形式输入单精度或双精度数

重要说明:

1)      从键盘中输入的数据是多个,不是一个的时候。输入的多个数值数据之间必须用分隔符(包

括空格符、制表符和回车符)隔开。

例如:

int x, y, z;

scanf("%d%d%d",&x,&y,&z);

如今要对x, y, z三个整型变量分别输入100  200  300

则数据的输入形式可以下几种:

方法一:100<空格符>200<空格符>300<回车>

方法二:100<空格符><空格符>200<空格符>300<回车>

方法三:100<制表符>200<制表符300<回车>

方法四:100<回车>

200<回车>

300<回车>

这四种方式都是正确的。主要是在各个数据之间用分隔符隔开,分隔符符号有:包括空格符、制表符和回车符三种。

错误的输入: 100,200,300<回车>

 

2)重要的一点:scanf函数中第一个参数中,格式说明的类型必须和scanf函数中第二个参数输入项的类型一一对应匹配。若是类型不匹配,系统是不会给出出错信息,运行的结果是得不到正确的输入数据。如:

           int a;

           scanf(“%f”,&a);因为咱们规定int格式说明为%d,因此这里%f就错了!

 

3)当输入长整型数据(long)时,必须使用%ld格式;输入double数据时,必须使用%lf或%le,不然不能获得正确数据,例如:

long a; 

scanf(“%lf”,&a);             

long a;

scanf(“%f”,&a) 

格式正确,变量a能够获得正确数据。  

格式不对,变量a得不到

正确数据。

 

4)与printf函数类似,在scanf函数中的格式字符前能够用一个整数指定输入数据所占的宽度,但对实数不能指定小数的位数,例如:

int a;

scanf(“%3d”,&a);   

float a;

scanf(“%5f”,&a);   

把键盘连续敲入的三个数据做为一个总体数据赋值给变量a。

输入:

12345 <回车>

变量a的结果为123

这里的处理,变量a是得不

到正确的数据,实数不能指定小数的位数。

输入:

123456.78<回车>

获得错误的结果

 

5)注意一点:输入控制中,格式说明的个数与输入项的个数应该相同。

状况一:格式说明的个数 < 输入项的个数。处理方式:系统自动结束输入,多余的数据没有被读入,但做为下一个输入操做的输入数据;

状况二:格式说明的个数 > 输入项的个数。处理方式:系统会自动结束输入。例如:

int x, y, z;

 scanf("%d%d",&x,&y,&z);

int x, y, z;

scanf("%d %d %d",&x,&y,);

键盘输入下面数据:

10<间隔符>20<间隔符>30<回车>

因为在输入控制中只有两个格式说明%d,则只能对x和y变量分别输入10和20,而30不能被读入,只能做为之后其它输入的输入数据。

键盘输入下面数据:

10<间隔符>20<间隔符>30<回车>

因为输入项多于格式说明的个数,变量x,y得到正确的数据以后,系统会自动结束输入。多出的那个%d不起做用。

 

6)考试的重点:跳过输入数据的方法。具体形式为:在格式字符与%之间加入一个“*”,这样会使输入过程跳过某个输入的数据。例如以下的程序:

int x, y, z;

scanf("%d%*d%d%d",&x,&y,&z); 

int x, y, z;

scanf("%d%d%*d%d",&x,&y,&z); 

键盘输入下面数据:

10<间隔符>20<间隔符>30<间隔符>40<回车>

则系统会把10赋给变量x,跳过数据20,把30赋给变量y,把40赋值给变量z。

最后能够得知:x=10,y=30,z=40;数据20被跳过

键盘输入下面数据:

10<间隔符>20<间隔符>30

<间隔符>40<回车>则系统

会把10赋给变量x,把20

赋给变量y,跳过数据30,

把40赋值给变量z。

最后能够得知:x=10,y=20,z=40;

数据30被跳过

 

7)考试的重点(必考):若在scanf函数的第一个参数的输入控制串中含有其余的字符,则在输入时要求一一对应的位置原样输入这些字符。例如:

 

int x, y, z;

scanf("x=%d,y=%d,z=%d",&x,&y,&z);

int x, y, z;

scanf("%d,%d,%d",&x,&y,&z);

要求按照以下的形式输入:

x=20,y=30,z=40<回车>

scanf函数的第一参数:"x=%d,y=% d,z=%d",之间有x=,y=,z=,因此输入的时候,这些符号在键盘输入时候不能够少。不然获得数据不正确。

要求按照以下的形式输入:

20,30,40<回车>

scanf函数的第一参数:"%d,%d,%d",之间是有逗号的,因此输入的时候,逗号不能够缺乏。不然获得数据不正确。

 

 

重要注意:

1)scanf的输入分隔符有三种,不包含逗号。在使用键盘输入数据时,不能以逗号做为分隔符。若是须要以逗号做分隔符,则应该在格式控制字符串中使用逗号,例如

scanf("%d, %d, %d",&x,&y,&z);

scanf("%d%d, %d",&x,&y,&z);

因为在以上三个%d之间有逗号隔开,因此正确的输入为:

10, 20, 30<回车>

因为在以上后两个%d之间有逗号隔开,前两个%d之间没有逗号因此正确的输入为:

10<.分隔符>20, 30<回车>

 

2)通常状况下,咱们操做scanf函数的时候,scanf的格式控制字符串中不要包含其它非格式控制符,不然每每容易让人混淆,也很可贵到正确的数据。也就是说,在scanf中通常只使用格式控制符。不要出现:scanf(" the data is %d",&a);这样的写法,最简单、最佳的操做写法如:scanf(" %d",&a)。

 

3)使用scanf时,若是数据输入未能完成,则程序一直等待键盘输入,此时用户应该完成数据输入。也就是说,程序从上往下顺序结构运行,当运行到scanf函数的时候,就会中止,等待你从键盘输入数据给指定的变量,这个和前面学的赋值语句有相同的功能。若是在未输入数据的状况下键入回车,程序是没有任何反映,好像死机了同样。这时,只要用户输入数据便可。

 

4)其实经过scanf函数给变量赋值和直接使用赋值语句给变量赋值,都能使变量的值发生改变,但两者具备本质区别。

 

 

 

使用scanf语句给变量输入数值

使用赋值符号“=”语句给变量赋值

实现语句

scanf(“%d’,&x);

       x=10;

获值方式

使用键盘动态的给指定的某个变量赋值。

将某一个固定的值在程序源代码中用赋值语句写死,

运行结果

每次编译运行后,变量可从键盘赋不一样的值,获得不一样的运行结果。

每次编译运行后,用户没法改变该变量的值,每次执行的结果均相同。

相关文章
相关标签/搜索