第4章顺序结构程序设计精.docx
- 文档编号:8698641
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:23
- 大小:60.20KB
第4章顺序结构程序设计精.docx
《第4章顺序结构程序设计精.docx》由会员分享,可在线阅读,更多相关《第4章顺序结构程序设计精.docx(23页珍藏版)》请在冰豆网上搜索。
第4章顺序结构程序设计精
第4章顺序结构程序设计
进行计算机程序设计时,通常采用三种不同的程序结构,即顺序结构、选择结构和循环结构。
其中顺序结构是一种最基本、最简单的程序结构。
本章介绍C语言的各类语句,包括控制语句、表达式语句等;格式输入函数printf和格式输入函数scanf等函数的一般形式和格式说明;算法及常用的算法表示方法。
4.1C语言语句
4.1.1控制语句
完成一定功能的语句称为控制语句。
C语言有9种控制语句,参见表4-1。
表4-1C语言的控制语句
语句
名称
if()~else~
条件语句
for()~
循环语句
while()~
循环语句
do~while()
循环语句
continue
结束本次循环语句
break
中止执行switc或循环语句
switch
多分支选择语句
goto
转向语句
return
从函数返回语句
上面9种语句的括号()表示其中是一个条件,~表示内嵌的语句。
4.1.2表达式语句
由一个表达式构成一个语句,称为表达式语句。
表达式语句由表达式加上分号“;”组成。
一般形式为:
表达式;
表达式语句可分为赋值语句、函数调用语句、空语句三种基本类型。
1.赋值语句
赋值语句由赋值表达式后跟一个分号组成。
例如:
a=3;是一个赋值语句。
2.函数调用语句
函数调用语句由函数调用表达式后跟一个分号组成。
例如:
printf(“ThisisaCstatement.”);是由标准输出函数printf构成的函数调用语句。
3.空语句
空语句是只有一个分号而没有表达式的语句。
其形式为:
;
它不产生任何操作运算,只用为形式上的语句,被填充到控制结构中。
4.1.3特殊语句
C语言中还包括一些其他语句,如复合语句等。
把多个语句用花括号{}括起来组成的语句称复合语句。
在程序中可以把复合语句看成是一条语句,而不是多条语句。
例如:
{x=y+z;
a=b+c;
printf(“%d%d”,x,a);
}
是一条复合语句,复合语句内的各条语句都必须以分号“;”结尾,在括号“}”外不能加分号。
注意,在C语言的语法中,只要出现语句的地方均可以出现复合语句。
4.2printf函数
与其他高级语言不同的是,C语言没有提供专门的输入输出语句,所有的输入输出都是通过调用标准库函数中的输入输出函数来实现的。
本节介绍向标准输出设备输出数据的printf函数。
printf函数称为格式输出函数,其功能是按用户指定的格式,把指定的数据输出到标准输出设备上。
4.2.1printf函数的一般形式
printf函数是一个标准库函数,它的函数原型包含在标准输入输出头文件“stdio.h”中,printf函数的一般形式为:
printf(”格式控制”,输出表列)
如:
printf(“hello”);
printf(“Theareais:
%f”,area);
4.2.2转义字符的使用
C语言中允许使用一种特殊形式的字符常量,就以一个“\”开头的字符序列,称为转义字符。
常用的转义字符参见表4-2。
表4-2转义字符
字符形式
含义
ASCII代码
\n
换行,将当前位置移到下一行开头
10
\t
横向跳格(即跳到下一个输出区,一个输出区占8列)
9
\b
退格,将当前位置移到前一列
8
\r
Enter,将当前位置移到本行开头
13
\f
换页,将当前位置多到下页开头
12
\\
反斜杠字符“、”
92
\’
单引号字符
39
\”
双引号字符
34
\ddd
1到3位8进制数所代表的字符
\xhh
1到2位16进制数所代表的字符
【例4-1】转义字符的使用
main()
{chara,b,c;
a=’n’;
b=’e’;
c=’\167’;/*8进制数167代表的字符w*/
printf(“%c%c%c\n”,a,b,c);/*以字符格式输出*/
printf(“%c\t%c\t%c\n”,a,b,c);/*每输出一个字符跳到下一输出区*/
printf(“%c\n%c\n%c\n”,a,b,c);/*每输出一个字符后换行*/
}
运行结果如下:
new
n□□□□□□□e□□□□□□□w“□”代表空格,下同
n
e
w
4.2.3printf函数的调用
printf函数是格式输出函数,其功能是按照指定的格式来控制输出参数在标准输出设备上输出。
格式控制用于指定输出参数的输出格式,格式控制由两部分组成:
格式说明和普通字符。
普通字符(包括转义字符)将被简单地复制显示(或执行)。
一个格式说明项将引起输出参数项的转换与显示。
例如,以下程序
main()
{inta=3,b=4;
printf(“a=%d□b=%d\n”,a,b);
}
在上面printf语句中,“%d”是格式说明(格式说明总是以“%”开头),“a=”、“□”、“b=”为普通字符,按原样输出,“\n”为转义字符,即Enter换行,使下次输出在下一行的开始处。
上例的输出结果为:
a=3□b=4
【例4-2】示例程序
main()
{charch1=’a’,ch2=’b’;
printf(“ch1=%c,ch2=%c\n”,ch1,ch2);
printf(“ch1=%d,ch2=%d\n”,ch1,ch2);
}
程序运行结果为:
ch1=a,ch2=b
ch1=97,ch2=98
在TurboC中,printf函数输出表列中的求值顺序是从右到左进行的。
4.2.4格式字符串
在TurboC中printf函数格式字符串一般形式为:
%
m
.
n
h/l
格式字符
↓
↓
↓
↓
↓
↓
[开始符]
[标志字符]
[宽度指示符]
[精度指示符]
[长度修正符]
[格式转换字符]
说明:
⑴格式字符:
格式字符用来表示输出数据的类型,在格式控制字符串不能略,其常用符号和含义参见表4-3。
表4-3printf格式字符
格式字符
说明
d,i
以带符号的十进制形式输出整数(正数不输出符号)
o
以八进制无符号形式输出整数(不输出前导符0)
x,X
以十六进制无符号形式输出整数(不输出前导符0x),用x则输出十六进制数的a~f时以小写形式输出;用X时,则以大写字母输出
u
以无符号十进制形式输出整数
c
以字符形式输出,只输出一个字符
s
输出字符串
f
以小数形式输出单、双精度数,隐含输出6位小数。
e,E
以指数“e”或“E”形式输出实数。
(如1.2e+02或1.2E+02)
g,G
选用%f或%e格式中输出宽度较短的一种格式,不输出无意义的0。
用G时,若以指数形式输出,则指数以大写表示
⑵标志字符:
标志字符包括-、+、#三种,具体含义参见表4-4。
表4-4printf标志字符
字符
意义
-
输出结果左对齐,右边填空格;缺省则输出结果右对齐,左边填空格或零
=
输出值为正时冠以“+”号,为负时冠以“-”号
#
八进制输出时加前缀0;十六进制输出时加前缀0x
例如,以下语句输出六位十进制整数:
printf(“%6d\n”,111);
printf(“%-6d\n”,111);
输出结果为:
□□□111(输出右对齐,左边填空格)
111□□□(输出左对齐,右边填空格)
例如,语句printf(“%+d,%+d\n”,111,-111);
输出结果为:
+111,-111
输出八进制或十六进制时,可以使用以下形式:
printf(“%#o,%#x\n”,10,16);
输出结果为:
012,0x10
⑶宽度指标符:
用来设置输出数据项的最小宽度,通常用十进制整数来表示输出的位数。
如果输出数据项所需实际位数多于指定宽度,则按实际位数输出,如果实际位数少于指定的宽度则用空格填补。
示例如表4-5所示。
表4-5示例程序
输出语句
输出结果
printf(“%d\n”,888);
888(按实际需要宽度输出)
printf(“%6d\n”,888);
□□□888(输出右对齐,左边填空格)
printf(“%f\n”,888.88);
888.880000(按实际需要宽度输出)
printf(“%12f\n”,888.88);
□□888.880000(输出右对齐,左边填空格)
printf(“%g\n”,888.88);
888.88(%f格式比采用%e格式输出宽度小)
printf(“%8g\n”,888.88);
□□888.88(输出右对齐,左边填空格)
⑷精度指示符:
以“.”开头,用十进制整数指精度。
对于float或double类型的浮点数可以用“m.n”的形式在指定宽度的同时来指定其精度。
其中,“m”用以指定输出数据所占总的宽度,“n”称为精度。
示例如表4-6所示。
表4-6示例程序
输出语句
输出结果
printf(“%.5d\n”,888);
00888(数字前补0)
printf(“%.0d\n”,888);
888
printf(“%8.3f\n”,888.88);
□888.880
printf(“%8.1f\n”,888.88);
□□□888.9
printf(“%8.0f\n”,888.88);
□□□□□889
printf(“%.5s\n”,”abcdefg”);
abcde(截去超过的部分)
printf(“%5s\n”,”abcdefg”);
abcdef(宽度不够,按实际宽度输出)
⑸长度修正符:
常用的长度修改符为h和l两种,h表示输出项按短整型输出,l表示输出项按长整型输出。
【例4-3】输出形式举例
main()
{intnum=123;
longnum2=1234567;
floatreal=123.4567;
printf(“%d,%6d,%-6d,%2d\n”,num1,num1,num1,num1);
printf(“%ld,%8ld,%4ld\n”,num2,num2,num2);
printf(“%f,%10f,%10.2f,%-10.2f\n”,real,real,real,real);
printf(“%s,%10.5s,%-10.5s\n”,”student”,”student”,”student”)
}
输出结果如下:
123,□□□123,123□□□,123
1234567,□1234567,1234567
123.456700,123.456700,□□□□123.46,123.46□□□□
student,□□□□□stude,stude□□□□□
4.3scanf函数
4.3.1scanf函数的一般形式
scanf函数是一个标准输入函数,与printf函数一样,它的函数原型也包含在标准输入输出头文件“stdio.h”中。
scanf函数的一般形式为:
scanf(格式控制,地址表列);
其中,格式控制的使用与printf函数相同,但不能显示非格式字符串,即不能显示提示字符串,但允许非格式字符作为分隔符。
地址表列中给出各变量的地址。
地址由取地址运算符“&”后跟变量名组成。
【例4-4】用scanf函数输入数据。
main()
{
inta,b,c;
scanf(“%d%d%d”,&a,&b,&c);
printf(“%d,%d,%d\n”,a,b,c);
}
运行时按以下方式输入a、b、c的值:
3□4□5
3,4,5(输出a,b,c的值)
4.3.2scanf函数的格式说明
1.格式说明
格式说明的一般形式为:
%
*
m
h/l
格式字符
↓
↓
↓
↓
↓
[开始符]
[赋值抑制符]
[宽度指示符]
[长度修正符]
[格式转换字符]
⑴格式字符:
表示输入数据的类型,其字符和含义如表4-7。
表4-7scanf格式字符
格式字符
说明
d,i
输入有符号的十进制整数
u
输入无符号的十进制整数
o
输入无符号的八进制整数
x,X
输入无符号的十六进制整数(大小写作用相同)
c
输入单个字符
s
输入字符串,将字符串送到一个字符数组中,在输入时以非空白字符开始,以第一个空白字符结束。
字符串以串结束标志’\0’作为其最后一个字符
f
输入实数,可以用以小数形式或指数形式输入
e,E,g,G
与f作用相同,e与f,g可以互相替换
⑵抑制字符“*”:
表示该输入项读入后不赋予相应的变量,即跳过该输入值。
例如:
scanf(“%d%*d%d”,&x,&y);
输入10□12□15后,把10赋予变量x,12被跳过,15赋予变量y。
⑶宽度指示符:
用十进制整数指定输入数据的宽度。
例如:
scanf(“5d”,&x);
输入数据“661020”,把前五位数66102赋予变量x,其余部分被截去。
又如,
scanf(“%4d%4d”,&x,&y);
输入数据“661020”,把前四位数6610赋予变量x,而把后剩下二位数20赋予变量y。
⑷长度修正符:
长度修正符分为l和h两种,l用于输入长整型数据等;h用于输入短整型数据。
2.使用scanf函数注意事项
使用scanf函数应注意以下几点:
⑴scanf函数中的“格式控制”后面应当是变量地址,而不应是变量名。
例如,如果a,b为整型变量,则
scanf(“%d,%d”,a,b);
是不对的,应将“a,b”改为“&a,&b”。
⑵scanf函数没有计算功能,因此输入的数据只能是常量,而不能是表达式。
⑶在输入多个整型数据或实型数据时,可以用一个或若干个空格、Enter键或制表符(Tab)作为间隔。
但在输入多个字符型数据时,数据之间分隔符认为是有效字符。
例如:
scanf(“%c%c%c”,&c1,&c2,&c3);
如输入
a□b□c
则字符’a’赋予变量c1,字符’□’赋予变量c2,字符’b’赋予变量c3,因为%c只要求读入一个字符,后面需要用空格作为两个字符的间隔,因此’□’作为下一个字符赋予变量c2。
⑷输入格式中,除格式说明符之外的普通字符应原样输入。
例如:
scanf(“x=%d,y=%d,z=%d”,&x,&y,&z);
应使用以下形式输入:
x=12,y=34,z=56
⑸输入实型数据时,不能规定精度,即没有“%m.n”的输入格式。
例如:
scanf(“%7.2f”,&f);
这种输入格式是不合法的,不能企图用这样的scanf函数并输入以下数据而使f的值为12345.67。
1234567
⑹在输入数据时,如果遇到以下情况,则认为是该数据输入结束:
①遇到空格符、换行符或制表符(Tab)。
例如:
scanf(“%d%d%d%d”,&i,&j,&k,&m);
如果输入:
1□2
则i、j、k、m变量的值分别为1、2、3、4。
②遇到给定的宽度结束。
例如:
scanf(“%2d”,&i);
如果输入:
1234567
则i变量的值为12。
③遇到非法字符输入,例如:
scanf(“%d%c%f”,&i,&c1,&f1);
如果输入:
123x23o.4567
系统自左向右扫描输入的信息。
由于x字符不是十进制中的合法字符,因而第一个数i到此结束,即i=123;第二个数c1=’x’;系统继续扫描后面的o(英文字母o,而非数字0),它不是实数中的有效字符,因而第三个数到结束,即f1=23.0。
4.4其他输入输出函数
4.4.1getchar函数
getchar()函数的功能是从键盘输入一个字符。
该函数没有参数。
getchar()函数也是一个标准的输入输出库函数,它的原型在“stdio.h”头文件中被定义。
因此,使用时用户应该在程序的开始加以下编译预处理命令。
#include“stdio.h”
getchar()函数的一般形式为:
c=getchar();
执行下面的调用时,变量c将得到用户从键盘输入的一个字符值,这里的c可以是字符型或整型变量。
【例4-5】getchar()函数应用举例
#include“stdio.h”
main()
{
charc;
c=getchar();/*接收用户从键盘上输入的一个字符*/
putchar();/*输出字符型变量c的值*/
}
运行结果如下:
h
h
说明:
⑴getchar()函数只能用于单个字符的输入,且一次只能输入一个字符;
⑵getchar()函数在使用时,必须在程序的开头加上编译预处理命令#include“stdio.h”。
4.4.2gets函数
gets函数的功能是接收从键盘输入的一个字符串,存放在字符数组中。
函数的返回值是字符数组的起始地址。
gets()函数也是一个标准的输入输出库函数,它的原型在“stdio.h”头文件中被定义,因此,使用时用户应该在程序的开始加以下以编译预处理命令:
#include“stdio.h”
gets函数的一般形式:
gets(str);
从键盘输入:
computer
将输入的字符串”computer”送给字符数组str,函数值为字符数组str的起始地址。
一般利用gets函数的目的是向字符数据输入一个字符串,而不大关心其函数值。
4.4.3putchar函数
putchar()函数的功能是将一个字符输出到显示器上显示。
putchar()函数也是一个标准的输入输出库函数,它的原型在“stdio.h”头文件中被定义,因此,使用时用户应该在程序的开始加以下编译预处理命令:
#include“stdio.h”
putchar()函数的一般调用形式:
putchar(c)
即把变量c的值输出到显示器上,这里的c可以是字符型或整型变量,也可以是一个转义字符。
【例4-6】putchar()函数应用举例
#include“stdio.h”
main()
{chara,b,c,d;
a=’g’;
b=’o’;
c=111;
d=’d’;
putchar(a);
putchar(b);
putchar(c);
putchar(d);
}
运行情况如下:
good
说明:
⑴putchar()函数只能用于单个字符的输出,并且一次只能输出一个字符;
⑵putchar()函数在使用时,必须在程序的开头加上编译预处理命令#include“stdio.h”。
4.4.4puts函数
puts函数的功能是将字符数组中存放的字符串输出到显示器上。
该函数没有返回值。
puts()函数也是一个标准的输入输出库函数,它的原型在“stdio.h”头文件中被定义,因此,使用时用户应该在程序的开始处加以下编译预处理命令:
#include“stdio.h”
puts函数的一般形式:
puts(str);
例如,假设已经定义str是一个字符数组名,且该数组已被初始化为”china”。
则执行
puts(str);
其结果是在显示器上输出china。
puts函数输出的字符串中也可以包含转义字符,例如,puts(“china\nbeijing”);
输出结果为:
china
beijing
4.5算法与程序设计
4.5.1算法及其表示方法
1.算法
算法(algorithm)一词源于算术(algorism)。
粗略地说,算术方法是一个由已知推求未知的运算过程。
后来人们把它推及一般,把进行某一工作的方法和步骤称为算法。
因此,算法反映了计算机的执行过程,是对解决特定问题的操作步骤的一种描述。
【例4-7】输入3个数,求其最大值。
问题分析:
设num1,num2,num3存放3个数,max存放其最大值。
为求最大值,就必须对3个数进行比较,可按如下步骤去做:
⑴输入3个数num1,num2,num3。
⑵先把第1个数num1的值赋给max。
⑶将第2个数num2与max比较,如果num2>max,则把第2个数num2的值赋给max(否则不做任何工作)。
⑷将第3个数num3与max比较,如果num3>max,则把第3个数num3的值赋给max(否则不做任何工作)。
输出max的值,即最大值。
从上例中可以看出,首先分析题目,然后寻找一种实现这个问题所要完成功能的方法,这种方法的具体化就称为算法。
因此可以说,算法是由一套明确的规则组成的一些步骤,它指定了操作顺序并通过有限个步骤解决问题、得出结果。
一个算法应具有以下5个特性:
⑴有穷性
一个算法必须总是在执行有限个操作步骤和可以接受的时间内完成其执行过程。
也就是说,对于一个算法,要求其在时间和空间上均是有穷的。
例如:
一个采集气象数据并加以计算进行天气预报的应用程序,如果不能及时得到结果,超出了可以接受的时间,就起不到天气预报的作用。
⑵确定性
算法中的每一步都必须明确的含义,不允许存在二义性。
例如:
“将成绩优秀的同学名单打印输出”,在这一描述中“成绩优秀”就很不明确,是每门功课均为95分以上?
还是指总成绩在多少分以上?
⑶有效性
算法中描述的每一步操作都应能有效地执行,并最终得到确定的结果。
例如:
当Y=0时,X/Y是不能有效执行的。
⑷有零个或多个输入
一个算法有零个或多个输入数据。
例如:
计算1~10的累计和的算法,则无须输入数据,而对10个数据进行排序的算法,却需要从键盘上输入这10个数据。
(5)有一个或多个输出
一个算法应该有一个或多个输出数据。
执行算法的目的是为了求解,而“解”就是输出,因此没有输出的算法是毫无意义的。
2.算法的表示方法
算法的表示方法很多,常用的有:
自然语言、传统流程图、N-S结构图、伪代码、PAD图等。
⑴用自然语言表示
自然语言就是人们日常使用的语言,可以是中文、英文等。
用自然语言表示算法通俗易懂,但一般篇幅冗长,表达上往往不易准确,容易引起理解上的“歧义性”。
所以,自然语言一般用于算法较简单的情况。
⑵用传统流程图表示
传统流程图是用规定的一组图形符号、流程线和文字说明来表示各种操作算法的表示方法。
传统流程图常用的符号如表4-8所示。
表4-8传统流程图常用的符号
符号
符号名称
含义
起止框
表示算法的开始和结束
输入/输出框
表示输入/输出操作
处理框
表示对框内的内容进行处理
判断框
表示对框内的条件进行判断
流程线
表示流程的方向
连接点
表示两上具有同一标记的“连接点”应连接成一个点
注释框
表示注释说明
用传统流程图表示算法直观形象,算法的逻辑流程一目了然,便于理解。
但占用篇幅较大,画起来比较麻烦,而且又由于允许使用流程线,使用者可以随心所欲,使流程可以任意转移,从而造成阅读和修改上的困难。
⑶N-S结构图表示
针对传统流程图存在的问题,美国学者I.Nassi和B.S
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 顺序 结构 程序设计