p = funa;
x = sub(p, 9, 3); x += sub(funb, 8, 3);
printf(“%d\\n”, x ); }
15.以下程序中的trap函数是一个用梯形法求定积分的通用函数,梯形法求定积分s的公式为:
其中: 是:
a ?bh?nn为积分小区间数,以下程序调用trap函数求定积分,被积函数
f(x) = x*x +3*x + 2, 且 n = 1000, a = 0, b = 4。 #include “math.h”
double trap( double (*fun)(double) , double a, double b) { double t, h; int i, n = 1000; t = 0.5 *((*fun)(a) +(*fun)(b) ); h = fabs(a - b) / (double) ( n ); for( i = 1; i <= n - 1; i++) t = t + (*fun)(a+i*h) ; t = t * h; return (t); }
double mypoly( double x)
{ return (x * x + 3.0 * x + 2.0); }
void main()
{ double y, (*pf)(double); pf = myproly ; y = trap( pf, 0.0, 4.0); printf(“%f\\n”, y); }
16.以下程序的输出结果是 ar=9 ar=9 ar=11 。
#define PR(ar) printf(“ar = %d “, ar) void main()
{ int j, a[] = { 1, 3, 5, 7, 9, 11, 13, 15}, *p = a + 5; for(j = 3; j ; j--) switch( j ) { case 1:
case 2: PR(*p++); break; case 3: PR(*(--p) );
46
} }
17.下面程序调用getone函数开辟一个动态存储单元,调用assone函数把数据输入此动态存储单元,调用outone函数输出此动态存储单元的数据。请填空。
#include “stdlib.h” getone( int **s)
{ *s = ( int * ) malloc (sizeof(int)); }
assone( int *s)
{ scanf(“%d”, s ); }
outone( int *b)
{ printf(“%d”, *b ); }
void main() { int *p;
getone( &p ); assone( p ); outone( p ); }
18.函数 void fun(float *sn, int n)的功能是根据以下公式计算S,计算结果通过形参指针sn传回,n通过形参传入,n的值大于等于0。请填空。
void fun( float *sn, int n) {
float s=0.0, w, f=-1.0; int i=0;
for(i=0; i<=n; i++) {
f= -1 * f; w=f/(2*i+1); s+=w; }
*sn =s; }
19.以下程序的执行结果是 a = 20, b = 20 。
void main() {
int a, b, *p = &a, *q = &b; a = 10; b = 20; *p = b; *q = a;
47
printf(“a = %d, b = %d\\n”, a, b); }
20. 下列程序的执行结果是 3 5 。
fun(int *x, int *y) { int c, *z = &c; z = x; x = y; y = z; }
void main() {
int a = 3, b = 5; fun(&a, &b);
printf(“%d %d\\n”, a,b); }
第九章 用户自己建立数据类型
一、选择题
1. 设有以下语句
typedef struct S
{ int g; char h; } T;
则下面叙述中正确的是 。
A)可用S定义结构体变量 B)可以用T定义结构体变量 C)S是struct 类型的变量 D)T是struct S类型的变量 2. 有以下说明和定义语句 。
struct student { int age;
char num[8]; } ;
struct student stu[3] = {{20,”20041”}, {21,”20042”},{19,”20043”}}; struct student *p = stu;
以下选项中引用结构体变量成员的表达式错误的是
A)(p++)->num B) p->num C) (*p).num D) stu[3].age 以下程序的输出结果是 。
void main() { struct cmplx
{ int x;
48
int y;
}cnum[2] = {1, 3, 2, 7};
printf(“%d\\n”, cnum[0].y / cnum[0].x * cnum[1].x);
}
A)0 B)1 C)3 D)6 根据以下定义,能输出字母M的语句是 。
struct person { char name[9]; int age; };
struct person class[4] = {{“John”, 17}, {“Paul”, 19}, {“Mary”, 18},{“Adam”, 16}}; A)printf(“%c\\n”, class[3].name); B)printf(“%c\\n”, class[3].name[1]); C)printf(“%c\\n”, class[2].name[1]); D)printf(“%c\\n”, class[2].name[0]); 3. 设有以下语句
struct st { int n;
struct st *next; };
struct st a[3]={5, &a[1], 7, &a[2], 9, NULL}, *p; p = &a[0];
则值为6的表达式是 。
A) p++->n B) p->n++ C) (*p).n++ D) ++p->n 4. 若有以下说明语句,则值为6的表达式是 。(同上)
struct st { int n;
struct st *next; };
struct st a[3], *p;
a[0].n = 5; a[0].next = &a[1]; a[1].n = 7; a[1].next = &a[2]; a[2].n = 9; a[2].next = ‘\\0’; p = &a[0];
A)p ++ ->n B)p ->n++ C)(*p).n++ D)++p -> n 5. 以下程序的输出结果是 。
struct st { int x; int *y; } *p;
int dt[4] = {10, 20, 30, 40};
struct st aa[4] = { 50, &dt[0] , 60, &dt[0] , 60, &dt[0] , 60, &dt[0]}; void main() { p = aa;
49
pritnf(“%d\\n”, ++p -> x); pritnf(“%d\\n”, (++p) -> x); pritnf(“%d\\n”, ++(*p -> y) );
}
A)10 B)50 C)51 D)60 20 60 60 70 20 21 11 31
6. 以下程序运行后的输出结果是 。
struct STU
{ char name[10]; int num; int score; };
void main()
{ struct STU s[5] = {{“YangSan”, 20041,703}, {“LiSiGuo”,20042, 580},
{“WangYin”,20043,680},{“SunDan”, 20044, 550}, {“Penghua”,20045,537}}, *p[5], *t;
int i, j;
for(i = 0; i < 5; i++) p[i] = &s[i]; for(i = 0; i < 4; i++)
for(j = i + 1; i < 5; j++)
if(p[i] ->score >p[j] ->score)
{ t = p[i]; p[i] = p[j]; p[j] = t; } printf(“%d %d\\n”, s[1].score, p[1] ->score); }
A)550 580 B)680 680 C)580 550 D)580 680
7. 已建立下面的链表结构,指针p、s分别指向图中所示结点,则不能将s所指的结
点插入到链表末尾的语句组是 。
p data next head E F \\0 s G
A)s->next = NULL; p = p->next; p->next = s; B)p = p->next; s->next = p ->next; p ->next = s; C)p = p->next; s->next = p; p->next = s;
D)p = (*p).next; (*s).next = (*p).next; (*p).next = s; 8. 以下程序运行后的输出结果是 。
struct STU
{ char name[10]; int num; }; void f1(struct STU c)
{ struct STU b = {“LiSiGuo”, 2042};
50