c 程 序 设 计

86
C 程 程 程 程 程程程程程程程程程程程程程程程 程程程 ([email protected])

Upload: summer

Post on 12-Jan-2016

76 views

Category:

Documents


0 download

DESCRIPTION

C 程 序 设 计. 江南大学控制科学与工程研究中心 张正道 ([email protected]). 第 4 章 最简单的 C 程序设计 -- 顺序程序结构设计. 4.0 程序的三种基本结构 4.1 C 语句概述 4.2 赋值语句 4.3 数据输入输出的概念及其语言实现 4.4 字符的输入和输出 4.5 格式输入 与输出   4.6 程序举例. § 4.0 程序的三种基本结构. 近年来广泛采用 结构化程序设计 方法,使程序结构清晰、易读性强。 强调今后在学习中要采用此方法。 有三种基本结构:. 顺序结构. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: C  程 序 设 计

C 程 序 设 计江南大学控制科学与工程研究中心

张正道 ([email protected])

Page 2: C  程 序 设 计

第 4 章 最简单的 C 程序设计-- 顺序程序结构设计

4.0 程序的三种基本结构4.1 C 语句概述4.2 赋值语句4.3 数据输入输出的概念及其语言实现4.4 字符的输入和输出4.5 格式输入 与输出  4.6 程序举例

Page 3: C  程 序 设 计

§4.0 程序的三种基本结构 近年来广泛采用近年来广泛采用结构化程序设计结构化程序设计方法,使程序方法,使程序

结构清晰、易读性强。结构清晰、易读性强。强调今后在学习中要采强调今后在学习中要采用此方法。用此方法。

有三种基本结构:有三种基本结构:

顺序结构

选择结构

循环结构

已经证明,由以上基本结构组成的程序能处理任何复杂的问题。

一种按书写顺序执行的结构。

根据运行时的情况自动选择要执行的语句。

根据情况自动重复执行有关语句。

Page 4: C  程 序 设 计

§4.1 C 语句概述

C 程序

源程序文件 1 源程序文件 2 源程序文件 n

预编译命令 函数 1 函数 n

说明部分 执行部分 ( 语句 )

一个语句经编译后产生若干条机器指令。 C 语句用来完成一定操作。声明部分不称为语句,如: int a ;

C程序的执行部分是由语句组成的。 程序的功能也是由执行语句实现的。

Page 5: C  程 序 设 计

C程序对数据的处理是通过“语句”的执行来实现的。一条语句完成一项操作(或功能)。一个为实现特定目的的程序应包含若干条语句。

Page 6: C  程 序 设 计

表达式语句表达式语句由表达式加上分号“;”组成。其一般形式为: 表达式; 执行表达式语句就是计算表达式的值。例如: x=y+z; 赋值语句。 y+z; 加法运算语句,但计算结果不

能保留,无实际意义。 i++; 自增 1 语句, i 值增 1 。

C 程序语句分五类

Page 7: C  程 序 设 计

函数调用语句 由函数名、实际参数加上分号“;”组成。其一般形式为:

函数名 (实际参数表 ); 执行函数语句就是调用函数体并把实际参数赋予函数定义中的形式参数,然后执行被调函数体中的语句,求取函数值 (在第五章函数中再详细介绍 )。

例如: printf("C Program");

其功能是:调用库函数,输出字符串。

Page 8: C  程 序 设 计

标准函数调用的目的

( 1)如数学函数,为了得到函数的返回值。 这类函数的调用一般出现在表达式中,作为表达式语句的一部分。 一般不作为函数调用语句。

( 2)为了完成某项任务,而不是为了得到返回值。

在表达式中调用函数,实际上是转去执行一段预先设计好的程序,求出结果后返回调用点。 所以函数的值又叫函数的返回值。

调用这类函数时,就直接用函数调用语句。例: scanf("%f" , &x);

printf("%f" , x);

Page 9: C  程 序 设 计

控制语句 控制语句用于控制程序的流程,以实现程序

的各种结构方式。它们由特定的语句定义符组成。C语言有九种控制语句。 可分成以下三类:

(1) 条件判断语句 if 语句, switch 语句(2) 循环执行语句 do while 语句, while 语句, for 语句(3) 转向语句 break 语句, goto 语句, continue 语句, r

eturn 语句

Page 10: C  程 序 设 计

复合语句 把多个语句用括号 {} 括起来组成的一个语句称复合

语句。 在程序中应把复合语句看成是单条语句,而不是多条语句,例如 :

{

x=y+z;

a=b+c;

printf(“%d%d” , x , a) ; }

是一条复合语句。复合语句内的各条语句都必须以分号“ ;” 结尾,在括号“ }” 外不必再加分号。

Page 11: C  程 序 设 计

注意:(1) 在复合语句中的“内部数据描述语句”中定义的变量,是局部变量 , 仅在复合语句中有效。(2) 复合语句结束的“ } ” 之后,不需要分号。

(3) 复合语句可以出现在任何数据操作语句可以出现的地方。

Page 12: C  程 序 设 计

空语句 只有分号“;”组成的语句称为空语句。 空语句是什么也不执行的语句。在程序中空语句可用来作空循环体。

例如: while(getchar()!='\n');

