38
第第第 第第第第 C 第第第第 ——第第第第第第

第四章 最简单的 C 程序设计 —— 顺序程序设计

Embed Size (px)

DESCRIPTION

第四章 最简单的 C 程序设计 —— 顺序程序设计. 主要内容:. 4 .1 C 语句概述 4 .2 赋值语句 4 .3 数据输入输出的概念及在 C 语言中的实现 4 .4 字符数据的输入输出 4 .5 格式输入输出 4 .6 顺序结构程序设计举例. 4.1 C 语句概述. 与其它高级语言一样, C语言也是利用函数体中的可执行语句,向计算机系统发出操作命令 。按照语句功能或构成的不同,可将C语言的语句分为五类。 ( 1 )控制语句 控制语句完成一定的控制功能。C语言只有9条控制语句,又可细分为三种: 选择结构控制语句 - PowerPoint PPT Presentation

Citation preview

Page 1: 第四章  最简单的 C 程序设计 —— 顺序程序设计

第四章 最简单的 C程序设计

——顺序程序设计

Page 2: 第四章  最简单的 C 程序设计 —— 顺序程序设计

主要内容:

4.1 C语句概述4.2 赋值语句4.3 数据输入输出的概念及在C语言中的实现4.4 字符数据的输入输出4.5 格式输入输出4.6 顺序结构程序设计举例

Page 3: 第四章  最简单的 C 程序设计 —— 顺序程序设计

4.1 C 语句概述 与其它高级语言一样,C语言也是利用函数体中的

可执行语句,向计算机系统发出操作命令。按照语句功能或构成的不同,可将C语言的语句分为五类。

( 1 )控制语句控制语句完成一定的控制功能。C语言只有9条控制语

句,又可细分为三种:选择结构控制语句 if() ~ else ~ , switch() ~循环结构控制语句 do ~ while(), for() ~ , while() ~ , break, con

tinue其它控制语句 goto, return

Page 4: 第四章  最简单的 C 程序设计 —— 顺序程序设计

( 2) 函数调用语句 函数调用语句由一次函数调用加一个分号(语句结束标

志)构成。例如 :printf("This is a C Program.");( 3) 表达式语句表达式语句由表达式后加一个分号构成。最典型的表达式

语句是,在赋值表达式后加一个分号构成的赋值语句。例如 :“num=5 ” 是一个赋值表达式,而“ num=5;”

却是一个赋值语句。( 4) 空语句空语句仅由一个分号构成。显然,空语句什么操作也不执

行。例如,下面就是一个空语句: ;

Page 5: 第四章  最简单的 C 程序设计 —— 顺序程序设计

( 5 ) 复合语句复合语句是由大括号括起来的一组(也可以是 1 条)语

句构成。例如: main() { …… {……} /* 复合语句。注意:右括号后不需要分号。 */ …… }复合语句的性质: ( 1 )在语法上和单一语句相同,即单一语句可以出现

的地方,也可以使用复合语句。( 2 )复合语句可以嵌套,即复合语句中也可出现复合

语句。( 3 )复合语句中最后一个语句中最后的分号不能忽略

不写,但是右括号后不需要分号。

Page 6: 第四章  最简单的 C 程序设计 —— 顺序程序设计

4.2 赋值语句

赋值语句由赋值表达式加上一个分号构成。

赋值语句和赋值表达式是不同的概念。赋值表达式可以包括在其他表达式中。

例如: if ((a=b)>0) t=a ;

作用是:先将 b 的值赋给 a ,然后判断 a 是否大于 0 ;若 a 大于 0 ,则执行语句 “ t=a ;” 。 if 后的 (a=b) 不是赋值语句,而是赋值表达式。if 后不能是赋值语句,写成“ if ((a=b ; )>0) t=a ;” 就错了。

Page 7: 第四章  最简单的 C 程序设计 —— 顺序程序设计

4.3 数据输入输出的概念及在 C 语言中的实现

1. 所谓的输入输出是以计算机主机为主体而言的。从计算机向外部输出设备(如显示器、打印机、磁盘等)输出数据称为“输出”,从输入设备(如键盘、磁盘、光盘、扫描仪等)向计算机输入数据称为“输入”。

