• 沒有找到結果。

第 6 章 回顾 数据类型和表达式

N/A
N/A
Protected

Academic year: 2021

Share "第 6 章 回顾 数据类型和表达式"

Copied!
29
0
0

加載中.... (立即查看全文)

全文

(1)

第 6 章 回顾 数据类型和表达式

6.1 教学要点

本章作为前五章的回顾,详细总结了 C 语言中可以使用的数据类型,要求学生准确掌 握各种数据类型的定义并能做到熟练使用。在此基础上,C 语言提供了多种运算符,和数据 组合后形成表达式,要求学生掌握各种表达式的语法和求解规则,丰富的运算符和表达式使 得 C 语言功能十分完善,鼓励学生灵活应用增加编程技巧。

6.1 节通过从数据在计算机内的存储格式入手,介绍整型、字符型、单精度和双精度实 型四种基本数据类型的存储方式。教师在讲解过程中,可以适当补充计算机概论的知识,帮 助学生加深理解。接下来,通过实例介绍了四种基本数据类型的定义、取值范围及其常量形 式,要求学生重点掌握 ASCII 字符集和转义字符的应用。

6.2 节通过实例介绍了在 C 语言中如何通过函数调用完成数据的输入和输出,要求学生 能熟练使用 scanf()、printf()、getchar()和 putchar()这四个基本输入输出函数,重点为格式控 制说明符。对于字符类型的数据,还要求学生能灵活运用这两组输入输出函数。

6.3 节通过实例介绍了 C 语言中不同类型数据混合运算的预处理-自动类型转换和强制 类型转换,使学生了解类型转换的原则和意义,避免在以后的实际开发中出现类似的错误。

6.4 节通过大量实例介绍了 C 语言的多种表达式和运算符,重点掌握各种运算符的优先 级和结合性。运算符丰富、表达式灵活是 C 语言不同于其他高级编程语言的特点,希望学 生能充分运用,熟能生巧,使编程能力得到进一步的提高。

本教材是以程序设计为主线,以编程应用为驱动,通过案例和问题引入内容,重点讲解 程序设计的思想和方法,穿插介绍相关的语言知识,因此本章将散布在前五章中的数据类型 和表达式等内容做了归纳性的汇总。由于知识点较多,需要学生在理解的基础上加强记忆,

最好能结合实践加深印象,提高学生的综合编程能力,培养良好的编程风格。

讲授学时:3 学时,实验学时:2 学时。

本章的知识能力结构图见图 6.1。

(2)

数据类型

类型转换

表达式 整型

(int)

实型

(float double)

字符型

(char)

常量和变量

自动类型转换

强制类型转换

逗号表达式

(,)

算术表达式

(+ - * / % ++ --)

赋值表达式

(= += -= *= /=

%=)

关系表达式

(== != > >= < <=)

逻辑表达式

(&& || !)

条件表达式

(? :)

其他运算

(sizeof () [] -> * &)

位运算

(& | ^ ~ << >>)

函数

格式化输入函数

(scanf)

格式化输出函数

(printf)

字符输入函数

(getchar)

字符输出函数

(putchar)

使

使

使

图 6.1 知识能力结构图

(3)

6.2 讲稿

1

Chap 6 回顾 数据类型和表达式

6.1 数据的存储和基本数据类型 6.2 数据的输入和输出

6.3 类型转换 6.4 表达式

本章分 4 节。

2

本章要点

C语言的基本数据类型有哪些?

各种基本数据类型的常量有哪些表现形 式?

C语言有哪些表达式?各种表达式的求解

规则是什么?

提出本章的学习要点。

3

数据类型和表达式

数据类型

基本数据类型

整型int

实型(浮点型)float double

字符型char

构造数据类型 数组、结构、联合、枚举

指针类型

空类型

运算:对数据的操作 运算符+数据 表达式

介绍 C 语言提供了四种基本的数据类型,

其中用这些基本类型还可以构造出许多 导出类型。C 语言还提供了许多运算符,

可以对不同类型的数据进行处理。这些运 算符与数据组合后便形成了表达式。

(4)

4

6.1 数据的存储和基本数据类型

6.1.1 数据的存储

整型、实型、字符型数据的存储 6.1.2 基本数据类型

整型与整型常量(整数)

字符型与字符型常量 实型与实型常量(实数)

不同类型的数据在计算机内存中的存放 方式也是各异的,了解数据的存储方式可 以帮助学生理解数据类型的概念和使用 方法。

5

6.1.1 数据的存储-整型数据

设整数在内存中用2个字节存储

1

000 0001 1000 0001

0

000 0001 1000 0001

符号位

1:负数 0:正数

整型数据的存储要点:最高位为符号位,

其余部分为该整型数据的绝对值。

提问:ppt 上所示的两个整数的值分别是 什么?

解答:-385 和+385。

6

数值的表示方法-原码 反码 补码

正数的原码、反码和补码相同

1的补码 0000 0000 0000 0001

……

32767的补码 0111 1111 1111 1111

(215-1,2个字节的存储单元能表示的最大正数)

负数的原码、反码和补码不同 -1

原码 1000 0000 0000 0001

反码 1111 1111 1111 1110 原码取反(符号位保持不变)

补码 1111 1111 1111 1111 反码+1

介绍数值的三种码制表示方法以及正数 和负数的表示方法要点。即:正数的原码、

反码和补码都相同;负数的反码即对原码 取反,补码即反码再加 1,要点是符号位 保持不变。

7

原码 反码 补码

32767

补码 0111 1111 1111 1111

-32767

原码 1111 1111 1111 1111

反码 1000 0000 0000 0000 原码取反(符号位保持不变)

补码 1000 0000 0000 0001 反码+1

-32768= -32767-1

补码 1000 0000 0000 0000 (2个字节的存储单元能表示的最小负数)

举例介绍正数和负数的原码、反码以及补 码的表示方法。由此可以看出,2 个字节 的 存 储 单 元 所 能 表 示 的 最 小 负 数 为 -32768,那么提出问题:2 个字节的存储 单元所能表示的最大正数为多少?答案 即为 32767。

(5)

8

-32768 -1 0 1 32767

32767 0111 1111 1111 1111

……

1 0000 0000 0000 0001 0 0000 0000 0000 0000 -1 1111 1111 1111 1111 -2 1111 1111 1111 1110

……

-327671000 0000 0000 0001 -327681000 0000 0000 0000

32767+ 1 =32768 ? 1000 0000 0000 000 =-32768

-32768- 1 =-32769 ? 0111 1111 1111 1111 =32767

以 2 个字节为例给出整型数据的表示范 围:-32768~+32767,以及二进制码的变 化规律,那么下面 2 个问题的答案即可得 出:(可提出溢出概念)

