C语言练习题(带详解答案) 下载本文

执行printf(?%c %s\\n?,*p,p);即以字符%c形式输出*p所对应的字符。此时p指 向数组中的第2个元素,即s[1],因此*p表示s[1]中的值,即’B’. 然后再以字 符串%s的形式输出以p中地址为首地址的整个字符串,此时p指向s[1],即 从s[1]开始,依次输出后面的字符串,因此又输出BCD

执行完循环体,转向执行表达式3,即p= p+1。p+1表示以p当前所指向的

位置起始,之后1个元素的地址,即s[2]的地址,然后将a[2]的地址赋给p。 s[2]的地址等价于s+2,因此循环条件p

执行printf(?%c %s\\n?,*p,p);即以字符%c形式输出*p所对应的字符。此时p指

向数组中的第3个元素,即s[2],因此*p表示s[2]中的值,即’C’. 然后再以字 符串%s的形式输出以p中地址为首地址的整个字符串,此时p指向s[2],即 从s[2]开始,依次输出后面的字符串,因此又输出CD

执行完循环体,转向执行表达式3,即p= p+1。p+1表示以p当前所指向的

位置起始,之后1个元素的地址,即s[2]的地址,然后将s[2]的地址赋给p。 s[2]的地址等价于s+3,因此循环条件p

执行printf(?%c %s\\n?,*p,p);即以字符%c形式输出*p所对应的字符。此时p指

向数组中的第4个元素,即s[3],因此*p表示s[3]中的值,即’D’. 然后再以字 符串%s的形式输出以p中地址为首地址的整个字符串,即输出D

执行完循环体,转向执行表达式3,即p= p+1。p+1表示以p当前所指向的

位置起始,之后1个元素的地址,即s[3]的地址,然后将s[3]的地址赋给p。 s[3]的地址等价于s+4,因此循环条件p

结构体 1.

#include struct st { int x; int y;

} a[2]={5, 7, 2, 9} ; main() {

printf(\}

运行结果是: 14

首先是定义结构体st,st中共有两个整型成员x,y。

然后定义一个st类型的数组a,a的长度为2,即数组中含有两个st类型的元素,分别是a[0]和a[1]. 对a进行初始化,此题是按照储存顺序进行初始化,即将5赋给a[0]中的x(即a[0].x=5);

将7赋给a[0]中的y(即a[0].y=7); 将2赋给a[1]中的x(即a[1].x=2); 将9赋给a[1]中的y(即a[1].y=9);

执行main函数,输出表达式a[0].y*a [1].x的值,即7*2的值

5 a[0].x a[0] 7 a[0].y 2 a[1].x a[1] 9 a[1].y 2. #include main( )

{struct stu {int num;

char a[5]; float score;

}m={1234,?wang?,89.5}; printf(?%d,%s,%f?,m.num,m.a,m.score); }

运行结果是: 1234,wang,89.5 3.

#include struct cmplx { int x; int y;

} cnum[2]={1, 3, 2, 7}; main( ) {

printf(?%d\\n?, cnum[0].y * cnum[1].x ); }

运行结果是:6 与第一题解法同

4.

#include struct abc

{ int a, b, c; }; main()

{ struct abc s[2]={{1,2,3},{4,5,6}}; int t;

t=s[0].a+s[1].b; printf(\

}

运行结果是:6

与第一题解法同

二、 程序填空

1.输入一个字符,判断该字符是数字、字母、空格还是其他字符。

main( ) { char ch; ch=getchar();

if( ch>=’a’&&ch<=’z’|| ch>=’A’&&ch<=’Z’ ) printf(\ else if( ch>=’0’&&ch<=’9’ )

printf(\else if( ch== ‘ ’ )

printf(\ else

printf(\

第1空:字符在计算机中以ASCII码的形式存储。所以当输入的字符,即ch中字符所对应的ASCII码的范围在英文字母的ASCII码的范围内即可,参照p377。由于英文字母又分为大写字母和小写字母,因此此处用一个逻辑或表达式,表示ch中是小写字母或者大写字母,都能使得表达式成立。ch>=97&&ch<=122|| ch>=65&&ch<=90

需要注意的是,对于本题区间所对应的表达式,不可写作97<=ch<=122,也不可写作’A’<=ch <=’Z’. 对于97<=ch<=122因为在计算此表达式时的顺序是从左向右,因此先计算97<=ch。无论ch中的取值如何,表达式97<=ch的值只有两种情况:0或1.所以无论是0还是1,都小于122,因此97<=ch<=122恒成立。

第3空,判断ch中是否为空格,也是通过ch中字符与空格字符的ASCII码来判断。在判断表达式的值是否相等时,用关系符号==;不要用赋值符号=。

2.下列程序的功能是从输入的整数中,统计大于零的整数个数和小于零的整数个数。用输入0来结束输入,用i,j来放统计数,请填空完成程序。 void main()

{ int n,i=0,j=0;

printf(?input a integer,0 for end\\n?); scanf(?%d?,&n);

while ( n或n!=0 ) {

if(n>0) i= i+1 ;

else j=j+1; }

printf(?i=M,j=M\\n?,i,j); }

此题用i来记录大于零的整数,用j记录小于零的整数。所以循环条件是n(或者n!=0)即当n不为0时执行循环体。在循环体中是一个选择语句。如果n>0,则令i加1,相当于令正整数的个数加1;否则(即n<0),令j加1,相当于令负整数的个数加1。

3.编程计算1+3+5+……+101的值

#include void main() { int i, sum = 0;

for (i = 1; i<=101 ; i=i+2; )

sum = sum + i;

printf(\

for语句的一般形式详见p120.

表达式1为i = 1,为循环变量赋初值,即循环从1开始,本题从1到101,因此终值是101,表达式2是循环条件,用来控制循环的结束,因此循环条件为i<=101;表达式3为循环变量的自增,本题是

4.编程计算1+3+5…+99的值

main()

{ int i, sum = 0;

i=1;

while ( i<100 )

{ sum = sum + i;

I=i+2 ; } printf(\}

5.从键盘输入一个字符,判断它是否是英文字母。 #include