其功能是:只要从键盘输入的字符不是回车则重新输入。这里的循环体为空语句。

Page 13: C  程 序 设 计

例 3-1 :

#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; } printf("a=%d\tb=%d\tc=%d\n",a,b,c);}

程序运行结果 a=11 b=21 c=31a=11 b=22 c=3.300000a=22 b=21 c=31

Page 14: C  程 序 设 计

§4.2 赋值语句 赋值语句是由赋值表达式加上一个分号构成的。其功能和特点都与赋值表达式相同。 但要注意:

①由于在赋值符“ =”右边的表达式也可以又是一个赋值表达式,因此,下述形式

变量 =( 变量 =表达式 );是成立的,从而形成嵌套的情形。其展开之后的一般形式为:变量 =变量 =…=表达式 ;

例如: a=b=c=5; 按照赋值运算符的右接合性,因此实际上等效于: c=5; b=c; a=b;

Page 15: C  程 序 设 计

② 注意在变量说明中给变量赋初值和赋值语句的区别。

给变量赋初值是变量说明的一部分,赋初值后的变

量与其后的其它同类变量之间仍必须用逗号间隔,

而赋值语句则必须用分号结尾。

如:变量赋初值: int a=5 , b;

赋值语句: a = 5;

Page 16: C  程 序 设 计

③在变量说明中,不允许连续给多个变量赋初值。如下述说明是错误的: int a=b=c=5 必须写为 int a=5,b=5,c=5; 而赋值语句允许连续赋值,如 a=b=c=5 ;

④注意赋值表达式和赋值语句的区别。赋值表达式是一种表达式,它可以出现在任何允许表达式出现的地方,而赋值语句则不能。

下述语句是合法的: if((x=y+5)>0) z=x; 语句的功能是,若表达式 x=y+5 大于 0则 z=x 。

下述语句是非法的: if((x=y+5;)>0) z=x; 因为 x=y+5; 是语句,不能出现在表达式中。

Page 17: C  程 序 设 计

⑤“=” 是赋值运算符,不是“等号”。如:

x=x+1

a = 1 与 a = = 1

要注意和等号的区别!

Page 18: C  程 序 设 计

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

输入和输出是以计算机主机为主体而言。 输出指外部设备:显示屏,打印机,磁盘,输入设备: 键盘,磁盘,光盘,扫描仪等。 默认输入设备是键盘,输出设备是显示器

C 语言不提供输入输出语句 ,而是由函数来完成。这样可以简化编译系统,提高可移植性。

在使用 C语言的输入输出函数(包括其它库函数)时,必须通过预编译命令“ #include”将有关的函数说明文件( *.h 头文件)包含到用户的源程序中。C语言中所以的输入输出函数包含在文件 stdio.h中,使用命令为: #include <stdio.h> 。

只有 printf 和 scanf 例外。

Page 19: C  程 序 设 计

4.4 字符数据的输入和输出1.putchar 函数 ( 字符输出函数)其作用是向默认终端(一般为显示器)输出单个字符。其作用是向默认终端(一般为显示器)输出单个字符。

其一般形式为:其一般形式为: putchar( 字符变量 C) ;

输出变量 c 的值, C 可以是字符型或整型变量例如: putchar('A'); 输出大写字母 A putchar(x); 输出字符变量 x 的值 putchar('\n'); 换行 对控制字符则执行控制功能,不在屏幕上显示。 对控制字符则执行控制功能,不在屏幕上显示。 使用本函数前必须要用文件包含命令:使用本函数前必须要用文件包含命令: #include<stdio.h>

Page 20: C  程 序 设 计

〔例〕:#include “stdio.h”

main ( )

{ char a ,b ,c ; a =‘B’ ; b =‘O’ ; c =‘Y’ ;

putchar(a) ; putchar(b) ; putchar( c);

}

运行结果 :BOY

若改为 :

putchar(a) ; putchar(‘\n’) ;

putchar(b); putchar(‘\n’) ;

putchar(c) ; putchar (‘\n’);

运行结果为 ?

Page 21: C  程 序 设 计

例例#include <stdio.h>

程序运行结果为:ABBC

main( ){ int a=65; char b='B'; putchar(a); putchar(65+1); putchar(b); putchar('B'+1); }

包含函数 putchar的头文件

Page 22: C  程 序 设 计

2. getchar() 函数 ( 字符输入函数)

getchar 函数的功能是从默认终端或系统指定的输入设备(一般为键盘)输入一个字符。

其一般形式为: getchar();

通常把输入的字符赋予一个字符变量,构成赋值语句,如:

char c; c=getchar();

Page 23: C  程 序 设 计

使用 getchar 函数还应注意几个问题:

1.getchar 函数只能接受单个字符,输入数字也按字符处理。输入多于一个字符时,只接收第一个字符。

2. 使用本函数前必须包含文件“ stdio.h”。

3.在 TC屏幕下运行含本函数程序时,将退出 TC 屏幕进入用户屏幕等待用户输入。输入完毕再返回 TC屏幕。利用这个特性,可以人为的让程序在指定位置停顿,直待用户按键确认后才能够继续运行。

Page 24: C  程 序 设 计