(1) 32767+1=32768?

(2) -32768-1=-32769?

9

实型和字符型数据的存储

实型数据的存储 -1.2345e+02 符号位 阶码 尾数

字符型数据的存储 一个字节存储ASCII码。

例如字符型常量 'A' 的ASCII码为65,它在内存 中以下列形式存放:

0 1 0 0 0 0 0 1

简单介绍实型数据和字符型数据的存储 方式。

实型数据存储示例:实数-1.2345e+02 是负 数,阶码是 2,尾数是 1.2345。

字符型数据存储示例:字符'A'的 ASCII 码 为 65,它在内存中以下列形式存放:

0 1 0 0 0 0 0 1

10

6.1.2 基本数据类型

整型

有符号整型 无符号整型 数据长度

int unsigned[int] 16或32位

short[int] unsigned short[int] 16位 long[int] unsigned long[int] 32位

字符型

char 8位

实型(浮点型)

单精度浮点型 float 32位 双精度浮点型 double64位

本小节介绍三种基本数据类型的数据长 度,尤其要注意整型数据的长度取决于机 器的字长。

11

基本数据类型-整型

扩展的整数类型:short long unsigned [int]

有符号整型 无符号整型 数据长度

int unsigned[int] 16或32位

short[int] unsigned short[int] 16位 long[int] unsigned long[int] 32位 有符号short

1

000 0000 0000 0000

-32768

-215

0

111 1111 1111 1111

32767

215-1 无符号unsigned short

0000 0000 0000 0000

0

1111 1111 1111 1111

65535

216-1

提出无符号整型数据的概念,顾名思义,

不带符号的整数,即零或正整数,不包括 负数。存储有符号的整型数据时,存储单 元的最高位是符号位,其余各位表示数 值;存储无符号(指定 unsigned)的整型 数据时,存储单元全部用于表示数值。

此处可引出问题:

(1) 哪些数据需要用有符号整型数据表 示?试举例说明。

(2) 哪些数据又可以用无符号整型数据表 示即可?试举例说明。

(6)

12

整数类型的取值范围

int 32位 -2147483648 ~ 2147483647 -231~ 231-1 short [int]16位 -32768 ~ 32767 -215~ 215-1 long [int]32位-2147483648 ~ 2147483647 -231~ 231-1

unsigned [int]32位 0 ~ 4294967295 0 ~ 232-1 unsigned short [int]16位0 ~ 65535 0 ~ 216-1 unsigned long [int] 32位0 ~ 4294967295 0 ~ 232-1

一个无符号整型变量中可以存放的数的 范围比一般整型变量中数的范围扩大一 倍。

13

整型常量(整数)

整数的表示 三种表现形式:

十进制整数:正、负号,0~9,首位不是0 例: 10,123

八进制整数:正、负号,0~7,首位是0 例: 010,0123

十六进制整数:正、负号,0~9,a~f,A~

F,前缀是0x,0X 例:0x10,0X123

介绍 C 语言中整数的三种表现形式及其特 点。

14

整数的表示

123 = 01111011 (B) 二进制

=173 (O) 八进制

=7B (X) 十六进制 123 0173 0x7b 16 020 0x10 10 012 0XA 10 010 0x10

不能超出整型数据的取值范围

比长整型数还要大的数只能用实数来表示

举例说明一个整数可以用不同的进制形 式来表示,注意括号内的进制标识代码。

15

整数的类型

判断整数的类型

整数后的字母后缀

123L long

123U unsigned

123LU unsigned long

整数的值

整数的类型取决于字母后缀。

(7)

16

基本数据类型-字符型

字符具有数值特征

'A' 65 0100 0001

整型变量和字符变量的定义和赋值可以互换

【 ASCII码范围】

char

c;

c = 'A';

c = 65;

int

i;

i = 65;

i = 'A';

字 符 型 数 据 存 储 时 是 将 该 字 符 相 应 的 ASCII 码放到存储单元中,实际上是以二 进制形式存放的,因此字符具有数值特 征。

比较左右两个例子中 c 和 i 变量的定义类 型以及它们的赋值方式。进一步考虑对 c 和 i 两个变量分别可以进行什么运算?输 出又有哪些方式可以选择?后面有详细 介绍。

17

字符型常量

字符常量

'a'、'A'、'9'、'+'、 '$'(注意:单引号)

ASCII字符集

列出所有可用的字符(256个)

每个字符:惟一的次序值( ASCII 码)

'0' ~'9' 升序排列

'A' ~'Z'

'a' ~'z'

重点介绍 ASCII 字符集的排列规律,以及 一些特殊字符的 ASCII 值。此处可以结合 教材附录 2 ASCII 码集进行讲解,如大小 写英文字母、数字 0~9 的 ASCII 码范围、

常用符号和特殊控制符的 ASCII 码值等。

18

字符的数值特征

字符-ASCII 码

对字符进行运算 - 对字符的ASCII 码进行运算

例如:

'A' 的 ASCII 码 65 则:'A'+1=66,对应字符 'B'

区分数字字符和数字

'1' 1

由于 C 语言中的字符具有数值特征,可以 像整数一样参加运算,此时相当于对字符 的 ASCII 码进行运算。

强调区分数字和数字字符是两个不同的 概念。

19 转 义 字 符

反斜杠后跟一个字符或数字

字符常量,代表一个字符 '\n' '\101' '\x41' 'A'

所有字符都可以用转义字符表示

转义字符使用场合:有一些字符,如回车、

退格等控制码,它们不能在屏幕上显示,

也无法从键盘输入,只能用转义字符来表 示。

转义字符表示方法:由反斜杠跟上一个字 符或数字组成,它把反斜杠后面的字符或 数字转换成别的意义。

需要强调:虽然转义字符形式上由多个字 符组成,但它是字符常量,只代表一个字 符,它的使用方法与其他字符常量相同。

(8)

20

基本数据类型-实型

实型(浮点型)数据

单精度浮点型

float

双精度浮点型

double

存储 数据精度 取值范围 (有效数字)

float 4字节 七/八位 ±(10-38~ 1038) double 8字节 十六位 ±(10308 ~ 10308 )

实数在 C 语言中又称浮点数,有两种表示 形式:十进制形式和指数形式。实型又分 为单精度和双精度两类,它们的精度和取 值范围不同,以实型为例介绍精度和取值 范围是两个不同的概念。

21

数据精度和取值范围

数据精度取值范围是两个不同的概念:

float x = 1234567.89;

虽在取值范围内,但无法精确表达。

float y = 1.2e55;

y 的精度要求不高,但超出取值范围。

并不是所有的实数都能在计算机中精确表示

实型常量的类型都是double

1234567.80

强调实型常量的类型是 double,但一个实 型常量也可以赋给一个 float 型变量。如:

