112
全全 C 全全全全全全 全2全

全国 C 等级考试复习

  • Upload
    zoltin

  • View
    133

  • Download
    0

Embed Size (px)

DESCRIPTION

全国 C 等级考试复习. 第 2 次. p. x. 一、概念 指针是 c 的特色之一,也是难点。 使用指针能有效地表示复杂的数据结构;动态分配内存; 方便地使用数组,字符串;实现双向地址调用;使 c 能直接处 理单元地址,具有低级语言的特点。这对设计系统软件很重要。 对变量访问方式: 单元地址: 单元地址: 1000 10 a pa 1000 1 a - PowerPoint PPT Presentation

Citation preview

Page 1: 全国 C 等级考试复习

全国 C 等级考试复习

第 2 次

Page 2: 全国 C 等级考试复习

一、概念 指针是 c 的特色之一,也是难点。 使用指针能有效地表示复杂的数据结构;动态分配内存;方便地使用数组,字符串;实现双向地址调用;使 c 能直接处理单元地址,具有低级语言的特点。这对设计系统软件很重要。 对变量访问方式:单元地址: 单元地址: 1000 10 a pa 1000 1 a 1002 20 b pb 1002 2 b

x

p

Page 3: 全国 C 等级考试复习

main() main() { int a, b; { int a=1 ; b=2; a=10; int *pa, *pb;

b=20; pa=&a; pb=&b; printf (“%d,%d\n”,a, b); *pa=100; *pb=200;

} printf (“%d,%d\n”, *pa,*pb ); }

通过变量名访问:直接访问给变量赋值;将变量值输出

通过指针变量来访问:间接访问即由指针变量存放的地址来得到变量的值。

Page 4: 全国 C 等级考试复习

二、指针变量 指针——就是变量在内存中的地址。 指针变量——存放指针的变量,即用来存放 变量地址的变量。指针类型由其所指向的数据类型决定

指针变量定义: 类型标识符 * 变量名 int *pa, *pb; /* 定义 pa, pb 分别指向整型类型 */ float *pf1, *pf2; /* 定义 pf1, pf2 分别指向实型变量 */ char *pc1, *pc2; /* 定义 pc1,pc2 分别指向字符型变量 */

pa 和 pb 只可指向整型变量, 不可指向其他类型变量;pf1, pf2 只可指向实型;pc1, pc2 只可指向字符型;

Page 5: 全国 C 等级考试复习

1 、运算符 * :间接引用运算符 *p 表示指针变量 p 所指内容

*p 可用于左值 *p=2 ;& 取地址符 int x,*p; p=&x ; 则 *p=x; *&x=x; *p*&xx

注意:不允许将任何非地址类型的数据赋给指针变量

例: int a,*p; a=4; p=&a; scanf(“%d”,p); scanf(“%d”,&a); printf(“%d”,*p); printf(“%d”,a);

Page 6: 全国 C 等级考试复习

2 、指针变量的加法和减法运算包括 + +和 - -

指针运算是地址的运算:取决于指针指向的数据类型 (T) 。 px+n, px-n —— 将指针从当前位置 向前或向后移动 n 个数据单位。pxn 的结果为: pxnsizeof(T)px-py :两指针位置之间的数据个数,不是地址差。px-py 的结果为: ( px-py) / sizeof(T) y= px++ —— y= ( px++ ), 注意优先级和结合性y= ++ px —— y= ( ++ px) 问题: y= px++和 y= (px)++ 的意义?

int *p;p=p+1;

Page 7: 全国 C 等级考试复习

【 1.74 】已知: int a[]={1,2,3,4}, y, *p=a ;则执行语句 y = (*++p)-- ;之后 , 数组 a 各元素的值变为 ______。 A) 0,1,3,4 B) 1,1,3,4 C) 1,2,2,4 D) 1,2,3,3 变量 y 的值是 ____。 P ++pA) 1 B) 2 C) 3 D) 4 y 的值是 ++p 所指的对象的值 2 (*++p)– 则是 a[1] 的值自减

[ 知识点 ] 指针指向数组,地址所在的单元格值变化,也就是数组元素值的变化

a[0] a[1] a[2] a[3]

1 2 3 4

Page 8: 全国 C 等级考试复习

例 2 用函数实现两数交换 void swap(int *pa, int *pb) { int temp; temp=*pa; *pa=*pb; *pb=temp; } main ( ) { int a, b; int *pa1, *pb1; scanf(“%d,%d\n”,&a, &b); pa1=&a; pb1=&b; if (a< b) swap(pa1, pb1); printf(“%d,%d \n”,a, b); }

&a

&a

&a

&b

&b

&b

&b

&a

3

30

30

3

30&b

3&a

参数传递 函数中实现 a b

pa1 a

pb1 b

pa1

pa

a

bpb1

pb

pa1

pa

pb1

pb

a

b

Page 9: 全国 C 等级考试复习

例 3 :在函数中交换指针值。是不行的 void swap(int *pa, int *pb ) main( ) { int a, b; { int *p; /* 交换指针的值 int *pa,*pb; p=pa; 返回时, pa,pb scanf(“%d,%d”,&a, &b); pa=pb; 均释放,达不 pa1=&a; pb1=&b; pb=p; 到交换 a,b 的目 printf(“%d,%d\n”,a,b); } 的 */ if (a<b) swap(pa1,pa2); printf(“%d,%d\n”,a, b); } void swap(int *pa, int *pb) { int *p; /* 指针变量 p 未赋值,是随机值,可能会使系统不 *p=*p1; 正常 */ *p1=*p2; *p=*p2; }

Page 10: 全国 C 等级考试复习

【 1.77 】函数的功能是交换变量 x和 y 中的值,且通过正确调用返回交换的结果。能正确执行此功能的函数是 。 A) funa (int *x, int *y) B) funb (int x, int y) { int *p; { int t; p=x; *x=*y; *y=*p; t=x; x=y; y=t; } } C) func (int *x, int *y) D) func (int *x, int *y) { *x=*y; *y=*x; { *x=*x+*y; *y=*x-*y; *x=*x-*y; } }

[ 知识点 ] 指针指向数组

Page 11: 全国 C 等级考试复习

11

复习:一维数组元素及其地址表示

int a[5] = { 1, 2, 3, 4, 5 } ;

元素a[0]

a[1]

a[2]

a[3]

a[4]

地址 &a[0]

&a[1]

&a[2]

&a[3]

&a[4]

元素*a

*(a+1)

*(a+2)

*(a+3)

*(a+4)

地址a

a+1

a+2

a+3

a+4

Page 12: 全国 C 等级考试复习

12

复习:指向一维数组元素的指针int a[5] = { 1, 2, 3, 4, 5 } , *p;

p=a;

元素*p