4.函数 getchar将回车键作为一个字符读入。如果程序中有两个以上函数 getchar时,应该一次性输入所需字符,最后再按回车键,如上例所示。

5. 无论输入的是英文字母或标点符号还是数字,都是作为字符输入 。

Page 25: C  程 序 设 计

【例】#include<stdio.h>

void main()

{

char c;

printf("input a character\n");

c=getchar();

putchar(c);

}

Putchar(getchar()) ;

Page 26: C  程 序 设 计

例:例:#include <stdio.h>

/* 说明函数 getchar 的原型包含在哪个文件中 */

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

Page 27: C  程 序 设 计

程序运行情况如下:

13↙

a=1 a=49 b=3 b=51

Page 28: C  程 序 设 计

§4.5 格式输入与输出1. printf 函数(格式输出函数 format )printf 的作用是向终端 ( 或系统隐含指定的输出

设备 ) 输出若干个任意类型的数据。一般格式: printf (格式控制,输出列表)

例如: printf (“ %d%d” , a , b ); 格式控制 输出列表printf (“ a=%d b=%d” , a , b ) 格式说明 普通字符 输出列表 结果 a=3 b=4

Page 29: C  程 序 设 计

函数调用的一般形式:函数调用的一般形式:

printf ( "格式控制字符串 " ,输出项列表);

◆ 必须用英文的双引号括起来。

◆ 作用是控制输出项的格式和输出一些提示信息。

◆ 要输出的表达式。◆ 常量、变量、运算符表达式、函数返回值等,每个输出项之间用逗号(,)分隔。

Page 30: C  程 序 设 计

格式控制串可由格式字符串和非格式字符串两种组格式控制串可由格式字符串和非格式字符串两种组成。格式字符串是以成。格式字符串是以 %% 开头的字符串,在开头的字符串,在 %% 后面跟后面跟有各种格式字符,以说明输出数据的类型、形式、有各种格式字符,以说明输出数据的类型、形式、长度、小数位数等。如“长度、小数位数等。如“ %d”%d” 表示按十进制整型输表示按十进制整型输出,“出,“ %ld”%ld” 表示按十进制长整型输出,“表示按十进制长整型输出,“ %c”%c” 表表示按字符型输出等。后面将专门给予讨论。示按字符型输出等。后面将专门给予讨论。

非格式字符串在输出时原样照印,在显示中起提示非格式字符串在输出时原样照印,在显示中起提示作用。 作用。

输出表列中给出了各个输出项, 要求格式字符串和输出表列中给出了各个输出项, 要求格式字符串和各输出项在数量和类型上应该一一对应。各输出项在数量和类型上应该一一对应。

Page 31: C  程 序 设 计

普通字符、转义字符、格式说明。普通字符、转义字符、格式说明。

普通字符普通字符:按原样输出,主要用于输出提示信息。按原样输出,主要用于输出提示信息。

转义字符转义字符:指明特定的操作。指明特定的操作。格式说明格式说明:由由 " % % " 和和 " 格式字符串格式字符串 " 组成:组成: %% 格式字符格式字符串。串。它表示按规定的格式输出数据。它表示按规定的格式输出数据。

Page 32: C  程 序 设 计

【例】 void main(){ int a=88,b=89; printf("%d %d\n",a,b); printf("%d,%d\n",a,b); printf("%c,%c\n",a,b); printf("a=%d,b=%d",a,b);}本例中四次输出了 a,b 的值。第四行的输出语句格式控制串中,两格式串 %d 之间加了一个空格 (非格式字符 ),所以输出的 a,b 值之间有一个空格。第五行的 printf 语句格式控制串中加入的是非格式字符逗号, 因此输出的 a,b 值之间加了一个逗号。第六行的格式串要求按字符型输出 a,b 值。第七行中为了提示输出结果又增加了非格式字符串。

Page 33: C  程 序 设 计

在在 Turbo CTurbo C 中格式字符串的一般形式为:中格式字符串的一般形式为:

[[ 标志标志 ][][ 输出最小宽度输出最小宽度 ][.][. 精度精度 ][][ 长度长度 ]] 类类型 型

其中方括号其中方括号 [][] 中的项为可选项。各项的意义中的项为可选项。各项的意义介绍如下:介绍如下:

2. 格式字符

Page 34: C  程 序 设 计

( 2 )格式说明的形式:

%[flags][width][.prec][F|N|h|L][type]

方括号表示该项可有可无

可选的标志字符◆- :左对齐输出,缺省为右对齐输出◆+ :正数输出加号 (+) ,负数输出减号 (-)◆ 空格:正数输出空格代替加号 (+) ,负数输 出减号 (-)如:% +d ,% -d ,% d 。 

十进制整数,指定输出宽度。▼ 指定宽度 > 实际宽度,补空格。▼ 指定宽度≤实际宽度,按实际输出。▼ 不指定宽度,按实际输出。如:%+ 10d

输出精度指示符。◆ 对整数,表示至少要输出的数字个数,不足补数字0,多出则原样输出。◆ 对实数,表示小数点后至多输出的数字个数,不足补数字0,多出则舍入处理。◆ 对字符串,表示最多输出的字符个数,不足补空格,多出则丢弃。

输出长度修饰符:F :输出远指针存放的地址。N :输出近指针存放的地址。H 或 h :输出短整型数据的值。L 或 l :输出长整型或双精度值。

