1、第3章 简单程序设计,3.1 顺序结构程序设计的概念 3.2 赋值语句 3.3 数据输出 3.4 数据输入 3.5 复合语句和空语句 习题3,3.1 顺序结构程序设计的概念,顺序结构的程序设计是最简单的程序设计,它由一组顺序执行的程序块组成。最简单的程序块是由若干顺序执行的语句所构成的。这些语句可以是赋值语句,输入输出语句等。顺序结构是一种线性结构,其特点是:在该结构中,各操作块(简称块,它所对应的计算机语言表述形式是程序段)按照各自出现的先后顺序,依次逐块执行。它是计算机科学用以描述客观世界顺序现象的重要手段,是任何从简单到复杂的程序的主体基本结构,因为选择结构与循环结构的组成,也离不开顺序
2、结构(即作为它们的子结构)。,一个程序通常可分为3个部分:输入、处理和输出。顺序结构用“结构化程序流程图(N-S图)”表示为如图3.1所示。程序名称标识符程序名称描述部分开始程序开始操作标志块a块给定问题初始化处理操作块b块,所论问题中心处理操作块c块给定问题善后化处理操作块 结束程序结束操作标志块,图3.1 顺序结构流程图,3.2 赋值语句,赋值语句由赋值表达式加上一个分号构成。赋值语句比较简单,但是使用比较普遍。赋值语句是由赋值表达式加上一个分号构成,其一般格式为变量 =表达式;例如:student_number=50 ;score=math+ph+ch ;,说明如下。(1) 在C语言中符
3、号“=”是一个运算符,其优先级别和结合性以及赋值时数据的转换在第2章中已经作了详细的说明。(2) 在赋值语句中,首先计算“=”右边的表达式的值,然后将其值赋给左边的变量。如果右边的表达式的类型与左边变量的类型不一致,系统将自动把“=”右边的表达式的值转换为与左边变量相同的类型,然后再赋值。,(3) 在C语言中有赋值表达式的概念,赋值表达式可以包括在其他表达式中,但是赋值语句一般不能出现在表达式中。例如:if (a=b)50) m=0.1 ;如果写成if (a=b ; )50) m=0.1 ;就错了,因为在if的条件中不能出现赋值语句,而只能是表达式。,3.3 数据输出,大部分的计算机程序需要与
4、用户进行交互,以便进行数据交流。所以,每一种语言都有完备的输入输出功能,有的是以标准的输入输出语句实现的,而C语言是通过调用系统提供的标准库函数实现的。由于不同的C编译系统以及C编译系统的不同版本提供的C函数库是不同的,因此其提供的输入输出函数也是不相同的(包括函数名和函数调用参数)。不过它们一般都提供像printf和scanf等一些标准函数,使用方法大体相同。,在使用库函数中的输入输出函数时,要用编译预处理命令“#include”将有关的“头文件”包含到用户源程序中。例如,在使用标准输入输出库函数时,要用到“stdio.h”文件,因此要将此文件包含进来,文件开头应使用下面的编译预处理命令:#
5、include 或 #include “stdio.h“由于printf函数和scanf函数的使用比较频繁,因此,在使用这两个函数时可以不使用“#include”命令。,数据的输出是指将数据输出到标准输出设备上(例如显示器和打印机)。一般的C编译系统均提供很多的标准输出函数,在这节中介绍使用最常用的两个输出函数printf函数和putchar函数。3.3.1 printf函数printf函数是向屏幕格式化输出变量、常量或表达式的值。在C语言中printf函数是最常用的输出函数。1. printf函数的一般格式printf函数的一般格式为printf ( 格式控制 , 输出项1 , 输出项2 ,
6、 )该函数按照指定的格式,将输出项列表中的各项输出到标准输出文件中。,如果在printf函数调用之后加上分号,就构成了输出语句。其中,输出项可以是常量、变量或表达式。格式控制有普通的字符、转义字符和输出格式说明,需要将格式控制用双引号括起来。一个格式说明必须由一个“%”开头,后面跟一个类型字符构成。【例3-1】向屏幕输出变量、常量和表达式的值,并且控制光标的移动。#include “stdio.h“main( )int x,y;x=21;y=10;,printf(“%dt“,123); /* 向屏幕输出常量123的值 */printf(“x=%d,y=%d“,x,y); /* 输出变量x和y的
7、值 */printf(“n“); /* 光标到下一行的行首 */printf(“x%y=%d“,x%y); /* 输出x%y的值 */,运行结果:123 “x=21,y=10“x%y=1其中,123可以直接输出,双引号中的字符(例如“x=”)按原样输出,“、t和n是转义字符,x和y为变量,x%y为表达式。“%”后面的d为格式控制符。为了在结果中输出“%”,必须使用“%”。,2. printf函数中的格式控制说明每个格式控制说明必须用“%”开头,以一个格式控制字符结束,在格式控制字符的前面还可以插入“宽度说明”、左对齐符号“-”、前导零符号“0”等附加字符。1) 格式控制字符常用的格式控制字符和
8、它们的功能见表3-1。使用时要注意区分大小写。,表3-1 printf函数的格式控制字符,2) 附加格式说明字符为了使程序的输出结果更加整齐美观,可以在控制字符的前面加上附加格式说明字符,见表3-2。,表3-2 printf函数的附加格式说明符,【例3-2】输出数据,并且控制数据的对齐形式、小数点后数字位数、八进制形式输出、字符串输出宽度等。#include “stdio.h“main( )int a=32,b=57;float x=7.876543,y=-345.123;char c=a;long l=1234567;printf(“%d%dn“,a,b);printf(“%-3d%3dn“
9、,a,b); /* 左对齐输出a的值,右对齐输出b的值 */,printf(“%8.2f,%8.2f,%.4f,%.4fn“,x,y,x,y); /* 数据x占8位,小数点后取两位,右对齐等 */printf(“%e,%10.2en“,x,y); /* 按指数形式输出x的值等 */printf(“%c,%d,%o,%xn“,c,c,c,c); /* 输出字符 a,字符 a 的ASCII码等 */printf(“%ld,%lo,%x,%dn“,l,l,l,l);printf(“%s,%5.3sn“,“CHINESE“,“CHINESE“); /* 输出“CHINESE“和其前3个字符*/,运行结
10、果:325732 577.88, -345.12,7.8765,-345.12307.87654e+00, -3.5e+02a,97,141,611234567,4553207,d687,18CHINESE, CHI,从上面的例子可以看出,输出的格式控制是很复杂的,除了可以控制数据按十进制、八进制、十六进制整型输出,或者按浮点型、字符型输出外,还可以控制数据输出对齐的方式(左对齐或右对齐)和实数输出的格式等。3.3.2 putchar函数putchar函数是向屏幕终端输出一个字符。格式为putchar(ch) ;其中,ch可以是字符型常量、变量或整型变量。另外,在使用本函数时,程序首行要有“#
11、 include “stdio.h“”预编译命令。,【例3-3】输出字符。#include “stdio.h“main( )char a , b , c ;a=C ; b=A ; c=T ;putchar(a) ; putchar(b) ; putchar(c) ; putchar(n) ;putchar(101) ; putchar(B) ; putchar(c) ;运行结果:CATABc,3.4 数据输入,3.4.1 scanf函数scanf函数的作用是接收从键盘输入的数据,格式化后赋给变量。scanf函数的格式为scanf(格式控制 , 地址1 , 地址2,);说明如下。(1) 格式控制
12、的含义同前。(2) “地址n”是变量的地址。它既可以是简单变量的地址也可以是数组的地址。简单变量的地址用变量名前面加取地址运算符“&”表示,数组的地址用数组名表示。,例如,有如下变量说明。int day , year ;char month10 ;如果需要给变量day赋值为25,month赋值为Dec,year赋值为1996,则可以用下面的语句表示。scanf(“%d%s%d“ , 数据输入时,应用空格隔开,按以下方式输入变量的值,即25 Dec 1996或者,数值型数据与字符型中间的空格省略,即25Dec 1996,但字符型数据与数值型数据之间的空格不能省略,上例不能输入为25 Dec199
13、6 (month得到了Dec1996)(3) 输入字符时不加单引号,输入字符串时不加双引号。(4) 当scanf的格式字符串包含有普通字符时,在输入流中相应位置必须有相同的字符与之匹配。格式串中的一个空白字符可以与输入流中0个或多个连续的空白字符匹配。例如:,main( ) int x , y ;printf(“please input x and y:“) ;scanf(“%d,%d“ , 如果将23赋给变量x,将42赋给变量y,因为在格式字符串中包含了“,”,所以,数据输入时,输入数据间也应用“,”分隔,则数据的输入形式为“23 , 42”,而不能用空格或其他符号分隔,如“23 42”。,
14、(5) 在Turbo C环境下输入long型整数时,在“%”和“d”之间必须加“l”;输入double型数时,在“%”和“f”或“e”之间必须加“l”,否则得不到正确的数据。在scanf函数中的格式字符前可以用一个整数指定输入数据所占宽度,但不可对实型数指定小数位的宽度。例如:int i , j ;scanf(“%3d%d“ , 若执行时输入:1234 5678则变量i的值为123,变量j的值为5678。,(6) 在格式控制时,格式说明的个数应该与输入项的个数相同。若格式说明的个数少于输入项的个数时,scanf函数结束输入,多余的数据项并没有被接收;若格式说明的个数多于输入项的个数时,scan
15、f函数同样也结束输入。例如,有下面的变量说明。int i , j ; float x , y ;scanf(“%d%d“ , 若执行时输入:12 34 56.7 89则执行后,变量i的值为12,j的值为34,x未被赋值,y得到浮点数56.7。,【例3-4】使用scanf函数输入整型、浮点型、字符型数据分别赋给整型、浮点型、字符型变量。#include “stdio.h“main( )int x;float y;char ch;printf(“Please input x,y,ch:“);scanf(“%d %f %c“,/* 从键盘输入数据分别赋给变量x,y,ch */printf(“x=%d
16、,y=%f,ch=%c“,x,y,ch); /* 输出变量x,y,ch */运行结果:Please input x,y,ch: 2 3 ax=2 , y=3.000000 , ch=a,3.4.2 getchar函数getchar函数的作用是从屏幕终端输入一个字符。getchar函数没有参数,其一般格式为getchar( )当执行此函数调用语句时,变量将获得一个从标准设备上读取的字符代码值。【例3-5】输入单个字符。#include “stdio.h“main( )char ch ;ch=getchar( ) ;putchar(ch) ;,在运行时,如果从键盘输入字符“a”并回车,就会在屏幕上
17、看到输出字符“a”。a CR (CR表示回车键)a (屏幕显示结果)注意:输入时,不能输入单引号,否则程序将接收单引号。如果在一个函数中(现为main函数),调用getchar函数,应该在该函数的前面(或本文件开头)加上“包含命令”:#include “stdio.h“,3.5 复合语句和空语句,3.5.1 复合语句在C语言中,一对花括号“ ”不仅可用作函数体的开头和结尾的标志,也可用作复合语句的开头和结尾的标志。复合语句也可称为“语句块”,复合语句的语句格式为语句1 ; 语句2 ; ; 语句n ; 一个复合语句在语法上视为一条语句,在一对花括号中的语句数量不限。例如: a+ ; b*=a ;
18、 printf(“b=%dn“ , b) ; ,在复合语句中,不仅可以有执行语句,还可以有定义部分,定义部分应该出现在可执行语句的前面。【例3-6】复合语句举例。#include “stdio.h“main( )int x ;x=100 ;int x=24 ;printf(“x=%dn“ , x) ;printf(“x=%dn“ , x) ;,运行结果:x=24 (此时的x为复合语句中的x)x=100 (此时的x为main函数中的x)3.5.2 空语句C程序中的所有语句必须由一个分号“;”作为结束。如果语句只有一个分号,就是空语句。程序执行空语句时不产生任何动作。例如:for( i=1; i1
19、0; i+ ) ;其中,循环体中就是空语句,程序执行空语句时不产生任何动作。,程序中有时需要加上一个空语句来表示存在一条语句,但是随意加上分号有时会造成逻辑上的错误,因此,用户应该慎用或去掉程序中不必要的空语句。,习题3,一、选择题3.1 请选出合法的C语言赋值语句( )。A) a=b=58 B) i+ ; C) a=58 , b=58 D) k=int(a+b) ;3.2 请选出以下语句的输出结果是( )。printf(“%dn“ , strlen(“t“065xffn“) ;A) 5 B) 14 C) 8 D) 输出项不合法,无正常输出,3.3 阅读程序:#include “stdio.h
20、“ main( ) int a ; float b , c;scanf(“%2d%3f%4f“ , ,若运行时从键盘上输入9876543210(0表示回车),则程序的输出结果是( )。A) a=98 , b=765 , c=4321 B) a=98 , b=765.000000 , c=4321.000000C) a=98 , b=765.0 , c=4321.0 D) a=98.0 , b=765.0 , c=4321.0,3.4 已知字母A的ASCII码为十进制的65,下面程序的输出结果是( )。#include “stdio.h“main( ) char ch1 , ch2 ;ch1=A
21、+5-3 ;ch2=A+6-3 ;printf(“%d , %cn“ , ch1 , ch2) ; A) 67 , D B) B , C C) C , D D) 不确定的值,3.5 设有如下定义:int x=10 , y=3 , z ;则语句:printf(“%dn“ , z=(x%y , x/y) ;的输出结果是( )。A) 1 B) 0 C) 4 D) 33.6 在下列选项中,不正确的赋值语句是( )。A) +t ; B) n1=(n2=(n3=0) ;C) k=i=j ; D) a=b+c=1 ;,3.7 若有以下定义和语句:char c1=b , c2=e ;printf(“%d,%c
22、n“ , c2-c1 , c2-a+A) ;则输出结果是( )。A) 2 , M B) 3 , E C) 2 , E D) 输出结果不确定3.8 若有定义:Int x , y ; char a , b , c ;并有以下输入数据(此处CR代表换行符,u代表空格):u2 CRuBuC CR,则能给x赋整数1,给y赋整数2,给a赋字符A,给b赋字符B,给c赋字符C的正确程序段是( )。 A) scanf(“x=%d y+%d“ , ,3.9 下列可作为C语言赋值语句的是( )。A) x=3 , y=5 B) a=b=6 C) i- ; D) y=int(x) ;3.10 以下叙述中正确的是( )。
23、A) 输入项可以是一个实型常量,例如:scanf(“%f“ , 3.5) ;B) 只有格式控制,没有输入项,也能正确输入数据到内存,例如:scanf(“a=%d , b=%d“),C) 输入一个实型数据时,格式控制部分可以规定小数点后的位数,例如:scanf(“%4.2f“ , , int b=5 , c=12 ;c/=b*2 ;a-=c ;printf(“%d , %d , %d ,“ , a , b , c) ;a+=-c ;printf(“%d , %d , %d“ , a , b , c) ;3.12 下面程序的输出结果是_。#include “stdio.h“main( ) unsi
24、gned a=32768 ;printf(“a=%dn“ , a) ;,3.13 下面程序的输出结果是_。#include “stdio.h“main( ) int k=17 ;printf(“%d , %o , %x n“ , k , k , k) ;3.14 下面程序的运行结果是_。#include main( ) int a=2 , c=5 ;printf(“a=%d , b=%dn“ , a , c); ,三、编程题3.15 编写程序,将d天h小时m分钟换算成分钟,然后进行输出。3.16 编写程序,输入两个整数,求出它们的商数和余数并进行输出。3.17 编写程序,读入3个双精度数,求它们的平均值,并保留此平均值小数点一位,对小数点后第二位进行四舍五入,并输出结果。3.18 编写程序,读入3个整数a、b、c,然后交换它们中的数,把a中原来的值给b,把b中的值给c,把c中的值给a。,