*(p+1)

*(p+2)

*(p+3)

*(p+4)

地址p

p+1

p+2

p+3

p+4

地址a

a+1

a+2

a+3

a+4

元素a[0]

a[1]

a[2]

a[3]

a[4]

p=&a[0];等价于

指针变量 p 与数组名 a都表示数组的首地址 ,但数组名 a 是指针常量 ,而 p 是指针变量

Page 13: 全国 C 等级考试复习

13

复习:指向一维数组元素的指针

(1) p++ 合法 , 但 a++ 不合法 , 因为 a 是地址常量 , 不能改变 ,

而 p 是一个指针变量 , 可以改变

注意:

(2) 要注意指针变量的当前值,保证它指向数组中有效的元素(3) 注意指针变量的运算 ① *p++ *(p++) 先取 p 所指向的变量,再使 p 自加指向下一个变量

③ (*p)++ 先取 p 所指向的变量,再使变量的值加1

② *(p++) 与 *(++p) 不同, *(++p) 是先使 p 自加指向下一个变量,再取其值

(4) 指针变量也可以加下标 p[i] a[i] *(p+i)

Page 14: 全国 C 等级考试复习

14

#include <stdio.h>#define N 6void main( ){ int a[N]={ 1, 3, 4, 6, 7, 9 }; int temp, m=(N-1)/2; int *p , *q , *t ; p=a; q=a+N-1; t=a+m; for( ; p<=t; p++, q-- ) { temp=*p; *p=*q; *q=temp; } for( p=a; p<a+N; p++ ) printf(“%3d”, *p ); printf(“\n”); }

1

3

4

6

7

9

a[0]

a[1]

a[2]

a[3]

a[4]

a[5]

ap6N

a+5q

a+2t

9

1

7

3

6

4

2m

temp 1

a+1

a+4

a+2

a+3

34

a+3

a+2

例 : 将数组 a 中的 n 个数按相反顺序存放

Page 15: 全国 C 等级考试复习

【 1.68 】已知: char s[10], *p=s ,则在下列语句中,错误的语句是 。 A) p=s+5; B) s=p+s; p p+5C) s[2]=p[4]; D) *p=s[0];

[ 知识点 ] 注释:选项 B 有两处错误,一是数组名是常量,不能出现的赋值符号的左侧,二是指针变量只能和整数做加,不能和作为地址常量的数组名相加。

s[0] s[1] s[2] s[3] s[4] s[5] s[6] s[7] s[8] s[9]

s[0] s[1] s[4] s[3] s[4] s[5] s[6] s[7] s[8] s[9]

s[0] s[1] s[2] s[3] s[4] s[5] s[6] s[7] s[8] s[9]

Page 16: 全国 C 等级考试复习

【 1.69 】已知: char s[100]; int i ;则引用数组元素的错误的形式是 。 A) s[i+10] B) *(s+i) C) *(i+s) D) *((s++)+i)

[ 知识点 ] s 作为数组名是地址常量,而 s++是s=s+1, C 语言不允许对常量进行赋值

Page 17: 全国 C 等级考试复习

【 1.73 】已知: int a[ ]={1,2,3,4,5,6,7,8,9,10,11,12},*p=a ;则值为 3 的表达式是 。 A) p+=2,*(p++) B) p+=2,*++p C) p+=2,*p++ p p+2D) p+=2,++*p

*++p: 4 ,*p++ :a[2]++:4 ,++*p : a[3]:4

[ 知识点 ] 指针移动

1 2 3 4 5 6 7 8 9 10 11 12

Page 18: 全国 C 等级考试复习

【 1.70 】已知: char s[6], *ps=s ;则正确的赋值语句是 。 A) s="12345"; B) *s="12345"; C) ps="12345"; D) *ps="12345" ;

[ 知识点 ] 将字符串首地址赋值给指针,指针指向该字符串

Page 19: 全国 C 等级考试复习

19

二维数组的地址

a[0]

a[1]

a[2]

二维数组名 a 表示二维数组的首地址 , 也是第 0 行的首地址 , a &a[0]

a, &a[0]

a+1, &a[1]

a+2, &a[2]

a+1 代表第 1 行的首地址 , a+1 &a[1]

a+2 代表第 2 行的首地址 , a+2 &a[2] a[2]

a[1]

a[0]

元素

&a[2]

&a[1]

&a[0]

地址

a+2

a+1

a

地址

int a[3] ;

二维数组与指针

Page 20: 全国 C 等级考试复习

20

a[0][0]

a[0][1]

a[0][2]

a[0][3]

a[1][0]

a[1][1]

a[1][2]

a[1][3]

a[2][0]

a[2][1]

a[2][2]

a[2][3]

a, &a[0]

a+1, &a[1]

a+2, &a[2]

a[0], a[1], a[2] 既然是第二重一维数组名 , 它们就代表了相应一维数组的首地址 , 因此 a[0] 代表了第 0 行第 0 列元素的地址 , 即

二维数组的地址

a[1] &a[1][0] a[1]+2 &a[1][2]

a[2]&a[2][0]

a[2]+3&a[2][3]

a[0]&a[0][0]

a[0]+1&a[0][1]

a[2] &a[2][0] a[2]+3 &a[2][3]

a[1]+2&a[1][2]

a[1]&a[1][0]

a[0] &a[0][0] a[0]+1 &a[0][1]

Page 21: 全国 C 等级考试复习

21

二维数组的地址

a[0][0]

a[0][1]

a[0][2]

a[0][3]

a[1][0]

a[1][1]

a[1][2]

a[1][3]

a[2][0]

a[2][1]

a[2][2]

a[2][3]

a, &a[0]

a+1, &a[1]

a+2, &a[2]

a[0]&a[0][0]

a[2]+3&a[2][3]

因 a &a[0] , 所以 *a *(&a[0]) a[0] &a[0][0]

*a 表示元素 a[0][0] 的地址

*a*a+1 表示元素 a[0][1] 的地址*(a+1) 表示元素 a[1][0] 的地

址*(a+2)+3 表示元素 a[2][3] 的地址

*(a+2)+3

*(a+1)a[1]&a[1][0]

*a+1a[0]+1

&a[0][1]

即 : *a a[0] &a[0][0]

思考: *a,*a+1,*(a+1),*(a+2)+3 表示什么?

Page 22: 全国 C 等级考试复习

22

0 班

1 班

2 班

a

a+1

a+2

a[0]+0

第 0 班第 0 个战士

a[0]+4

第 0 班第 4 个战士

排长“指向”班,纵向管理,走一步就跳过 1 个班

班长“指向”战士,横向管理,走一步就只是指向下一个战士

二维数组 a 相当于排长

一维数组 a[0]、 a[1]、 a[2] 相当于班长