格式字符,用来进行格式转换。

(重点掌握)

Page 35: C  程 序 设 计

1. 类型 类型字符用以表示输出数据的类型,其格式符和意义下

表所示: 格式字符 意 义 d 以十进制形式输出带符号整数 ( 正数不输出符号 ) o 以八进制形式输出无符号整数 ( 不输出前缀 O) x 以十六进制形式输出无符号整数 ( 不输出前缀 O

X) u 以十进制形式输出无符号整数 f 以小数形式输出单、双精度实数 e 以指数形式输出单、双精度实数 g 以 %f%e 中较短的输出宽度输出单、双精度实数 c 输出单个字符 s 输出字符串

Page 36: C  程 序 设 计

2. 标志标志字符为 - 、 + 、 # 、空格四种,其意义下表所示:

标 志 意 义 l 长整型,可由于 o,x,d 之前 - 结果左对齐,右边填空格 + 输出符号 ( 正号或负号 ) 空格输出值为正时冠 以空格,为负时冠以负号 # 对 c , s , d , u 类无影响;对 o 类, 在输

出时 加前缀 o ;对 x 类,在输出时加前缀 0x ;对 e,g,f 类当结果有小数时才给出小数点

Page 37: C  程 序 设 计

3. 输出最小宽度 用十进制整数来表示输出的最少位数。 若实际位数多于定义的宽度,则按实际位数输出, 若实际位数少于定义的宽度则补以空格或 0 。

4. 精度 精度格式符以“ .”开头,后跟十进制整数。本项的意义是:如果输出数字,则表示小数的位数;如果输出的是字符, 则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。

5. 长度 长度格式符为 h,l两种, h 表示按短整型量输出,l 表示按长整型量输出。

Page 38: C  程 序 设 计

d 格式符。用来输出十进制整数。 %d printf (“ %d , %d” , a , b ) ; %md printf (“ %4d , %4d” , a , b ) ;

a=123; b=12345; printf(%4d,%4d”,a,b); 123,12345�

%ld 输出长整型 printf (“ %ld,%ld”,a,b ) ;

如: a=1234; printf (“%10ld”,a) ; 则: 1234 � � � � � �

o 格式符。用来输出 8 进制整数。 %o %mo %lo

int a = -1; printf (“ %d , %o” , a , a );结果: - 1 , 177777

Page 39: C  程 序 设 计

x 格式符。用来输出 16 进制整数。%x %mx %lx

printf (“ %d , %o , %x” , a , a , a ); 结果: - 1 , 177777 , ffff

注意在八进制和十六进制中并不能,打印出0 或 0x 的先导符

printf (“ %d , 0%o , 0x%x” , a , a ,a );

结果: - 1 , 0177777 , 0xffff

Page 40: C  程 序 设 计

u 格式符 . 用来输出十进制无符号整数例: main ( )

{unsigned int a = 65535 ; int b = -2 ;printf (“ a=%d , %o , %x , %u\n”,a,a,a,a);printf (“ b=%d , %o , %x , %u\n”,b,b,b,b);}

运行结果为: a= -1 , 177777 , ffff , 65535 b= -2 , 177776 , fffe , 65534

以上四种格式可以互换,但是后三种无负数形式;第一种格式应用较多,但是要注意数据的表示范围与输

出格式的对应。int -32768~+32767 unsigned 0~65535

int 、 short 占 2B 内存, long 占 4B 内存

Page 41: C  程 序 设 计

c 格式符。用来输出一个字符。例: main ( ) {char a =‘a’ ; int b = 97 ; print (“ %c , %d\n” , a , a ); print (“ %c , %d” , b , b ); }

结果: a , 97

a , 97

整数的范围在 0~255 之间,可以用字符形式输出;一个字符数据可以用整数形式输出。也可指定字符宽度,如: printf (“ %3d” , c )

Page 42: C  程 序 设 计

s 格式符。用来输出一个字符串。 % s 原长输出 % ms 字符串占m 列,小于 m 左补空格 % -ms 大于 m原样输出,小于 m 右补空格 % m.ns 输出占m 列,只取字符串左端 n 个字符 % -m.ns n 个字符输出在 m 列的左侧,右补空格例: main ( ){printf (“ %3S , %7.2s , % .4s , % -5.3\n” ,

“ CHINA” ,“ CHINA” ,“ CHINA” ,“ CHINA” ); }

结果: CHINA , CH����� , CHIN , CHI � �

Page 43: C  程 序 设 计

f 格式符。用来输出实数,以小数形式输出。%f ,不指定字段宽度,由系统自动指定。整数部分

如数输出,并输出 6位小数。单精度实数有效位数为 7位;双精度实数有效位数为 16位,小数 6位。

如: main ( ){float x , y ; x=111111.111 ; y=222222.222 ;printf (“ %f” , x+y ); }

结果: 333333.326125

又如: main ( ){double x , y ; x=1111111111111.111111111 ;y=2222222222222.222222222 ;printf (“ %f” , x+y ); }

结果: 3333333333333.333010

Page 44: C  程 序 设 计

% m.nf 指定输出的数据占m 列,其中 n位小数;右对齐。

