return z: }
四、 编程
1. 编写一函数判断某数是否素数。 2. 编写一函数求三个整数的最大值。
3. 打印出3到1100之间的全部素数(判素数由函数实现)。 4. 写一函数,使给定的一个二维数组(3×3)转置,即行列互换。 5. 写一函数,将两个字符串连接,即编写一strcat函数。 6. 写一函数,求一字符串长度,即编写一strlen函数。
7. 写一函数将字符数组s1中的全部字符复制到字符数组s2中,不用strcpy函数。
8. 写一函数判断某数是否“水仙花数”,所谓“水仙花数”是指一个三位数, 其各位数字立方和等于该数本身。例如 153是一个水仙花数,因为 153=13?53?33 。
9. 在主函数内任意输入一个5×6矩阵,编写一函数求出每一行的和放到一个一维数组中,输出此矩阵及其每一行的和。
10. 写一主函数输入一数组,写一子函数实现对该数组的冒泡排序并输出。
11. 任意输入20个正整数,找出其中的素数,并将这些素数按由小到大排序。要求:判断一个数是否为素数用函数实现;排序用函数实现。
12. 编写计算m的n次方的递归函数。
13. 编一个程序,读入具有5个元素的整型数组,然后调用一个函数,递归计算这些元素的积。
14. 编一个程序,读入具有5个元素的实型数组,然后调用一个函数,递归地找出其中的最大元素,并指出它位置。
45
第七单元 指 针
一、选择题
1、 若有以下定义和语句,且0≤i<10则对数组元素的错误引用是 。
int a[10]={1,2,3,4,5,6,7,8,9,10},*p,i; p=a;
A. *(a+i) B. a[p-a] C. p+i
若有定义:int a[3][4]; , 不能表示数组元素
D. *(&a[i]) 2、
a[1][1]。 D. *(a+5) 3、
对如下定义,以下说法中正确的是 。 A. char *a[2]={ \B. 数组a的元素值分别为\和\
C. a是指针变量,它指向含有两个数组元素的字符型数组 D.数组a的两个元素分别存放的是含有4个字符的一维数组的首
数组a的两个元素中各自存放了字符’a’、’A’的地址 char *s=\
A. *(a[1]+1) B. *(&a[1][1]) C. (*(a+1)[1])
地址 4、
指针s所指字符串的长度为: 。
A. 说明不合法 B. 19 C. 18 D. 15
分析下面函数,以下说法正确的是 。 swap(int *p1,int *p2) { int *p;
46
5、
*p=*p1; *p1=*p2; *p2=*p; }
A. 交换*p1和*p2的值 B. 正确,但无法改变*p1和C. 交换*p1和*p2的地址 D. 可能造成系统故障,因为
设有说明int (*ptr)[M]; 其中ptr是 。
*p2的值 使用了空指针 6、 量 7、
在说明语句:int *f(); 中,标识符代表的是: 。 A. 一个用于指向整型数据的指针变量 B. 一个用于指向一维数C. 一个用于指向函数的指针变量
D. 一个返回值为指针型的
A. M个指向整型变量的指针 B. 指向M个整型变量的函数指针
C. 一个指向具有M个整型元素的一维数组的指针
D. 具有M个指针元素的一维指针数组,每个元素都只能指向整型
组的指针 函数名 8、 9、
若int x ,*pb; ,则正确的赋值表达式是 。 有如下程序段
int *p ,a=10 ,b=1 ; p=&a ; a=*p+b ;
A. pb=&x B. pb=x; C. *pb=&x; D. *pb=*x
执行该程序段后,a 的值为 。
A. 12 B. 11 C. 10 D. 编译出错
double r=99 , *p=&r ;
47
10、若有以下定义和语句:
*p=r ;
则以下正确的叙述是 。
A. 以下两处的*p 含义相同,都说明给指针变量p 赋值 B. 在\;\中,把r 的地址赋值给了p 所指的C. 语句\;\把变量r 的值赋给指针变量p D. 语句\;\取变量r 的值放回r 中
存储单元
11、要求函数的功能是交换x 和y 中的值,且通过正确调用返回交换结果.能正确执行
此功能的函数是 。
A. funa (int *x,int *y) { int *p; *p=*x; *x=*y;*y=*p; } B. fund (int x,int y) { int t; t=x;x=y;y=t; } C. func (int *x,int *y) { *x=*y;*y=*x;}
D. fund (int *x,int *y) { *x=*x+*y;*y=*x-*y;*x=*x-*y; }
12、若有说明:long *p ,a;则不能通过scanf 语句正确给输入项读入数据的程序段
是 。
A. *p=&a; scanf(\,p);
B. p=(long *)malloc(8); scanf(\,p); C. scanf(\,p=&a); D. scanf(\,&a);
A. < B. = C. + D. -
13、对于类型相同的两个指针变量之间,不能进行的运算是 。 14、若已定义:int a[9] ,*p=a;并在以后的语句中未改变p 的值,不能表示a[1] 地
址的表达式是 。
48
A. p+1 B. a+1 C. a++ D. ++p
int a[10]={1,2,3,4,5,6,7,8,9,10} ,*p=a ;
15、若有以下说明:
则数值为6 的表达式是 。
A. *p+6 B. *(p+6) C. *p+=5 D. p+5
16、设P1 和P2 是指向同一个int 型一维数组的指针变量,k 为int 型变量,则不能正
确执行的语句是 。
A. k=*P1+*P2; B. p2=k; C. P1=P2; D. k=*P1 *
(*P2);
17、若有以下的定义:
int a[ ]={1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10} , *p=a ; 则值为3 的表式是 。
A. p+=2 , *(p++) B. p+=2 ,*++p C. p+=3 , *p++ D. p+=2 ,++*p
int a[10]={1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10} ,
18、若有以下定义和语句: *p=a ;
则不能表示a 数组元素的表达式是 。
A. *p B. a[10] C. *a D. a[p-a]
int a[10]={1,2,3,4,5,6,7,8,9,10},*p=a;
19、有如下说明
则数值为9 的表达式是 。
A. *p+9 B. *(p+8) C. *p+=9 D. p+8 void main()
49
20、下面程序输出数组中的最大值,由s 指针指向该元素.