二维数组元素 a[0][1] 就相当于战士

Page 23: 全国 C 等级考试复习

23

• a+1与 a[0]+1 是不同的: a+1 是序号为 1 的行的首地址,指向序号为 1 的行(相当于排长走到序号为 1 班的第一个战士位置);而 a[0]+1 是指向 0行 1 列元素(相当于序号为 0 班的第 1 个战士 ) 。

• a、 a[0] 的值虽然相同,但是由于指针的类型不同(相当于排长和班长面对的对象一样,但意义不同), a 是指向一维数组, a[0] 指向 a[0][0] 元素,因此,进行加 1 运算,得到的结果是不一样的。

• 二维数组 a 是指向行的。在指向行的指针前面加一个 * ,就转换为指向列的指针。反之,在指向列的指针前面加一个 & ,就转换为指向行的指针。

Page 24: 全国 C 等级考试复习

24

例如: a和 a+1 是指向行的指针

*a 和 *(a+1) 是指向列的指针,分别指向 a 数组 0行 0列

的元素和 1行 0 列的元素反之: a[0] 是指向 0行 0 列元素的指针,由于 a[0] 等价于*(a+0) ,

因此 &a[0] 等价于 &*a ,也就是与 a 等价,指向二维数组

的第 0 行。不要简单的把 &a[i] 为求 a[i] 单元的物理地址,因为并不存在a[i] 这样一个实际的变量。 &a[i] (即 a 的值)与 a[i] 的值是一样的,但是含义不同。 &a[i] 指向行,而 a[i] 指向列。

Page 25: 全国 C 等级考试复习

25

小结:二维数组的地址分为行地址和列地址二维数组名 a 代表二维数组的首地址 , 即 : 第 0 行的地址为 a &a[0]

第 1 行的地址为 a+1 &a[1]第 2 行的地址为 a+2 &a[2]

二维数组的列地址即元素的地址元素

a[0][0]

a[0][1]

a[1][0]

a[1][2]

a[2][3]

地址&a[0][0]

&a[0][1]

&a[1][0]

&a[1][2]

&a[2][3]

地址a[0]

a[0]+1

a[1]

a[1]+2

a[2]+3

地址*a

*a+1

*(a+1)

*(a+1)+2

*(a+2)+3

元素*a[0]

*(a[0]+1)

*a[1]

*(a[1]+2)

*(a[2]+3)

元素**a

*(*a+1)

*(*(a+1))

*(*(a+1)+2)

*(*(a+2)+3)

Page 26: 全国 C 等级考试复习

26

指向二维数组的指针变量1 、指向数组元素的指针变量例:用指针变量输出二维数组中的元素#include<stdio.h>void main( ){ int a[3][4]={{1,3,5,7},{2,4,6,8},{9,10,11,12}}; int *p; for( p=a[0]; p<a[0]+12; p++) { if ( (p-a[0])%4==0 ) printf(“\n”); printf(“%4d”, *p); }}

思考:p=a;p=&a[0][0];p=*a;p=*a[0];

对对

Page 27: 全国 C 等级考试复习

27

指向二维数组元素的指针

普通指针变量 int *p ,可以指向整形数据或整型数组元素。

若使 p 不是指向整型变量,而是指向一个包含 m个元素的一维数组(即二维数组)。这时,如果 p先指向 a[0] (即 p=&a[0] ),则 p+1 不是指向a[0][1] ,而是指向 a[1] , p 的增值以一维数组的长度为单位。

那么指针变量 p 应该怎么定义呢?

Page 28: 全国 C 等级考试复习

28

2026

q

指向二维数组元素的指针int a[3][4];

int **p;

p=a; 合法吗?int x=36, *q,**p;q=&x;p=&q;

36

2010

x

2048

p20102026

a[0]

a[1]

a[2]

p 是二级指针 , 它指向一个整型指针变量q, 而 q 指向一个整型变量

a 是一种地址表示方法 , a 实际指向了第一重一维数组元素 a[0] ,而 a[0] 是第二重一维数组

a a[0][0]

a[0][1]

a[0][2]

a[0][3]

非法!

Page 29: 全国 C 等级考试复习

29

指向二维数组元素的指针

定义格式:类型名 ( *指针变量名) [ 数组长度 ] ;

int a[3][4];

int (*p)[4];

p=a;

p 指向一个包含有 4 个整型数据的一维数组

合法!

虽然在定义 p 的时候只用了一个 *,但 p 实际上是一个二级指针变量

*p 所指的对象是有 4 个整形元素的数组,即 p 是指向一维数组的指针。 p 的值就是该一维数组的起始地址, p 不能指向一维数组中的某个元素。

Page 30: 全国 C 等级考试复习

30

指向二维数组的指针变量例:输出二维数组中的元素#include<stdio.h>void main( ){ int a[3][4]={{1,3,5,7},{2,4,6,8},{9,10,11,12}}; int (*p)[4], i, j; p=a; for( i=0; i<3; i++) { for( j=0; j<4; j++) printf(“a[%d][%d]=%-4d”, i, j, *(*(p+i)+j) ); printf(“\n”); }}

分析: *(*(p+i)+j) 是什么?p=a => *(p+i)=a[i] => *(p+i)+j =a[i]+j =&a[i][j]

*(*(p+i)+j) = a[i][j]

Page 31: 全国 C 等级考试复习

【 1.67 】设有说明 int (*p)[4] ;其中的标识符 p 是 。 A) 4 个指向整型变量的指针变量 B) 指向 4 个整型变量的函数指针 C) 一个指向具有 4 个整型元素的一维数组的指针 D) 具有 4 个指向整型变量的指针元素的一维指针数组

[ 知识点 ] 题干中由于 *和 p 被小括号括起,所以 p 应被解释为一个指针,而后的下标运算符 [] 说明所指向的对象是一个有 4个 int 型元素的一维数组;如果是 int (*p)(), 则是指向函数的指针。对于 int *p[4], 则根据运算符的优先级,先考虑 p和 [] 运算符的关系,所以它就是一个指针数组了。

Page 32: 全国 C 等级考试复习

【 1.72 】已知: int a[4][3]={1,2,3,4,5,6,7,8,9,10,11,12}; int (*ptr)[3]=a,*p=a[0]; 则以下能够正确表示数组元素 a[1][2] 的表达式是 。 A) *(*(a+1)+2) pB) *(*(p+5)) C) (*ptr+1)+2 ptrD) *((ptr+1)[2])

a[0][0] a[0][1] a[0][2]

a[1][0] a[1][1] a[1][2]

a[2][0] a[2][1] a[2][2]

a[3][0] a[3][1] a[3][2]

Page 33: 全国 C 等级考试复习