% -m.nf 同上,左对齐。例: main ( )

{ float f=123.456 ;printf (“ %f %12f %12.2f % -12.2f %.2f \n”,f,f,f,f ) ;}

结果 :123.455994123.455994123.46�� ������123.46123.46������

Page 45: C  程 序 设 计

e 格式符。以指数形式输出实数。% e 整数一位 , 小数 6位 , 指数 5位包括 e 和符号位 .

例 : printf(“%e,%e”,123.456,0.006543);

输出 :1.234560e+002,6.543000e-003

% m.ne 和 % -m.ne 其中 m 为输出宽度, - 为左齐 ,

n 为尾数的小数位数 .

例 : 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 46: C  程 序 设 计

g 格式符。用来输出实数,自动选用 %f 或%e 格式中格式较短的一种格式,不输出无意义的零。

如: float f = 123.456 ; printf (“ %f , %e , %g” , f , f , f );输 :123.456000,1.234560e+002,123.456 ���

Page 47: C  程 序 设 计

例如:printf ("%d\n" , 100) ;

100

printf ( "%5d\n",100 );

100100

printf("%8d\n%8d″,100,100*100);

100100

1 0 0

1 0 0 0 0

100100

1 0 0

1 0 0 0 0

Page 48: C  程 序 设 计

例如:printf ("%o\n" , -1) ;

1 7 7 7 7 7

printf ("%x,%X\n" , -1);

1 7 7 7 7 7

f f f f , F F F F

printf ("%u,%d" , -1) ;1 7 7 7 7 7

f f f f , F F F F

6 5 5 3 5 , - 1

Page 49: C  程 序 设 计

printf ("%4c,%c\n" , 'A', 'A') ;printf ("%-8s,%8.2s" , " Name ", " Name ") ;

A , A

例如:

A , A

N a me - - - - , - - - - - - N a

Page 50: C  程 序 设 计

printf ("%f\n%10.3f\n" , 100.7654321, 100.7654321);printf ("%e\n%10.9e" , 100.7654321,100.7654321);

例如:

1 0 0 . 7 6 5 4 3 2

1 0 0 . 7 6 5

1 0 0 . 7 6 5 4 3 2

1 0 0 . 7 6 5

1 . 0 0 7 6 5 e + 2

1 . 0 0 7 6 5 4 3 2 e + 2

Page 51: C  程 序 设 计

使用使用 printfprintf 函数时函数时 ,, 要注意要注意 ::

X,E,G 可以用大写, 但 d 不能写成 D 格式控制字符串中可以包括转义字符 d 、 o 、 x 、 u 、 c 、 s 、 f 、 e 、 g等字

符,紧接在“ %” 后面即为格式字符,在其它位置则为普通字符 printf(“c=%cf=%fs=%s”,c,f,s):

若想输出“ %” ,则用连续两个“ %” 表示 如: printf (“ %f % %” , 1.0/3 ); 输出: 0.333333% 不同系统的格式输出,可能会有些小差别

Page 52: C  程 序 设 计

【例】main(){ int a=15; float b=138.3576278; double c=35648256.3645687; char d='p'; printf("a=%d,%5d,%o,%x\n",a,a,a,a); printf("b=%f,%lf,%5.4lf,%e\n",b,b,b,b); printf("c=%lf,%f,%8.4lf\n",c,c,c); printf("d=%c,%8c\n",d,d); }

Page 53: C  程 序 设 计

本例第七行中以四种格式输出整型变量 a的值,其中“ %5d ”要求输出宽度为 5,而 a值为 15 只有两位故补三个空格。 第八行中以四种格式输出实型量 b的值。其中“ %f”和“ %lf ”格式的输出相同,说明“ l”符对“ f”类型无影响。“ %5.4lf”指定输出宽度为 5,精度为 4,由于实际长度超过 5故应该按实际位数输出,小数位数超过 4位部分被截去。第九行输出双精度实数,“ %8.4lf ”由于指定精度为 4位故截去了超过 4位的部分。第十行输出字符量 d,其中“ %bc ”指定输出

宽度为 8故在输出字符 p之前补加 7个空格。

Page 54: C  程 序 设 计

使用 printf 函数时还要注意一个问题, 那就是输出表列中的求值顺序。不同的编译系统不一定相同,可以从左到右, 也可从右到左。 Turbo C 是按从右到左进行的。

【例】void main(){ int i=8; printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i, --i, i++,i--,-i++,-i--);}

Page 55: C  程 序 设 计

因为 printf 函数对输出表中各量求值的顺序是自右

至左进行 的。在式中,先对最后一项“ -i--”求值,

结果为 -8,然后 i 自减 1 后为 7 。 再对“ -i++”项求

值得 -7 ,然后 i 自增 1 后为 8 。再对“ i--”项求值

得 8 ,然后 i 再自减 1 后为 7 。再求“ i++”项得 7 ,

然后 I 再自增 1 后为 8 。 再求“ --i”项, i先自减 1

后输出,输出值为 7 。 最后才求输出表列中的第一

项“ ++i” ,此时 i 自增 1 后输出 8 。但是必须注意,

求值顺序虽是自右至左,但是输出顺序还是从左至

右, 因此得到的结果是上述输出结果。

