第三章 顺序结构程序设计 计算机科学学院
本章内容: 3.1 C语句概述 3.2 程序的三种基本结构 3.3 输入与输出语句 3.4 顺序程序设计举例
3.1 C语句概述 C程序对数据的处理是通过“语句”的执行来实现的。 一条语句完成一项操作(或功能)。 一个为实现特定目的的程序应包含若干条语句。
C语言的语句分类: 表达式语句(表达式;) 简单语句 函数调用语句(函数名(参数表); 空语句(;) C语言 数据操作 复合语句({ 一条或多条语句 }) 语句 条件语句(if语句,switch语句) 结构化语句 while语句 循环语句 do_while语句 for语句 流程控制语句 break语句 限定转向语句 continue语句 非结构化语句 return语句 非限定转向语句(goto语句)
3.1.1 简单语句 1.表达式语句 由表达式组成的语句称为表达式语句 分号(;)是语句结束的标志 语句格式: 表达式; 功能: 计算表达式或改变变量的值。 分类: 运算符表达式语句 赋值语句
(1)运算符表达式语句 运算符表达式后跟一个分号组成。 例: i++; 语句的功能是变量i的值增1。 a=3,b=a+2,c=a+1; /*由三个赋值语句组成的逗号表达式语句。*/
(2)赋值语句 赋值表达式后跟一个分号组成。 例: x=y+z; /*计算y+z的和并赋值给变量x。*/ x=2; y=3;
2.函数调用语句 由函数调用表达式后跟一个分号组成。 格式: 函数名 (参数列表); 分类: 标准库函数 用户定义函数 标准库函数调用原则: (1) 要在程序中包含相应的头文件 (2) 调用的一般形式:函数名 (参数列表);
标准函数调用的目的 (1)如数学函数,为了得到函数的返回值。 (2)为了完成某项任务,而不是为了得到返回值。 例: 在表达式中调用函数,实际上是转去执行一段预先设计好的程序,求出结果后返回调用点。 所以函数的值又叫函数的返回值。 这类函数的调用一般出现在表达式中,作为表达式语句的一部分。一般不作为函数调用语句。 (2)为了完成某项任务,而不是为了得到返回值。 调用这类函数时,就直接用函数调用语句。 例: scanf("%f",&x); printf("%f",x);
3.1.2 复合语句 一对大括号{ }包围若干条语句组成。 格式: { [ 数据说明部分;] 执行语句部分; } 注意: (1) 在复合语句中的“数据说明部分”中定义的变量,是局部变量, 仅在复合语句中有效。 (2) 复合语句结束的“ } ”之后,不需要分号。 (3) 复合语句可以出现在任何数据操作语句可以出现的地方。
例3.1: 程序运行结果 a=11 b=21 c=31 a=11 b=22 c=3.300000 a=22 b=21 c=31 #include "stdio.h" void main() { int a=11,b=21,c=31; printf("a=%d\tb=%d\tc=%d\n",a,b,c); { int b=22; float c=3.3; printf("a=%d\tb=%d\tc=%f\n",a,b,c); a=b; }
3.1.3 空语句 空语句就是一个分号。 格式: ; 功能: 执行该语句不做任何操作。
3.2 C语言的三种基本结构 C语言提供三种结构化语句来控制程序的执行流程: 顺序结构: 选择结构: 循环结构: 一种按书写顺序执行的结构。 根据运行时的情况自动选择要执行的语句。 循环结构: 根据情况自动重复执行有关语句。
3.2.1 顺序结构 顺序结构即按照语句书写顺序执行的程序结构。 A B 顺序结构
3.2.2 选择结构 选择结构又称为分支结构,是指有条件地选择要执行的程序段。 选择结构示意图 … k=k2 k≠k1…kk k=kk A1 A2 B Ak 图 3-4 多分支选择结构 真(非0) 假(0) A B 条件 图 3-3 双分支选择结构 选择结构示意图
3.2.3 循环结构 1. 当型循环结构 当条件成立(为“真”或非0)时,反复执行程序段A,否则不执行程序段A。 条件 A 假(0) 真(非0) A
先执行程序段A,再判断条件是否为“真”(非0);若为“真”(非0),再执行A,如此反复,直到条件为“假”(0)为止。 2. 直到型循环结构 先执行程序段A,再判断条件是否为“真”(非0);若为“真”(非0),再执行A,如此反复,直到条件为“假”(0)为止。 真(非0) 假(0) A 条件
3.3 输入输出语句 C语言本身不提供输入/输出语句。 C语言的输入/输出功能由C语言的标准I/O库函数提供。 C语言的输入/输出库函数名不是保留字(或称关键字)。如 putchar,printf,scanf。
3.3.1 字符输入 getchar( ); 一般形式 函数功能 从标准输入设备(一般为键盘)输入一个字符,即计算机获得一个字符,其函数值就是从输入设备得到的字符。
从键盘输入字符, 该字符的ASCII编码值赋给a 例3.2: #include <stdio.h> void main( ) { int a; char b; a=getchar( ); b=getchar( ); printf("a=%c\ta=%d\tb=%c\tb=%d\n",a,a,b,b); } 从键盘输入字符, 该字符的ASCII编码值赋给a
程序运行情况如下: 13↙ a=1 a=49 b=3 b=51
注意: 调用函数getchar时,程序执行被中断,等待用户从键盘输入数据。当用户键入字符并敲回车键以后,程序继续运行。若用户输入字符后未按回车键,则键入的内容一直保留在键盘缓冲区中,只有用户键入回车键后,字符输入函数getchar才进行处理。 函数getchar将回车键作为一个字符读入。如果程序中有两个以上函数getchar时,应该一次性输入所需字符,最后再按回车键,如上例所示。 无论输入的是英文字母或标点符号还是数字,都是作为字符输入 。
3.3.2 字符输出函数 一般形式 putchar(c); 函数功能 向标准输出设备(一般为显示器)以字符形式输出c的值(即一个字符)。 函数的参数 函数返回值类型 函数的名称 函数功能 向标准输出设备(一般为显示器)以字符形式输出c的值(即一个字符)。
例3.3: #include <stdio.h> 包含函数putchar的头文件 void main( ) { int a=65; char b=‘B’; putchar(a); putchar(65+1); putchar(b); putchar(‘B’+1); putchar(‘\n’); } 程序运行结果为: ABBC
3.3.3 格式输出函数 1.printf函数的一般形式: printf(格式控制,输出表列); ◆用双引号括起来的字符串。包括格式声明和普通字符等。 ◆要输出的数据,可以是常量、变量、表达式、函数返回值等,每个输出项之间用逗号(,)分隔。 ◆作用是控制输出项的格式和输出一些提示信息。
3.3.3 格式输出函数 2.函数功能 函数printf按指定格式向标准输出设备输出若干个任意类型的数据。
3.格式控制字符串: (1)组成: 普通字符、转义字符、格式声明。 普通字符: 按原样输出,主要用于输出提示信息。 转义字符: 指明特定的操作。 格式声明: 由“ % ” 和“格式字符”组成,它表示按规定的格式输出数据。
例3-5 程序运行结果为: 1:97 98 2:97,98 3:a,b 4:a=97,b=98 #include "stdio.h" void main() { int a=97,b=98; printf(“1:%d %d\n”,a,b); printf("2:%d,%d\n",a,b); printf("3:%c,%c\n",a,b); printf("4:a=%d,b=%d",a,b); } 程序运行结果为: 1:97 98 2:97,98 3:a,b 4:a=97,b=98
(2)格式说明的形式: 格式字符,用来进行格式转换。 (重点掌握) %[flags][width][.prec][F|N|h|L][type] 输出长度修饰符: F:输出远指针存放的地址。 N:输出近指针存放的地址。 H或h:输出短整型数据的值。 L或l:输出长整型或双精度值。 输出精度指示符。 ◆对整数,表示至少要输出的数字个数,不足补数字0,多出则原样输出。 ◆对实数,表示小数点后至多输出的数字个数,不足补数字0,多出则舍入处理。 ◆对字符串,表示最多输出的字符个数,不足补空格,多出则丢弃。 格式字符,用来进行格式转换。 (重点掌握) 方括号表示该项可有可无 可选的标志字符 ◆-:左对齐输出,缺省为右对齐输出 ◆+:正数输出加号(+),负数输出减号(-) ◆空格:正数输出空格代替加号(+),负数输 出减号(-) 如:%+d,%-d,% d。 十进制整数,指定输出宽度。 ▼指定宽度>实际宽度,补空格。 ▼指定宽度≤实际宽度,按实际输出。 ▼不指定宽度,按实际输出。 如:%+10d
以十六进制无符号形式输出整数(不输出前导符Ox) (3)格式字符(type)一鉴表: 字符 说 明 d(或i) 以带符号的十进制形式输出整数,不输出(+)号 o 以八进制无符号形式输出整数(不输出前导符数字O) x(或X) 以十六进制无符号形式输出整数(不输出前导符Ox) u 以无符号十进制形式输出整数 c 输出一个字符 s 输出字符串 f 以小数形式输出单、双精度数,隐含输出6位小数 e(或E) 以指数形式输出单、双精度数,小数位数为6位 g(或G) 由给定的值和精度自动选用%f或%e或%E格式 % 输出百分号(%)
例如: printf ("%d\n",100); printf("%5d\n",100); printf("%8d\n%8d″,100,100*100); 1 0 1 1 0 1 0 1 0 1
例如: printf ("%o\n",-1); printf (“%x,%X\n”,-1,-1); printf ("%u,%d",-1); 3 7 3 7 f , F 3 7 f , F 4 2 9 6 5 - 1
例如: printf ("%4c,%c\n",'A', 'A'); printf ("%-8s,%8.2s", " Name ", " Name "); A , A , N a m e -
例如: printf ("%f\n%10.3f\n",100.7654321, 100.7654321); printf ("%e\n%10.9e", 100.7654321,100.7654321); 1 . 7 6 5 4 3 2 1 . 7 6 5 4 3 2 e + 第三章 3.3 输入与输出语句
例3.4: #include "stdio.h" void main() { int a=3,b=4; printf("%d\n",(a=b,b,a+3)); /*输出序列是一个逗号表达式*/ printf("%d\n",a=b,b,a+3); /*输出第一个参数变量a的值*/ } 输出结果为: 7 4
3.3.4 格式输入函数 1.scanf函数的一般形式: scanf(格式控制,地址表列); ◆由若干个地址组成的表列。 3.3.4 格式输入函数 1.scanf函数的一般形式: scanf(格式控制,地址表列); ◆由若干个地址组成的表列。 ◆必须用英文的双引号括起来。 ◆变量的地址、字符串的首地址、指针变量等,以逗号(,)间隔。 ◆由普通字符和格式声明组成。
2.格式控制: (1)组成: 普通字符、格式说明。 普通字符: 键盘输入时,要按原样输入,一般起分隔或提示作用。 但分隔或提示作用若由用户输入,就失去了本来的意义,一般采用printf来实现。 格式说明: %[ * ][ width ][ F|N ][ h|l ] type
(2)格式说明的形式: %[ * ][ width ][ F|N ][ h|l ] type 必需的格式字符,表示输入数据转换后的数据类型。 输入赋值抑制字符: 表示该格式说明要求输入数据,但不赋值,即在地址列表中没有对应有地址项。 地址大小修饰符: F:表示地址列表项中对应的地址为远指针; N:表示地址列表项中对应的地址为近指针。 数据输入类型: h:短整型 l:长整型或双精度类型 宽度指示符: 表示该输入项最多可输入的字符个数。 如遇空格或不可转换的字符,读入的字符将减少。
(3)格式字符(type)一鉴表: 字符 说 明 d(D) 用来输入十进制整数 o(O) 用来输入八进制整数 x(X) 说 明 d(D) 用来输入十进制整数 o(O) 用来输入八进制整数 x(X) 用来输入以十六进制整数 i(I) 用来输入十、八(0开头)、十六(0x开头)进制整数 u(U) 用来输入无符号十进制整数 c 用来输入单个字符 s 用来输入字符串,将字符串送到一个字符数组中 f(e) 用来输入实娄,用小数形式或指数形式输入 g(G) 与f作用相同,e、f和g可以互换 n 不输入数据,只将该语句已成功读入的字符数(到%n为止)送到对应的地址中 % 输入百分号(%)
scanf (“i=%d",&i);printf (“i=%d",i); scanf ("%d%d%d", &a,&b,&c); &:取地址运算符。 表示将所输入后的数据放入对应地址的存储单元中。 i = 3 ↙ 输 入 出 1 2 或 , 错 i = 3 ↙ 输 入 出
scanf ("%d,%d,%d", &a,&b,&c); 1 , 2 3 ↙ 错 1 , 2 3 ↙ 错 a = b
例3.5: input a,b: 7⊔8↙ a=7,b=8 #include "stdio.h" void main() { int a,b; printf("input a,b:"); scanf("%d%d",&a,&b); printf("a=%d,b=%d",a,b); }
(4)注意事项: scanf()的格式控制字符串中没有转义字符。如scanf (“%d\n”, &a);是错误的。
3.4 顺序程序设计举例 例3.7:输入一个华氏温度,输出对应的摄氏温度。输出取1位小数。转换公式为 #include "stdio.h" void main() { float c,f; scanf("%f",&f); c=5.0/9*(f-32); printf("%.1f\n",c); } 注意数学表达式到C语言表达式的转换 程序演示
例3.8:输入两个整数a、b,将它们交换,例如a为3,b为5,交换后a为5,b为3。 #include "stdio.h" void main() { int a,b,t; /*t就相当于空杯子*/ scanf("%d,%d",&a,&b); printf("a=%d,b=%d\n",a,b); /*观察原来的值*/ t=a;a=b;b=t; /*观察交换后的值*/ } 用于交换变量a、b的方法通常称为两两交换法。 程序演示
例3.9:从键盘输入圆半径,求圆的面积和周长,结果保留两位小数 。 #include "stdio.h" #include "math.h" void main() { float r,area,peri; scanf("%f",&r); area=3.14*pow(r,2);/*函数pow(x,y)表示xy */ peri=2*3.14*r; printf("area=%.2f,peri=%.2f\n",area,peri); } 程序演示
小 结 1、表达式与语句的区别 2、格式化输入/输出语句的使用 3、简单顺序程序的编写