float pi;

pi=3.14159;

22

实型常量(实数、浮点数)

实数的表示

浮点表示法

0.123 123.4 12. .12

科学计数法

6.026E-27 1.2e+30 1E-5

实数的类型

double

浮点表示法:实数由正号、负号、阿 拉伯数字 0~9 和小数点组成,必须有小 数点,并且小数点的前、后至少一边要有 数字。实数的浮点表示法又称实数的小数 形式。

科学计数法:实数由正号、负号、数 字和字母 e(或 E)组成,e 是指数的标志,

在 e 之前要有数据,e 之后的指数只能是 整数。实数的科学计数法又称实数的指数 形式。例如:

3.14 和 6.026E-27->合法 0.2E2.3 和 E-5->非法

23

6.2.1 整型数据的输入和输出 6.2.2 实型数据的输入和输出 6.2.3 字符型数据的输入和输出

6.2 数据的输入和输出

本节介绍不同类型数据的输入和输出方 法。主要围绕下列四个基本输入输出函数 来介绍:

scanf()

printf()

getchar()

putchar()

(9)

24

6.2.1 整型数据的输入输出

printf (格式控制, 输出参数1, ... , 输出参数n);

scanf (格式控制, 输入参数1, ... , 输入参数n);

格式控制说明

%…

十进制 八进制 十六进制

int %d %o %x

long %ld %lo %lx

unsigned %u %o %x

unsigned long %lu %lo %lx

本小节介绍整型数据所使用的输入输出 函数 scanf()和 printf()的格式。重点需要掌 握格式控制符与数据类型的对应关系。

25

输出整型数据示例(1)

# include <stdio.h>

int main(void) {

printf("%d, %o, %x\n", 10, 10, 10);

printf("%d, %d, %d\n", 10, 010, 0x10);

printf("%d, %x\n", 012, 012);

return 0;

}

0……01010

10, 12, a 10, 8, 16 10, a

根据格式控制说明,可以选用十进制、八 进制和十六进制 3 种形式来输出一个整 数,同时,该整数也可以有十进制、八进 制和十六进制 3 种表现形式,二者可以不 一致,输出结果以格式控制说明为准,但 该整数的数值是确定的。

26

输入整型数据示例(2)

# include <stdio.h>

int main(void) {

int a, b;

printf("input a, b:");

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

printf("%d%5d\n", a, b); /*%5d指定变量b的输出宽度为5 */

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

return 0;

}

input a, b: 17 17 15 17

f, 17

"%x%d"

该例说明,输入时,用格式控制说明指定 的形式来读入数据。以八进制形式读入 17,相当于将 017(即 15)赋值给变量 a。

思考:如果将 scanf("%o%d", &a, &b);

改为 scanf("%x%d", &a, &b); 输入数据 不变,输出结果会有什么不同?

答案:

23 17(中间有三个空格) 17, 17

27

6.2.2 实型数据的输入和输出

输入 scanf()

float:%f 或%e

以小数或指数形式输入一个单精度浮点数

double: %lf或%le

以小数或指数形式输入一个双精度浮点数

输出 printf()

float 和double使用相同的格式控制说明

%f

以小数形式输出浮点数,保留6位小数

%e

以指数形式输出

本小节介绍实型数据所使用的输入输出 函数 scanf()和 printf()的格式。重点需要掌 握格式控制符与数据类型的对应关系。尤 其要强调 float 型和 double 型数据在输入 时格式控制说明符的区别。

强调:当程序运行时输入实型数据有误,

建议首先检查是否混用了%f 与%lf。初学 者经常会犯这个错误,务必需要牢记。

(10)

28

实型数据输出格式示例

# include <stdio.h>

int main(void) {

double d = 3.1415926;

printf("%f, %e\n", d, d);

printf("%5.3f, %5.2f, %.2f\n", d, d, d);

return 0;

}

3.141593, 3.14159e+00 3.142, 3.14, 3.14

一共5位,小数部分3位,小数点占1位

在输出格式控制说明中,可以加宽度限定 词,指定实型数据的输出宽度。例如,输 出格式控制说明%m.nf,指定输出浮点型 数据时,保留 n 位小数,且输出宽度是 m

(包括符号位和小数点)。若数据的实际 位数小于 m,左端补空格,若大于 m,

按实际位数输出。示例结果讲解如下:

输出 d 的值 3.1415926 时,%5.3f 输出 3.142(保留 3 位小数),%5.2f 输出 3.14

(保留 2 位小数,左端补 1 个空格),%.2f 输出 3.14(保留 2 位小数,按实际位数)。

29

实型数据输出格式示例

# include <stdio.h>

int main(void) {

double d = 3.1415926;

printf("%f, %e\n", d, d);

printf("%5.3f, %5.2f, %.2f\n", d, d, d);

return 0;

}

3.141593, 3.14159e+00 3.142, 3.14, 3.14

一共5位,小数部分3位,小数点占1位

举例说明实型数据的输入和输出应用。示 例结果讲解如下:

由于 float 型只能保存 7 位有效数字,

double 型可以保存 16 位有效数字,输出数 据的下划线部分即为有效数字,由此可得 知,由于精度的关系,并不是所有实数都 可以在计算机中精确表示。

30

6.2.3 字符型数据输入输出

scanf() 和 printf()

%c

char ch;

scanf("%c", &ch);

printf("%c", ch);

getchar() 和 putchar()

char ch;

ch = getchar( );

putchar(ch);

输入输出一个字符

本小节介绍字符型数据所使用的输入输 出函数的格式。重点需要掌握格式控制符 与数据类型的对应关系。

scanf("%c", &ch) / ch=getchar() printf("%c", ch) / putchar(ch)

注意:getchar()和 putchar()都是针对单个 字符的输入和输出。通常情况下成对使 用。

31

输入输出字符示例

# include <stdio.h>

int main(void) {

char ch1, ch2;

ch1=getchar();

ch2=getchar();

putchar(ch1);

putchar('#');

putchar(ch2);

return 0;

}

Ab

A#b

举例说明 getchar()和 putchar()的用法。

注意:

(1) getchar()函数中参数可以省略,括号不 能省略;

(2) putchar()函数也可以输出单个字符常 量,参数用单引号括起来。

(11)

32

输入输出字符示例

# include <stdio.h>

int main(void) {

char ch1, ch2, ch3;

scanf("%c%c%c", &ch1, &ch2, &ch3);

printf("%c%c%c%c%c", ch1, '#', ch2, '#', ch3);

return 0;

}

AbC A#b#C

A bC A# #b

输入多个字符时,这些字符之间不能有间 隔。如果使用了间隔符(如空格''),由于 它本身也是字符,该间隔符就被作为输入 字符。在第二组输入数据中,输入字符 A 后,输入了一个空格,所以 ch2 的值是'',