Page 56: C  程 序 设 计

3. scanf 函数(格式输入函数)scanf 格式输入函数 , 用来输入任何类型的多个数据一般格式 : scanf ( 格式控制 ,地址列表 )

例 : main ( )

{ int a,b,c; scanf(“%d%d%d”,&a,&b,&c);

printf(“%d,%d,%d\n”,a,b,c);}

运行时的合法输入可以是 :

①345 345� � ② �� ���③3 3(④ 按 Tab 键 )4

45 5�非法输入为 :3 , 4 , 5

Page 57: C  程 序 设 计

3.3. 函数调用的一般形式函数调用的一般形式::

scanf ( "格式控制字符串 " ,地址列表);

◆ 必须用英文的双引号括起来。◆ 由普通字符和格式说明字符组成。

◆ 由若干个地址组成的列表。

◆ 变量的地址、字符串的首地址、指针变量等,以逗号(,)间隔。

Page 58: C  程 序 设 计

格式控制字符:格式控制字符:( 1 )组成:普通字符、格式说明。普通字符、格式说明。

普通字符普通字符:

格式说明格式说明:

键盘输入时,要按原样输入,一般起分隔或键盘输入时,要按原样输入,一般起分隔或提示作用。提示作用。但分隔或提示作用若由用户输入,就失去了但分隔或提示作用若由用户输入,就失去了本来的意义,一般采用本来的意义,一般采用 printfprintf 来实现。来实现。

%[ * ][ width ][ F|N ][ h|l ] type%[ * ][ width ][ F|N ][ h|l ] type

Page 59: C  程 序 设 计

( 2 )格式说明的形式:

%[ * ][ width ][ F|N ][ h|l ] type%[ * ][ width ][ F|N ][ h|l ] type

输入赋值抑制字符:表示该格式说明要求输入数据,但不赋值,即在地址列表中没有对应有地址项。

输入赋值抑制字符:表示该格式说明要求输入数据,但不赋值,即在地址列表中没有对应有地址项。

宽度指示符:表示该输入项最多可输入的字符个数。如遇空格或不可转换的字符,读入的字符将减少。

地址大小修饰符:F:表示地址列表项中对应的地址为远指针;N:表示地址列表项中对应的地址为近指针。

数据输入类型:h :短整型l :长整型或双精度类型

必需的格式字必需的格式字符,表示输入符,表示输入数据转换后的数据转换后的数据类型。数据类型。

Page 60: C  程 序 设 计

scanfscanf 函数是一个标准库函数,它的函数原函数是一个标准库函数,它的函数原型在头文件“型在头文件“ stdio.h”stdio.h” 中,与中,与 printfprintf 函函数相同,C语言也允许在使用数相同,C语言也允许在使用 scanfscanf 函数之函数之前不必包含前不必包含 stdio.hstdio.h 文件。 文件。

格式控制字符串的作用与格式控制字符串的作用与 printfprintf 函数相函数相同,但不能显示非格式字符串, 也就是不同,但不能显示非格式字符串, 也就是不能显示提示字符串。 能显示提示字符串。 地址表列中给出各变量的地址。 地址是地址表列中给出各变量的地址。 地址是由地址运算符“由地址运算符“ &”&” 后跟变量名组成的。后跟变量名组成的。

Page 61: C  程 序 设 计

例如, &a,&b 分别表示变量 a 和变量 b 的地址。这个地址就是编译系统在内存中给 a,b 变量分配的地址。在C语言中,使用了地址这个概念,这是与其它语言不同的。 应该把变量的值和变量的地址这两个不同的概念区别开来。变量的地址是 C 编译系统分配的,用户不必关心具体的地址是多少。 变量的地址和变量值的关系如下:

&a--->a567 a 为变量名, 567 是变量的值, &a是变量 a 的地址。

在赋值表达式中给变量赋值,如: a=567 在赋值号左边是变量名,不能写地址,而 scanf 函数在本质上也是给变量赋值,但要求写变量的地址,如 &a 。 这两者在形式上是不同的。 & 是一个取地址运算符, &a是一个表达式,其功能是求变量的地址。

Page 62: C  程 序 设 计

【例】 void main(){ int a,b,c; printf("input a,b,c\n"); scanf("%d%d%d",&a,&b,&c); printf("a=%d,b=%d,c=%d",a,b,c);} /*注意 & 的用法 !*/ 在本例中,由于 scanf 函数本身不能显示提示串,故先用 printf 语句输出提示信息。执行 scanf 时,进入 TC 的用户屏幕等待用户输入。用户输入 7 、 8 、9 后按下回车键,此时,系统又将返回 TC屏幕。在 scanf 语句的格式串中由于没有非格式字符在“ %d%d%d” 之间作输入时的间隔, 因此在输入时要用一个以上的空格或回车键作为每两个输入数之间的间隔。如: 7 8 9 或 7<CR> 8<CR> 9<CR>

Page 63: C  程 序 设 计

格式字符串格式字符串的一般形式为: %[*][ 输入数据宽度 ][ 长度 ] 类型 其中有方括号 [] 的项为任选项。意义如下: 类型:表示输入数据的类型,其格式符和意义如下。