【 1.71 】已知: char a[3][10]={"BeiJing","ShangHai","TianJin"}, *pa=a ;不能正确显示字符串 "ShangHai" 的语句是 。 A) printf("%s",a+1); B) printf("%s",*(a+1)); C) printf("%s",*a+1); D) printf("%s",&a[1][0]); pa

[ 知识点 ] 字符串

B e i J i n g \0

S h a n g H a i \0

T i a n J i n \0

Page 34: 全国 C 等级考试复习

指 针 数 组 ( 1 ) 一、指针数组的概念:1 、定义: 一个数组的各个元素均为指针类型数据,

称为指针数组,也就是说,指针数组中的每一个元素都相当于一个指针变量。2 、一维数组的定义形式: 类型名 * 数组名 [ 数组长度 ] ;例如: int *p[4] ; 由于 [ ] 比 * 优先级高,先有 p[4] 形式,是数组, 有 4 个元素。再与 p 前面的“ *” 结合,“ *” 表示 此数组是指针类型的,每个数组元素(相当于一 个指针变量)都可指向一个 int 型变量。

Page 35: 全国 C 等级考试复习

指 针 数 组 ( 2 )

例 10.27 将若干字符串按字母顺序(由小到大)输出。

注意:不要写成 int(*p)[4] ,这是指向大小为 4 的一维数组 的单个指针变量。

二、指针数组的运用

Page 36: 全国 C 等级考试复习

函数指针

指针变量可以指向变量地址、数组、字符串、动态分配地址,同时也可指向函数,每一个函数在编译时,系统会分配给该函数一个入口地址,函数名表示这个入口地址,那么,指向函数的指针变量称之函数指针变量 .

例如: float fun(int, char); float (* p)( ) ; p= fun ;

Page 37: 全国 C 等级考试复习

2 .用函数指针变量调用函数 可用函数指针来调用函数 . 其形式为: (* 函数指针变量名 )(< 实参表 >)

例如: int i=5 ; char ch=‘a’; float fun(int, char), (*p)( ) ; p= fun ; (*p)(i, ch) ; …

int i=5 ; char ch=’a’ ; float fun(int, char) ; fun(i, ch) ;

Page 38: 全国 C 等级考试复习

[[ 例例 77 .. 18]18] 利用直接函数调用,求函数返回值。利用直接函数调用,求函数返回值。

#include<stdio. h>

main()

{

int a= 3, b=5 ; float f1(), f2() ; printf(” % 4 . 1f \n”, f1(a, b)) ; printf(” % 4 . 1f \n”, f2(a, b)) ; }

float f1(int x, int y)

{ return x+y ; }

float f2(int x, int y)

{ return(1. 0*y)/ x ; }

运行结果: 8.0

1.7

Page 39: 全国 C 等级考试复习

[例 7. 19] 利用函数指针变量调用,求函数返回值 #include <stdio.h>sub(int x, int y, float(*fun)()) { float result ; result= (*fun)(x, y) ; printf(”% 4.1f\ n”, result) ; }float f1(int x1,int y1) { return x1+y1; }float f2(int x2,int y2) { return (y2*1.0)/x2; }main( ) { int a=3, b=5 ; float fl( ), f2() ; sub(a, b , f1) ; sub(a, b , f2) ; }

Page 40: 全国 C 等级考试复习

【 1.66 】说明语句 "int (*p)( ); " 的含义是 。 A) p 是一个指向一维数组的指针变量 B) p 是指针变量,指向一个整型数据 C) p 是一个指向函数的指针,该函数的返回值是一个整型 D) 以上都不对

[ 知识点 ] 函数返回值为指针的函数的定义

Page 41: 全国 C 等级考试复习

C程序设计快速进阶大学教程 23/4/21 41

结构体变量引用 结构体成员引用引用结构变量成员的一般形式是:结构体变量名 . 成员名. 为成员运算符,优先级最高,结合性为自左向右。例如:strStu1.iNum 第一个学生的学号strStu2.cSex 第二个学生的性别如果成员本身又是一个结构体则必须逐级找到最低级的成员才能使用。例如:strStu1.strBirthday.iMonth 第一个学生出生的月份成员可以在程序中单独使用,与普通变量完全相同。

Page 42: 全国 C 等级考试复习

C程序设计快速进阶大学教程 23/4/21 42

结构体与指针 • 一个指针变量也可以指向结构体变量,一个指针

变量当用来指向一个结构体变量时,称之为结构体指针变量。结构体指针变量中的值是所指向的结构体变量的首地址。通过结构体指针即可间接访问该结构变量。

• 结构体指针定义说明的一般形式为:• struct 结构名 * 结构指针变量名 ;

• struct student *pStrStudent;• pStrStudent =&strStu1;

Page 43: 全国 C 等级考试复习

C程序设计快速进阶大学教程 23/4/21 43

12.1.5 结构体与指针 • 通过结构体指针变量,就能间接地访问结构体变

量的各个成员。• 其访问的一般形式为:• (* 结构指针变量 ). 成员名• 或为:• 结构指针变量 -> 成员名• -> 为指向运算符,优先级最高,结合性为自左向

右。两种写法完全一样。• (*pStrStudent).iNum• 或者:• pStrStudent->iNum• 应该注意 (*pStrStudent) 两侧的括号不可少,因为

成员符 "." 的优先级高于 "*" 。

Page 44: 全国 C 等级考试复习

【 1.78 】有定义如下: struct sk { int a; float b; }data ,*p; 如果 p=&data ;则对于结构变量 data 的成员 a 的正确引用是 ____。 A)( *) .data.a B) (*p).a C) p->data.a D) p.data.a

[ 知识点 ] 结构体

Page 45: 全国 C 等级考试复习

【 1.79 】已知: struct st { int n; struct st *next; }; static struct st a[3]={1,&a[1],3,&a[2],5,&a[0]},*p; 如果下述语句的显示是 2 ,则对 p 的赋值是 ____。 printf("%d",++(p->next->n)); A) p=&a[0]; B) p=&a[1]; C) p=&a[2]; s[0] s[1] s[2]D) p=&a[3];

[ 知识点 ] 注释:使用 C对 p 进行赋值,则 p->next是a[0] 的地址,引用其成员 n 再做前增 1 运算,结果就是2 。

1 3 5

Page 46: 全国 C 等级考试复习

C程序设计快速进阶大学教程 23/4/21 46

结构体数组 数组的元素也可以是结构体类型的struct Student{ int iNum; char *pcName; char cSex; float fScore;}strStuArr[5];

Page 47: 全国 C 等级考试复习

C程序设计快速进阶大学教程 23/4/21 47

结构体数组 例 12.2 对学生表按照成绩从小到大排序#include <stdio.h>#include <string.h>/*声明结构体类型 */struct student{ int iNum; char *pcName; char cSex; float fScore;};int main(){ /* 定义结构体数组 */ struct student strStuArr[5]= {