ch3 的值是'b'。

33 介绍一个在编程中经常用到的字符转

换实例,要求寻找英文大小写字母转换的 运算规律。

34

字符运算

大小写英文字母转换 'b' - 'a' = 'B' - 'A'

……

'z' - 'a' = 'Z' - 'A'

'm'  'M' 'a'->'A' 'A'->'a'

'm' - 'a' + 'A' = 'M'

'M' - 'A' + 'a' = 'm'

'8' - '0' = 8

8 + '0' = '8'

数字字符和数字转换 9 - 0 = '9' - '0' '9' = 9 + '0'

'8'  8

'8'->8 8->'8'

介绍一些在编程中经常用到的字符运算,

要求寻找并总结规律。假设 ch 为 char 类 型,则:

(1) 大写字母->小写字母: ch=ch-‘A’+‘a’;

(2) 小写字母->大写字母: ch=ch-‘a’+‘A’;

(3) 数字字符->数值: ch=ch-‘0’;

(4) 数值->数字字符: ch=ch+‘0’;

(5) 特 殊 转 换 , 如 ‘A’ - >‘Z’ , ‘B’

->‘Y’,……‘Z’-> ‘A’: ch=‘A’+‘Z’-ch;

35

不同类型数据的混合运算,先转换为同一 类型,再运算。

6.3.1 自动类型转换

非赋值运算的类型转换

赋值运算的类型转换

6.3.2 强制类型转换

6.3 类型转换

本节主要介绍不同类型数据的混合运算,

运算的前提是这些数据首先要转换成同 一类型。数据类型的转换包括:

(1) 自动转换:由 C 语言编译系统自动完 成;

(2) 强制转换:通过特定的运算完成。

【例6-1】单词加密解析。输入一个英文单词(由6个小写英文字母组成),

按照下列过程将该单词加密:先将英文单词中的小写字母转换为对应的大 写字母,再将该大写字母的ASCII码对10整除后取其余数,从而得到一个 六位整数密码。

# include <stdio.h>

int main (void) { int i;

char ch_lower, ch_upper;

for (i = 1; i <= 6; i++) { scanf ("%c", &ch_lower);

if (ch_lower >= 'a' && ch_lower <= 'z') ch_upper = ch_lower - 'a' + 'A'; /*将小写字母转换为大写字母*/

printf ("%c->%c->%d\n", ch_lower, ch_upper, ch_upper%10);

} return 0;

}

friday f->F->0 r->R->2 i->I->3 d->D->8 a->A->5 y->Y->9

(12)

36

6.3.1 自动类型转换(非赋值运算)

水平方向:自动

垂直方向:低 高

double float

unsigned long long

unsigned unsigned short

int char, short

自动类型转换之非赋值运算方式:转换规 则所遵循的原则为保证运算的精度不降 低。

37

自动类型转换(非赋值运算)

'A' + 12– 10.05 65

77 66.95

double float

unsigned long long

unsigned unsigned short

int char, short

举例说明自动转换的详细步骤。

38

自动类型转换(赋值运算)

变量=表达式

计算赋值运算符右侧表达式的值

将赋值运算符右侧表达式的值赋给左侧的变量

将赋值运算符右侧表达式的类型 自动转换成

赋值号左侧变量的类型

自动类型转换之赋值运算方式:赋值运算 时,将赋值号右侧表达式的类型自动转换 成赋值号左侧变量的类型。

39

自动类型转换(赋值运算)

double x;

x = 1; x = ?

short a = 1000;

char b = 'A';

long c;

c = a + b; c = ?

int ai;

ai = 2.56; ai = ?

short bi;

bi = 0x12345678L

bi = ?

利用这条规则时,如果赋值号右侧表达式 的类型比赋值号左侧变量的类型级别高,

运算精度会降低。因此,在赋值运算时,

赋值号两侧数据的类型最好相同,至少右 侧数据的类型比左侧数据的类型级别低,

或者右侧数据的值在左侧变量的取值范 围内,否则,会导致运算精度降低,甚至 出现意想不到的结果。

(13)

40

6.3.2 强制类型转换

强制类型转换运算符

(类型名)

表达式

(double)3 (int)3.8 (double)(5/2) (double)5/2

3.0 3 2.0 2.5

使用强制类型转换运算符,可以将一个表 达式转换成给定的类型。注意:强制类型 转换是运算符而不是函数,故

(类型名) 表达式

类型名 (表达式) 

强制类型转换运算符的优先级较高,

与自增运算符 ++ 相同,它的结合性是从 右到左。例如:

(int)3.8 + 1.3->4.3 (int)(3.8 + 1.3)->5

41 注意:无论是自动类型转换,还是强制类

型转换,都是为了本次运算的需要,对数 据的类型进行临时转换,并没有改变数据 的定义。

42

表达式:由运算符和运算对象(操作数)组 成的有意义的运算式子,它的值和类型由 参加运算的运算符和运算对象决定。

运算符:具有运算功能的符号

运算对象:常量、变量和函数等表达式

算术表达式、赋值表达式、关系表达式、逻 辑表达式、条件表达式和逗号表达式等

6.4 表达式

本节主要介绍了 C 语言的多种表达式和相 应的运算符。要求准确掌握表达式的语法 规则以及运算符的运算规则,并能做到灵 活使用。

43

6.4.1 算术表达式-算术运算符

单目 + - ++ --

双目 + - * / %

注意

/ 整数除整数,得整数 1/4 = 0,10/3 = 3

% 模(求余): 针对整型数据 5%6 = 5,9%4 = 1,100%4 = 0

+

单目运算符, +10 和–10

双目运算符, x+10 和 y–10

双目运算符两侧操作数的类型要相同,否则,自动 类型转换后,再运算。

本小节主要介绍算术表达式的语法规则 和运算规律。算术运算符分为单目运算符 和双目运算符两类,单目运算符只需要一 个操作数,而双目运算符需要两个操作 数。

注意:

(1) 整除和取余运算都针对整型数据;

(2) +和-既可以当作单目运算又可以看作 双目运算。

强制类型转换示例

# include <stdio.h>

int main (void) {

int i;

double x;

x = 3.8;

i = (int) x;

printf ("x = %f, i = %d \n", x, i);

printf ("(double)(int)x = %f\n", (double)(int)x);

printf (" x mod 3 = %d\n", (int)x % 3);

return 0;

}

x = 3.800000, i = 3 (double)(int)x = 3.000000 x mod 3 = 0

(14)

44

自增运算符++和自减运算符--

int n;

n++ ++n n-- --n

(只适合变量运算)

使变量的值增1或减1

++n n++

n = n + 1

--n n--