格式 字符意义 d 输入十进制整数 o 输入八进制整数 x 输入十六进制整数 u 输入无符号十进制整数 f 或 e 输入实型数 ( 用小数形式或指数形式 ) c 输入单个字符 s 输入字符串

Page 64: C  程 序 设 计

“*” 符: 用以表示该输入项读入后不赋予相应的变量,即跳过该输入值。如:

scanf("%d %*d %d",&a,&b);当输入: 1 2 3 时,把 1 赋予 a , 2被跳过, 3 赋予 b 。

宽度: 用十进制整数指定输入的宽度 (即字符数 ) 。例如: scanf("%5d",&a); 输入: 12345678只把 12345 赋予变量 a ,其余部分被截去。又如: scanf("%4d%4d",&a,&b);输入: 12345678将把 1234 赋予 a ,而把 5678 赋予 b 。

长度: 长度格式符为 l 和 h , l 表示输入长整型数据(%ld) 和双精度浮点数 (%lf) 。 h 表示输入短整型数据。

Page 65: C  程 序 设 计

scanf (“i=%d" , &i) ; printf (“i=%d" , i) ;

scanf ("%d%d%d" , &a,&b,&c) ;

i = 3 0 ↙ 输入i = 3 0 输出

& :取地址运算符。表示将所输入后的数据放入对应地址的存储单元中。

&:取地址运算符。表示将所输入后的数据放入对应地址的存储单元中。

i = 3 0 ↙ 输入i = 3 0 输出1 2 3 ↙ 或1 ↙

2 ↙

3 ↙

1 , 2 , 3 ↙ 错

Page 66: C  程 序 设 计

scanf ("%d , %d , %d" , &a,&b,&c) ;

1 ,2 ,3 ↙

1 2 3 ↙ 错

scanf ("%d , %*d , %d" , &a,&b) ;

1 ,2 ,3 ↙

1 2 3 ↙ 错

1 ,2 ,3 ↙ a = 1 b = 3

Page 67: C  程 序 设 计

scanfscanf 函数格式说明函数格式说明 ::

1. 格式字符与 printf相同 ,只是没有 %u 和 %g

2.可以指定输入数据所占列数 , 系统自动按它截取所需数据 , 如 :

scanf(“%3d%3d”,&a,&b); 输入 :123456

3. % 号后的“ *”附加说明符 , 用来表示跳过它相应的数据。

4. 输入数据时不能规定精度 , 如 :

scanf(“%7.2f”,&a); 是不合法的 .

Page 68: C  程 序 设 计

应用应用 scanfscanf 函数应注意函数应注意 ::

1. 格式控制后面是变量地址 , 而不是变量名,如 :scanf ("%d",a); 是非法的,应改为 scnaf("%d",&

a);

2. 格式控制字符串中除了格式说明符以外的其它字符 , 在输入时要原样输入,如 :

scanf(“%d : %d : %d”, &a , &b ,&c);

scanf(“a=%d , b=%d , c=%d”, &a , &b ,&c);

3. scanf 函数中没有精度控制,如: scanf("%5.2f",&a); 是非法的。不能企图用此语句输入小数为 2位的实数。

Page 69: C  程 序 设 计

4. 在输入多个数值数据时,若格式控制串中没有非格式字符作输入 数据之间的间隔则可用空格, TAB 或回车作间隔。C 编译在碰到空 格, TAB ,回车或非法数据 ( 如对“ %d” 输入“ 12A” 时, A即为非法数据 ) 时即认为该数据结束。

5. 在输入字符数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。例如:

scanf("%c%c%c",&a,&b,&c); 输入为: d e f 则把‘ d’ 赋予 a, ‘f’ 赋予 b,‘e’ 赋予 c 。 只有输入为: def 时,才能把‘ d’ 赋于 a,‘e’ 赋予 b,‘f’

赋予 c 。 如果在格式控制中加入空格作为间隔,如: scanf ("%c %c %c",&a,&b,&c); 则输入时各数据之间可加空格。

Page 70: C  程 序 设 计

【例】void main(){ char a,b; printf("input character a,b\n"); scanf("%c%c",&a,&b); printf("%c%c\n",a,b);} 由于 scanf 函数 "%c%c" 中没有空格,输入

M N ,结果输出只有 M 。而输入改为 MN 时则可输出 MN两字符。

Page 71: C  程 序 设 计