2. C 语言不提供输入输出语句,输入输出操作由函数来实现。 C 标准库函数中提供一些输入输出函数,例如: printf 和 scanf 函数。不要误认为它们是 c 语言提供的“输入输出语句”。 c 提供的函数以库的形式存放在系统中,它们不是 c 语言文本中的组成部分。

Page 8: 第四章  最简单的 C 程序设计 —— 顺序程序设计

3. 使用 C 库函数时,要用预编译命令“ #include”将有关的“头文件”包括到用户源文件中。在调用标准输入输出库函数时,文件开头应有以下预编译命令: # include <stdio.h>

或 # include “stdio.h”

系统允许使用 printf 和 scanf 函数时,可不加 # include 命令。

Page 9: 第四章  最简单的 C 程序设计 —— 顺序程序设计

4.4 字符数据的输入输出

4.4.1 putchar 函数(字符输出函数) putchar 函数的作用是向终端输出一个字符。 例 putchar(c) ; 其中 c 可以是字符型变量或整型变量,也可以是一个字符型常量或 一个转义字符。 使用 putchar 函数,务必牢记:在程序(或文件)的开头加上编译预处理命令(也称包含命令),即: #include "stdio.h" 表示要使用的函数,包含在标准输入输出( stdio )头文件( .h )中。

Page 10: 第四章  最简单的 C 程序设计 —— 顺序程序设计

[ 例 4.1] #include "stdio.h" /* 编译预处理命令:文件包含 */