n = n - 1

取变量的值作为表达式的值

++n

:n = n + 1;取n值作为表达式 ++n 的值

n++

:取n值作为表达式 n++ 的值;n = n + 1

自增运算符和自减运算符的运算对象 只能是变量,不能是常量或表达式。如:

3++或 ++(i+j)->非法的表达式

45

自增运算和自减运算

int n, m;

n=2;

m=++n;

n=2;

m=n++;

n=3

n=3 m=3

m=2 m=n

m=n+1 n=n+1 m=n

举例说明自增和自减运算的用法,注意 n++和++n 的区别。

(1) ++n 的运算顺序是:先执行 n=n+1,再 将 n 的值作为表达式++n 的值;

(2) n++的运算顺序是:先将 n 的值作为表 达式 n++的值,再执行 n=n+1。

46

算术运算符的优先级和结合性

单目+ - ++ -- 双目* / % 双目+ -

从右向左

-5 + 3%2 = (-5) + (3%2) = -4 3 * 5 % 3 = (3*5) % 3 = 0 -i++ -(i++)

在 C 语言中,计算表达式的值也需要按运 算符的优先级从高到低顺序计算。

如果操作数两侧运算符的优先级相同,则 按结合性(结合方向)决定计算顺序,若 结合方向为“从左到右”,则操作数先与 左面的运算符结合;若结合方向为“从右 到左”,则操作数先与右面的运算符结合。

具体可参阅教材附表 2。

47

写出C表达式

数学式  C算术表达式 s(s-a)(s-b)(s-c)

(x+2)e2x

a ac b b

2

24

C 算术表达式分别为:

s*(s-a)*(s-b)*(s-c) (x+2)*exp(2*x)

(-b+sqrt(b*b-4*a*c))/(2*a)

(15)

48

6.4.2 赋值表达式

赋值运算符

=

x = 3*4

优先级较低,结合性从右向左 x = y = 3

x = (y = 3)

本小节主要介绍赋值表达式的语法规则 和运算规律。

赋值运算符的特点:优先级别较低,结合 性是从右向左。

49

赋值表达式

变量

=

表达式

计算赋值运算符右侧表达式的值

将赋值运算符右侧表达式的值赋给左侧的变量

将赋值运算符左侧的变量的值作为表达式的值 右侧表达式的类型自动转换成左侧变量的类型

int n;

double x, y;

n = 3.14 * 2;

x = 10 / 4;

x = (y = 3);

解答如下:

n=6

解析:先计算 3.14*2 得 6.28,再通过赋值 运算符将该结果赋给整型变量 n,赋值过 程中自动转换为整型,因此 n 的值为 6;

x=2.0

解析:先计算 10 整除 4 得 2,再通过赋值 运算符将该结果赋给实型变量 x,赋值过 程中自动转换为实型,因此 x 的值为 2.0;

x=3.0

解析:先计算赋值表达式 y=3 的值得 3.0,

再通过赋值运算符将该结果赋给实型变 量 x,因此 x 的值为 3.0。

50

复合赋值运算符

赋值运算符

简单赋值运算符

=

复合赋值运算符

复合算术赋值运算符 += -= *= /= %=

复合位赋值运算符

赋值表达式

变量赋值运算符 表达式 x

+=

exp等价于 x

=

x

+

exp x

*=

y - 3 x =x *(y-3)

注意:x *= y -3 等价于 x=x*(y-3),而 不是 x=x*y–3。

(16)

51

6.4.3 关系表达式-关系运算符

比较两个操作数,比较的结果:真 假 x<y x<=y x==y

x>y x>=y x!=y

优先级

算术运算符

< <= > >=

== !=

赋值运算符

左结合

a > b == c d = a > b ch > 'a' + 1 d = a + b > c 3 <= x <= 5 b - 1 == a != c

(a > b)== c d = (a > b) ch > ('a' + 1) d = ((a + b) > c) (3 <= x) <= 5 ((b - 1) == a) != c

本小节主要介绍关系表达式的语法规则 和运算规律。

关系运算符的特点:优先级低于算术运算 符,高于赋值运算符和逗号运算符,结合 性是从左向右。

逗号表达式常用于 for 循环语句中对循环 变量进行初始化。

52

关系表达式

用关系运算符将2个表达式连接起来的式子 哪些是关系表达式?

a > b == c d = a > b ch > 'a' + 1 d = a + b > c b - 1 == a != c 3 <= x <= 5

关系运算的结果

1

0

char ch = 'w';

int a = 2, b = 3, c = 1, d, x=10;

0 0 1 1 0 1

关系表达式的运算结果是逻辑量。由于 C 语言没有逻辑型数据,就用整数 1 代表

“真”,0 代表“假”。

解析:判断一个复杂表达式是否为关系表 达式,只要看其最后一步运算是否为关系 运算即可。

注意:表达式 3 <= x< = 5 等价于(3 <=x)<=

5,无论 x 取何值,关系表达式 3<=x 的值 不是 1 就是 0,都小于 5,即 3 <=x<= 5 的 值恒为 1。由此看出,表达式 3 <= x <= 5 无法正确表示代数式“3<=x<=5”。

53

6.4.4 逻辑表达式-逻辑运算符

&& || !

逻辑运算结果:1(真)

0 (假)

逻辑运算对象:关系表达式或逻辑量 x >= 3

&&

x <= 5 !x

判断逻辑量的真假:非0

(真) 0 (假)

(ch >= 'a' &&ch <= 'z' ) ||( ch >= 'A' &&ch <= 'Z') ch == ' ' ||ch == '\n'

x >= 3 &&x <= 5

本小节主要介绍逻辑表达式的语法规则 和运算规律。

强调:逻辑运算对象是值为“真”或“假”

的逻辑量,它可以是任何类型的数据,如 整型、浮点型、字符型等,C 编译系统以 非 0 和 0 判定“真”和“假”。

54

逻辑运算的规则-真值表

x y x&&y x||y !x 0 0 1 0 1 1 0 1 0 1 1 0

0 0

0 非0

非0 0 非0 非0

要求掌握如何填写真值表。

(17)

55

优先级

!

算术运算符

关系运算符

&&

||

赋值运算符

左结合

逻辑运算符的优先级和结合性

a || b && c

!a && b x >= 3 && x <= 5

!x == 2 a || 3 + 10 && 2

a || (b && c) (!a) && b (x >= 3) && (x <= 5) (!x) == 2 a || ((3 + 10) && 2)

逻辑运算符的特点:逻辑非的优先级高于 算术运算符和关系运算符,其次按顺序为 逻辑与、逻辑或,均高于赋值运算符和逗 号运算符,结合性是从左向右。

56

逻辑表达式

用逻辑运算符将关系表达式或逻辑量连接起来 的式子