【例】 void main(){ int a; printf(“input a number : "); scanf("%d",&a); printf("%ld",a);}由于输入数据类型为整型,而输出语句的格式串中

说明为长整型,因此当输入一个长整型数时,输出结果将和输入数据不符。如改动 a 的定义如下:

long a;运行结果为: input a long integer : 1234567890 1234567890 当输入数据改为长整型后,输入输出数据相等。

Page 72: C  程 序 设 计

【例】void main(){ char a,b,c; printf("input character a,b,c\n"); scanf("%c %c %c",&a,&b,&c); printf("%d,%d,%d\n%c,%c,%c\n",a,b,c,a-32,b-32,c-3

2); } 输入三个小写字母输出其 ASCII码和对应的大写字母。

Page 73: C  程 序 设 计

【例】void main(){ int a; long b; float f; double d; char c; printf("%d,%d,%d,%d,%d",sizeof(a),sizeof

(b), sizeof(f),sizeof(d),sizeof(c));} 输出各种数据类型的字节长度。

Page 74: C  程 序 设 计

§4.6 程序举例例 s=(a+b+c)/2

#include “math.h”

main()

{float a,b,c,s,area;

scanf(”%f,%f,%f”,&a,&b,&c);

s=1.0/2*(a+b+c);

area=sqrt(s*(s-a)*(s-b)*(s-c));

printf(“a=%7.2f,b=%7.2f,c=%7.2f\n”,a,b,c);

printf(“s=%7.2f,area=%7.2f\n”,s,area);}

运行 : 3,4,6

a=3.00,b=4.00,c=6.00��� ��� ���s=6.50,area=5.33��� ���

))()(( csbsassarea

Page 75: C  程 序 设 计

例 :

#include “stdio.h”

main()

{char c1 ,c2 ;

c1 = getchar();

printf(“%c,%d\n”, c1 ,c1);

c2 = c1+32;

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

运行 :A

A,65

a,97

Page 76: C  程 序 设 计

#include “stdio.h”main(){char c1 ,c2 ,c3,c4;c1 = getchar();c3 = getchar();printf(“%c,%d\n”, c1 ,c1);printf(“%c,%d\n”, c3 ,c4);c2 = c1+32;c4 = c4+32;printf(“%c,%d\n”,c2 ,c2);printf(“%c,%d\n”,c4 ,c4);}AB

Page 77: C  程 序 设 计

例:输入一个华氏温度,输出对应的摄氏温度。输出取1位小数。转换公式为 5

c (F 32)9

#include "stdio.h"void main(){float c,f;scanf("%f",&f);c=5.0/9*(f-32);printf("%.1f\n",c); }

注意数学表达式到 C语言表达式

的转换

Page 78: C  程 序 设 计

例:输入两个整数 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;

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

/*观察交换后的值 */

}

用于交换变量a、 b 的方法通常称为两两交换法。

Page 79: C  程 序 设 计

例:从键盘输入圆半径,求圆的面积和周长,结果保留两位小数 。

#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); }

Page 80: C  程 序 设 计

第四章结束

熟练掌握 printf和 scanf函数的用法

思考题

Page 81: C  程 序 设 计

顺序结构如流程图:

先执行 A 操作,再执行 B 操作,两者是顺序执行的关系。例程 1 :

int x , y , z ; x = 2 ; y = 3 ; z = x+y;

例程 2 : main ( ) {int a , b , c , d ;

a = 8 ; b = 9 ; c = + +a ; d = + +b ;printf (“ %d , %d , %d , %d”,a,b,c,d ); }

A B

A

B

Page 82: C  程 序 设 计

选择结构如流程图: 真 假

其中 p代表一个条件,当条件成立则执行 a ,否则执行 b ;且只能执行 a 、 b 之一。例如: if (x > y) z = x ; else z = y ;再如: if (x > 0) {i+ + ; sum = sum + x ; }

else { j+ + ; sub = sub + x ; }

p

a bA B

PY N

Page 83: C  程 序 设 计

循环结构循环结构循环结构循环结构

当条件成立(为“真”或非 0)时,反复执行程序段 A,否则不执行程序段A。

1. 当型循环结构 P

A

当 P 成立A

Page 84: C  程 序 设 计

先执行程序段 A,再判断条件是否为“真”(非 0);若为“真”(非 0),再执行 A,如此反复,直到条件为“假”( 0)为止。

2. 直到型循环结构

P

A

A

直到 P 成立

Page 85: C  程 序 设 计

思考题:1. 正确的赋值语句是:A) a=1,b=2 B) i++; c) a=b=5 d) y=int (x);

2 . 非法的转义字符是:(1) A) ‘\t’ B) ‘\018’ C) ‘\n’ D) ‘\xaa’

(2) A) ‘\\’ B) ‘101’ C) ‘\’’ D) ‘\xaa’

(3) A) ‘\t’ B) ‘\011’ C) ‘\n’ D) ‘\o17’

3. 不正确的八进制和十六进制数是:( 1 ) A) 0x16 B) 016 C) -16 D) 0xaaaa

(2) A) oxcc B) -017 C) -0x12 D) 0xffff 4. 不正确的数值和字符常量是:( 1 ) A) 0.0 B) 5L C) o13 D) 986l

(2) A) 8.9e1.2 B) 1e1 C) 0xFF00 D) 0.825e2

(3) A) “a” B)’\’” C) 0xaa D) 50.

Page 86: C  程 序 设 计

5. printf (“%d\n”, (int)(2.5+3.0)/3); 输出结果是:

A) 有语法错误 B) 2 C) 1 D) 0

6.main() {int a=9; a+=a-=a+a; printf(“%d\n”,a);} 输出结果是:

A) 18 B) 9 C) -18 D) -9

7. #include <stdio.h>

main() { char c1,c2,c3,c4,c5,c6;

scanf(“%c%c%c%c”, &c1, &c2, &c3, &c4);

c5=getcahr(); c6=getchar(); putchar(c1); putchar(c2);

printf (“%c%c\n”,c5,c6);}

若输入为: 123

45678

则输出: A) 1267 B) 1256 C) 1278 D) 1245