{101,"Li ping",'M',45},{102,"Zhang ping",'M',62.5},{103,"He fang",'F',92.5},{104,"Cheng ling",'M',87},{105,"Wang ming",'F',58}

};

struct student strStuTemp; int i1,i2,iFlag;for(i1=0;i1<4;i1++) { iFlag=i1;

for(i2=i1+1;i2<5;i2++) if(strStuArr[i2].fScore<strStuArr[iFlag].fScore)

iFlag=i2; if(iFlag!=i1)

{ strStuTemp=strStuArr[i1]; strStuArr[i1]=strStuArr[iFlag];

strStuArr[iFlag]=strStuTemp;}

}for(i1=0;i1<5;i1++) {

printf("Num=%d Name=%s ",strStuArr[i1].iNum,strStuArr[i1].pcName);

printf("Sex=%c Score=%f\n",strStuArr[i1].cSex,strStuArr[i1].fScore);

} return 0;}

Page 48: 全国 C 等级考试复习

【 1.80 】已知: struct person { char name[10]; int age; }class[10]={"LiMing",29,"ZhangHong",21,"WangFang",22}; 下述表达式中,值为 72 的一个是 ____。 A) class[0]->age + class[1]->age+ class[2]->age B) class[1].name[5] C) person[1].name[5] D) clase->name[5]

[ 知识点 ] 字符所对应的 ASCII码值

Page 49: 全国 C 等级考试复习

【 1.81 】已知: struct { int i; char c; float a; }test; 则 sizeof(test) 的值是 。 A) 4 B) 5 C) 6 D) 7

[ 知识点 ] 结构体类型的长度是全体成员长度之和

Page 50: 全国 C 等级考试复习

【 1.82 】已知: union { int i; char c; float a; }test; 则 sizeof(test) 的值是 。 A) 4 B) 5 C) 6 D) 7

[ 知识点 ]共用体类型的长度是全体成员最长的长度

Page 51: 全国 C 等级考试复习

【 1.83 】已知: union u_type { int i; char ch; float a; }temp; 现在执行 "temp.i=266; printf("%d",temp.ch)" 的结果是 。 A) 266 B) 256 C) 10 D) 1

Page 52: 全国 C 等级考试复习

注释:联合变量 temp 的成员是占用同一存储单元,它的长度是 4 个字节。 266 的二进制表示是 100001010 ,存放在存储单元的低端两个字节,如下图:高字节 0 0 0 0 0 0 0 1低字节 0 0 0 0 1 0 1 0引用 temp.ch 进行输出,只取最低的第一个字节。

Page 53: 全国 C 等级考试复习

【 1.84 】若有以下程序段: struct dent { int n; int *m; }; int a=1,b=2,c=3; struct dent s[3] = { {101,&a},{102,&b},{103,&c} }; struct dent *p=s; 则以下表达式中值为 2 的是 。 A) (p++)->m B) *(p++)->m C) (*p).m D) *(++p)->m

Page 54: 全国 C 等级考试复习

注释:由于结构指针指向了结构数组的 0 号元素,所以表达式 (p++)->m 的含义是先取出m(变量 a 的地址),然后指针 p加 1 。表达式 *(p++)->m 的含义是先取出 m 的内容(变量 a 的值),然后指针 p 再加 1 。表达式 (*p).m 的含义是取出 m(变量 a 的地址)。表达式 *(++p)->m 的含义是先将指针 p加 1 ,然后再取 m 的内容(变量 b 的值)。

Page 55: 全国 C 等级考试复习

【 1.85 】若有以下说明语句,则对结构变量 pup中sex域的正确引用是 。 struct pupil { char name[20]; int sex; }pup,*p; p=&pup; A) p.pup.sex B) p->pup.sex C) (*p).pup.sex D) (*p).sex

Page 56: 全国 C 等级考试复习

【 1.86 】以下对结构变量 stul 中成员 age 的非法引用是 。 struct student { int age; int num; }stu1,*p; p=&stu1; A) stu1.age B) student.age C) p->age D) (*p).age

Page 57: 全国 C 等级考试复习

【 1.87 】若有以下定义和语句: union data { int i; char c; float f; }a; int n; 则以下语句正确的是 ______ 。A) a=5; B) a={2,’a’,1.2}; C) printf("%d\n",a); D) n=a;

Page 58: 全国 C 等级考试复习

【 1.88 】已知: struct sk { int a; int age; }data,*p; 如果要使指针 p 指向 data 中的成员 a ,正确的赋值语句是 ____。 A) p = (struct sk *)&data.a; B) p = (struct sk *)data.a; C) p = &data.a; D) *p = data.a ;

Page 59: 全国 C 等级考试复习

【 1.89 】已知 enum week {sun,mon,tue,wed,thu,fri,sat}day ;则正确的赋值语句是 ____。 A) sun=0; C) san=day; D) sun=mon; D) day=sun ;

[ 知识点 ]枚举类型

Page 60: 全国 C 等级考试复习

2023.04.21 C 语言程序设计教程 60

(1) 定义枚举类型 status , 包含复制与删除两种状态:

enum status{copy , delete} ; 枚举类型 status 仅有两个数据,一个是 copy ,一个是 delete , 序号为 0 、 1 , 代表复制与删除。(2) 定义枚举类型 color ,包含红、黄、蓝、白、黑五种颜色: enum color {red , yellow , blue , white , black} ; 枚举类型 color有 red 、 yellow 、 blue 、 white 、 black 五个数据, 序号为 0 、 1 、 2 、 3 、 4 , 代表红、 黄、 蓝、 白、 黑五种颜色。 在定义枚举类型时,程序员可在枚举数据时通过“ =” 号自己规定序号,并影响后面的枚举数据的序号,后继序号以此递增。例如 :enum statu{copy=6 , delete} ;则 copy 的序号为 6 , delete 的序号为 7 。

Page 61: 全国 C 等级考试复习

2023.04.21 C 语言程序设计教程 61

2. 枚举类型变量的定义 (1) 先定义枚举类型, 再定义枚举类型变量: enum 标识符 { 枚举数据表 } ; enum 标识符 变量表; 例如 : enum color {red,yellow, blue, white, black} ; enum color c1 , c2 ;(2) 在定义枚举类型的同时定义枚举类型变量: enum 标识符 { 枚举数据表 } 变量表;例如 : enum color {red,yellow,blue,white,black} c1, c2 ;

Page 62: 全国 C 等级考试复习

【 1.90 】已知 enum color {red,yellow=2,blue,white,black}ren ;执行下述语句的输出结果是 ____。 printf("%d",ren=white); A) 0 B) 1 C) 3 D) 4

