scanf(“%d”, &a);
}
printf(“%d”,max);
}
A) a==0 B) a C) !a==1 D) !a
5.2.9 下面程序段的输出结果是( C)。
#include
void main()
{ int num=0;
while( num<=2 )
{ num++;
printf(“%dn”,num);
}
}
A) 1 B) 1 C) 1 D) 1
2 2 2
3 3
4
5.2.10 若运行下程序,从键盘输入2473<回车>,则下面程序的结果是( A )。
#include
void main()
{ int c;
while((c=getchar())!=‟n‟ )
switch(c-‟2‟)
{ case 0:
case 1: putchar( c+4 );
case 2: putchar( c+4 ); break;
case 3: putchar( c+3 );
default: putchar( c+2 ); break;
}
printf(“n”);
}
A) 668977 B) 668988 C) 66778777 D) 6688766
5.2.11 以下描述正确的是( C )。
A) while、do…while、for循环中的循环体语句都至少被执行一次。
B) do…while循环中,while(表达式)后面的分号可以省略。
C) while循环中,一般要有能使while后面表达式的值变为“假”的操作。
D) do…while循环中,根据情况可以省略while。
5.2.12 C语言的do…while循环中,循环由do开始,用while结束;而且在while
表达式后面的(B)不能丢,它表示do…while循环的结束。
A) n B) “;” C) “%” D) “。”
5.2.13 下面程序段的输出结果是( D )。
int x=3;
do{ printf(“%3d”, x-=2); } while(!(--x));
A) 1 2 B) 3 2 C) 2 3 D) 1 -2
5.2.14 下面程序的功能是计算正整数2345的各位数字的平方和,请选择填空。
#include
void main()
{ int n=2345,sum=0;
do
{ sum=sum+( [1] B );
n=( [2] C )
}while(n);
printf(“sum=%d”,sum);
}
[1] A) n%10 B) (n%10)*(n%10)
C) n/10 D) (n/10)*(n/10)
[2] A) n/1000 B) n/100
C) n/10 D) n%10
5.2.15 执行程序段:x=-1;do{x=x*x;} while(!x);的结果是( C )。
A) 死循环 B) 循环执行2次 C) 循环执行一次 D) 有语法错误
5.2.16 以下能正确计算1*2*3*4…*10的程序段是( C )。
A) do(i=1;s=1;s=s*i;i++) while(i<=10);
B) do(i=1;s=0;s=s*i;i++) while(i<=10);
C) i=1;s=1; do(s=s*i;i++) while(i<=10);
D) i=1;s=0; do(s=s*i;i++) while(i<=10);
5.2.17 下面程序的功能是从键盘输入若干学号,然后输出学号中百位数字式3的
学号(输入0时结束循环),请选择填空。
#include
void main()
{ long int num;
scanf(“%ld”,&num);
do
{ if( [1] B) printf(“%ld”, num);
scanf(“%ld”,&num);
}whle( [2] C ))
}
[1] A) num%100/10==3 B) num/100%10==3
C) num%10/10==3 D) num/10%10==3
[2] A) !num B) num<0==0 C) !num==0 D) !num!=0
5.2.18 对于for(表达式;;表达式3)可理解为( B )。
A) for(表达式;0;表达式3)
B) for(表达式;1;表达式3)
C) for(表达式;表达式1;表达式3)
D) for(表达式;表达式3;表达式3)
5.2.19 以下不正确的描述是( B )。
A) break语句不能用于循环语句和switch语句外的任何其他语句
B) 在switch语句中使用break语句或continue语句的作用相同
C) 在循环语句中使用continue语句是为了结束本次循环,而不是终止整
个循环的执行。
D) 在循环语句中使用break语句是为了使流程跳出循环体,提前结束循
环
5.2.20 若i为整型变量,循环语句for(i=2,i==0;) printf(“%d”,i--);的执行次数为(B)。
A) 无限次 B) 0次 C) 1次 D) 2次
5.2.21 以下叙述正确的是(C )。
A) for循环中设置if(条件)break,当条件成立时中止程序执行。
B) for循环中设置if (条件)continue,当条件成立时中止本层循环。
C) for循环中设置if (条件)break,当条件成立时中止本层循环。
D) for循环中设置if (条件) continue,当条件成立时暂停程序执行。
5.2.22 下面关于for循环的正确描述是(D )。
A) for循环只能用于循环次数已经确定的情况。
B) for循环是先执行循环体语句,后判断表达式。
C) 在for循环中,不能用break语句跳出循环体。
D) for循环的循环体语句中,可以包含多条语句。
5.2.23 循环语句for(i=0,x=0; !x&&i<=5; i++);的执行次数为(B)。
A) 5次 B) 6次 C) 1次 D) 无限
5.2.24 以下程序段的输出结果是( D )。
int x,i;
for(i=1;i<=100;i++)
{ x=I; if(++x%2==0) if(++x%3==0) if(++x%7==0) printf(“%d”,x); }
A) 39 81 B) 42 84 C) 26 68 D) 28 70
5.2.25 以下描述正确的是( C )。
A) goto语句只能用于退出多层循环
B) switch语句不能出现continue语句
C) 只能用continue语句来终止本次循环
D) 在循环中break语句不能独立出现
5.2.26 以下不是无限循环的语句是( A )
A) for(y=0,x=1;x>++y; x=i++) i=x;
B) for(; ; x++=i);
C) while(1) { x++; }
D) for(i=10; ; i- -) sum+=i;
5.2.27 下面程序段的输出结果是( D )。
int i,sum;
for(i=1;i<=10;i++) sum+=sum
printf(“%dn”, i);
A) 10 B) 9 C) 15 D) 11
5.2.28 下面程序段的运行结果是(D )。
for(x=3; x<6; x++) printf((x%2)?(“**%d”):(“##%dn”),x);
A) **3 B)##3 C) ##3 D) **3##4
##4 **4 **4##5 **5
**5 ##5
5.2.29 执行语句for(i=1; i++<4; );后变量i的值是( C )。
A) 3 B) 4 C) 5 D) 不定
5.2.30 下面程序段运行结果是(C)。
int i,j,k;
for(i=2;i<6;i++,i++)
{ k=1;
for(j=i; j<6; j++) k+=j; }
printf(“%dn”,k);
A) 4 B) 5 C) 10 D) 7
5.2.31 下面程序段( D )。
for( t=1; t<=100; t++)
{ scanf(“%d”, &x);
If(x<0) continue;
printf(”%3d”,t);
}
A) 当x<0时整个循环结束 B) x>=0时什么也不执行
C) printf函数永远也不执行 D) 最多允许输出100个非负数
5.2.32 下面程序段运行结果是( A)。
int i,j,a=0;
for(i=0;i<2;i++)
{ for(j=0; j<4; j++) {if(j%2) break; a++;} a++; }
printf(“%dn”,a);
A) 4 B) 5 C) 6 D) 7
5.2.33 下面程序的运行结果是( B)。
#include
void main()
{ int i,j,x=0;
for(i=0;i<2;i++)
{ x++;
for(j=0;j<=3;j++)
{ if(j%2) continue; x++; }
x++; }
printf(“x=%dn”,x); }
A) x=4 B) x=8 C) x=6 D) x=12
5.2.34 下面程序段运行结果是( A)。
#include
void main()
{ int i;
for(i=1; i<=5; i++)
{ if(i%2) printf(”*”);
else continue;
printf(“#”);
}
printf(“$n”);
}
A) *#*#*#$ B) #*#*#*$ C) *#*#$ D) #*#*$
5.2.35 有一堆零件(100~200之间),如果分成4个零件一组的若干组,则多2
个零件;若分成7个零件一组,则多3个零件;若分9个零件一组,则多
5个零件。下面程序是求这堆零件的总数,请选择填空。
#include
void main( )
{ int i;
for(i=100; i<201; i++)
if((i-2)%4==0)
if(!(i-3)%7)
if( D )
printf(”%d”, i);
}
A) i%9=5 B) i%9!=5 C) (i-5)%9!=0 D) i%9==5
习题六
6.1 填空题
6.1.1 C语言中,数组名代表 数组首地址 。
6.1.2 在c语言中,引用数组元素时,其数组下标的数据类型允许是 整型常量
6.1.3 在c语言中,一维数组的定义形式为:存储类型 类型说明符 数组名 [常
量表达式] 。
6.1.4 若有说明:int a[][3]={1,2,3,4,5,6,7}; 则a数组第一维的大小是
3 。
6.1.5 下面程序段的运行结果是 f 。
char a[7]="abcdef";
char b[4]="ABC";
strcpy(a,b);
printf("%c",a[5]);
6.1.6 下面程序段的运行结果是 3 。
char c[]="tv0willn";
printf("%d",strlen(c));
6.1.7 假设字符串s1和s2均定义过并初始化,判断字符串s1是否大于字符串
s2,应当使用语句为:
if( strcmp(s1,s2)>0)
6.1.8 定义int arr[5]={1,2,3};则引用数组元素a[4]的值是: 0 。
6.1.9 数组的长度若为N,则可以访问的数组下标范围为: 0~(N-1) 。
6.1.10 数组元素引用时,下标为整型的表达式,可以使用 变量 。
6.2 选择题
6.2.1 合法的数组定义是(D)。
A.int a[ ]=”string”; B.int a[5]={0,1,2,3,4,5};
C.char a=”string”; D.char a[ ]={0,1,2,3,4,5};
6.2.2 若有定义和语句:char s[10]; s=”abcd”; printf(“%sn”,s); 则
结果是(以下u代表空格)(A)。
A.输出abcd B.输出a
C.输出abcd u u u u u D.编译不通过
6.2.3 数组a[2][2]的元素排列次序是(A)。
A.a[0][0],a[0][1],a[1][0],a[1][1]
B.a[0][0],a[1][0],a[0][1],a[1][1]
C.a[1][1],a[1][2],a[2][1],a[2][2]
D.a[1][1],a[2][1],a[1][2],a[2][2]
6.2.4 有以下语句,则下面正确的描述是(B)。
static char x [ ]=“12345”; static
y[ ]={„1‟,„2‟,„3‟,„4‟,„5‟};
char
A.x数组和y数组的长度相同。
B.x数组长度大于y数组长度。
C.x数组长度小于y数组长度
D.x数组等价于y数组。
6.2.5 列不能正确进行字符串赋值操作的语句是(C)。
A.char str[10];gets(str); B.char*str;str=“a”;
C.char*str;str=„a‟;
D.charstr[10];strcpy(str,“hello”);
6.2.6 若数组的长度为n,则该数组中的元素最多有n个。若[3][5]是一个二维
数组,则最多可使用的元素个数为(C)
A.8 B.10 C.15 D.5
6.2.7 若有说明:int a[3][4]; 则对a数组元素的非法引用是(D)。
A.a['B'-'A'][2*1] B.a[1][3] C.a[4-2][0]
D.a[0][4]
6.2.8 设有语句static char str[10]
={“china”};printf(“%d”,strlen(str)); 则输出结果是
A.10 B.5 C.china D.6
6.2.9 表达式strlen(“string”)+strlen(“C”)的运算结果为(C)。
A.9 B.10 C.7 D.8
6.2.10 执行以下程序段后,s的值为(B)。
static char ch[ ]=“623”
int a,s=0;for(a=0;ch[a]>=„0‟&&ch[a]<=„9‟;a++)
s=10*s+ch[a]-„0‟;
A.-4705 B.623 C.600 D.326
习题七答案
习题七
7.1 选择题
7.1.1 在一个C语言程序构成中,较完整的描述是(D )
A) 由主程序与子程序构成 B) 由多个主函数与多个子函数构成
C) 由主函数与子函数构成 D) 由一个主函数与多个子函数构成
7.1.2 C语言在程序开始执行时,其正确的描述是(B )
A) 由编写程序语句的顺序格式执行 B) 在主函数main()开始处执行
C) 在第一个子函数处执行 D) 由人随机选择执行
7.1.3 下列有关函数错误的描述是(A )
A) C语言中允许函数嵌套定义 B) C语言中允许函数递归调用
C) 调用函数时,实参与形参的个数、类型需完全一致
D) C语言函数的缺省数据类型是int类型
7.1.4 在C语言中,各个函数之间具有的关系是(D )
A) 不允许直接递归调用,也不允许间接递归调用
B) 允许直接递归调用,不允许间接递归调用
C) 不允许直接递归调用,允许间接递归调用
D) 允许直接递归调用,也允许间接递归调用
7.1.5 在C语言中,函数的返回值的类型是由(D )
A) C语言的编译程序,在程序编译时决定
B) 由调用该函数的主调函数所决定
C) 由return语句的表达式的类型所决定
D) 由定义该函数时指定的函数类型所决定
7.1.6 当调用函数时,如果实参是一个数组名,则向函数传送的是(B )
A) 数组的首元素 B) 数组的首地址
C) 数组每个元素的地址 D) 数组每个元素中的值
7.1.7 对于以下程序,不正确的叙述是(A )
#include
void f(int n); /*函数说明*/
void main()
{ void f(int n); /*函数说明*/
f(5);
}
void f(int n)
{ printf("%dn",n); }
A) 若只在主函数中对函数f进行说明,则只能在主函数中正确调用函数f
B) 要求函数f无返回值,所以可用void将其类型定义为无值型
C) 在主函数前对函数f进行说明,则在主函数和其后的其它函数中都可以正确调
用函数f
D) 对于上面程序的说明,编译时系统会提示出错信息:提示对f函数重复说明
7.1.8 以下程序的输出结果是(A )。
long fun( int n)
{ long s;
if(n==1 || n==2) s=2;
else s=n-fun(n-1);
return s;}
void main()
{ printf("%ldn", fun(3)); }
A) 1 B) 2 C) 3 D) 4
7.1.9 有以下程序执行后输出的结果是(C )。
int f1(int x,int y)
{ return x>y?x:y; }
int f2(int x,int y)
{ return x>y?y:x; }
main()
{int a=4,b=3,c=5,d,e,f;
d=f1(a,b); d=f1(d,c);
e=f2(a,b); e=f2(e,c);
f=a+b+c-d-e;
printf("%d,%d,%dn",d,f,e);
}
A)3,4,5 B)5,3,4 C)5,4,3 D)3,5,4
7.1.10 设有以下函数;
f(int a)
{ int b=0;
static int c=3;
b++;c++;
return(a+b+c);
}
如果在下面的程序中调用该函数,则输出结果是(A )。
void main()
{ int a=2, i;
for(i=0;i<3;i++) printf("%dn",f(a));
}
a) b) c) d)
7 7 7 7
8 9 10 7
9 11 13 7
A)a) B)b) C)c) D)d)
7.1.11 以下程序的输出结果是(C )。
int x=3;
void main()
{ int i;
for(i=1;i}
incre()
{ static int x=1;
x*=x+1;
printf(" %d",x);
}
A)3 3 B)2 2 C)2 6 D)2 5
以下程序中的函数reverse的功能是将a所指数组中的内容进行逆置。程序运
行后的输出结果是(A )。
void reverse(int a[],int n)
{int i,t;
for(i=0;i {t=a[i];a[i]=a[n-1-i];a[n-1-i]=t;}
}
void main()
{int b[10]={1,2,3,4,5,6,7,8,9,10}; int i,s=0;
reverse(b,8);
for(i=6;i<10;i++) s+=b[i];
printf("%dn",s);
}
A)22 B)10 C)34 D)30
7.1.13 程序运行后的输出结果是(C )。
#include
void f(char p[][10],int n)
{ char t[20]; int i,j;
for(i=0;i for (j=i+1;j if(strcmp(p[i],p[j])<0)
{ strcpy(t,p[i]);strcpy(p[i],p[j]);strcpy(p[j],t);}
}
void main()
{char p[][10]={"abc","aabdfg","abbd","dcdbe","cd"};int i;
f(p,5); printf("%dn",strlen(p[0]));
}
A)6 B)4 C)5 D)3
7.2 填空题
7.2.1 在C语言中,除主函数外,其子函数分为 标准库函数、自定义函数 两类。
7.2.2 变量在程序使用中,其作用域可分为 全局 变量和 局部 变量。
7.2.3 以下函数用以求x的y次方,请补充填空。
double fun ( double x , int y )
{ int i; double z;
for ( i=1 ; i <=y ; i + + )
z= z*x ;
return z;
}
7.2.4 以下程序的功能是计算
s
long f(int n)
{ int i; long s;
s= 1 ;
7.1.12
k!
,请补充填空。
k0
n
for(i=1; i<=n; i++)
s= s*i ;
return s;
main()
{ long s; int k,n;
scanf("%d",&n);
s= 0 ;
for(k=0; k<=n; k++)
s=s+ f(k) ;
printf("%d",s));
}
习题八
8.1 选择题
8.4.1 下面各语句行中,能正确进行赋字符串操作的语句行是 ( C)
A) char s[4][5]={ "abcd"} B) char s[5]={„a‟,„b‟,„c‟,„e‟,„f‟};
C) char *s; s="abcd"; D) char *s=; scanf(“%s”,s);
8.4.2 正确的数组定义语句为 (D )
A) int A[“a”]; B) int A[3,5]; C) int A[ ][ ]; D) int *A[3];
8.4.3 若有以下说明和语句,对c数组元素的正确引用是(D)
int c[4][5], (*cp)[5];
cp=c;
A) cp+1 B) *(cp+3) C) *(cp+1)+3 D) *(*cp+2)
8.4.4 执行下列语句后,其输出结果为 (B )
#include
void main()
{ int **k, *j, i=100;
j=&i; k=&j;
printf("%dn", **k);
}
A) 运行错误 B) 100 C) i的地址 D) j的地址
8.4.5 设有如下的程序段:
char str[ ]="Hello";
char *ptr;ptr=str;
执行上面的程序段后,*(ptr+5)的值为( B )
A) 'o' B) '0' C) 不确定的值 D) 'o'的地址
8.4.6 若有说明:long *p,a;
则不能通过scanf语句正确给输入项读入数据的程序段是(A)。
A)*p=&a;scanf("%ld",p); B)p=(long *)malloc(8);scanf("%ld",p);
C)scanf("%ld",p=&a); D)scanf("%ld",&a);
8.4.7 下面函数的功能是(B )
sss(s, t)
char *s, *t;
{ while((*s)&&(*t)&&(*t++==*s++)); return(*s-*t);}
A) 求字符串的长度 B) 比较两个字符串的大小
C) 将字符串s复制到字符串t中 D) 将字符串s接续到字符串t中
8.4.8 请选出以下程序的输出结果(B )
#include
sub(x,y,z)
int x, y, *z;
{ *z=y-x; }
void main()
{ int a, b, c;
sub(10,5,&a); sub(7,a,&b); sub(a,b,&c);
printf("%d,%d,%dn", a,b,c);
}
A) 5,2,3 B) -5,-12,-7 C) -5,-12,-17 D) 5,-2,-7
8.4.9 下面函数的功能是(A)
int fun1(char*x)
{ char *y=x;
while(*y++);
return(y-x-1);
}
A)求字符串的长度 B)比较两个字符串的大小
C)将字符串x复制到字符串y D)将字符串x连接到字符串y后面
8.2 填空题
8.2.1 在指针的概念中,“*”表示的含义是所指对象的内容,而“&”表示的含义是 取
变量的地址 。
8.2.2 如果p是一个指针,那么*&p表示的含义是 P ,而&*p表示的含义是
P 。
8.2.3 统计从终端输入的字符中每个大写字母的个数。用#号作为输入结束标志,请
填空。
#include
#include
void main( )
{ int num[26],i;
char c,*pc=&c;
for(i=0; i<26; i++) num[i]=0;
while( (c(或者*pc)=getchar()) !='#') /*统计从终端输入的大写字母个数*/
if( isupper(*pc)) num[*p-65]+=1;
for(i=0; i<26; i++) /*输出大写字母和该字母的个数*/
if(num[i]) printf(“%c: %dn”, i+„A‟, num[i] );
以下程序调用findmax函数求数组中值最大的元素在数组中的下标,请补充填
空。
# include
findmax (int *s ,int t ,int *k )
{ int p;
for(p=0,*k=p;pif ( s[p] > s[*k] ) __*k=p______;
}
void main()
{ int a[10] , i , k ;
for ( i=0 ; i<10 ; i + + ) scanf("%d",&a[i]);
findmax ( a,10,&k );
printf ( "%d,%dn" , k , a[k] );
}
8.2.5 以下程序求a数组中的所有素数的和,函数isprime用来判断自变量是否为素
数,请补充填空。
#include
void main()
{ int i,a[10],*p= a ,sum=0;
printf("Enter 10 num:n");
for(i=0;i<10;i + + ) scanf("%d",&a[i]);
for(i=0;i<10;i + + )
if(isprime(*(p+i)) = = 1)
{ printf("%d",*(a+i)); sum+= a[i] //或者 *(a+i) 或者 *(p+i) ; } /*打印
素数*/
printf("nThe sum=%dn",sum); /*打印所有素数的和*/
}
isprime(int x)
{ int i;
for(i=2;i<=x/2;i + + )
if(x%i = = 0) return (0);
return 1 ;
}
8.2.6 在下列程序中,其函数的功能是比较两个字符串的长度,比较的结果是函数返
回较长的字符串的地址。若两个字符串长度相同,则返回第一个字符串的地址。
#include
char * fun ( char *s, char *t)
{ char *ss=s, *tt=t;
while((*ss)&&(*tt))
{ ss++; tt++; }
if (*tt) return tt;
else return ss ;
}
}
8.2.4
void main( )
{ char a[20],b[10],*p=a,*q=b;
gets(p);
gets( q );
printf("%sn",fun (p, b ));
}
8.3 写出以下程序的运行结果
8.4.1
main( )
{ int a[ ]={2,4,6,8},*p=a,i;
for(i=0;i<4;i++) a[i]=*p++;
printf("%d,%dn",a[2],*(- -p));
}
运行结果: 6,8
8.4.2
#include
void main( )
{ int a,b,c;
int x=4,y=6,z=8;
int p1=&x,p2=&y,*p3;
a=p1==&x;
b=3*(-*p1)/(*p2)+7;
c=*(p3=&z)=*p1*(*p2);
printf("%d,%d,%dn",a,b,c);
}
运行结果: 1,5,24
8.4.3
#include
void main( )
{ int a[ ]={2,4,6,8,10},*p,**k;
p=a; k=&p;
printf("%d ",*(p++));
printf("%d n",**k);
}
运行结果: 24
8.4.4
#include
void main( )
{ int a[3][4]={2,4,6,8,10,12,14,16,18,20,22,24};
int (*p)[4]=a,i,j,k=0;
for(i=0;i<3;i++)
for(j=0;j<2;j++))
k+=*(*(p+i)+j);
printf("%d n",k);
}
运行结果: 66
8.4.5
#include
void main( )
{ int k=0,sign,m;
char s[ ]=“-12345”;
if(s[k]==„+‟||s[k]==„-‟)
sign=s[k++]==„+‟?1:-1;
for(m=0;s[k]>=„0‟&&s[k]<=„9‟;k++)
m=m*10+s[k]-„0‟;
printf("Result=%dn",sign*m);
}
运行结果: Result=-12345
8.4.6 若有5门课程的成绩是:90.5, 72, 80, 61.5, 55,则程序运行结果是多少,其函数执
行什么功能。
#include
float fun ( float *a , int n )
{ int i;
float sum=0;
for(i=0; i sum+=a[i];
return(sum/n);
}
void main()
{ float score[30]={90.5, 72, 80, 61.5, 55}, aver;
aver = fun( score, 5 );
printf( "nAverage score is: %5.2fn", aver);
}
运行结果: Average score is: 71.80 函数功能:求5门课程平均分
8.4.7 若输入字符串"-1234",则程序运行结果是多少,其程序执行什么功能。
#include
#include
long fun ( char *p)
{ long nn=0; int ss=1;
if((*p)=='-'){ p++; ss=-1;}
if((*p)=='+') p++;
while(*p)
nn=nn*10-48+(*p++);
return(nn*ss);
}
void main() /* 主函数 */
{ char s[6];
long n;
8.4.8
8.4.9
printf("Enter a string:n") ;
gets(s);
n = fun(s);
printf("%ldn",n);
}
运行结果: -1234 程序功能:输入一个字符串,并将其转换为数字
下列程序功能是将长整型数中每一位上为偶数的数依次取出,构成一个新数放在t
中。高位仍在高位,低位仍在低位。例如,当s中的数为:87653142时,t中的数
为:8642。请改正程序中的错误,使它能得出正确的结果。
#include
void fun (long s, long *t)
{ int d;
long sl=1;
*t = 0;
while ( s > 0)
{ d = s%10;
if (d/2==0) // 改为:if(d%2==0)
{ *t=d* sl+ *t; sl *= 10; }
s = 10; //改为:s/=10;
}
}
void main()
{ long s, t;
scanf("%ld", &s);
fun(s, &t);
printf("The result is: %ldn", t);
}
下列程序功能是对M行M列整数方阵求两条对角线上各元素之和。请改正程序中
的错误,使它能得出正确的结果。
#include
#define M 5
int fun(int n, int x[ ][ ]) //改int fun(int n,int x[][M])
{ int i, j, sum=0,*p; //改int i,j,sum=0,(*p)[M];
for( p = 1,i= 1;i <= M ; i++ ) //改for(p=x,i=0;i sum += p[ i ][ i ]+p[ i ][ n-i-1 ];
return( sum );
}
void main( )
{ int a[M][M]={{1,2,3,4,5},{4,3,2,1,0},{6,7,8,9,0},{9,8,7,6,5},{3,4,5,6,7}};
printf ( "nThe sum of all elements on 2 diagnals is %d.",fun( M, a ));
}
习题
9
9.1 选择题
9.1.1 在宏定义#define PI 3.14159 中,宏名PI代替的是一个( D )。
A) 常量 B) 单精度数 C) 双精度数 D) 字符串
9.1.2 定义一个名为NEW(X)的宏,产生它的参数的负值,正确的语句是( C )。
A) #define NEW(X) -x B)#define NEW(X) x
C) #define NEW(X) (-x) D)#define NEW(X) (-x);
9.1.3 定义一个名为ABSVAL(X)的宏,产生它的参数的绝对值,正确的语句是( D )。
A) #define ABSVAL(X) (-x)
B) #define ABSVAL(X) (x<0 ? –x:x)
C) #define ABSVAL(X) (x>0 ? x:-x)
D) #define ABSVAL(X) ((x)<0 ?(-x):(x))
9.1.4 下列格式中哪个是合法的( D)。
A) #define PI=3.14159 B) include "string.h"
C) #include math.h; D) #define s(r) r*r
9.1.5 以下程序的输出结果是( B )。
#define MIN(x,y) (x)<(y)?(x):(y)
main( )
{ int i=10,j=15,k;
k=10*MIN(i,j);
printf("%dn",k);
}
A) 10 B) 15 C) 100 D) 150
9.1.6 以下有关宏替换的叙述不正确的是( C )。
A) 宏替换只是字符替换 B) 宏名无类型
C) 宏名必须用大写字母表示 D) 宏替换不占用运行时间
9.1.7 设有以下宏定义,则执行语句“z=2*(N+Y(5+1));”后,z值为( C )。
#define N 3
#define Y(n) ((N+1)*n)
A) 42 B) 15 C) 48 D) 出错
9.1.8 设有以下定义:#define F(n) 2*n ,则表达式F(4+2)的值是( B )。
A) 12 B) 10 C) 22 D)20
9.1.9 关于预处理,以下叙述正确的是( B )。
A. 可以把define和if定义为用户标识符(即宏名或常量符号名)
B. 可以把define定义为用户标识符,但不能把if定义为用户标识符
C. 可以把if定义为用户标识符,但不能把define定义为用户标识符
D. define和if都不能定义为用户标识符
9.1.10 关于预处理,以下叙述正确的是( B )。
A. 预处理命令行必须位于C源程序的起始位置
B. 在C语言中,预处理命令行都以“#”开头
C. 每个C程序必须在开头包含预处理命令行:#include
D. C语言的预处理不能实现宏定义和条件编译的功能
9.2 编程题
9.2.1 写出下列程序的运行结果,并上机予以验证。
#define LETTER 0
void main( )
{ char str[20]= "C Language",c;
int i=0;
while( (c=str[i])!= '0' )
{ i=i+1;
#if LETTER
if( c>='a' &&c<='z' )
c=c-32;
#else
if( c>='A' &&c<='Z')
c=c+32;
#endif
printf("%c",c);
}
}
运行结果:
c language
9.2.2 写出下列程序的运行结果,并上机予以验证。
#define EXCH(a,b) { int t;t=a;a=b;b=t;}
void main( )
{ int x=5,y=9;
EXCH(x,y);
printf("x=%d,y=%dn",x,y);
运行结果:
x=9,y=5
9.2.3 写出下列程序的运行结果,并上机予以验证。
#define PR(x) printf("%d,",x)
void main( )
{ int i,a[ ]={1,3,5,7,9,11,13,15},*p=a+5;
for(i=3;i;i--)
switch( i )
{ case 1:
case 2: PR(*p++);break;
case 3: PR(*(--p));
}
}
运行结果:
9,9,11
习题10
10.1 填空题
10.1.1 C语言允许定义由不同数据项组合的数据类型,称为 结构 。
10.1.2 结构体 、 共用体 和 数组 都是C语言的构造类型。
10.1.3 结构体变量成员的引用方式是使用 · 运算符。
10.1.4 结构体指针变量成员的引用方式是使用 -> 运算符。
10.1.5 若有定义:
struct num
{
int a ; int b ; float f ;
}n={1,3,5.0};
struct num *pn=&n ;
则表达式pn->b/n.a*(++pn->b)的值是 12 , 表达式
(*pn).a+pn->f的值是 6.00000 。
10.1.6 C语言可以定义共用体类型,其关键字为 union 。
10.1.7 C语言允许用 typedef 声明新的类型名来代替已有的类型名。
10.1.8 链表中,每个结点包括两个部分:一个是存储数据元素的 数据域 ,另一
个是存储下一个结点地址的 指针域 。
10.1.9 相比于线性表顺序结构,链表比较方便 插入 和 删除 操作。
10.1.10 常用的内存管理函数有 malloc 、 calloc 、 free 。
10.2 选择题
10.2.1 有如下说明语句,则下面叙述不正确的是 。
struct stu {
int a ; float b ;
}stutype;
A)struct是结构体类型的关键字 B)struct stu是用户定义的
结构体类型
C)stutype是用户定义的结构体类型名 D)a和b都是结构体成员名
10.2.2 以下对结构类型变量的定义中不正确的是 。
A)#define STUDENT struct student B)struct student
STUDENT { { int num;
int num ; float age ; float age;
}std1 ; }std1;
C)struct { D)struct {
int num ; int num ;
float age ;
float age ; }student;
} std1 ; struct student
std1 ;
10.2.3 当定义一个结构体变量时,系统分配给它的内存是 。
A)各成员所需内存量的总和 B)结构中第一个成员所需内存量
C)成员中占内存量最大的容量 D)结构中最后一个成员所需内存量
10.2.4 已知学生记录描述为:
struct student
{
int no ; char name[20]; char sex;
struct {
int year; int month ; int day ;
} birth ;
} s ;
设结构变量s中的“birth”应是“1985年10月1日”,则下面正确的赋值方式
是 。
A)year=1985 B)=1985
month=10 =10
day=1 =1
C)=1985 D)=1985
=10 =10
=1 =1
10.2.5 下面程序的运行结果是 。
main ( )
{
struct complx {
int x; int y ;
} cnum[2]={1,3,2,7} ;
printf(“%dn”,cnum[0].y/cnum[0].x*cnum[1].x) ;
}
A)0 B)1 C)2 D)6
10.2.6 以下对结构体变量成员不正确的引用是 。
struct pupil
{
char name[20]; int age; int sex ;
} pup[5], *p=pup ;
A)scanf(“%s”,pup[0].name); B)
scanf(“%d”,&pup[0].age);
C)scanf(“%d”,&(p->sex)); D)scanf(“%d”,p->age);
10.2.7 若要利用下面的程序段使指针变量p指向一个存储整型变量的存储单元,则
在【】中应有的内容是 。
int *p ;
p = 【】malloc(sizeof(int));
A)int B)int * C)(*int) D)
(int*)
10.2.8 当定义一个共用体变量时,系统分配给它的内存是 。
A)各成员所需内存量的总和 B)结构中第一个成员所需内存量
C)成员中占内存量最大的容量 D)结构中最后一个成员所需内存量
10.2.9 以下对C语言中共用体类型数据的叙述正确的是 。
A)可以对共用体变量直接赋值
B)一个共用体变量中可以同时存放其所有成员
C)一个共用体变量中不能同时存放其所有成员
D)共用体类型定义中不能出现结构体类型的成员
10.2.10 下面对typedef的叙述中不正确的是 。
A)用typedef可以定义多种类型名,但不能用来定义变量
B)用typedef可以增加新类型
C)用typedef只是将已存在的类型用一个新的标识符来代表
D)使用typedef有利于程序的通用和移植
习题11
11.1填空题
1.1.1 C系统的标准数入文件是指__键盘_______。
1.1.2 正常执行fclose函数的返回值是 0 。
1.1.3 在C程序中,数据可以用 二进制 、 ASCII 两种方式存放。
1.1.4 fgets函数的作用是从指定文件读入一个字符,该文件的打开方式必须是 读或读
写 。
1.1.5 C语言中,文件的存取时是以 字符 为单位的,这种文件被称为 流式 文件。
1.1.6 在C程序中,如要定义文件指针fp,定义形式为 FILE *fp; 。
1.1.7 列出能够用于写入数据到文件的三个函数 fputc 、 fputs 和 fprintf 。
1.1.8 列出能够用于从文件中读取数据的三个函数 fgetc 、 fets 和 fscanf 。
1.1.9 fseek 函数可以把文件指针定义到文件中的任何位置。
1.1.10 有函数语句 fgets(buf,n,fp);其作用是从fp指向的文件中读入 n-1 字符放到buf
字符数组中,函数返回值是 buf的首地址。
发表评论