综 合 练 习 题
一、从下列四个供选择的答案中选出正确的一个答案
1、语句printf(“%%d%d”,123); 将输出:
A) %123%d B) %%d123 C) %d123 D)上述语句语法有错
,%%”格式表示输出一个“%”。
2、执行下列程序段后,a值为:
int a,b;
a=15; b=12;
a=(a-- ==b++)? a%5,a/5;
A) 0 B) 2.8 C ) 4 D) 2
先计算a--==b++的值:
a--的值为15,执行后a=14;b++的值为12,执行后b=13;15==12为假执行a/5即14/5值为2
结果,a = 2
3、判断字符变量c的值为数字(’0’---’9’)则返回1,否则返回0,可用表达式:
A) ‘0’<=c<=‘9’ B) ‘0’<=c && c<=‘9’ C) ‘0’<=c || c<= ‘9’ D)以上均不是
4、对于int x,y; 语句 if (x<0) y= -1; else if (!x) y=0; else y=1; 等价于:
A) y=0; if (x>=0) if (x) y=1; else y= -1;
B) if (x!=0) if (x>0) y=1; else y= -1; else y=0;
C) if (x<0) y= -1; if (x!=0) y=1; else y=0;
D) y= -1; if (x!=0) if (x>0) y=1; else y=0;
语句if (x<0) y= -1; else if (!x) y=0; else y=1; 等价于:
if (x < 0)
y = -1;
else {
if (!x)
y = 0;
else
y = 1;
}
即:
-1 x < 0
y = 0 x = 0
1 x > 0
5、循环 for(i=0,j=5; ++i!=--j; ) printf(“%d %d”,i,j); 将执行
A) 6次 B) 3次 C) 0次 D) 无限次
i = 0,j = 5,(++i(1) != (--j(4) 成立,i = 1,j = 4
i = 1,j = 4,(++i(2) != (--j(3) 成立,i = 2,j = 3
i = 2,j = 3,(++i(3) != (--j(2) 成立,i = 3,j = 2
……
6、下列程序段执行后s值为:
int i=5,s=0;
do if (i%2) continue; else s+=i; while (--i);
A) 15 B) 9 C) 6 D) 以上均不是
写成规范形式:
do
if (i % 2)
continue;
else
s += i;
while (--i);
i = 5,s = 0,i % 2 = 1,i = 4
i = 4,s = 0,i % 2 = 0,s = 0 + 4 = 4; i = 3
i = 3,s = 4,i % 2 = 1,i = 2
i = 2,s = 4,i % 2 = 0,s = 4 + 2 = 6; i = 1
i = 1,s = 6,i % 2 = 1,i = 0
7、对于int a,要使((1<<2>>1)|a)==a; 则a 可以是:
A) 2 B) 6 C) 10 D) 2,6,10均可
1,0000 0000 0000 0001
1<<2,0000 0000 0000 0100
1<<2>>1,0000 0000 0000 0010
(1<<2>>1) | 2,0000 0000 0000 0010 (2)
(1<<2>>1) | 6,0000 0000 0000 0110 (6)
(1<<2>>1) | 10,0000 0000 0000 1010 (10)
8、对于以下宏定义:
#define SQ(x) x*x
#define DD(x,y) SQ(x)-SQ(y)
宏调用DD(2*3,2+3)执行后值为:
A) 43 B) 11 C) 25 D) 以上均不是
DD(2*3,2+3)
(SQ(2*3)-SQ(2+3)
(2*3*2*3-2+3*2+3
(43
9、对于以下结构定义:
struct { int len;
char *str;
} *p;
*p->str++中的++加在
A) 指针str上 B) 指针p上 C) str所指的内容上 D) 以上均不是
优先级:,->” >,*” =,++”,++是右结合
*p->str++ (( *((p->str)++)
例子,假如有
则*p->str++的值为 ‘H’,执行后,str指向’e’单元.
10、将s所指节点加到p所指节点之后(如下图),其语句应为:
next,
,.......
p next
s
A) s->next = p+1; p->next = s;
B) p->next = s; s->next = p->next;
C) s->next=p->next; p->next=s->next;
D) s->next = p->next; p->next = s;
11、语句if (a>b) k=0; else k=1; (int a,b,k) 等价于:
A) k=(a>b)?1:0; B) k=a>b; C) k=a<=b; D) 以上均不是
12、对于int i; char c,s[20];从输入序列123ab45efg中将123读入i; ’ b’读入c;,45efg”读入s,则scanf语句应写为:
A) scanf(“%da%c%s”,i,c,s) B) scanf(“%d%*c%c%s”,&i,&c,s);
C) scanf(“%da%c%s”,&i,&c,&s) D) scanf(“%d%c%c%s”,&i,&c,s);
13、若有以下说明和语句,已知int和double类型分别占2和8个字节,则sizeof(st)的值为:
struct st {
char a[10];
union {
int i;
double y;
}
};
A) 18 B) 20 C) 12 D) 以上均不是
14、对于以下程序段,运行后i值为:
enum WEEKS {1,2,3,4,5,6,7} ;
enum WEEKS a=1;
int i=0;
switch (a) {
case 1,i=1;
case 2,i=2;
default,i=3;
}
A) 1 B) 0 C) 3 D) 上述程序有语法错误
15、对于以下递归函数f,调用f(4),其返回值为:
int f(int n)
{ return f(n-1)+n; }
A) 10 B) 11 C) 0 D) 以上均不是
16、某一程序TEST.C,编译后运行:TEST 123 456 ABC 则相应的argc及argv[3]分别为:
A) 3,456” B) 3,ABC” C) 4,456” D) 4,ABC”
17、如下程序段:
int c[]={1,7,12};
int *k;
k=c;
printf("next k is %d",*++k);
其输出应为:
A) 2 B) 7 C) 1 D)以上均不对
18、如果变量xx有如下类型:
struct {
char a1; 1
int a2; 2
} xx;
如果sizeof(xx)的值为3,则:
union {
char a1;
int a2;
int a3;
} yy;
则sizeof(yy)函数的返回值应为:
A) 2 B) 4 C) 5 D)定义有错
19、对于enum { RAIN,CLOUD,CLEAR } weather;做如下操作:
⑴ weather=1;
⑵ weather=CLOUD; 下列哪个说法是对的。
A) ⑴是错的 B) ⑵是错的 C) ⑴与⑵是一样的 D)以上都错
20、设 int a1=7,a2=1,xx; 进行如下操作xx = ( a1<< 1 )&~( a2<<2 )后 xx 的值为:
A) 0 B) 1 C) 10 D) 以上都错
7,0000 0000 0000 0111
7<<1,0000 0000 0000 1110
1<<2,0000 0000 0000 0100
~(1<<2),1111 1111 1111 1011
& 0000 0000 0000 1010
0000 0000 0000 1010 (10)
21、执行 i=3; if(i>3) if ( i<4 ) i=1 else i=2; 后i的值应为:
A) 1 B) 2 C) 3 D) 语句错误
22、执行下列程序:
#define MA(x,y) ( (x)*(y) )
i=5;
i=MA(i,i+1)-7;
后变量i的值应为:
A) 30 B) 19 C) 23 D) 1
MA(i,i+1)-7
((i) * (i+1)) – 7
(5 * 6 ) – 7
23
23、执行下列程序:
int i,j;
i = 3/2 + 7/2 == 5;
j = 45 % 11 + (((7>8)? 14:21) == 14);
后变量i,j的值应为:
A) i=0 j=1 B) i=1 j=1
C) i=0 j=2 D) i=1 j=2
i = ((3/2 + 7/2) == 5) = ((1+3) == 5) = (4 == 5) = 0;
j = 1 + (21 == 14) = 1 + 0 = 1
24、如果char cc[]="12345",做sizeof(cc)后的返回值应为
A) 2 B) 5 C) 6 D) 1
sizeof()返回参数对象的字节数,这里的参数是字符数组cc,有6个元素.
25、如果 int i=16,j=23 ; 执行 printf("%x--%o",i,j)后输出为:
A) 10--23 B) 10--27 C) 16--23 D) 16--27
26、执行下列程序:
#define MA(x,y) (x)*(y)
int i = 2;
i = 3/MA(i,i+1)+5;
printf(“%d\n”,i);
其输出应为:
A) 5 B) 8 C) 0 D) 以上都错
3/MA(i,i+1)+5
3/(i)*(i+1)+5
3/2*3+5
8
27、有一函数:
int f(int a) {
auto int b = 0;
static int c = 3;
b = b+1;
c = c+1;
return(a+b+c);
}
如果有int i,j; 则执行两次调用:i=f(2); j=f(2) 后,i,j值为:
A) i = 7,j = 7 B) i = 7,j = 8
C) i = 8,j = 7 D) i = 8,j = 8
注意静态局部变量static int c;的含义
第一次调用f(2):
开始时,b = 0,c = 3
执行,b = 0 + 1 = 1,c = 3 + 1 = 4;
返回,a+b+c=2+1+4=7;
调用结束后,静态局部变量c=4保持不变;
第二次调用f(2):
开始时,b = 0,c = 4
执行,b = 0 + 1 = 1,c = 4 + 1 = 5;
返回,a+b+c=2+1+5=8;
调用结束后,静态局部变量c=5保持不变;
28、有一函数:
int f(char *s) {
int k = 0;
while (*s) k = k*10+*s++-’0’;
return(k);
}
调用f(“1234”)的返回结果是:
A),1234” B) 1234 C),4321” D) 4321
while循环等价于,while (*s) k = k * 10 + (*s++) – ‘0’;
该函数的作用:将数字字符串转换成相应的整数.
29、static int a[] = {1,2,3},*p,*q;
p = a+1;
q = p++;
执行该程序段后,p和q所指向的单元的内容分别为:
A) (*p) = 1,(*q) = 2 B) (*p) = 2,(*q) = 3
C) (*p) = 3,(*q) = 2 D) 以上都错
a
30、static struct {
int x,y[3];
} a[3] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}},*p;
p = a;
则*((int *)(p+1)+2) =?
A) 3 B) 7 C) 10 D) 以上都错
p 1
2
3
4
p+1 5
6
7
8
9
10
11
12
二、填空题
1、用for循环打印 1 4 7 10 13 16 19 22 25,其语句应为:
for (i=1; i<=9; i++) printf(“%3d”,_3*i-2__);
2、执行完下列语句段后,i,j值分别为:___355,350__
int i,j;
j=10*(i=5);
i+=j*=i+2;
第一条语句执行后,i = 5,j = 50
执行第二条语句:
i+=j*=i+2
i += (j *= (i+2))
i += (j *= 7)
i += (j = 50*7)
i = 5 + 350 = 355,j = 350
3、执行完下列语句段后,i值为:__5__
static int a[3][4]={{1,2,3},{4,5,6}},i;
i= a[0][5];
a[0][0] 1 X
a[0][1] 2 X+2
a[0][2] 3 X+4
a[0][3]? X+6
a[1][0] 4 X+8
a[1][1] 5 X+10
a[1][2] 6 X+12
a[1][3]? X+14
a[2][0]? X+16
a[2][1]? X+18
a[2][2]? X+20
a[2][3]? X+22
a[0][5]的地址,X+(0*4+5)*2 = X + 10,即对应于a[1][1]。
4、执行完下列语句段后,i值为:__4___
int i;
int f(int x)
{ static int k = 0;
x+=k++;
return x;
}
i=f(2);
i=f(3);
5、执行完下列语句段后,i值为:__18__
int i;
int f(int x)
{ return ((x>0)? x*f(x-1):3); }
i=f(f(1));
调用f(1):
成立,执行1*f(0)=f(0),
调用f(0) = 3
所以,f(1)=3;
调用f(3):
f(3) = 3 * f(2)
f(2) = 2 * f(1) = 2 * 3 = 6
所以 f(3) = 3 * 6 = 18
6、执行完下列语句段后,s和f值分别为,__”%s%lf”,12.4__
char s[20];
double f;
sscanf(“%s%lf 12.4%s%f12.5”,“%s %lf”,s,&f);
函数sscanf()的一般形式,sscanf(char *buffer,char *format,var1,var2,var3,…)
它的含义:从缓冲区buffer中按照格式字符串format读入变量var1,var2,var3,…的值。
7、对于char c; 若已知其值为小写字母,将其转换为相应大写字母的表达式为 ___c – ‘a’ + ‘A’______
8、将p说明为字符数组指针,数组大小为10,可写为:__char (*p)[10];__
9、用typedef定义类型CP,以表示一个指向含有10个字符型元素的指针数组类型。
typedef char *CP[10];
四个步骤:
(1) char *ptr[10];
char *CP[10];
typedef char *CP[10];
(4) CP *ptr[10];
10、如下函数
void f(char *s,char *t)
{ int i;
i=0;
while (s[i]=t[i]) i++;
}
等价于:
void f(char *s,char *t)
{ while (_*s++_ = *t++);
}
11、int i=0,s=0;
while (i<n) s+=i++;
等价于
int i,s;
for(_i=0,s=0; i < n; s+=i++_);
12、head为指向以下结构的链表指针,统计链表中所有inf域值之和(s)的程序段为:
struct nlist {
int inf;
struct nlist *next;
} *head,*p;
long s;
for (p=head,s=0; _p != NULL_ ; p = p->next)
s += __p->inf__;
13、下列程序判断字符串s是否对称,对称则返回1,否则返回0; 如f(“abcba”)返回1,f(“abab”)返回0;
int f(__char s[]_) a b c b a \0
{ int i=0,j=0;
while(s[j]) j++;
for ( j--; i<j && __s[i]==s[j]_; i++,j--) ; i ( ( j
return __ i>=j__;
}
14、下面是用二分法从数组v[n]中查找数x的函数,返回值为x所在下标(若找到)或-1(没找到):
binsearch(int x,int v[],int n)
{ int low,high,mid;
low=0; high=n-1;
while (low<=high) {
mid = _ (low+high)/2_;
if (x<v[mid]) high = mid -1;
else if (x>v[mid]) low = mid +1;
else return __ mid_;
}
return -1;
}
15、下面程序验证哥德巴赫猜想,即寻找2到1000间满足“偶数=素数1+素数2”(如10=3+7)的所有偶数。素数指只能被1和自身整除的正整数,如1,2,3,17等。
#include <stdio.h>
#define MAX 500
int prime(int n) /* 判断n是否为素数 */
{ int i;
for (i=2; i<=n-1; i++)
if (!(n%i)) break;
return _ i==n_;
}
main()
{ int i,j;
for (i=1 ; i<=500; i++)
for (j=1; j<2*i; j+=2)
if (_prime(j) && prime(2*i-j)_) {
printf(“%d = %d +%d\n”,2*i,j,2*i-j); /*若2*i为两个素数之和 */
break;
}
}
16、对于整型变量i,j执行scanf("%d%*d%d",&i,&j);当输入2 3 4 5 6后
i=_ 2_ j= _4__
17、对于 int *p,*q,i=5,j=6;执行:
p = &i;
q = p;
p = &j;后 (*p)=_ 6_,(*q)= __5__
18、f( int m )
{
int i,j;
for( i=0; i<m; i++ )
for( j=m-1; j>=0; j--)
printf(“%1d%c",i+j,j?'*':'#');
}
如果调用f(3)将输出__2*1*0#3*2*1#4*3*2#__
19、void f( int *a,int b )
{
static int k=0;
*a += ++k;
b +=2;
}
若执行 i=2; j=4;
f( &i,j );
f( &j,i ) 后 i= __3__,j= __6___
i 2 ( 3 j 4 i 3 j 4 ( 6
k 0 ( 1 k 1 ( 2
a b 4 ( 6 a b 3 ( 5
20、用for循环打印 0 1 2 0 1 2 0 1 2;
for( i=1; i<=9; i++ ) printf("%2d",__(i-1)%3__);
21、定义一个返回整型的函数指针p,应写为 _int (*p)();_
22、定义字符指针数组arr,数组大小为20,应写为 __char *arr[20];__
23、程序A
void f( char cc[] )
{
char ch;
int i=0,j=0;
while ( cc[i]!=NULL ) i++;
i --;
for( ;j<i; i--,j++ ) {
ch = cc[j];
cc[j] = cc[i];
cc[i] = ch;
}
}
等价于程序B
void f( char *cc )
{
char *p1,*p2,ch;
p1=p2=cc;
while(_*p2_)
p2++;
p2 - -;
while( p1<p2 ) {
ch = *p2;
_*p2_ = *p1;
_*p1_ = ch;
_p1++_;
p2 - -;
}
}
24、程序A:
int f( int n )
{
if(n<=1)
return n;
else
return f(n-1)+f(n-2);
}
等价于程序B:
int f( int n )
{
_int t0,t1,t_;
t0=0; t1=1; t=n;
while (_n>=2_) {
t = _t0+t1_;
t0 = t1;
t1 = t;
n - -;
}
return _t_;
}
25、下列函数strcmp(s1,s2)是字符串比较,根据s1,s2大小分别返回负数(s1<s2),0(s1=s2),正数(s1>s2),请将缺少的部分补上。
strcmp(_char *s1,char *s2_)
{
for(; s1!=_ ‘\0’_; ++s1,++s2)
if (*s1!= *s2) break;
return (_*s1-*s2_);
}
26、下列函数f(A,n,x)将正整数x插入已从小到大排序好的数组A中,数组A当前分量个数为n,例如,当A的前5个分量为(2,3,9,12,15),n=5时,调用f(A,n,10)后,n变为6,A的前6个量为:(2,3,9,10,12,15)。 A[0] A[1] A[2] A[3] A[4]A[5]
void f(_int A[],int n,int x_) 2 3 9 12 15 x
{
int t,i;
i=n; A[n+1]=_ x_; i
while ((i>=0) && (_A[i]>A[i+1]_)) {
t=A[i];
A[i]=A[i+1];
A[i+1]=t;
i - -;
}
n++;
}
27、本程序从一个文件中from.txt读出内容,除去其中的数字后写入另一文件to.txt。请将程序中所缺的部分补上。
#include<stdio.h>
int main()
{
FILE *fr,*to;
int cc;
if (_(fr=fopen(“fr.txt”,“r”)) == NULL_) {
printf( " Can not open file--> form.txt " );
return 1;
}
if (_(to=fopen(“to.txt”,“w”)) == NULL _) {
printf( " Can not open file--> to.txt " );
return 1;
}
while ( ( cc = getc( fr ) ) != EOF )
if ( cc<'0' || cc>'9' ) _putc(cc,to)_;
_fclose(fr),fclose(to)_;
}
三、程序阅读理解,并回答相应问题
1、 #include <stdio.h>
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
main()
{ int s,i;
for(s=0,i=0; i<3; i++)
s+= *(*a+i);
printf(“%d,,s);
for(s=0,i=0; i<3; i++)
s+= **(a+i);
printf(“%d,,s);
}
问题,上述程序运行后,将输出__6 15__
a[][ 0] a[][1] a[][2] a[][3]
a[0] 1 2 3 4
a[1] 5 6 7 8
a[2] 9 10 11 12
由于:*(a + i) ( a[i],*a + i ( a[0] + i
*(*a+i) ( *(a[0] + i) ( a[0][i],所以,第一个循环是将数组a的第0行的前3个元数相加,值为6;
**(a+i) ( *a[i] ( a[i][0] 所以,第一个循环是将数组a的第0列所有的元数相加,值为15。
2、 #include <stdio.h>
int x,y,z,w;
void p(int x,int *y)
{ int z;
++x; x 2(3 y z 6
++*y;
z=x+*y;
w+=x;
printf(“%3d%3d%3d%3d\n”,x,*y,z,w);
}
main()
{ x=y=z=w=2; x 2(3 y 2 z 2 w 2(5
p(y,&x);
printf(“%3d%3d%3d%3d\n”,x,y,z,w);
}
问题,上述程序运行后,第一行将输出___ 3 3 6 5___
第二行将输出__ 3 2 2 5_
3、#include <stdio.h>
int a[2][5];
void p1(int v[])
{ int i,j,temp;
for (i=1; i<5; i++)
for(j=i-1; j>=0 && v[j]<v[j+1]; j--) {
temp=v[j]; v[j]=v[j+1]; v[j+1]=temp;
}
}
void p2(int v1[],int v2[])
{ int i=0,j=0;
while (i<5 && j<5)
if (v1[i]>v2[j]) printf("%d ",v1[i++]);
else printf("%d ",v2[j++]);
while (i<5) printf("%d ",v1[i++]);
while (j<5) printf("%d ",v1[j++]);
printf("\n");
}
main()
{ int i,j;
for (i=0; i<2; i++)
for(j=0; j<5; j++)
scanf("%d",&a[i][j]);
p1(a[0]);
p1(a[1]);
for (i=0; i<2; i++)
for(j=0; j<5; j++)
printf("%d ",a[i][j]);
printf("\n");
p2(a[0],a[1]);
}
问题,当输入5 9 1 12 10 7 3 11 4 10时,上述程序运行后,
第一行将输出_12 10 9 5 1 11 10 7 4 3_ 第二行将输出_12 11 10 10 9 7 5 4 3 1_
函数p1()的功能:将参数数组的每个元素按从大到小的顺序排列。
函数p2()的功能:将两个参数数组中的每个元素(已经降序排列)混合在一起,并按从大到小的顺序输出。
4、#include <stdio.h>
void p( int r[],int s,int t )
{
int i,j,x;
i=s; j=t; x=r[s];
while( i < j ) {
while ( ( i < j ) && ( r[j] >= x ) ) /* NOTE 1*/
j--;
r[i]=r[j];
while ( ( i < j ) && ( r[i] <= x ) ) /* NOTE 2*/
i++;
r[j]=r[i];
}
r[i]=x;
}
main()
{
int i,n,a[100];
scanf("%d",&n);
for( i=1; i<=n ; i++ )
scanf( "%d",&a[i] );
p( a,1,n );
for( i=1; i<=n; i++ )
printf( "%3d",a[i] );
}
问题:⒈当输入 6 49 38 65 97 13 27 时,
将输出_27 38 13 49 97 65_
⒉若将作NOTE 1标记的一行中的r[j]>=x改为r[j]<=x,同时将作NOTE 2 标记的一行中的r[i]<=x改为r[i]>=x 对于问题一中的相同输入,将输出__97 65 49 38 13 27_
5,#include<stdio.h>
int x,y,z;
const C = 5; /* const 定义“常”变量,即只能对其进行初始化赋值,以后不能改变其值 */
void p( int *x,int y)
{
/* 标注 */
++*x;
y--;
z= *x+y;
printf("%3d %3d %3d",*x,y,z );
}
void main()
{
x=1; y=C; z=2;
p(&y,x);
printf("%3d %3d %3d",x,y,z );
}
问题:⒈上述程序运行后,第一行将输出_ 6 0 6 _第二行将输出_ 1 6 6_
⒉若在函数p中/* 标注 */ 处改成 int z;则
程序运行后,第一行将输出_ 6 0 6_第二行将输出_ 1 6 2_
6、 #include <stdio.h>
#define F(k) k+3.14
#define P(a) printf("a=%d\n",(int)(a))
#define P1(a) P(a);putchar('\n');
#define P2(a,b) P(a);p1(b);
main()
{
int x = 1;
{
int x = 2;
P(x*F(2));
}
{
for (; x < 10; x += 50)
P2(x,9.15*x+32);
}
}
请写出该程序中有关宏定义的展开式,并给出该程序的运行结果。
有关展开:
P(x*F(2));
( printf(“a=%d\n”,(int)(x*F(2)));
( printf(“a=%d\n”,(int)(x*2+3.14));
P2(x,9.15*x+32);
P(x);P1(9.15*x+32);
P(x); ( printf(“a=%d\n”,(int)(x));
P1(9.15*x+32) ( P(9.15*x+32);putchar(‘\n’);
P(9.15*x+32);( printf(“a=%d\n”,(int)(9.15*x+32));
( printf(“a=%d\n”,(int)(x));printf(“a=%d\n”,(int)(9.15*x+32));putchar(‘\n’);
全部展开,并整理,得:
main()
{
int x = 1;
{
int x = 2;
printf(“a=%d\n”,(int)(x*2+3.14));
}
{
for (;x<10;x+=50)
printf(“a=%d\n”,(int)(x));
printf(“a=%d\n”,(int)(9.15*x+32));
putchar(‘\n’);
}
运行结果:
a=7
a=1
a=498
7、 struct student {
int num;
char name[20];
char sex;
int age;
};
struct student stu[3] = {
{1001,“Li Lin”,‘M’,18},
{1002,“Zhang Fun”,‘M’,19},
{1004,“Wang Min”,‘F’,20}
};
main() {
struct student *p;
p = &stu[1];
printf(“%d\n”,(p++)->num); /* Note */
}
请回答下列问题,
1)画出数组stu在内存中的存放示意图;
2)执行该程序后,将输出:
1002
3)若将Note标记一行中的(p++)->num改为(++p)->num,
则程序将输出:
1004
1001
,Li Lin”
‘M’
18
p 1002
,Zhang Fun”
‘M’
19
1004
,Wang Min”
‘F’
20
四,请按下列要求编程
请编写一个带命令行参数的程序prog.c,当运行prog filename时将文本文件filename按原样在标准输出(终端)上输出;当运行prog -n filename时将文本文件按原样在标准输出(终端)上输出,并在各行开头显示当前行行号(从1:开始,如1:XXXXXXXX);其它运行方式均显示出错信息.
/* prog filename,Print the file only.
prog -n filename,print the file with a number per line.
*/
#include <stdio.h>
#include <conio.h>
#include <string.h>
main(int argc,int *argv[])
{
int flag;
FILE *fp;
char *file,c;
int count = 0;
clrscr();
flag = 0;
if (argc == 2)
file = argv[1];
else if (argc == 3 && strcmp(argv[1],“-n”) == 0) {
file = argv[2];
flag = 1;
} else {
printf(“prog,Bad parameter!\n”);
exit(-1);
}
if ((fp=fopen(file,“r”)) == NULL) {
printf(“Cannot open ‘‘%s’’\n”,file);
exit(-1);
}
c = ‘\n’;
while (!feof(fp)) {
if (flag && (count == 0 || c == ‘\n’)
printf(“%d:”,++count);
putchar(c=fgetc(fp));
}
fclose(fp);
}
一、从下列四个供选择的答案中选出正确的一个答案
1、语句printf(“%%d%d”,123); 将输出:
A) %123%d B) %%d123 C) %d123 D)上述语句语法有错
,%%”格式表示输出一个“%”。
2、执行下列程序段后,a值为:
int a,b;
a=15; b=12;
a=(a-- ==b++)? a%5,a/5;
A) 0 B) 2.8 C ) 4 D) 2
先计算a--==b++的值:
a--的值为15,执行后a=14;b++的值为12,执行后b=13;15==12为假执行a/5即14/5值为2
结果,a = 2
3、判断字符变量c的值为数字(’0’---’9’)则返回1,否则返回0,可用表达式:
A) ‘0’<=c<=‘9’ B) ‘0’<=c && c<=‘9’ C) ‘0’<=c || c<= ‘9’ D)以上均不是
4、对于int x,y; 语句 if (x<0) y= -1; else if (!x) y=0; else y=1; 等价于:
A) y=0; if (x>=0) if (x) y=1; else y= -1;
B) if (x!=0) if (x>0) y=1; else y= -1; else y=0;
C) if (x<0) y= -1; if (x!=0) y=1; else y=0;
D) y= -1; if (x!=0) if (x>0) y=1; else y=0;
语句if (x<0) y= -1; else if (!x) y=0; else y=1; 等价于:
if (x < 0)
y = -1;
else {
if (!x)
y = 0;
else
y = 1;
}
即:
-1 x < 0
y = 0 x = 0
1 x > 0
5、循环 for(i=0,j=5; ++i!=--j; ) printf(“%d %d”,i,j); 将执行
A) 6次 B) 3次 C) 0次 D) 无限次
i = 0,j = 5,(++i(1) != (--j(4) 成立,i = 1,j = 4
i = 1,j = 4,(++i(2) != (--j(3) 成立,i = 2,j = 3
i = 2,j = 3,(++i(3) != (--j(2) 成立,i = 3,j = 2
……
6、下列程序段执行后s值为:
int i=5,s=0;
do if (i%2) continue; else s+=i; while (--i);
A) 15 B) 9 C) 6 D) 以上均不是
写成规范形式:
do
if (i % 2)
continue;
else
s += i;
while (--i);
i = 5,s = 0,i % 2 = 1,i = 4
i = 4,s = 0,i % 2 = 0,s = 0 + 4 = 4; i = 3
i = 3,s = 4,i % 2 = 1,i = 2
i = 2,s = 4,i % 2 = 0,s = 4 + 2 = 6; i = 1
i = 1,s = 6,i % 2 = 1,i = 0
7、对于int a,要使((1<<2>>1)|a)==a; 则a 可以是:
A) 2 B) 6 C) 10 D) 2,6,10均可
1,0000 0000 0000 0001
1<<2,0000 0000 0000 0100
1<<2>>1,0000 0000 0000 0010
(1<<2>>1) | 2,0000 0000 0000 0010 (2)
(1<<2>>1) | 6,0000 0000 0000 0110 (6)
(1<<2>>1) | 10,0000 0000 0000 1010 (10)
8、对于以下宏定义:
#define SQ(x) x*x
#define DD(x,y) SQ(x)-SQ(y)
宏调用DD(2*3,2+3)执行后值为:
A) 43 B) 11 C) 25 D) 以上均不是
DD(2*3,2+3)
(SQ(2*3)-SQ(2+3)
(2*3*2*3-2+3*2+3
(43
9、对于以下结构定义:
struct { int len;
char *str;
} *p;
*p->str++中的++加在
A) 指针str上 B) 指针p上 C) str所指的内容上 D) 以上均不是
优先级:,->” >,*” =,++”,++是右结合
*p->str++ (( *((p->str)++)
例子,假如有
则*p->str++的值为 ‘H’,执行后,str指向’e’单元.
10、将s所指节点加到p所指节点之后(如下图),其语句应为:
next,
,.......
p next
s
A) s->next = p+1; p->next = s;
B) p->next = s; s->next = p->next;
C) s->next=p->next; p->next=s->next;
D) s->next = p->next; p->next = s;
11、语句if (a>b) k=0; else k=1; (int a,b,k) 等价于:
A) k=(a>b)?1:0; B) k=a>b; C) k=a<=b; D) 以上均不是
12、对于int i; char c,s[20];从输入序列123ab45efg中将123读入i; ’ b’读入c;,45efg”读入s,则scanf语句应写为:
A) scanf(“%da%c%s”,i,c,s) B) scanf(“%d%*c%c%s”,&i,&c,s);
C) scanf(“%da%c%s”,&i,&c,&s) D) scanf(“%d%c%c%s”,&i,&c,s);
13、若有以下说明和语句,已知int和double类型分别占2和8个字节,则sizeof(st)的值为:
struct st {
char a[10];
union {
int i;
double y;
}
};
A) 18 B) 20 C) 12 D) 以上均不是
14、对于以下程序段,运行后i值为:
enum WEEKS {1,2,3,4,5,6,7} ;
enum WEEKS a=1;
int i=0;
switch (a) {
case 1,i=1;
case 2,i=2;
default,i=3;
}
A) 1 B) 0 C) 3 D) 上述程序有语法错误
15、对于以下递归函数f,调用f(4),其返回值为:
int f(int n)
{ return f(n-1)+n; }
A) 10 B) 11 C) 0 D) 以上均不是
16、某一程序TEST.C,编译后运行:TEST 123 456 ABC 则相应的argc及argv[3]分别为:
A) 3,456” B) 3,ABC” C) 4,456” D) 4,ABC”
17、如下程序段:
int c[]={1,7,12};
int *k;
k=c;
printf("next k is %d",*++k);
其输出应为:
A) 2 B) 7 C) 1 D)以上均不对
18、如果变量xx有如下类型:
struct {
char a1; 1
int a2; 2
} xx;
如果sizeof(xx)的值为3,则:
union {
char a1;
int a2;
int a3;
} yy;
则sizeof(yy)函数的返回值应为:
A) 2 B) 4 C) 5 D)定义有错
19、对于enum { RAIN,CLOUD,CLEAR } weather;做如下操作:
⑴ weather=1;
⑵ weather=CLOUD; 下列哪个说法是对的。
A) ⑴是错的 B) ⑵是错的 C) ⑴与⑵是一样的 D)以上都错
20、设 int a1=7,a2=1,xx; 进行如下操作xx = ( a1<< 1 )&~( a2<<2 )后 xx 的值为:
A) 0 B) 1 C) 10 D) 以上都错
7,0000 0000 0000 0111
7<<1,0000 0000 0000 1110
1<<2,0000 0000 0000 0100
~(1<<2),1111 1111 1111 1011
& 0000 0000 0000 1010
0000 0000 0000 1010 (10)
21、执行 i=3; if(i>3) if ( i<4 ) i=1 else i=2; 后i的值应为:
A) 1 B) 2 C) 3 D) 语句错误
22、执行下列程序:
#define MA(x,y) ( (x)*(y) )
i=5;
i=MA(i,i+1)-7;
后变量i的值应为:
A) 30 B) 19 C) 23 D) 1
MA(i,i+1)-7
((i) * (i+1)) – 7
(5 * 6 ) – 7
23
23、执行下列程序:
int i,j;
i = 3/2 + 7/2 == 5;
j = 45 % 11 + (((7>8)? 14:21) == 14);
后变量i,j的值应为:
A) i=0 j=1 B) i=1 j=1
C) i=0 j=2 D) i=1 j=2
i = ((3/2 + 7/2) == 5) = ((1+3) == 5) = (4 == 5) = 0;
j = 1 + (21 == 14) = 1 + 0 = 1
24、如果char cc[]="12345",做sizeof(cc)后的返回值应为
A) 2 B) 5 C) 6 D) 1
sizeof()返回参数对象的字节数,这里的参数是字符数组cc,有6个元素.
25、如果 int i=16,j=23 ; 执行 printf("%x--%o",i,j)后输出为:
A) 10--23 B) 10--27 C) 16--23 D) 16--27
26、执行下列程序:
#define MA(x,y) (x)*(y)
int i = 2;
i = 3/MA(i,i+1)+5;
printf(“%d\n”,i);
其输出应为:
A) 5 B) 8 C) 0 D) 以上都错
3/MA(i,i+1)+5
3/(i)*(i+1)+5
3/2*3+5
8
27、有一函数:
int f(int a) {
auto int b = 0;
static int c = 3;
b = b+1;
c = c+1;
return(a+b+c);
}
如果有int i,j; 则执行两次调用:i=f(2); j=f(2) 后,i,j值为:
A) i = 7,j = 7 B) i = 7,j = 8
C) i = 8,j = 7 D) i = 8,j = 8
注意静态局部变量static int c;的含义
第一次调用f(2):
开始时,b = 0,c = 3
执行,b = 0 + 1 = 1,c = 3 + 1 = 4;
返回,a+b+c=2+1+4=7;
调用结束后,静态局部变量c=4保持不变;
第二次调用f(2):
开始时,b = 0,c = 4
执行,b = 0 + 1 = 1,c = 4 + 1 = 5;
返回,a+b+c=2+1+5=8;
调用结束后,静态局部变量c=5保持不变;
28、有一函数:
int f(char *s) {
int k = 0;
while (*s) k = k*10+*s++-’0’;
return(k);
}
调用f(“1234”)的返回结果是:
A),1234” B) 1234 C),4321” D) 4321
while循环等价于,while (*s) k = k * 10 + (*s++) – ‘0’;
该函数的作用:将数字字符串转换成相应的整数.
29、static int a[] = {1,2,3},*p,*q;
p = a+1;
q = p++;
执行该程序段后,p和q所指向的单元的内容分别为:
A) (*p) = 1,(*q) = 2 B) (*p) = 2,(*q) = 3
C) (*p) = 3,(*q) = 2 D) 以上都错
a
30、static struct {
int x,y[3];
} a[3] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}},*p;
p = a;
则*((int *)(p+1)+2) =?
A) 3 B) 7 C) 10 D) 以上都错
p 1
2
3
4
p+1 5
6
7
8
9
10
11
12
二、填空题
1、用for循环打印 1 4 7 10 13 16 19 22 25,其语句应为:
for (i=1; i<=9; i++) printf(“%3d”,_3*i-2__);
2、执行完下列语句段后,i,j值分别为:___355,350__
int i,j;
j=10*(i=5);
i+=j*=i+2;
第一条语句执行后,i = 5,j = 50
执行第二条语句:
i+=j*=i+2
i += (j *= (i+2))
i += (j *= 7)
i += (j = 50*7)
i = 5 + 350 = 355,j = 350
3、执行完下列语句段后,i值为:__5__
static int a[3][4]={{1,2,3},{4,5,6}},i;
i= a[0][5];
a[0][0] 1 X
a[0][1] 2 X+2
a[0][2] 3 X+4
a[0][3]? X+6
a[1][0] 4 X+8
a[1][1] 5 X+10
a[1][2] 6 X+12
a[1][3]? X+14
a[2][0]? X+16
a[2][1]? X+18
a[2][2]? X+20
a[2][3]? X+22
a[0][5]的地址,X+(0*4+5)*2 = X + 10,即对应于a[1][1]。
4、执行完下列语句段后,i值为:__4___
int i;
int f(int x)
{ static int k = 0;
x+=k++;
return x;
}
i=f(2);
i=f(3);
5、执行完下列语句段后,i值为:__18__
int i;
int f(int x)
{ return ((x>0)? x*f(x-1):3); }
i=f(f(1));
调用f(1):
成立,执行1*f(0)=f(0),
调用f(0) = 3
所以,f(1)=3;
调用f(3):
f(3) = 3 * f(2)
f(2) = 2 * f(1) = 2 * 3 = 6
所以 f(3) = 3 * 6 = 18
6、执行完下列语句段后,s和f值分别为,__”%s%lf”,12.4__
char s[20];
double f;
sscanf(“%s%lf 12.4%s%f12.5”,“%s %lf”,s,&f);
函数sscanf()的一般形式,sscanf(char *buffer,char *format,var1,var2,var3,…)
它的含义:从缓冲区buffer中按照格式字符串format读入变量var1,var2,var3,…的值。
7、对于char c; 若已知其值为小写字母,将其转换为相应大写字母的表达式为 ___c – ‘a’ + ‘A’______
8、将p说明为字符数组指针,数组大小为10,可写为:__char (*p)[10];__
9、用typedef定义类型CP,以表示一个指向含有10个字符型元素的指针数组类型。
typedef char *CP[10];
四个步骤:
(1) char *ptr[10];
char *CP[10];
typedef char *CP[10];
(4) CP *ptr[10];
10、如下函数
void f(char *s,char *t)
{ int i;
i=0;
while (s[i]=t[i]) i++;
}
等价于:
void f(char *s,char *t)
{ while (_*s++_ = *t++);
}
11、int i=0,s=0;
while (i<n) s+=i++;
等价于
int i,s;
for(_i=0,s=0; i < n; s+=i++_);
12、head为指向以下结构的链表指针,统计链表中所有inf域值之和(s)的程序段为:
struct nlist {
int inf;
struct nlist *next;
} *head,*p;
long s;
for (p=head,s=0; _p != NULL_ ; p = p->next)
s += __p->inf__;
13、下列程序判断字符串s是否对称,对称则返回1,否则返回0; 如f(“abcba”)返回1,f(“abab”)返回0;
int f(__char s[]_) a b c b a \0
{ int i=0,j=0;
while(s[j]) j++;
for ( j--; i<j && __s[i]==s[j]_; i++,j--) ; i ( ( j
return __ i>=j__;
}
14、下面是用二分法从数组v[n]中查找数x的函数,返回值为x所在下标(若找到)或-1(没找到):
binsearch(int x,int v[],int n)
{ int low,high,mid;
low=0; high=n-1;
while (low<=high) {
mid = _ (low+high)/2_;
if (x<v[mid]) high = mid -1;
else if (x>v[mid]) low = mid +1;
else return __ mid_;
}
return -1;
}
15、下面程序验证哥德巴赫猜想,即寻找2到1000间满足“偶数=素数1+素数2”(如10=3+7)的所有偶数。素数指只能被1和自身整除的正整数,如1,2,3,17等。
#include <stdio.h>
#define MAX 500
int prime(int n) /* 判断n是否为素数 */
{ int i;
for (i=2; i<=n-1; i++)
if (!(n%i)) break;
return _ i==n_;
}
main()
{ int i,j;
for (i=1 ; i<=500; i++)
for (j=1; j<2*i; j+=2)
if (_prime(j) && prime(2*i-j)_) {
printf(“%d = %d +%d\n”,2*i,j,2*i-j); /*若2*i为两个素数之和 */
break;
}
}
16、对于整型变量i,j执行scanf("%d%*d%d",&i,&j);当输入2 3 4 5 6后
i=_ 2_ j= _4__
17、对于 int *p,*q,i=5,j=6;执行:
p = &i;
q = p;
p = &j;后 (*p)=_ 6_,(*q)= __5__
18、f( int m )
{
int i,j;
for( i=0; i<m; i++ )
for( j=m-1; j>=0; j--)
printf(“%1d%c",i+j,j?'*':'#');
}
如果调用f(3)将输出__2*1*0#3*2*1#4*3*2#__
19、void f( int *a,int b )
{
static int k=0;
*a += ++k;
b +=2;
}
若执行 i=2; j=4;
f( &i,j );
f( &j,i ) 后 i= __3__,j= __6___
i 2 ( 3 j 4 i 3 j 4 ( 6
k 0 ( 1 k 1 ( 2
a b 4 ( 6 a b 3 ( 5
20、用for循环打印 0 1 2 0 1 2 0 1 2;
for( i=1; i<=9; i++ ) printf("%2d",__(i-1)%3__);
21、定义一个返回整型的函数指针p,应写为 _int (*p)();_
22、定义字符指针数组arr,数组大小为20,应写为 __char *arr[20];__
23、程序A
void f( char cc[] )
{
char ch;
int i=0,j=0;
while ( cc[i]!=NULL ) i++;
i --;
for( ;j<i; i--,j++ ) {
ch = cc[j];
cc[j] = cc[i];
cc[i] = ch;
}
}
等价于程序B
void f( char *cc )
{
char *p1,*p2,ch;
p1=p2=cc;
while(_*p2_)
p2++;
p2 - -;
while( p1<p2 ) {
ch = *p2;
_*p2_ = *p1;
_*p1_ = ch;
_p1++_;
p2 - -;
}
}
24、程序A:
int f( int n )
{
if(n<=1)
return n;
else
return f(n-1)+f(n-2);
}
等价于程序B:
int f( int n )
{
_int t0,t1,t_;
t0=0; t1=1; t=n;
while (_n>=2_) {
t = _t0+t1_;
t0 = t1;
t1 = t;
n - -;
}
return _t_;
}
25、下列函数strcmp(s1,s2)是字符串比较,根据s1,s2大小分别返回负数(s1<s2),0(s1=s2),正数(s1>s2),请将缺少的部分补上。
strcmp(_char *s1,char *s2_)
{
for(; s1!=_ ‘\0’_; ++s1,++s2)
if (*s1!= *s2) break;
return (_*s1-*s2_);
}
26、下列函数f(A,n,x)将正整数x插入已从小到大排序好的数组A中,数组A当前分量个数为n,例如,当A的前5个分量为(2,3,9,12,15),n=5时,调用f(A,n,10)后,n变为6,A的前6个量为:(2,3,9,10,12,15)。 A[0] A[1] A[2] A[3] A[4]A[5]
void f(_int A[],int n,int x_) 2 3 9 12 15 x
{
int t,i;
i=n; A[n+1]=_ x_; i
while ((i>=0) && (_A[i]>A[i+1]_)) {
t=A[i];
A[i]=A[i+1];
A[i+1]=t;
i - -;
}
n++;
}
27、本程序从一个文件中from.txt读出内容,除去其中的数字后写入另一文件to.txt。请将程序中所缺的部分补上。
#include<stdio.h>
int main()
{
FILE *fr,*to;
int cc;
if (_(fr=fopen(“fr.txt”,“r”)) == NULL_) {
printf( " Can not open file--> form.txt " );
return 1;
}
if (_(to=fopen(“to.txt”,“w”)) == NULL _) {
printf( " Can not open file--> to.txt " );
return 1;
}
while ( ( cc = getc( fr ) ) != EOF )
if ( cc<'0' || cc>'9' ) _putc(cc,to)_;
_fclose(fr),fclose(to)_;
}
三、程序阅读理解,并回答相应问题
1、 #include <stdio.h>
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
main()
{ int s,i;
for(s=0,i=0; i<3; i++)
s+= *(*a+i);
printf(“%d,,s);
for(s=0,i=0; i<3; i++)
s+= **(a+i);
printf(“%d,,s);
}
问题,上述程序运行后,将输出__6 15__
a[][ 0] a[][1] a[][2] a[][3]
a[0] 1 2 3 4
a[1] 5 6 7 8
a[2] 9 10 11 12
由于:*(a + i) ( a[i],*a + i ( a[0] + i
*(*a+i) ( *(a[0] + i) ( a[0][i],所以,第一个循环是将数组a的第0行的前3个元数相加,值为6;
**(a+i) ( *a[i] ( a[i][0] 所以,第一个循环是将数组a的第0列所有的元数相加,值为15。
2、 #include <stdio.h>
int x,y,z,w;
void p(int x,int *y)
{ int z;
++x; x 2(3 y z 6
++*y;
z=x+*y;
w+=x;
printf(“%3d%3d%3d%3d\n”,x,*y,z,w);
}
main()
{ x=y=z=w=2; x 2(3 y 2 z 2 w 2(5
p(y,&x);
printf(“%3d%3d%3d%3d\n”,x,y,z,w);
}
问题,上述程序运行后,第一行将输出___ 3 3 6 5___
第二行将输出__ 3 2 2 5_
3、#include <stdio.h>
int a[2][5];
void p1(int v[])
{ int i,j,temp;
for (i=1; i<5; i++)
for(j=i-1; j>=0 && v[j]<v[j+1]; j--) {
temp=v[j]; v[j]=v[j+1]; v[j+1]=temp;
}
}
void p2(int v1[],int v2[])
{ int i=0,j=0;
while (i<5 && j<5)
if (v1[i]>v2[j]) printf("%d ",v1[i++]);
else printf("%d ",v2[j++]);
while (i<5) printf("%d ",v1[i++]);
while (j<5) printf("%d ",v1[j++]);
printf("\n");
}
main()
{ int i,j;
for (i=0; i<2; i++)
for(j=0; j<5; j++)
scanf("%d",&a[i][j]);
p1(a[0]);
p1(a[1]);
for (i=0; i<2; i++)
for(j=0; j<5; j++)
printf("%d ",a[i][j]);
printf("\n");
p2(a[0],a[1]);
}
问题,当输入5 9 1 12 10 7 3 11 4 10时,上述程序运行后,
第一行将输出_12 10 9 5 1 11 10 7 4 3_ 第二行将输出_12 11 10 10 9 7 5 4 3 1_
函数p1()的功能:将参数数组的每个元素按从大到小的顺序排列。
函数p2()的功能:将两个参数数组中的每个元素(已经降序排列)混合在一起,并按从大到小的顺序输出。
4、#include <stdio.h>
void p( int r[],int s,int t )
{
int i,j,x;
i=s; j=t; x=r[s];
while( i < j ) {
while ( ( i < j ) && ( r[j] >= x ) ) /* NOTE 1*/
j--;
r[i]=r[j];
while ( ( i < j ) && ( r[i] <= x ) ) /* NOTE 2*/
i++;
r[j]=r[i];
}
r[i]=x;
}
main()
{
int i,n,a[100];
scanf("%d",&n);
for( i=1; i<=n ; i++ )
scanf( "%d",&a[i] );
p( a,1,n );
for( i=1; i<=n; i++ )
printf( "%3d",a[i] );
}
问题:⒈当输入 6 49 38 65 97 13 27 时,
将输出_27 38 13 49 97 65_
⒉若将作NOTE 1标记的一行中的r[j]>=x改为r[j]<=x,同时将作NOTE 2 标记的一行中的r[i]<=x改为r[i]>=x 对于问题一中的相同输入,将输出__97 65 49 38 13 27_
5,#include<stdio.h>
int x,y,z;
const C = 5; /* const 定义“常”变量,即只能对其进行初始化赋值,以后不能改变其值 */
void p( int *x,int y)
{
/* 标注 */
++*x;
y--;
z= *x+y;
printf("%3d %3d %3d",*x,y,z );
}
void main()
{
x=1; y=C; z=2;
p(&y,x);
printf("%3d %3d %3d",x,y,z );
}
问题:⒈上述程序运行后,第一行将输出_ 6 0 6 _第二行将输出_ 1 6 6_
⒉若在函数p中/* 标注 */ 处改成 int z;则
程序运行后,第一行将输出_ 6 0 6_第二行将输出_ 1 6 2_
6、 #include <stdio.h>
#define F(k) k+3.14
#define P(a) printf("a=%d\n",(int)(a))
#define P1(a) P(a);putchar('\n');
#define P2(a,b) P(a);p1(b);
main()
{
int x = 1;
{
int x = 2;
P(x*F(2));
}
{
for (; x < 10; x += 50)
P2(x,9.15*x+32);
}
}
请写出该程序中有关宏定义的展开式,并给出该程序的运行结果。
有关展开:
P(x*F(2));
( printf(“a=%d\n”,(int)(x*F(2)));
( printf(“a=%d\n”,(int)(x*2+3.14));
P2(x,9.15*x+32);
P(x);P1(9.15*x+32);
P(x); ( printf(“a=%d\n”,(int)(x));
P1(9.15*x+32) ( P(9.15*x+32);putchar(‘\n’);
P(9.15*x+32);( printf(“a=%d\n”,(int)(9.15*x+32));
( printf(“a=%d\n”,(int)(x));printf(“a=%d\n”,(int)(9.15*x+32));putchar(‘\n’);
全部展开,并整理,得:
main()
{
int x = 1;
{
int x = 2;
printf(“a=%d\n”,(int)(x*2+3.14));
}
{
for (;x<10;x+=50)
printf(“a=%d\n”,(int)(x));
printf(“a=%d\n”,(int)(9.15*x+32));
putchar(‘\n’);
}
运行结果:
a=7
a=1
a=498
7、 struct student {
int num;
char name[20];
char sex;
int age;
};
struct student stu[3] = {
{1001,“Li Lin”,‘M’,18},
{1002,“Zhang Fun”,‘M’,19},
{1004,“Wang Min”,‘F’,20}
};
main() {
struct student *p;
p = &stu[1];
printf(“%d\n”,(p++)->num); /* Note */
}
请回答下列问题,
1)画出数组stu在内存中的存放示意图;
2)执行该程序后,将输出:
1002
3)若将Note标记一行中的(p++)->num改为(++p)->num,
则程序将输出:
1004
1001
,Li Lin”
‘M’
18
p 1002
,Zhang Fun”
‘M’
19
1004
,Wang Min”
‘F’
20
四,请按下列要求编程
请编写一个带命令行参数的程序prog.c,当运行prog filename时将文本文件filename按原样在标准输出(终端)上输出;当运行prog -n filename时将文本文件按原样在标准输出(终端)上输出,并在各行开头显示当前行行号(从1:开始,如1:XXXXXXXX);其它运行方式均显示出错信息.
/* prog filename,Print the file only.
prog -n filename,print the file with a number per line.
*/
#include <stdio.h>
#include <conio.h>
#include <string.h>
main(int argc,int *argv[])
{
int flag;
FILE *fp;
char *file,c;
int count = 0;
clrscr();
flag = 0;
if (argc == 2)
file = argv[1];
else if (argc == 3 && strcmp(argv[1],“-n”) == 0) {
file = argv[2];
flag = 1;
} else {
printf(“prog,Bad parameter!\n”);
exit(-1);
}
if ((fp=fopen(file,“r”)) == NULL) {
printf(“Cannot open ‘‘%s’’\n”,file);
exit(-1);
}
c = ‘\n’;
while (!feof(fp)) {
if (flag && (count == 0 || c == ‘\n’)
printf(“%d:”,++count);
putchar(c=fgetc(fp));
}
fclose(fp);
}