main(){char ch1='N', ch2='E', ch3='W'; int c1=65,c2,c3; c2=c1+1;c3=c2+1; putchar(ch1); putchar(ch2); putchar(ch3); putchar('\n');

/* 输出: NEW ,并换行 */

putchar(ch1); putchar('E'); putchar(ch3); putchar('\n'); /* 输出: NEW ,并换行 */

putchar (c1); putchar(c2); putchar(c3); putchar(‘!'); }

Page 11: 第四章  最简单的 C 程序设计 —— 顺序程序设计

4.4.2 getchar 函数(字符输入函数) getchar 函数的作用是从终端输入一个字符。 getchar 函数没有参数,其形式为: getchar() 程序中要使用 getchar 函数,必须在程序(或文件)的开头加上编译预处理命令: #include "stdio.h” 。 注意: getchar() 只能接收一个字符。 getchar 函数得到的字符可以赋给一个字符变量或整型变量,也可以不赋给任何变量,而作为表达式的一部分。

Page 12: 第四章  最简单的 C 程序设计 —— 顺序程序设计

[例 4.2] #include "stdio.h" /* 文件包含 */

main(){char ch;int c; printf("Please input two character: "); ch=getchar(); /* 输入 1 个字符并赋给 c

h */ putchar(c=getchar() ); /* 输入 1 个字符并赋给

c */ putchar('\t'); putchar(ch); putchar('\t'); putchar(c); putchar('\n'); }程序运行情况如下: Please input two characters: ab↙ b a b

Page 13: 第四章  最简单的 C 程序设计 —— 顺序程序设计

4.5 格式输入与输出 4.5.1 printf 函数(格式输出函数) printf 函数的作用:向计算机系统默认的输出

设备输出若干个任意类型的数据。一、 printf 函数的一般格式为:

printf(格式控制 ,输出表列 )例如: printf ( “ i= %d , c=%c\n ” , i ,

c )1.“格式控制”是由双引号括起来的字符串。

它包含两种信息:( 1 )格式说明: 由 % 和格式字符组成,作用

是将输出的数据转换为指定的格式输出。( 2 )普通字符:即需要原样输出的字符 。

Page 14: 第四章  最简单的 C 程序设计 —— 顺序程序设计

2.“输出表列”是需要输出的一些数据,可以是表达式,是可选的。

如果要输出的数据不止 1 个,相邻 2 个之间用逗号分开。下面的 printf() 函数都是合法的:

printf("I am a student.\n");printf("%d",3+2);printf("a=%f b=%5d\n", a, a+3);

必须强调:“格式控制”中的格式指示符,必须与“输出表列”中输出项的数据类型一致,否则会引起输出错误。

printf 函数的一般形式为: printf (参数 1 ,参数 2 ,参数 3 ,…… , 参数

n )printf 函数的功能是将参数 2 ~ 参数 n 按参数 1 的格式输出。

Page 15: 第四章  最简单的 C 程序设计 —— 顺序程序设计

二、格式字符 输出不同类型的数据,要使用不同的格式字

符。常用的有以下几种:1 . d 格式符:用来输出十进制整数。有以下几

种用法: ①%d :按整型数据的实际长度输出。 ②%md : m 为指定的输出宽度,如 %4d ,

m=4 。如果数据的位数小于 m ,则左端补空格,否则按数据的实际位数输出。 ③%ld :输出长整型数据。对长整型数据也

可以指定宽度。如:printf(“%8ld”,a);

Page 16: 第四章  最简单的 C 程序设计 —— 顺序程序设计

[ 例 4.3] 格式字符 d 的使用main()

{int n1=123; long n2=123456;

printf("n1=%d,n1=%5d,n1=%-5d,n1=%2d\n", n1,n1,n1,n1);

/* 用不同格式,输出 int 型数据 n1 的值 */

printf("n2=%ld,n2=%8ld,n2=%5ld\n", n2,n2,n2);

/* 用不同格式,输出 long 型数据 n2 的值 */

printf("n1=%ld\n",n1);

}

程序运行结果如下:n1=123,n1=□□123,n1=123□□,n1=123

n2=123456,n2=□□123456,n2=123456

n1=16908411

最后输出的 num1=16908411 是错误的,原因是格式不相符。

Page 17: 第四章  最简单的 C 程序设计 —— 顺序程序设计

2.o 格式符:以八进制形式输出整数。 对于整数,可用八进制( %o )输出。由于是将内存单元的各位的值( 0 或 1 )按八进制形式输出,因此输出的值不带符号,即将符号位也一起作为八进制数的一部分输出。可以指定宽度,如 printf(“%8o”,a) 。 对于长整数( long 型)可以用 %lo 形式输出。3.x 格式符:以十六进制形式输出整数。 对于整数,可用十六进制( %x )输出。同样不会出现负的十六进制数。可以指定宽度,如 printf(“%8x”,a) 。 对于长整数( long 型)可以用 %lx 形式输出。4.u 格式符:以十进制形式输出 unsigned 型整数。 一个有符号整数也可以用 %u格式输出, unsigned型也可以用 %d格式输出。按相互赋值的规则( 3.9节)处理。 unsigned 型也可以用 %o 或 %x格式输出。

Page 18: 第四章  最简单的 C 程序设计 —— 顺序程序设计

5 . c格式符:输出一个字符。 0 到 255范围内的整数 , 可用字符形式输出,输出前系统按 ASCII码表转换;反之,一个字符数据也可以用整数形式输出。[ 例 4.4] 字符的输出。main() {char c='A';int i=65; printf("c=%c,%5c,%d\n",c,c,c); printf("i=%d,%c",i,i); }程序运行结果如下: c=A,□□□□A,65 i=65,A

Page 19: 第四章  最简单的 C 程序设计 —— 顺序程序设计

6 . S格式符:输出一个字符串。用法有下面几种:①%s :如 printf(“%s”, “ CHINA”); 输出 :CHINA②%ms :如 %6s ,输出的字符串占m列,若字符串本身长度大于 m ,则将字符串全部输出,若串长度小于 m ,则左补空格。 ③ %-ms :如 %-6s ,与②的区别是右补空格。 ④ %m.ns :如 %6.4s ,输出占m列,但只取字符串左端的 n 个字符输出。这 n 个字符位于 m列的右侧,左补空格。 ⑤ %-m.ns :如 %-6.4s ,与④的区别是右补空格。

④和⑤是用于从一个长字符串中取左端的若干个字符。若 n>m ,则 m自动取 n 值,以保证 n 个字符正常输出。

Page 20: 第四章  最简单的 C 程序设计 —— 顺序程序设计

[ 例 4.5] 字符串的输出。main()

{printf("%s,%5s,%-10s,","internet","internet","internet");

printf("%10.5s,\n%-10.5s,%4.5s\n",

"internet","internet","internet");

}

程序运行结果如下:internet,internet,internet□□,□□□□□inter,

inter□□□□□,inter

注意:系统输出字符和字符串时,不输出单引号和双引号。

Page 21: 第四章  最简单的 C 程序设计 —— 顺序程序设计

7.f 格式符 : 以小数形式,输出单精度和双精度实数。有下面几种用法:① %f : 由系统自动指定输出宽度,整数部分全部如数输出,小数部分输出 6位。并非全部数字都是有效数字,单精度实数的有效位数一般是 7位。[ 例 4.6] 输出单精度实数的有效位数。main( ){float d1,d2; d1=111111.111; d2=222222.222; printf("%f\n", d1+d2);}结果为: 333333.328125

Page 22: 第四章  最简单的 C 程序设计 —— 顺序程序设计

双精度实数也可以用 %f格式输出,它的有效位数一般是 16位 , 给出 6位小数。

[ 例 4.7] 输出双精度实数的有效位数。main( ){double d1,d2; d1=1111111111111.111111111; d2=2222222222222.222222222; printf("d1+d2=%f\n",d1+d2);} 程序运行结果如下:d1+d2=3333333333333.333010

Page 23: 第四章  最简单的 C 程序设计 —— 顺序程序设计

②%m.nf : 输出的数据共占m列 , 其中 n位小数。若数值长度小于 m, 则左补空格。

③%-m.nf : 与②的区别是输出的数值向左端靠,右端补空格。[ 例 3.8] 输出实数时指定小数位数。

main()

{float f=123.456 ;

printf(“%f--%10f --%10.2f --%.2f--%-10.2f\n”,f,f,f,f,f);}

结果如下: ( 用 - 表示空格 )

123.456001--123.456001------123.46--123.46--123.46----

Page 24: 第四章  最简单的 C 程序设计 —— 顺序程序设计

8. e 格式符 , 以指数形式输出实数。 用法有下面几种:(1) %e: 不指定数据所占宽度和小数位数,由系统自动给出,小数部分给出 6位,指数部分占 5位。数值按规范化指数形式输出(即小数点前必须有而且只有 1位非零数字)。例如 printf(“%e”,123.456) 的输出是 : 1.234560e+002 ,占 13列。(2) %m.ne 或 %-m.ne : 数据占宽度m列,小数占宽度 n列, %-m.ne 与 %m.ne 的区别是数据向左端靠。 float f =123.456 ; printf(“%e--%10e--%10.2e--%.2e--%-10.2e”,f,f,f,f,f );输出如下:

1.234560e+002-- 1.234560e+002---1.23e+002 -- 1.23e+002 --1.23e+002 -

Page 25: 第四章  最简单的 C 程序设计 —— 顺序程序设计

9. g 格式符 , 用来输出实数。

根据输出数值的大小,自动选 f格式或 e格式(选择输出时占宽度较小的一种),且不输出无意义的零。

如: f=123.468;

printf(“%f--%e--%g”,f,f,f);

输出为 :

123.468000--1.234680e+002--123.468---

Page 26: 第四章  最简单的 C 程序设计 —— 顺序程序设计

Printf 函数的使用说明 ①格式字符 x 、 e 、 g 可以用小写字母,也可以用大写字母。除了 x 、 e 、 g格式字符外,其它格式字符必须用小写字母。

②可以在 printf 函数的“格式控制”字符串中包含“转义字符”。如“ \n” 、 “ \t” 、 “ \377” 、 “ \b” 、 “ \x41” 等。

printf 可以输出常量、变量和表达式的值。但格式控制中的格式说明符,必须按从左到右的顺序,与输出项表中的每个数据一一对应,否则出错。

③格式字符紧跟在“ %” 后面就作为格式字符,否则将作为普通字符使用(原样输出)。

例如 :“printf (“c=%c,f=%f\n”, c, f);” 中的第一个 c 和 f ,都是普通字符。

④如果想输出“ %” ,则要在“格式控制”字符串中用两个连续的 % 表示 , 如 :printf (“ %f%%” , 1.0/3); 输出为 : 0.333333%

Page 27: 第四章  最简单的 C 程序设计 —— 顺序程序设计

例 若 a1 、 a2 、 a3 、 a4均为 char 类型变量,则执行以下程序段后的输出结果为:

a1=‘1’;a2=‘2’; a3=‘3’;a4=‘4’; printf(“%1c\n”,a1); printf(“%2c\n”,a2); printf(“%3c\n”,a3); printf(“%4c\n”,a4); (A)1 (B)1 (C)1 (D) 输出格式的描述符不正确

2 2 02 3 3 003 4 4 0004

Page 28: 第四章  最简单的 C 程序设计 —— 顺序程序设计

例 若 x 为 int 类型变量,则执行以下程序段后的输出结果为:

x=0xDEF;

printf(“%4d\n”,x);

printf(“%40\n”,x);

printf(“%4x\n”,x);

(A)3567 (B)3567 (C)3567 (D)3567

6757 6757 06757 6757

def xdef 0xdef 0def

Page 29: 第四章  最简单的 C 程序设计 —— 顺序程序设计

4.5.2 scanf 函数 (格式化输入 )scanf 函数是用来从输入设备向计算机主机输入数据的。1.scanf 函数的一般形式scanf(格式控制,地址列表 )格式控制含义同 printf 函数相同,“地址列表”是由

若干个地址组成的表列,可以是变量的地址或字符串的首地址。

[例 4.9] main(){int a , b, c ; scanf(“%d%d%d”, &a , &b , &c) ; printf(“%d , %d , %d \n”,a , b , c);} %d%d%d 表示按十进制整数形式输入数据,两个数

据间有一个或多个空格间隔 , 也可以用回车键或跳格键间隔。

Page 30: 第四章  最简单的 C 程序设计 —— 顺序程序设计

2.格式说明 ①对 unsigned 形变量所需的数据,可以用 %u 、%d 、 %o 、 %x格式输入。 ②可以指定输入数据所占列数,系统自动按列数截取所需数据。如“ scanf(“%3d%3d”,&a,&b);”, 若输入 123456, 系统自动将 123 赋给 a , 456 赋给 b 。 上面方法也适用于字符,如“ scanf(“%3c”,&ch);”,若连续输入 3 个字符 abc ,则系统将第一个字符 a 赋给 ch 。 ③如果在 % 后有一个“ *”附加说明符,表示跳过它指定的列数。如“ scanf(“%2d-%*3d-%2d”,&a, &b);”, 若输入 12-345-67 ,则 12 赋给 a ,跳过 345 , 67 赋给 b 。(用 - 表示空格) ④输入数据时不能规定精度。例如“ scanf(“%7.2f”,&a);” 是错误的。

Page 31: 第四章  最简单的 C 程序设计 —— 顺序程序设计

3. 使用 scanf 函数时应注意问题①在 scanf 函数中 ,“格式控制”后面应当是变量

地址,而不应是变量名。如果 a 和 b 是整型变量,那么 scanf(“%d,%d”,a,b) 是错的。 a 和 b前面必须加 & 。②如果在“格式控制”字符串中除格式说明外,

还有其它字符,则输入数据时必须对应地输入这些字符。

如“ scanf(“%d,%d”,&a,&b);”, 应输入“ 3,4” 。如“ scanf(“%d--%d”,&a,&b);”, 输入时应在 3 和 4间有

两个以上空格。如“ scanf(“a=%d,b=%d”,&a,&b);”, 应输入“ a=3,b=4” 。如“ scanf(“%d:%d:%c”,&a,&b,&c);”, 应输入“ 3:4:5” 。

Page 32: 第四章  最简单的 C 程序设计 —— 顺序程序设计

③在用 %c格式输入字符时 , 空格字符和“转义字符”都作为有效字符输入。

如“ scanf(“%c%c%c”,&c1,&c2,&c3);”, 若输入“ a-b-c”, 字符 a 赋给 c1, - 赋给 c2, 字符 b 赋给 c3 。④输入数据时,遇到以下情况,系统认为该数

据结束: a 、遇到空格,或者回车键,或者 Tab 键。 b 、按指定的宽度结束。例如“ %3d” ,只取 3

列。 c 、遇到非法输入。例如,在输入数值数据时,遇

到字母等非数值符号 ( 数值符号仅由数字字符 0-9 、小数点和正负号构成 ) 。

Page 33: 第四章  最简单的 C 程序设计 —— 顺序程序设计

提高人机交互性建议:为改善人机交互性,同时简化输入操作,在设计输入操作时,一般先用 printf 函数输出一个提示信息,再用 scanf 函数进行数据输入。

例如:将 scanf("num1=%d,num2=%d\n",&num1,&num2);改为: printf("num1="); scanf("%d",&num1); printf("num2="); scanf("%d",&num2);

Page 34: 第四章  最简单的 C 程序设计 —— 顺序程序设计

例 设 a 、 b 、 c 、 d均是 int 型的变量,为了使以下的程序段的输出为: 1234+123+12+1 ,正确的输入形式应当是

scanf(“%4d+%3d+%2d+%1d”,&a,&b,&c,&d);

printf(“%4d+%3d+%2d+%1d”,a,b,c,d);

(A)1234123121

(B)1234123412341234

(C)1234+1234+1234+1234

(D)1234+123+12+1

Page 35: 第四章  最简单的 C 程序设计 —— 顺序程序设计

4.6 顺序结构程序设计举例 在顺序结构程序中,各语句(或命令)是按照位置的

先后次序,顺序执行的,且每个语句都会被执行到。[ 例 4.10] 输入任意三个整数,求它们的和及平均值。 main(){int num1, num2 , num3 , sum ; float aver; printf(“Please input three numbers:”); scanf(“%d,%d,%d”,&num1,&num2,&num3); /* 输入三个整数 */ sum=num1+num2+num3; /*求累计和 */ aver=sum/3.0; /*求平均值 */ printf("num1=%d,num2=%d,num3=%d\n",num1,num2,num3); printf("sum=%d,aver=%7.2f\n",sum,aver);}

思考题:能否将“ aver=sum/3.0;” 中“ 3.0”改为“ 3”?

Page 36: 第四章  最简单的 C 程序设计 —— 顺序程序设计

[ 例 4.11] 求方程 ax2+bx+c=0 的实数根。 a , b , c由键盘输入, a≠0且 b2-4ac>0 。#include “math.h”main(){float a,b,c,disc,x1,x2; printf("Input a, b, c: "); scanf("%f,%f,%f",&a,&b,&c); /* 输入方程的三个系数的值 */

disc=b*b-4*a*c; /*求判别式的值赋给 disc*/

x1=(-b+sqrt(disc))/(2*a); x2=(-b-sqrt(disc))/(2*a); printf("\nx1=%6.2f\nx2=%6.2f\n",x1,x2);}

Page 37: 第四章  最简单的 C 程序设计 —— 顺序程序设计

[ 例 4.12] 从键盘输入一个小写字母,要求用大小写字母形式输出该字母及对应的 ASCII码值。#include "stdio.h"main(){char c1,c2; printf("Input a lowercase letter: "); c1=getchar(); putchar(c1);printf(",%d\n",c1); c2=c1-32; /* 将大写字母 c1 转换成对应的小写字母 c2 */

printf("%c,%d\n",c2,c2);}

程序运行情况如下: Input a lowercase letter: a↙ a,97 A,65

Page 38: 第四章  最简单的 C 程序设计 —— 顺序程序设计

在顺序结构程序中,一般包括以下几个部分: 1.程序开头的编译预处理命令。 在程序中要使用标准函数(又称库函数),除 printf 和 scanf 外,其它的都必须使用编译预处理命令,将相应的头文件包含进来。。

2.顺序结构程序的函数体中,是完成具体功能的各个语句和运算,主要包括:

( 1 )变量类型的说明。 ( 2 )提供数据语句。 ( 3 )运算部分。 ( 4 )输出部分。