哪些是逻辑表达式?

a && b a || b && c

!a && b a || 3+10 && 2

!(x == 2)

!x == 2 ch || b

char ch = 'w';

int a = 2, b = 0, c = 0;

float x = 3.0;

0 1 0 1 1 0 1

exp1 && exp2

先 算 exp1, 若 其 值 为 0 , STOP

exp1 || exp2

先 算 exp1, 若 其 值 为 1 , STOP

解析:判断一个复杂表达式是否为逻辑表 达式,只要看其最后一步运算是否为逻辑 运算即可。

强调:求解用逻辑运算符&&或者||连接的 逻辑表达式时,按从左到右的顺序计算该 运算符两侧的操作数,一旦能得到表达式 的结果,就停止计算。例如:

(1)解逻辑表达式 exp1&&exp2 时,先算 exp1,若其值为 0,则 exp1&&exp2 的值 一定是 0。此时,已经没有必要计算 exp2 的值;

(2)求解逻辑表达式 exp1||exp2 时,先算 exp1,若其值为非 0,则 exp1||exp2 的值一 定是 1。此时,也不必计算 exp2 的值。

57

例[6-4]写出满足要求的逻辑表达式

x 为零

关系表达式 x == 0

逻辑表达式 !x

x 不为零

x != 0

x

x 和 y 不同时为零

!(x == 0 && y==0)

x != 0 || y!=0

x || y

x取0 !x 真 x取非0 !x 假 x取0 x==0 真 x取非0 x==0 假 等价

要求练习用真值表证明。

(18)

58

6.4.5 条件表达式

exp1 ? exp2 : exp3

非0 0

exp1 y = (x>0) ? x+2 : x*x;

int n;

(n>0) ? 2.9 : 1 n = 10 n = -10

2.9 1.0

if ( x>0 ) y=x+2;

else y=x*x;

x+2 x>0 y =

x2 x<=0

z = (a>b) ? a : b;

if ( a>b ) z = a;

else z = b;

本小节主要介绍条件表达式的语法规则 和运算规律。条件运算符是 C 语言中惟一 的一个三目运算符,它将 3 个表达式连结 在一起,组成条件表达式。一般形式是:

表达式1 ? 表达式 2 :表达式 3 运算过程是:先计算表达式 1 的值,如果 它的值为非 0(真),将表达式 2 的值作为 条件表达式的值,否则,将表达式 3 的值 作为条件表达式的值;

条件运算符的优先级较低,只比赋值运算 符高。它的结合方向是自右向左。

59

6.4.6 逗号表达式

表达式1,表达式2,

……,

表达式n

先计算表达式1,然后计算表达式2,……,最 后计算表达式n的值,并将表达式n的值作为逗 号表达式的值.

int a, b, c;

(a=2), (b=3), (c=a+b);

逗号运算符的优先级最低,左结合

a=2, b=3, c=a+b

本小节主要介绍逗号表达式的语法规则 和运算规律。

逗号运算符的优先级是所有运算符中最 低的,它的结合性是从左到右。

60

sum = 0;

for(i = 0; i <= 100; i++) sum = sum + i;

逗号表达式的用途

for(i = 0, sum = 0; i <= 100; i++) sum = sum + i;

for(i = 0, sum = 0; i <= 100; i++) sum+=i;

逗号表达式一个常用的场合就是在 for 循 环中为多个循环控制变量做初始化。

61

6.4.7 位运算

位逻辑运算

~

按位取反 单目 右结合

&

按位与

^

按位异或:相同取0,不同取1

|

按位或

移位运算

<<

对操作数左移给出的位数

>>

对操作数右移给出的位数

复合位赋值运算

本小节主要介绍位运算符的运算规则。

在使用位运算符时,注意以下几点:

① 位运算符中除~是单目运算,其余均为 二目运算;

② 位运算符所操作的操作数只能是整型 或字符型的数据以及它们的变体;

③ 操作数的移位运算不改变原操作数的 值。

(19)

62

位逻辑运算

x=0 00000000 00000000 y=3 00000000 00000011 x & y 00000000 00000000 x | y 00000000 00000011 x ^ y 00000000 00000011

1010 ^0101 =1111

注意区分:

& 和 |

&& 和||

~ 按位取反

& 按位与

^ 按位异或:相同取0,不同取1

| 按位或

x && y得 0 x || y得 1

位逻辑运算符的运算规则:

先将两个操作数(int 或 char 类型)化为 二进制数,然后按位运算。

对于位异或运算^有几个特殊的操作:

(1) a ^ a 的值为 0;

(2) a ^~ a = 二进制全 1 (如果 a 以 16 位 二进制表示,则为 65535);

(3) ~(a^~a) = 0;

(4) a 和 b 的值互换,可执行语句:

a^=b^=a^=b;

63

位移位运算

<< 对操作数左移给出的位数

>> 对操作数右移给出的位数

x<<3 将x向左移3位,空出的位用零填补 00111010 << 3

11010000 x>>3 将x向右移3位

00111010 >> 3 00000111

移位运算是指对操作数以二进制位为单 位进行左移或右移的操作。移位运算具体 实现有 3 种方式:循环移位、逻辑移位和 算术移位(带符号)。

①循环移位:在循环移位中,移入的 位等于移出的位;

②逻辑移位:在逻辑移位中,移出的 位丢失,移入的位取 0;

③算术移位:在算术移位中(带符号),

移出的位丢失,左移入的位取 0,右移入 的位取符号位,即最高位代表数据符号,

保持不变。

64

复合位赋值运算符

&=

|=

^=

>>=

<<=

a &= b 相当于 a = a & b a <<= 2 相当于 a = a << 2

复合位赋值运算符就是在=前加上位运算 符。

65

6.4.8 其他运算

长度运算符

sizeof

单目运算符,计算变量或数据类型的字节长度 int a;

sizeof(a)

求整型变量 a 的长度,值为4(bytes) sizeof(int)

求整型的长度,值为4 (bytes) sizeof(double)

求双精度浮点型的长度,值为8 (bytes)

本小节主要介绍其他一些比较特殊的,具 有专门用的途运算符。

长度运算符 sizeof 是一个单目运算符,

用来返回变量或数据类型的字节长 度。优点在于使用长度运算符可以增 强程序的可移植性,使之不受具体计 算机数据类型长度的限制。

(20)

66

运算符的优先级和结合性

( )

! - + ++ -- (类型名)sizeof

* / %

+ -

< <= > >=

== !=

&&

||

? :

= += -= *= /= %=

,

总结本章所介绍的运算符的优先级和结 合性,特点如下:

(1) C 语言中,运算符共分 15 个优先级,

分别用 1~15 来表示,1 表示优先级最 高,15 表示优先级最低。各个运算符 的优先级可参见附录 1;