[ 知识点 ]枚举类型

Page 63: 全国 C 等级考试复习

【 1.91 】已知 enum name{zhao=1,qian,sun,li}man ;执行下述程序段后的输出是 ____。 man=0; switch(man) { case 0: printf("People\n"); case 1: printf("Man\n"); case 2: printf("Woman\n"); default: printf("Error\n"); } A) People B) Man C) Woman D)Error

[ 知识点 ]枚举类型

Page 64: 全国 C 等级考试复习

【 1.92 】下述关于枚举类型名的定义中,正确的是 ____。 A) enem a={ one,two,three }; B) enem a { one=9,two=-1,three }; C) enem a={"one","two","three"}; D) enem a {"one","two","three"};

[ 知识点 ]枚举类型

Page 65: 全国 C 等级考试复习

【 1.93 】C语言中标准输入文件 stdin 是指 。 A) 键盘 B) 显示器 C) 鼠标 D) 硬盘

[ 知识点 ]枚举类型

Page 66: 全国 C 等级考试复习

【 1.94 】要打开一个已存在的非空文件 "file" 用于修改,选择正确的语句____。 A) fp=fopen("file", "r"); B) fp=fopen("file", "a+"); C) fp=fopen("file", "w"); D) fp=fopen("file", "r+");

Page 67: 全国 C 等级考试复习

[ 知识点 ] 注释:函数 fopen 中的第二参数是打开模式, "r"模式是只读方式,不能写文件; "a+"模式是读 /追加方式,允许从文件中读出数据,但所有写入的数据均自动加在文件的末尾; "w"模式是写方式,允许按照用户的要求将数据写入文件的指定位置,但打开文件后,首先要将文件的内容清空。 "r+"模式是读 /

写方式,不但允许读文件,而且允许按照用户的要求将数据写入文件的指定位置,且在打开文件后,不会将文件的内容清空。本题的要求是 "修改 "文件的内容,因此只能选择答案 D 。

Page 68: 全国 C 等级考试复习

【 1.95 】当顺利执行了文件关闭操作时, fclose 函数的返回值是 。 A) -1 B) TRUE C) 0 D) 1

Page 69: 全国 C 等级考试复习

【 1.96】 fscanf 函数的正确调用形式是 。 A) fscanf (文件指针 , 格式字符串 , 输出列表 ); B) fscanf ( 格式字符串 , 输出列表 , 文件指针 ); C) fscanf ( 格式字符串 , 文件指针 , 输出列表 ); D) fscanf (文件指针 , 格式字符串 , 输入列表 );

Page 70: 全国 C 等级考试复习

【 1.97 】使用 fgetc 函数,则打开文件的方式必须是 。 A) 只写 B) 追加 C) 读或读 /写 D) 参考答案 B和 C 都正确

Page 71: 全国 C 等级考试复习

【 1.98 】已知宏定义 #define N 3 #define Y(n) ((N+1)*n) 执行语句 z=2*(N+Y(5+1)) ;后,变量 z 的值是 ____。 A) 42 B) 48 C) 52 D) 出错