C 语言中运算符的结合性分两类,左结合

(从左到右)和右结合(从右到左)。单 目运算符、三目运算符和赋值运算符的结 合性是从右到左,其他运算符的结合性是 从左到右。

67

6.4.9 程序解析-大小写字母转换

#include <stdio.h>

int main(void) {

char ch;

printf("input characters: ");

ch = getchar();

while(ch != '\n'){

if(ch >= 'A' && ch <= 'Z') ch = ch - 'A' + 'a';

else if((ch >= 'a' && ch <= 'z' ) ch = ch - 'a' + 'A';

putchar(ch);

ch = getchar();

} rerurn 0;

}

input 10 characters: Reold 123?

rEOLD 123?

while((ch = getchar())!= '\n')

(ch = getchar())!= '\n' ch = getchar() != '\n' 等价吗?

该例题是一个包含数据表达、运算和流程 控制的典型示例,程序中涉及到字符型数 据的表示,算术、赋值和关系运算,在实 现过程中使用了循环和分支结构,编程时 综合运用了前 5 章介绍的编程思想和语言 知识。

6.3 练习与习题参考答案

6.3.1 练习参考答案

练习 6-1 输入一个十进制数,输出相应的八进制数和十六进制数。例如:输入 31,输出 37 和 1F。

解答:

#include<stdio.h>

int main(void) {

intx;

printf("Enter x:");

scanf("%d", &x);

printf("%o %x\n", x, x);

return 0;

}

练习 6-2 在程序段:

(21)

printf("input a, b:");

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

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

中,如果将 scanf("%o%d", &a, &b) 改为 scanf("%x%d", &a, &b),仍输入 17 17,输出是什 么?

解答: 23 17(中间有三个空格)

练习 6-3 如果字符型变量 ch 的值是大写字母,怎样的运算可以把它转换为小写字母?

解答:ch=ch-‘A’+’a’;

练习 6-4 证明下列等价关系。

(1) a&&(b||c) 等价于 a&&b||a&&c 解答:

a b c a&&(b||c) a&&b a&&c a&&b||a&&c 0(假) 0(假) 0(假) 0 0 0 0 0(假) 0(假) 非 0(真) 0 0 0 0 0(假) 非 0(真) 0 0 0 0 0 0(假) 非 0(真) 非 0(真) 0 0 0 0 非 0(真) 0(假) 0(假) 0 0 0 0 非 0(真) 0(假) 非 0(真) 1 0 1 1 非 0(真) 非 0(真) 0(假) 1 1 0 1 非 0(真) 非 0(真) 非 0(真) 1 1 1 1

(2) a||(b&&c) 等价于 (a||b)&&(a||c) 解答:

a b c b&&c a||(b&&c) a||b a||c (a||b)&&(a||c)

0(假) 0(假) 0(假) 0 0 0 0 0

0(假) 0(假) 非 0(真) 0 0 0 1 0

0(假) 非 0(真) 0 0 0 1 0 0

0(假) 非 0(真) 非 0(真) 1 1 1 1 1

非 0(真) 0(假) 0(假) 0 1 1 1 1

非 0(真) 0(假) 非 0(真) 0 1 1 1 1 非 0(真) 非 0(真) 0(假) 0 1 1 1 1

(22)

非 0(真) 非 0(真) 非 0(真) 1 1 1 1 1

(3)!(a&&b) 等价于 !a||!b 解答:

a b a&&b !(a&&b) !a !b !a||!b

0(假) 0(假) 0 1 1 1 1

0(假) 非 0(真) 0 1 1 0 1 非 0(真) 0(假) 0 1 0 1 1 非 0(真) 非 0(真) 1 0 0 0 0

(4)!(a||b) 等价于 !a&&!b 解答:

a b a||b !(a||b) !a !b !a&&!b

0(假) 0(假) 0 1 1 1 1

0(假) 非 0(真) 1 0 1 0 0 非 0(真) 0(假) 1 0 0 1 0 非 0(真) 非 0(真) 1 0 0 0 0

6.3.2 习题参考答案 一、选择题

1 2 3 4 5

A D A A C

二、填空题

1、100000000111111111111111100000001111111110000001 2、x!=0

3、7

4、真假真真 5、c1 = 2, c2 = 5

三、程序设计题

1.分类统计字符个数:输入一行字符,统计出其中的英文字母、空格、数字和其他字符的个数。

试编写相应程序。

解答:

#include<stdio.h>

int main(void)

(23)

{

char c;

int blank, digit, letter, other;

printf("请输入一行字符,以回车符结束:");

c = getchar();

blank = digit = letter = other = 0;

while(c != '\n'){

if(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z') letter++;

else if(c >= '0' && c <= '9') digit++;

else if(c == ' ') blank++;

else other++;

c = getchar();

}

printf("letter = %d, blank = %d, digit = %d, other = %d\n", letter, blank, digit, other);

return 0;

}

2.使用函数累加由 n 个 a 构成的整数之和:输入两个正整数 a 和 n, 求 a+aa+aaa+aa„

a(n 个 a)之和。要求定义并调用函数 fn(a,n),它的功能是返回 aa„a(n 个 a)。例如,fn(3,2) 的返回值是 33。试编写相应程序。

解答:

#include<stdio.h>

longfn(long a, int n);

int main(void) { inti, n;

long a, sn;

scanf("%ld%d", &a, &n);

sn=0;

for(i=1; i<=n; i++) sn=sn+fn(a, i);

printf("sum=%ld\n", sn);

return 0;

}

longfn(long a, int n) { inti;

longtn=0;

for(i=1; i<=n; i++){

(24)

tn=tn+a;

a=a*10;

} returntn;

}

3.使用函数输出指定范围内的完数:输入两个正整数 m 和 n(1<=m,n<=1000),输出 m ~ n 之 间 的 所 有 完 数 , 完 数 就 是 因 子 和 与 它 本 身 相 等 的 数 。 要 求 定 义 并 调 用 函 数 factorsum(number),它的功能是返回 number 的因子和。例如,factorsum(12)的返回值是 16

(1+2+3+4+6)。试编写相应程序。

解答:

#include<stdio.h>

intfactorsum(int number);

int main(void) {

inti, m, n;

scanf("%d%d", &m, &n);

for (i=m; i<=n; i++)

if(factorsum(i)==i) printf("%d\n", i);

return 0;

}

intfactorsum(int number) { inti, sum;

sum = 1;

for(i=2; i<=number/2; i++)

if(number%i==0) sum = sum + i;

return sum;

}

4.使用函数输出指定范围内的 Fibonacci 数:输入两个正整数 m 和 n(1<=m,n<=10000),

输出 m ~n 之间所有的 Fibonacci 数。Fibonacci 序列(第 1 项起):1 1 2 3 5 8 13 21„„。要求定义并调用函数 fib(n),它的功能是返回第 n 项 Fibonacci 数。例如,fib(7)的 返回值是 13。试编写相应程序。

解答:

#include<stdio.h>

long fib(int n);

int main(void) { inti, m, n;

scanf("%d%d", &m, &n);

i=1;

while(fib(i)<=n){

(25)

if(fib(i)>=m) printf("%ld ", fib(i));

i++;

}

return 0;

}

long fib(int n) { inti;

long x1,x2,x;

if(n==1 || n==2) return 1;

else{

x1=1;x2=1;

for(i=3;i<=n;i++){

x=x1+x2;

x1=x2;

x2=x;

} return x;

} }

5.使用函数验证哥德巴赫猜想:任何一个不小于 6 的偶数均可表示为两个奇素数之和。

例如 6=3+3,8=3+5,„,18=5+13。将 6~100 之间的偶数都表示成两个素数之和,打印时 一行打印 5 组。试编写相应程序。

解答:

#include "stdio.h"

#include "math.h"

int prime(int m);

int main(void) {

int count, i, number;

count = 0;

for(number = 6; number <= 100; number =number + 2){

for(i = 3; i<= number/2; i = i + 2) if(prime(i) && prime(number - i)){

printf("%d=%d+%d ", number, i, number - i);

count++;

if(count % 5 == 0) printf("\n");

break;

} }

(26)

return 0;

}

int prime(int m) {

int k, i;

if(m == 1) return 0;

k = sqrt(m);

for(i = 2; i<= k; i++) if(m % i == 0) return 0;

return 1;

}

6.使用函数输出一个整数的逆序数:输入一个整数,将它逆序输出。要求定义并调用 函数 reverse(number),它的功能是返回 number 的逆序数。例如,reverse(12345)的返回值是 54321。试编写相应程序。

解答:

#include<stdio.h>

int reverse(int n);

int main(void) {

int x;

scanf("%d", &x);

printf("%d 的逆向是%d\n", x, reverse(x));

return 0;

}

int reverse (int n) {

int m, res;

if(n >= 0) m = n;

else

m = -n;

res = 0;

while(m != 0){

res= res* 10 + m % 10;

m = m / 10;

} if(n >= 0) return res;

else

(27)

return -res;

}

7.简单计算器:模拟简单运算器的工作,输入一个算式(没有空格),遇等号"="说明 输入结束,输出结果。假设计算器只能进行加、减、乘、除运算,运算数和结果都是整数,

4 种运算符的优先级相同,按从左到右的顺序计算。例如,输入 1+2*10-10/2=后,输出 10。

试编写相应程序。

解答:

#include<stdio.h>

int main(void) {

charop;

int operand1, operand2, res;

printf("请输入一个算式,以=结束:");

scanf("%d", &operand1);

op = getchar();

while(op != '='){

scanf("%d", &operand2);

switch(op){

case '+': res = operand1 + operand2; break;

case '-': res = operand1 - operand2; break;

case '*': res = operand1 * operand2; break;

case '/': res = operand1 / operand2; break;

default: res = 0;

} operand1 = res;

op = getchar();

}

printf("%d\n", res);

return 0;

}

8.统计一行文本的单词个数:输入一行字符,统计其中单词的个数。各单词之间用空 格分隔,空格数可以是多个。试编写相应程序。

解答:

#include<stdio.h>

int main(void) {

char c;

int count, word;

printf("请输入一行字符,以回车符结束:");

c = getchar();

(28)

count = word = 0;

while(c != '\n'){

if(c == ' ') word=0;

else if(word == 0){

count++;

word = 1;

}

c = getchar();

}

printf("count = %d\n", count);

return 0;

}

6.4 实验指导教材参考答案

一、调试示例:略 二、基础编程题

(1)分类统计字符个数:编写程序,输入一行字符,统计出其中的英文字母、空格、

数字和其他字符的个数。

解答:参见《C 语言程序设计》习题 6 中的三、程序设计题,第 1 题。

(2)使用函数累加由 n 个 a 构成的整数之和:输入两个正整数 a 和 n, 求 a+aa+aaa+aa„

a(n 个 a)之和。要求定义并调用函数 fn(a,n),它的功能是返回 aa„a(n 个 a)。例如,fn(3,2)的 返回值是 33。

解答:参见《C 语言程序设计》习题 6 中的三、程序设计题,第 2 题。

(3)使用函数输出指定范围内的完数:输入两个正整数 m 和 n(1m,n1000),输出 m ~ n 之间的所有完数,完数就是因子和与它本身相等的数(如 6=1+2+3)。要求定义并调用函数 factorsum(number),它的功能是返回 number 的因子和。例如,factorsum(12)的返回值是 16

(1+2+3+4+6)。

解答:参见《C 语言程序设计》习题 6 中的三、程序设计题,第 3 题。

(4)使用函数输出指定范围内的 Fibonacci 数:输入两个正整数 m 和 n(1m,n10000),

输出 m ~n 之间所有的 Fibonacci 数。Fibonacci 序列(第 1 项起):1、1、2、3、5、8、13、

21„„。要求定义并调用函数 fib(n),它的功能是返回第 n 项 Fibonacci 数。例如,fib(7)的返回 值是 13。

解答:参见《C 语言程序设计》习题 6 中的三、程序设计题,第 4 题。

(5)使用函数验证哥德巴赫猜想:任何一个不小于 6 的偶数均可表示为两个奇素数之和。

例如 6=3+3,8=3+5,„,18=5+13。将 6~100 之间的偶数都表示成两个素数之和,打印时一 行打印 5 组。素数就是只能被 1 和自身整除的正整数,最小的素数是 2。要求定义并调用函数 prime(m)判断 m 是否为素数,当 m 为素数时返回 1,否则返回 0。

參考文獻

相關文件

大型会议:

线性拟合与二次拟合 数据拟合的线性模型 一次多项式拟合公式..

超定方程组QR分解算法 数据拟合确定常微分方程..

(1)滿意 滿意 滿意 滿意 (2) 普通 普通 普通 (3) 不滿意 普通 不滿意 不滿意 不滿意 (4) 沒意見 沒意見 沒意見 沒意見.. 開放式題型的優 開放式題型的優

目錄的字型不一致 不一致 不一致 不一致 縮排格式.

電腦內部是使⽤用位元 (Bit) 這個基本單位來表⽰示資料 並儲存於記憶單元 (記憶體) 或輔助記憶單元 (硬碟) 中。.. 每個位元只可以表⽰示

Error t-Statistic Prob... Error t-Statistic

Error t-Statistic Prob... Error t-Statistic