[ 知识点 ] 注释:语句z=2*(N+Y(5+1) 引用了两个宏定义。C 语言是区分字母大小的,第二个宏定义中的 N 直接用 3替换,用5+1替换 n ,则有z=2*(3+(3+1)*5+1) ;结果是 48 。注意对于带参数的宏亦是直接的文本替换,此例中 n用 5+1去替换,结果是( N+1) *5+1 ,而不是(N+1)*(5+1) 。

Page 72: 全国 C 等级考试复习

【 1.99 】已知宏定义 #define SQ(x) x*x, 执行语句printf("%d",10/SQ(3)) ;后的输出结果是 ____ 。A) 1 B) 3 C) 9 D) 10

10/SQ(3)=10/3*3

Page 73: 全国 C 等级考试复习

【 1.100 】已知宏定义如下: #define PR printf #define NL "\n" #define D "%d" #define D1 DNL 若程序中的语句是 PR(D1,a) ;经预处理后展开为____。 A) printf(%d\n,a); B) printf("%d\n",a); C) printf("%d""\n", a); D) 原语句错误

Page 74: 全国 C 等级考试复习

[ 知识点 ] C</b?a:(c<d?c:d) ,它的运算顺序就清楚了。由于条件运算符的结合性是从右向左,所以括号可以省略。它的运算顺序是先算出右边的条件表达式 "c<d?c:d" 的值,然后求条件表达式a<b?a:3 的值。

Page 75: 全国 C 等级考试复习

编程题:第 1题函数 fun 的功能是:将 n 个人员的考试成绩进行分段统计,考试成绩放在 a 数组中,各分数段的人数存到 b 数组中:成绩为 60到 69 的人数存到 b[0] 中,成绩为 70到79 的人数存到 b[1] ,成绩为 80到 89 的人数存到 b[2] , 成绩为 90到 99 的人数存到 b[3] ,成绩为 100 的人数存到b[4] , 成绩为 60分以下的人数存到 b[5] 中。例如,当 a 数组中的数据是: 93、 85、 77、 68、 59、 43、 94、 75、 98。 调用该函数后, b 数组中存放的数据应是: 1、 2、 1、 3、 0、 2。注意:部分源程序存在文件 PROG1.C 中。请勿改动主函数 main 和其它函数中的任何内容,仅在函数 fun 的花括号中填入你编写的若干语句。

Page 76: 全国 C 等级考试复习

Prog1.c#include “stdio.h”#include “stdlib.h” void fun(int a[], int b[], int n){ } main(){ int i, a[100]={ 93, 85, 77, 68, 59, 43, 94, 75, 98}, b[6]; clrscr(); fun(a, b, 9); printf("the result is: "); for (i=0; i<6; i++) printf("%d ", b[i]); printf("\n"); NONO();}

Page 77: 全国 C 等级考试复习

Prog1.c NONO( ){/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */ FILE *rf, *wf ; int a[100], b[6], i, j ; rf = fopen("in1.dat", "r") ; wf = fopen("bc01.dat","w") ; for(i = 0 ; i < 10 ; i++) { for(j = 0 ; j < 10 ; j++) fscanf(rf, "%d,", &a[j]) ; fun(a, b, 9) ; for(j = 0 ; j < 6 ; j++) fprintf(wf, "%d ", b[j]) ; fprintf(wf, "\n") ; } fclose(rf) ; fclose(wf) ;}

Page 78: 全国 C 等级考试复习

Prog1.c 程序参考答案 void fun(int a[], int b[], int n){int i;for (i=0; i<6; i++) b[i] = 0;for (i=0; i<n;i++)if (a[i] < 60) b[5]++;else b[(a[i]- 60)/10]++;}

Page 79: 全国 C 等级考试复习

第 2题函数 fun 的功能是:统计各年龄段的人数并存到 b 数组中, n 个人员的年龄放在 a 数组中。年龄为 1到 9 的人数存到 b[0] 中,年龄为 10到 19 的人数存到 b[1] ,年龄为20到 29 的人数存到 b[2] , 年龄为 30到 39 的人数存到b[3] ,年龄为 40到 49 的人数存到 b[4] , 年龄为 50岁以上的人数存到 b[5] 中。例如,当 a 数组中的数据为: 9、 18、 27、 38、 59、 33、 14、 75、 38。 调用该函数后, b 数组中存放的数据应是: 1、 2、 1、 3、 0、 2。注意:部分源程序存在文件 PROG1.C 中。请勿改动主函数 main 和其它函数中的任何内容,仅在函数 fun 的花括号中填入你编写的若干语句。

Page 80: 全国 C 等级考试复习

#include “stdio.h” #include “stdlib.h”void fun(int a[], int b[], int n){ } main(){ int i, a[100]={ 9, 18, 27, 38, 59, 33, 14, 75, 38}, b[6]; clrscr(); fun(a, b, 9); printf("The result is: "); for (i=0; i<6; i++) printf("%d ", b[i]); printf("\n"); NONO();}

Page 81: 全国 C 等级考试复习

NONO( ){/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */ FILE *rf, *wf ; int a[100], b[6], i, j ; rf = fopen("in2.dat", "r") ; wf = fopen("bc02.dat","w") ; for(i = 0 ; i < 10 ; i++) { for(j = 0 ; j < 10 ; j++) fscanf(rf, "%d,", &a[j]) ; fun(a, b, 9) ; for(j = 0 ; j < 6 ; j++) fprintf(wf, "%d ", b[j]) ; fprintf(wf, "\n") ; } fclose(rf) ; fclose(wf) ;}

Page 82: 全国 C 等级考试复习

程序参考答案 void fun(int a[], int b[], int n){int i;for (i=0; i<6; i++) b[i] = 0;for (i=0; i<n;i++)if (a[i] >= 50) b[5]++;else b[a[i]/10]++;}

Page 83: 全国 C 等级考试复习

程序参考答案 void fun(int a[], int b[], int n){int i;for (i=0; i<6; i++) b[i] = 0;for (i=0; i<n;i++)if (a[i] >= 50) b[5]++;else b[a[i]/10]++;}

Page 84: 全国 C 等级考试复习

第 3题函数 fun 的功能是:统计在字符串 a 中,以下指定字符出现的次数,并存到 b 数组中,其中:字符 '+' 出现的次数存到 b[0] 中,字符 '-' 出现的次数存到 b[1] , 字符 '*' 出现的次数存到 b[2] ,字符 '/' 出现的次数存到 b[3] , 字符 '&' 出现的次数存到 b[4] ,其它字符出现的次数存到b[5] 中。例如,当 a 字符串中的字符串为: "-+*1-a/&b" 时, 调用该函数后, b 中存放的数据应是:1、 2、 1、 2、 1、 3。注意:部分源程序存在文件 PROG1.C 中。请勿改动主函数 main 和其它函数中的任何内容,仅在函数 fun 的花括号中填入你编写的若干语句。

Page 85: 全国 C 等级考试复习

#include “stdio.h” #include “stdlib.h”void fun(char *a, int b[]){} main(){ int i, b[6]; char a[100] = "-+*1/-a/&b"; clrscr(); fun(a, b); printf("The result is: "); for (i=0; i<6; i++) printf("%d ", b[i]); printf("\n"); NONO();}

Page 86: 全国 C 等级考试复习

NONO( ){/* 本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */ FILE *rf, *wf ; char a[100], *p ; int b[6], i, j ; rf = fopen("in6.dat", "r") ; wf = fopen("bc06.dat","w") ; for(i = 0 ; i < 10 ; i++) { fgets(a, 99, rf) ; p = strchr(a, '\n') ; if(p) *p = 0 ; fun(a, b) ; for(j = 0 ; j < 6 ; j++) fprintf(wf, "%d ", b[j]) ; fprintf(wf, "\n") ; } fclose(rf) ; fclose(wf) ;}

Page 87: 全国 C 等级考试复习

程序参考答案 void fun(char *a, int b[]){int i;for (i=0; i<6; i++) b[i] = 0;for (i=0; i< strlen(a); i++)switch(a[i]){ case '+': b[0]++; break;case '-': b[1]++; break;case '*': b[2]++; break;case '/': b[3]++; break;case '&': b[4]++; break;default: b[5]++;}}

Page 88: 全国 C 等级考试复习

填空

给定程序的功能是调用 fun 函数建立班级通讯录。通讯录中记录每位学生的编号,姓名和电话号码。班级的人数和学生的信息从键盘读入,每个人的信息作为一个数据块写到名为 myfile5.dat 的二进制文件中。请在程序的下划线处填入正确的内容并把下划线删除,是程序得出正确的结果。

Page 89: 全国 C 等级考试复习

void check(); /**********found**********/int fun(___1___ *std){/**********found**********/ ___2___ *fp; int i; if((fp=fopen("myfile5.dat","wb"))==NULL) return(0); printf("\nOutput data to file !\n"); for(i=0; i<N; i++)/**********found**********/ fwrite(&std[i], sizeof(STYPE), 1, ___3___); fclose(fp); return (1);}

Page 90: 全国 C 等级考试复习

文件的打开和关闭

• 对文件进行访问,必须先打开文件;访问结束后应当关闭文件。

• 打开文件:– FILE *文件指针 ;–文件指针 =fopen(文件名 ,打开方式 );

• 关闭文件:– fclose(文件指针 );

Page 91: 全国 C 等级考试复习

fread和 fwrtie 函数

• fread和 fwrtie 函数用来读写一个数据块。• 一般形式:

– fread(buffer,size,count,fp);– fwrite(buffer,size,count,fp);

• 说明:– buffer 是指针。对 fread 来说是读入数据的存放地址;对 fwrite 来说是输出数据的地址。

– size 是要读写的字节数(一个数据块)– count 是读写的数据块个数– fp读写的文件指针– 如果文件以二进制形式打开,用 fread和 fwrtie 函数可

以读写任何信息

Page 92: 全国 C 等级考试复习

void check(); /**********found**********/int fun(struct student *std){/**********found**********/ FILE *fp; int i; if((fp=fopen("myfile5.dat","wb"))==NULL) return(0); printf("\nOutput data to file !\n"); for(i=0; i<N; i++)/**********found**********/ fwrite(&std[i], sizeof(STYPE), 1, fp ); fclose(fp); return (1);}

Page 93: 全国 C 等级考试复习

给定程序的功能是:从键盘输入若干行文本(每行不超过 80 个字符),写到文件myfile4.txt 中,用 -1 作为字符串输入结束的标记。然后将文件的内容读出显示在屏幕上。文件的读写分别有自定义函数 ReadText和WriteText 实现。

Page 94: 全国 C 等级考试复习

main(){ FILE *fp; if((fp=fopen("myfile4.txt","w"))==NULL) { printf(" open fail!!\n"); exit(0); } WriteText(fp); fclose(fp); if((fp=fopen("myfile4.txt","r"))==NULL) { printf(" open fail!!\n"); exit(0); } ReadText(fp); fclose(fp);}

Page 95: 全国 C 等级考试复习

/**********found**********/void WriteText(FILE ___1___){ char str[81]; printf("\nEnter string with -1 to end :\n"); gets(str); while(strcmp(str,"-1")!=0) {/**********found**********/ fputs(___2___,fw); fputs("\n",fw); gets(str); }}

Page 96: 全国 C 等级考试复习

/**********found**********/void WriteText(FILE ___ *fw ___){ char str[81]; printf("\nEnter string with -1 to end :\n"); gets(str); while(strcmp(str,"-1")!=0) {/**********found**********/ fputs(___str___,fw); fputs("\n",fw); gets(str); }}

Page 97: 全国 C 等级考试复习

void ReadText(FILE *fr){ char str[81]; printf("\nRead file and output to screen :\n"); fgets(str,81,fr); while( !feof(fr) ) {/**********found**********/ printf("%s",___3___); fgets(str,81,fr); }}

Page 98: 全国 C 等级考试复习

void ReadText(FILE *fr){ char str[81]; printf("\nRead file and output to screen :\n"); fgets(str,81,fr); while( !feof(fr) ) {/**********found**********/ printf("%s",___str___); fgets(str,81,fr); }}

Page 99: 全国 C 等级考试复习

给定程序中,函数 fun 的功能是:将自然数 1~10 以

及它们的平方根写到名为 myfile3txt 的文本文档中,

然后再顺序读出显示在屏幕上。

Page 100: 全国 C 等级考试复习

int fun(char *fname ){ FILE *fp; int i,n; float x; if((fp=fopen(fname, "w"))==NULL) return 0; for(i=1;i<=10;i++)/**********found**********/ fprintf(___1___,"%d %f\n",i,sqrt((double)i)); printf("\nSucceed!! \n");/**********found**********/ ___2___; printf("\nThe data in file :\n");/**********found**********/ if((fp=fopen(___3___,"r"))==NULL) return 0;

Page 101: 全国 C 等级考试复习

fscanf(fp,"%d%f",&n,&x);

while(!feof(fp))

{ printf("%d %f\n",n,x); fscanf(fp,"%d%f",&n,&x); }

fclose(fp);

return 1;

}

Page 102: 全国 C 等级考试复习

文件的读: fscanf 函数• 格式:

– fscanf(文件指针 , 格式字符串 , 输入表列 );

• 例:– fscanf(fp,"%d%d%d",&a,&b,&c);

• 编程:读出数据文件f.dat中 所有数据并显示到屏幕思考:文件为 f.dat ,如何读取数据?读到哪里保存

f.dat:301101 张文 91301102 陈慧 85301103 王卫东 76301104 郑伟 69301105 郭温涛 55

思考:如果不知道有几个数据怎么办,如何读取数据?函数 feof(fp) :检查文件是否结束。遇文件结束返回 1 ,否则返回 0 。

Page 103: 全国 C 等级考试复习

文件的写: fprintf 函数

• 格式:– fprintf(文件指针 , 格式字符串 , 输出表列 );

• 例:– FILE *fp;– fp=fopen("f1.txt","w");– fprintf(fp,"%s", "hello");

• 编写程序,将“ hello world”保存到文件f1.txt中。

Hello WorldF1.txt:

Page 104: 全国 C 等级考试复习

int fun(char *fname ){ FILE *fp; int i,n; float x; if((fp=fopen(fname, "w"))==NULL) return 0; for(i=1;i<=10;i++)/**********found**********/ fprintf(___fp___,"%d %f\n",i,sqrt((double)i)); printf("\nSucceed!! \n");/**********found**********/ ___fclose(fp)___; printf("\nThe data in file :\n");/**********found**********/ if((fp=fopen(___fname___,"r"))==NULL) return 0;

Page 105: 全国 C 等级考试复习

修改程序题

Page 106: 全国 C 等级考试复习

给定程序 MODI1.C 中函数 fun 的功能是:先将在字符串 s 中的字符按正序存放到 t 串中,然后把 s 中的字符按逆序连接到 t 串后面。

例如:当 s 中的字符串为:“ ABCDE” 时,

则他中的字符串应为:“ ABCDEEDCBA” 。

请改正程序中的错误,使他能得出正确的结果。

注意:不要改动 main 函数,不能增行或删行,也不得更改程序的结构!

Page 107: 全国 C 等级考试复习

void fun (char *s, char *t){ int i, sl; sl = strlen(s);/************found************/ for( i=0; i<=s1; i ++) t[i] = s[i]; for (i=0; i<sl; i++)

t[sl+i] = s[sl-i-1];/************found************/ t[sl] = '\0';}

for(i = 0 ; i < sl ; i++) t[2*sl] = 0;

Page 108: 全国 C 等级考试复习

给定程序 MODI1.c 中函数 fun 的功能是:从低位开始取出长整形变量 s 中的奇数位上的数,依次构成一个新数放在 t 中,高位仍放在高位,低位仍放在低位。

例如:当 s 中的数为: 7654321 时, t 中的数为:7531

请改正程序中的错误,使他能得出正确的结果。

注意:不要改动 main 函数,不能增行或删行,也不得更改程序的结构! 

Page 109: 全国 C 等级考试复习

#include <stdio.h> /************found************/void fun (long s, long t){ long sl=10; *t = s % 10; while ( s > 0) { s = s/100; *t = s%10 * sl + *t;/************found************/

sl = sl*100; }}

long *t

sl = sl*10;

Page 110: 全国 C 等级考试复习

给定程序 MODI1.c中 fun 函数的功能是:将 n 个无

序整数从小到大排序。

Page 111: 全国 C 等级考试复习

fun ( int n, int *a ){ int i, j, p, t; for ( j = 0; j<n-1 ; j++ ) { p = j;/************found************/ for ( i=j+1; i<n-1 ; i++ ) if ( a[p]>a[i] )/************found************/ t=i; if ( p!=j ) { t = a[j]; a[j] = a[p]; a[p] = t; } }}

i<n

p=i

Page 112: 全国 C 等级考试复习

下周二在机房课程模拟考试