admin 管理员组

文章数量: 887021


2024年1月25日发(作者:mdb数据库合并工具)

C语言程序设计(第二版)习题参考题答案

-CAL-FENGHAI.-(YICAI)-Company One1

C语言程序设计习题参考答案

习 题 1

一、判断题

1.在计算机中,小数点和正负号都有专用部件来保存和表示。

2.二进制是由0和1两个数字组成的进制方式。

3.二进制数的逻辑运算是按位进行的,位与位之间没有进位和借位的关系。

4.在整数的二进制表示方法中,0的原码、反码都有两种形式。

5.有符号数有三种表示法:原码、反码和补码。

6.常用字符的ASCII码值从小到大的排列规律是:空格、阿拉伯数字、大写英文字母、小写英文字母。

解:1.F 2.T 3.T 4.T 5.T 6.T

二、单选题

1.在计算机中,最适合进行数值加减运算的数值编码是 。

A. 原码 B. 反码 C. 补码 D. 移码

2.已知英文小写字母m的ASCII码为十进制数109,则英文小写字母y的ASCII码为十进制数 。

A. 112 B. 120 C. 121 D. 122

3.关于ASCII码,在计算机中的表示方法准确地描述是 。

A. 使用8位二进制数,最右边一位为1

B. 使用8位二进制数,最左边一位为1

C. 使用8位二进制数,最右边一位为0

D. 使用8位二进制数,最左边一位为0

4.设在机器字长4位,X=0111B,Y=1011B,则下列逻辑运算中,正确的是___________。

A. X∧Y=1000 B. X∨Y=1111 C. X⊕Y=0011 D. ¯ =1000 Y5.下列叙述中正确的是( )。

A.高级语言就是机器语言

B.汇编语言程序、高级语言程序都是计算机程序,但只有机器语言程序才是计算机可以直接识别并执行的程序

C.C语言因为具有汇编语言的一些特性,所以是汇编语言的一种

D.C源程序经过编译、连接,若正确,执行后就能得到正确的运行结果

6.用C语言编写的源程序经过编译后,若没有产生编译错误,则系统将( )。

A.生成可执行文件 B.生成目标文件

C.输出运行结果 D.自动保存源文件

7.下列叙述中不正确的是( )。

A.main函数在C程序中必须有且只有一个

B. C程序的执行从main函数开始,所以main函数必须放在程序最前面

C. 函数可以带参数,也可以不带参数。

D. 每个函数执行时,按函数体中语句的先后次序,依次执行每条语句

解:1.C 2.C 3.D 4.B 5.B 6.B 7.B

三、填空题

1.()10=( )2=( )8=( )16

2.(.10111)2=( )8=( )16=( )10

3.输入三个数,计算并输出三个数的和与三个数的乘积。

程序如下:

#include <>

void main()

{

int a,b,c,s,z;

printf("Please input a b c:n");

s=a+b+c;

printf("%dn",s);

}

*4. 输入三角形三条边的边长,计算并输出三角形的面积。

根据三条边的边长,计算三角形面积的公式如下:

xyz面积s(sx)(sy)(sz)

其中s

2程序如下:

#include <>

#include <>

void main()

{

double x,y,z,s,dime;

scanf("%lf%lf%lf",&x,&y,&z);

dime=sqrt(s*(s-x)*(s-y)*(s-z));

}

解:1.

2.

3.scanf("%f%f%f",&a,&b,&c); z=a*b*c; printf("%f",z);

4.s=(x+y+2)/2; printf("%f",dim);

四、编程题

1.仿照例,编程序在屏幕上显示:

*****************************

Merry Christmas!

Happy New Year!

*****************************

解:#include <>

void main()

{ printf("*****************************n");

printf(" Merry Christmas!n");

printf(" Happy New Year!n");

printf("*****************************n");

}

2.仿照例编程,输入一个整数,计算这个数的平方。

解:#include<>

void main()

{ int a,z;

printf("请输入一个整数:n");

scanf("%d",&a);

z=a*a;

printf("%d*%d=%dn",a,a,z);

}

*3.仿照例编程,输入两个数后,输出其中较小值。

解:#include<>

float min(float x, float y)

{ float m;

if (x

else m=y;

return m;

}

void main()

{ float a,b,c,mindata;

printf("请输入二个数:n");

scanf("%f %f",&a,&b);

mindata=min(a,b);

printf("较小数:%fn",mindata);

}

*4.仿照例编程,输入a、b后,输出一元一次方程ax+b=0的解。

解:#include<>

void main()

{ float a,b,x;

printf("请输入a、b:n");

scanf("%f %f",&a,&b);

x=-a/b;

printf("x=%fn",x);

}

*5.仿照例编程,输入圆柱体的半径和高,计算并输出圆柱体的体积。

解:#include <>

void main()

{ float r,h,s,v;

printf("Please input r and h:n");

scanf("%f %f",&r,&h);

v=*r*r*h;

printf("V=%fn",v);

}

习 题2

一、判断题

1.任何变量都必须要定义其类型。

2.C语言的double类型数据在其数值范围内可以表示任何实数。

3.C语言的任何类型数据在计算机内都是以二进制形式存储的。

4.isdigit(‘5’)的结果为0。

5.printf函数中格式符“%c”对应的参数只能是字符类型。

6.按格式符“%d”输出float类型变量时,截断小数位取整后输出。

7.在C语言程序中,ABC与abc是两个相同的变量。

8.scanf函数中的格式符“%d”不能用于输入实型数据。

9.格式符“%f”不能用于输入double类型数据。

10.当格式符中指定宽度时,输出的信息完全取决于所指定的宽度。

解:(1)T (2)F (3)T (4)F (5)F (6)F (7)F (8)T (9)T (10)F

二、指出下列各项中哪些是C语言中的常量,并指出其类型

10,150 007 –0x3d π 1e0 e1 o7o8

‘x’ ‘xo’ sin(3) 0xf16 ‘a’ ‘009’

+2 ‘’ ‘a’+2 0x100h 0128 10L

解:合法的C常量有:

整型常量: 007 –0x3d 0xf16 10L

实型常量: 1e0 +2

字符型常量:‘x’ ‘a’ ‘’

三、指出下列各项中哪些是C语言中的用户标识符

x_1 X_2 High printf β 3DS i/j

e2 -e2

count Int number $23 next_

sizeof IF sum_12 _123# NO1: double for

解:C的用户标识符有:x_1 X_2 High e2 count Int number

next_ IF sum_12

四、单项选择题

1.C语言中,char型数据在内存中的存储形式是( )。

A.原码 B.反码 C.补码

D.ASCII码

2.若有定义语句“char c='72';”则变量c( )。

A.包含1个字符 B.包含2个字符 C.包含3个字符 D.定义不合法

3.C语言中的基本数据类型包括( )。

A.整型、实型、逻辑型 B.整型、实型、字符型

C.整型、逻辑型、字符型 D.整型、实型、逻辑型、字符型

4.设c1、c2为字符型变量,执行语句“c1=getchar( );c2=getchar( );”时,从键盘输入A↙,c1和c2的值分别为( )。

A.都是‘A’ B.c1是‘A’,c2未输入

C.c1未输入,c2是‘A’ D.c1是‘A’,c2是‘n’

5.a、b是整型变量,执行语句“scanf("a=%d,b=%d",&a,&b);”,使a和b的值分别为1和2,正确的输入是( )。

A.1 2 B.1,2 C.a=1,b=2

D.a=1 b=2

6.设c为字符型变量值为‘A’,a为整型变量值为97,执行语句“putchar(c);putchar(a);”后,输出结果为( )。

A.Aa B.A97 C.A9

D.aA

7.已知字母A的ASCII码值为65,以下语句段的输出结果是( )。

char c1='A',c2='Y'; printf("%d,%dn",c1,c2);

A.输出格式非法,输出错误信息 B.65,90

C.A,Y D.65,89

8.若要使用输入语句“scanf("%4d%4d%10f",&i,&j,&x);”,为i输入-10,为j输入12,为x输入,则正确的输入形式是( )。

A.–↙ B.–10 12 ↙

C.–.67↙ D.–10,12,↙

9.能正确地定义符号常量的是( )。

A.#define n=10 B.#define n 10 C.#define n 10; D.#DEFINE N 10

10.在C语言中,int、char、short三种类型数据在内存中所占的字节数( )。

A.由用户自己定义 B.均为2个字节 C.是任意的 D.由机器字长决定

解:(1) D (2) A (3) B (4) D (5) C (6) A (7) D (8) B (9) B (10) D

五、填空题

1.char ch='$';float x=;

语句“printf("%c%–n",ch,x);”的输出结果是 。

解:$ n

2.int i=123;float x= – ;

语句“printf("i=%5d x=%n",i,x);”的输出结果是 。

解:i= 123 x=

3.char c='a';int a=65;

语句“putchar(c+1);putchar(a);”的输出结果是 。

解:bA

4.int a=98;

语句“printf(“%d,%c,%o,%x”,a,a+1,a+2,a+3);”的输出结果是 。

解:98,c,144,65

5.int k; float f;

语句“scanf(“%3d%*4d%6f”,&k,&f);”执行时输入 .43↙

则 k= ,f= 。

解:k=123 f=

6.使用pow()函数时,程序的开头必须写一条预处理命令: 。

解:#include <>

5.填空题。

(1)int i=123,j=45;

函数printf("%d,%dn",i,j);的输出结果是 。

解:123,45

(2)int i=123; float x=;

语句printf("i=%5d x=%7.4fn",i,x); 的输出结果是 。

解:i= 123 x=

(3)float alfa=60,pi=3

习 题 3

一、根据下列数学式,写出C的算术表达式。

1abcd2cda2bcd(a2b3)y4210tan1x2|sin(x)|3.5x6e5

解:-(a2+b2)×y4 的C表达式:-(a*a+b*b)*pow(y,4)

2102 的C表达式:(sqrt(2)+10*10)/(pow(tan(x),-1)+

tan1x

|sin(x)|3.5 的C表达式:sqrt(pow (fabs (sin(x)),)

x6e5 的C表达式:pow(x,6)-exp(5)

1abcd2 的C表达式:2*a*b+c+d)/(a+2*b-(c+d)/c/d)

cda2bcd二、按照要求,写出下列C的表达式。

1.写出int类型变量x为“奇数”的表达式。

解:x%2==1

2.Int类型变量x、y、z,写出描述“x或y中有且仅有一个小于z”的表达式。

解:x=z||x>=z&&y

3.将double类型变量y保留四位小数的表达式。

解:(int)(y*10000+/

4.为变量s赋值:取变量x 的符号,取变量y的绝对值。

解:s=(x>=01:-1)*(y>=0y:-y)

5.条件“-5≤x≤3”所对应的C逻辑表达式。

解:-5<=x&&x<=3

6.a、b是字符变量,已知a的值为大写字母、b的值为小写字母,写出判断a、b是否为同一字母(不区分大小写)的逻辑表达式

解:a+32==b 或 b-a==321:0

7.int类型变量a、b均为两位正整数,写出判断a的个位数等于b的十位数、且b的个位数等于a的十位数的逻辑表达式。

解:a%10==b/10&&a/10==b%10

8.写出判断某个人是否是成年人(年龄大于21),且不是老年人(年龄大于65)的逻辑表达式。

解:y>21&&y<=65

9.写出取变量a、b、c中最大值的条件表达式。

解:(a>ba:b)>c(a>ba:b):c

10.若字符变量ch为小写字母,则将其转换为对应的大写字母。

解:ch=ch>='a'&&ch<='z'ch-32:ch

三、单项选择题

1.设int x=3,y=4,z=5;,下列表达式中值为0的是( )。

A.'x'&&'y' B. x<=y C.x||y+z&&y–z D. !((x

2.已知x=10,ch='A',y=0;,则表达式“x>=y&&ch<'B'&&!y”的值是( )。

A.0 B. 1 C.“假”

D.“真”

3.判断char型变量c为数字字符的正确表达式为( )。

A.'0'<=c<='9' B.'0'<=c&&c<='9' C.c>='0'||c<='9' D.c>=0&&c<=9

4.下列运算符中,优先级最低的是( )。

A.: B.&& C.= = D.*=

5.若有条件表达式“xa++:b--”,则以下表达式中( )等价于表达式x。

A.x==0 B.x!=0 C.x==1

D.x!=1

6.有定义int k=4,a=3,b=2,c=1;,表达式“k

A.4 B.3 C.2 D.1

7.执行下列程序段后,变量a,b,c的值分别是( )。

int x=10,y=9,a,b,c;

a=(--x= =y++)--x:++y;b=x++;c=y;

A.a=9,b=9,c=9 B.a=8,b=8,c=10

C.a=9,b=10,c=9 D.a=1,b=11,c=10

8.有定义int a=9;,语句“a+=a– =a+a;”执行后,变量的值是( )。

A.18 B.9 C.–18 D.–9

9.设x和y均为int型变量,则语句“x+=y;y=x–y;x– =y;”的功能是( )。

A.把x和y按从小到大排列 B.把x和y按从大到小排列

C.无确定结果 D.交换x和y中的值

10.有定义double x=1,y;,表达式“y=x+3/2”的值是( )。

A.1 B.2 C. D.

11.设有定义int x;double y;,则下列表达式中结果为整型的是( )。

A.(int)y+x B.(int)x+y C.int(y+x) D.(double)x+y

12.设有整型变量x,下列说法中,错误的是( )。

A.“5.0”不是表达式 B.“x”是表达式

C.“!x”是表达式 D.“sqrt(x)”是表达式

解:(1)D (2)B (3)B (4)D (5)B (6)D (7)B (8)C (9)D (10)C (11)A (12)A

四、填空题。

1.设float x=,y=; int a=7;,表达式 x+a%3*(int)(x+y)%2/4 值为 。

解:

2.设int x=2,y=3;,执行语句“x*=x+y”后x的值为 。

解:10

3.设int x=17,y=5;,执行语句“x%=x–y”后x的值为 。

解:5

4.设 int a=6,b=4,c=2;,表达式 !(a-b)+c-1&&b-c/2 的值为 。

解:1

5.设 int a=2,b=4,x,y;,表达式!(x=a)||(y=b)&&! 的值为 。

解:0

6.判断变量a、b是否绝对值相等而符号相反的逻辑表达式为 。

解:a==-b

7.判断变量a、b中必有且只有一个为0的逻辑表达式为 。

解:a*b==0&&a+b!=0

8.设int m=2,n=2,a=1,b=2,c=3;执行语句d=(m=a==b)&&(n=b>c);后,m和n的值分别为 。

解:m为0,n为2

9.设int a=2;,表达式“a%2!=0”的值为 。

解:0

10.设char c='y';,表达式“c>='a'&&c<='z'|| c>='A'&&c<='Z'”的值为 。

解:1

11.写出与代数式 (x+2)ex+2 对应的C表达式 。

解:(x+2)*exp(x+2)

12.设int a=2;执行语句a=3*5,a*4;后a的值为 。

解:15

五、写出下列程序的输出结果。

1.

#include <>

void main()

{

unsigned k,n;

scanf("%u",&n); 3 c.3f输入矩形的边长,求矩形面积。

解:#include <>

void main()

{

double a,b,s;

printf(“请输入矩形的长,宽n”);

scanf(“%lf,%lf”,&a,&b);

s=a*b;

printf(“ 矩形面积=%fn”,s);

}

8. 已知等差数列的第一项为a,公差为d,求前n项之和,a、d、n由键盘输入。

解:#include <>

void main()

{

int a,d,n,sum;

printf(“请输入等差数列的首项 公差 项数n”);

scanf(“%d%d%d”,&a,&d,&n);

sum=a*n+n*(n-1)*d/2;

printf(“ sum=%dn”,sum);

}

9. 编写程序,将d天h小时m分钟换算成分钟,输入d、h、m,输出换算结果。

解:#include <>

void main()

{

int d,h,m,t;

printf(“请输入天 小时 分钟n”);

scanf(“%d%d%d”,&d,&h,&m);

t=d*24*60+h*60+m;

printf(“%d天%d小时%d分钟=%d分钟n”,d,h,m,t);

}

10. 编写程序,求出给定半径r的圆以及内接正n边形的面积,输出计算结果。r和n的值由键盘输入。

解:#include <>

#include <>

#define PI

void main()

{

double r,s1,s2;

int n;

printf(“Input r nn”);

scanf(“%lf%d”,&r,&n);

s1=PI*r*r;

s2=n/*r*r*sin(2*PI/n);

printf(“圆面积=%f,正内接%d边形面积=%fn”,s1,s2);

}

习 题 4

一、单项选择题

1.下列语句将小写字母转换为大写字母,其中正确的是( )。

A.if(ch>='a'&ch<='z')ch=ch-32;

B.if(ch>='a'&&ch<='z')ch=ch-32;

C.ch=(ch>='a'&&ch<='z')ch-32:' '; D.ch=(ch>'a'&&ch<'z')ch-32:ch;

2.下列各语句中,能够将变量u、s中最大值赋给变量t的是( )。

A.if(u>s)t=u;t=s; B.t=s;if(u>s)t=u;

C.if(u>s)t=s;else t=u D.t=u;if(u>s)t=s;

3.假设变量x、k都已定义,下列语句片段中,无语法错误的是( )。

A. switch(x){

case x>=90: putchar('A');

case x<60: putchar('E');

}

B. switch(x) {

case 1+2: k='A';

defualt: k='E';

case 2*4: k='B';

}

C. switch(x){

case 2+x: k=x-2;

case 3*x: k=x+3;

default: k=0;

}

D. switch(x){

case : k=*x;

case : k=8*x;

default: k=0;

}

*4.与语句while(!s )中的条件等价的是( )。

A.s==0 B.s!=0 C.s==1

D.s=0

5.下列语句中,哪一个可以输出26个大写英文字母( )。

A.for(a='A';a<='Z';printf("%c",++a));

B.for(a='A';a<'Z';a++)printf("%c",a);

C.for(a='A';a<='Z';printf("%c",a++));

D.for(a='A';a<'Z';printf("%c",++a));

6.判断下面的while循环体的执行次数( )。

i=0;

k=10;

while( i=8 ) i=k––;

A.8次 B.10次

D.无数次

解:(1) B (2) B (3) B (4) A (5) C (6) D

二、写出下列程序的输出结果

C.2次

1.#include <>

void main()

*

{

* * *

*

char x;

* * * * *

* * *

int n=0,k=0;

* * * * * * *

* * * * *

while((x=getchar())!='#'){ 0

* * * * *

xyzcs

* * * * *

n

* *

面积s(sx)(sy)(sz)

n

1 *

1111* *

2.3f1n前40°22

11114xxy23560y0x0*

F3s1.....-3-n-1-2224!2!3!10101010x0 1In2In3In4Inf(x)0年信息查询 2.x0y0元xyf(x,y)旦是星期几信息查 3. 程序结束n”);

x01x0y0printf(“请输入年份:n”);

xyscanf(“%d”,&year);

x0y0xyprintf(“请选择功能:n”);

scanf(“%d”,&number);

if(number==1)

{ year=legal(year);

leapyear(year);

}

if(number==2)

{ week=judgeweeknumber(year);

judgeweekchinese(week);

}

if(number==3)

return;

}

int legal(int y)

{ if(y<0)

do {

printf(“请重新输入一个年份:”);

scanf(“%d”,&y);

} while(y<0);

return y;

}

void leapyear(int y)

{

if(y%4==0&&y%100!=0||y%400==0)

printf(“%d是闰年n”,y);

else

printf(“%d不是闰年n”,y);

}

int judgeweeknumber(int y)

{ int week;

week=(y+(y-1)/4-(y-1)/100+(y-1)/400)%7;

return week;

}

void judgeweekchinese(int week)

{ switch(week)

{ case 0: printf(“星期天”); break;

case 1: printf(“星期一”); break;

case 2: printf(“星期二”); break;

case 3: printf(“星期三”); break;

case 4: printf(“星期四”); break;

case 5: printf(“星期五”); break;

case 6: printf(“星期六”); break;

}

}

*14.输入n、x,计算xn 输出。要求定义一个递归函数计算xn 。

解:#include<>

double mypow(double x,int n)

{

double y=1;

if (n>0)

return(x*mypow(x,n-1));

else

if (n<0) return(1/x*mypow(x,n+1));

else return 1;

}

void main()

{ double x;

int n;

printf(“请输入x n:n”);

scanf("%lf%d",&x,&n);

printf("%fn",mypow(x,n));

}

*15.数列的第1、2项为1,此后各项为前两项之和。编制求数列中任何一项值的递归函数。

解:此数列为1、1、2、3、5、8、13 ……。

#include<>

int f(int n)

{ if (n==1||n==2)

return (1);

else

return (f(n-1)+f(n-2));

}

void main()

{ int n;

while(scanf("%d",&n),n<0);

printf("数列第%d项为:%d",n,f(n));

}

习 题 5

一、单项选择题

1.下列能正确定义一维数组a的语句是( )。

A.int a(10); B.int n=10,a[n];

C.int n;scanf("%d",&n); D.#define n 10

int a[n]; int a[n];

2.若有定义语句“int a[10];”则下列对a中数组元素正确引用的是( )。

A.a[10/2–5] B.a[10] C.a[]

D.a(1)

3.能对一维数组正确初始化的语句是( )。

A.int a[6]={6*1}; B.int a[6]={1,,,3};

C.int a[6]={}; D.int a[6]=(0,0,0);

4.以下能正确定义二维数组的语句为( )。

A.int a[][]; B.int a[][4]; C.int a[3][]; D.int

a[3][4];

5.若有数组定义语句“int a[4][5];”,则对a中数组元素的正确引用是( )。

A.a[4][1] B.a[2,1] C.a[4][5]

D.a[4–1][5–5]

6.以下能对二维数组a进行正确初始化的语句为( )。

A.int a[2][]={{1},{4,5}}; B.int a[2][3]={1,2,3,4,5,6,7};

C.int a[][]={1,2,3,4,5,6}; D.int a[][3]={1,2,3,4,5};

7.下列对字符数组s的初始化不正确的是( )。

A.char s[5]="abc"; B.char s[5]={'a','b','c','d','e'};

C.char s[5]="abcde"; D.char s[]="abcde";

8. 下列程序段的运行结果为( )。

char s[]="ab0cd"; printf("%s",s);

A.ab0 B.ab

D.ab cd

9.下列数组s中所存放字符串的长度为( )。

char s[]="a128btcdxdgn";

C.Abcd

A.9 B.10 C.11

D.18

10.有数组定义语句“char a[20];”,则正确的输入语句为( )。

A.scanf("%s",&a); B.scanf("%s",a[]);

C.gets(a[20]); D.gets(a);

11.下面程序执行后的正确输出项是( )。

#include<>

void swap1(int a[ ])

{ int t;

t=a[0]; a[0]=a[1]; a[1]=t;

}

void swap2(int a,int b)

{ int t;

t=a; a=b; b=t;

}

void main()

{ int x[2]={1,5};

int y[2]={1,5};

swap1(x);

swap2(y[0],y[1]);

printf("x: %d %dn", x[0],x[1]);

printf("y: %d %dn", y[0],y[1]);

}

A. x:5 1 B. x:1 5

5 1

y:1 5 y:5 1

y:5 1

12.执行下列程序后的输出结果是( )。#include <>

char f(char s[],int n)

{ return (s[n]); }

main()

{ char a[]="ABCD";

printf("%c",f(a,2)+1);

}

A.D B.C

D.A

13.执行下列程序后的输出结果是( )。#include <>

int f(int a[],int n)

{ if(n==0) return a[0];

else return f(a,n-1)+a[n];

}

main()

{ int x[]={1,3,5,7,9};

printf("%dn",f(x,3));

}

A.1 B.4

D.16

解:

x:1 5 D.

y:1 5

C.B

C.9

x: C.

二、填空题

1.构成数组的各个元素必须具有相同的 。

解:数据类型

2.若有定义“int a[10]={1,2};”,则数组元素a[2]的值为 。

解:0

3.若有定义“int a[3][4];”,则数组a行下标的上限为 ,列下标的下限为 。

解:2 0

4.C语言程序在执行过程中,不检查数组下标是否 。

解:越界

5.C语言中,二维数组元素在内存中的存放顺序是 。

解:按行存放

6.若有定义“int a[3][4];”,则在数组元素a[2][2]前有 个元素。

解:10

7.若用数组名作为函数调用的实参,传递给形参的是 。

解:数组第一个元素的地址

8.若有定义语句“char s1[ ]="abc",s2[ ]={'a','b','c'};”,则数组s1有

个元素,数组s2有 个元素。

解:4 3

三、写出下列程序的输出结果

1.#include <>

void main()

{

int a[6]={2,3,7,1,9,6},i,j,k,m;

for(i=5;i>=0;i--){

k=a[5];

for(j=4;j>=0;j--)

a[j+1]=a[j];

a[0]=k;

for(m=0;m<6;m++)

printf("%2d",a[m]);

putchar('n');

}

}

解:6 2 3 7 1 9

9 6 2 3 7 1

1 9 6 2 3 7

7 1 9 6 2 3

3 7 1 9 6 2

2 3 7 1 9 6

2.#include <>

void main()

{

int n[3],i,j,k;

for(i=0;i<3;i++)

n[i]=0;

k=3;

for(i=0;i

for(j=0;j

n[j]+=n[i]+1;

for(i=0;i<3;i++)

printf("%5d",n[i]);

}

解: 13 14 17

3.#include <>

void main()

{

int a[6][6],i,j;

for(i=1;i<6;i++)

for(j=1;j<6;j++)

a[i][j]=(i/j)*(j/i);

for(i=1;i<6;i++){

for(j=1;j<6;j++)

printf("%3d",a[i][j]);

printf("n");

}

}

解:1 0 0 0 0

0 1 0 0 0

0 0 1 0 0

0 0 0 1 0

0 0 0 0 1

4.#include <>

void main()

{

int x[10];

int i,m=1;

void sort(int a[],int n);

for(i=0;i<10;i++){

m=-m;

x[i]=m*i;

}

sort(x,10);

for(i=0;i<10;i++) printf("%3d",x[i]);

}

void sort(int a[],int n)

{

int i,j,t;

for(i=1;i<10;i++){

t=a[i];

for(j=i-1; j>=0; j--)

if(t>a[j]) break;

else a[j+1]=a[j];

a[j+1]=t;

}

}

解: -8 -6 -4 -2 0 1 3 5 7 9

5.#include <>

void main()

{

char s1[]="aex",s2[]="dpsy",s[10];

int i1,i2,i,flag;

i1=i2=i=flag=0;

while(1){

if(s1[i1]=='0'){

flag=1;

break;

}

if(s2[i2]=='0'){

flag=2;

break;

}

if(s1[i1]

s[i++]=s1[i1++];

else

s[i++]=s2[i2++];

}

if(flag==1)

while(s2[i2]!='0')

s[i++]=s2[i2++];

else

while(s1[i1]!='0')

s[i++]=s1[i1++];

s[i]='0';

puts(s);

}

解:adepsxy

6.

#include <>

void main()

{

char h[11];

int d[10];

int i,n=0,x=1;

gets(h);

统计在一个字符串中各元音字母(a、e、i、o、u)出现的次数。

#include <>

void main()

{

char s[80];

int i, ;

printf("input a string:n");

gets(s);

for(i=0; ;i++)

if( )

a[0]++;

else if(s[i]=='e'||s[i]=='E')

a[1]++;

else if(s[i]=='i'||s[i]=='I')

a[2]++;

else if(s[i]=='o'||s[i]=='O')

a[3]++;

else if(s[i]=='u'||s[i]=='U')

a[4]++;

printf(" A E I O Un");

for(i=0;i<5;i++)

}

解:① a[5] ②s[i]!= '0' ③s[i]== 'a'|| s[i]== 'A' ④ printf(“%5d”,i)

五、编程题

1.在数组x的10个数中求平均值v,找出与v相差最小的数组元素。

解:#include <>

#include <>

void main()

{ double x[10],v,d;

int i;

for(i=0,v=0;i<10;i++)

{ scanf("%lf",&x[i]);

v+=x[i]; }

v=v/10;

d=x[0];

for(i=1;i<10;i++)

if(fabs(d-v)>fabs(x[i]-v))

d=x[i];

printf("平均值:%-8.2f,与平均值最近元素:%-8.2fn",v,d);

}

2.输入n(n≤20)个数放在一维数组中,找出其中最小的数,将它与数组最前面的元素交换后输出这些数。

解:#include <>

void main()

{ int i,k,temp,n,a[20];

printf("Input n:n");

scanf("%d",&n);

for(i=0;i

scanf("%d",&a[i]);

for(k=0,i=1;i

if(a[i]

temp=a[0];a[0]=a[k];a[k]=temp;

for(i=0;i

}

3.输入一个字符串,统计其中数字字符出现的次数。

解:#include <>

void main()

{ char s[80];

int i,n=0;

gets(s);

for(i=0;s[i]!='0';i++)

if(s[i]>='0'&&s[i]<='9')

n++;

printf("%s中包含%d个字符n",s,n);

}

4.设有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。问在第20年时,共有多少头牛分别输出从第1年至第20年每年的母牛数。

解:#include <>

#define N 20

void main()

{ int x[N+1]={1},i; 0’0’0’0’0’0’0’.2f0’0’4.1f12 deldeldel++.2f.2f8.2f-8.2f-8.2f0’0’deldel8.2f.0f,"Feb.","Mar.","Apr.","May.","Jun.","July.",

"Aug.","Sept.","Oct.","Nov.","Dec."};

puts(p[m-1]);

}

void main()

{ int no;

printf("请输入月份(1--12)n");

scanf("%d",&no);

if (no>=1&&no<=12) findmonth(no);

else printf("数据输入错误!n");

}

15.输入5个字符串,输出其中最长的字符串。

解:#include ""

#include ""

void main()

{ char str[5][100],*p[5];

int i,k;

ame); B.printf("%s",&stu[1].name);

C.printf("%s",stu[1].name[0]); D.printf("%s",&stu[1].name[0]);

*5.以下程序的输出结果是( )。

#include <>

void main()

{ int x=1,y=2,z=3;

struct aa { int a; int *p; } s[ ]={4,&x,5,&y,6,&z};

struct aa *q=s+1;

printf("%dn",*(q–>p)++);

}

A.1

D.4

6.有以下定义语句:

B.2 C.3

struct node { int n; struct node *next; } x,y,*p=&x,*q=&y;

则能将y节点链接到x节点之前的语句是( )。

A.=p B.=q C.=p D.=q

*7.以下程序的输出结果为( )。

#include <>

void main()

{

struct node{

int n;

struct node *next;

}a[4];

int i;

for(i=0;i<3;i++){

(a+i)–>n=i+1;

(a+i)->next=a+i+1;

}

(a+i)->next=a;

printf("%d,%dn",(a[1].next)->n,a[3].next->n);

}

A.1,2 B.2,1 C.1,3

D.3,1

8.已建立一单向链表,指针变量p1指向链表中某一节点,p2指向下一节点,将p2所指节点从链表中删除并释放的语句为( )。

A.p1=p2;free(p2); B.p1–>next=p2–>next;free(p2);

C.*=*;free(p2); D.p1=p2–>next;free(p2);

9.已建立一单向链表,指针变量p1指向链表中某一节点,p2指向下一节点;指针变量p指向新申请节点,将p所指节点插入到链表中p1与p2之间的语句为( )。

A.p–>next=p2;p1–>next=p; B.p1–>next=p;p–>next=p2;

C.p=p2;p1–>next=p; D.p1=p;p–>next=p2;

10.若要利用下面的程序片段使指针变量p指向一个整型变量的存储单元则括号中需填入的内容是( )。

int *p;

p=( )malloc(sizeof(int));

A.int B.*int C.&int

解:(1)B (2)C (3)A (4)D (5)B (6)C (7)D (8)B (9)A (10)D

二、写出下列程序的输出结果

D.int *

1.

#include <>

struct st

{ int num;

char name[10];

int age;

}x[3]={{1,"zhang",19},{2,"li",20},{3,"wang",21}},*p=x;

void main()

{ printf("%s,%dn",(p+2)->name,(*p).age);

}

解:wang,19

*2.

#include <>

#include <>

struct s { int a[4]; char *pa[4]; }x,*p=&x;

void main()

{ int i;

char y[4][8]={"A","AB", "ABC","ABCD"} ;

for(i=1;i<4;i++) [i]=y[i];

for(i=1;i<4;i++) [i]=strlen[i]);

printf("%d,%d,%sn",[1],++p->a[2],++p->pa[2]);

}

解:2,4,BC

*3.

#include <>

struct ks {int a;int *b;}s[4],*p;

void main()

{ int n=1,i;

for(i=1;i<4;i++){

s[i].a=n;

s[i].b=&s[i].a;

n+=2;

}

p=&s[0];

p++;

printf("%d,%dn",(++p)->a,p->a);

}

解:3,1

4.

#include <>

struct s {int a;float b;char *c;};

void main()

{ struct s x={19,, "zhang"};

struct s *px=&x;

printf("%d,%.1f,%sn",,,;

printf("%d,%.1f,%sn",px->a,(*px).b,px->c);

printf("%c,%sn",*px->c-1,&px->c[1]);

}

解:19,,zhang

19,,zhang

y,hang

三、程序填空题

1.已知head指向一个单向链表,链表中每个节点包含整型数据域(data)和指针域(next)。以下函数max求出链表中数据域值最大节点的位置,由指针s传回主调函数。

#include <>

struct link

{ int data;struct link *next;};

void main()

{ struct link *head,*q;

struct link *max(struct link *); um=i+1;scanf("%lf",&a[i].x); }

for(i=0;i<9;i++)

for(j=0;j<9-i;j++)

if(a[j].x

for(i=0;i<10;i++)

printf("%d, %.3fn",a[i].num,a[i].x);

}

5.有10个学生,每个学生的数据包括学号、姓名、三门课的成绩。数据从键盘输入,要求打印出每个学生的总分、三门课的总平均成绩,以及总分最高的学生数据。

解:#include ""

struct student

{ char num[6]; um);

scanf("%s",stu[i].name);

for(j=0;j<3;j++)

scanf("%d",&stu[i].score[j]);

}

printf(“ 姓名 总分n”);

for(i=0;i<10;i++)

{ sum=0;

for(j=0;j<3;j++)

sum+=stu[i].score[j];

stu[i].avr=sum/;

aver+=stu[i].avr;

if(sum>max){max=sum;maxi=i;}

printf(“%-8s %-7dn”,stu[i].name,sum);

}

aver=aver/10;

for(i=0;i<10;i++)

{ printf("%8s%10s",stu[i].num,stu[i].name);

for(j=0;j<3;j++)

printf("%7d",stu[i].score[j]);

printf("%6.2fn",stu[i].avr);

}

printf("平均成绩是%5.2fn",aver);

printf("最好成绩的学生是%s,总分是 %dn",stu[maxi].name,max);

}

6.建立一个链表,每个结点包括:学号、姓名、性别、年龄。输入一个年龄,如果链表中的结点所包含的年龄等于此年龄,将此结点删除。

解:#include ""

#define NULL 0

#define LEN sizeof(struct student)

struct student

{ char num[6]; um,stu[i].name);

scanf(“%c%d”,&stu[i].sex,&stu[i].age);

sum=0;

for(j=0;j<5;j++)

{ scanf(“%f”,&stu[i].score[j]);

sum+=stu[i].score[j];

}

stu[i].aver=sum/5;

}

for(i=0,j=0;i

if(stu[i].sex==’w’) girl[j++]=stu[i];

m=j;

for(i=0;i

{ k=i;

for(j=i;j

if(girl[j].aver>girl[k].aver) k=j;

temp=girl[i]; girl[i]=girl[k]; girl[k]=temp;

}

for(i=0;i

{ printf(“%10s%10s”,girl[i].num,girl[i].name);

printf(“%2c%3d”,girl[i].sex,girl[i].age);

for(j=0;j<5;j++) printf(“%3.0f”,girl[i].score[j]);

printf(“%3.0fn”, girl[i].aver);

}

}

*8.输入不超过100个通讯录数据(姓名、电话号码,电话号码为7位数字),要求输入通讯录个数。将原7位的电话号码改为8位,规则是原来以2、4开头的号码的在前面加一位6,原来以1、5开头的号码的在前面加一位9,其他在原号码前面加一位8。输出处理后的通讯录数据。

解:#include <>

#define N 100

void main()

{ struct {

char name[10],tel[9];

} addr[N];

int i,j,n;

printf(“请输入通讯录数:”);

while(scanf(“%d”,&n),n>100);

for(i=0;i

{ scanf(“%s%s”,addr[i].name,addr[i].tel);

addr[i].tel[8]='0';

if(*addr[i].tel==’2’||*addr[i].tel==’4’)

{ for(j=6;j>=0;j--)addr[i].tel[j+1]=addr[i].tel[j];

addr[i].tel[0]=’6’;

}

else if(*addr[i].tel==’1’||*addr[i].tel==’5’)

{ for(j=6;j>=0;j--)addr[i].tel[j+1]=addr[i].tel[j];

addr[i].tel[0]=’9’;

}

else

{ for(j=6;j>=0;j--)addr[i].tel[j+1]=addr[i].tel[j];

addr[i].tel[0]=’8’;

}

}

printf(“新的通讯录:n”);

for(i=0;i

printf(“%10s%10sn”,addr[i].name,addr[i].tel);

}

9.在一有序(设为升序)链表中查找某数(由键盘输入),如果存在则将它删除,如果不存在则将它按其大小次序插入到链表中。

解:#include <>

#include <>

struct link { int data; struct link *next; };

struct ling *find(struct link *head,int x)

{ struct link *p,*q,*s;

if(head->data==x) head=head->next;

else if(xdata)

{ s=(struct link *)malloc(sizeof(struct link));

s->data=x; s->next=head; head=s;

}

else

{ q=head; p=head->next;

while(p!=NULL)

{ if(p->data==x){ q->next=p->next; break; }

else if(xdata)

{ s=(struct link *)malloc(sizeof(struct link));

s->data=x; s->next=p; q->next=s; break;

}

p=p->next;

}

if(p==NULL)

{ s=(struct link *)malloc(sizeof(struct link));

s->data=x; s->next=NULL; q->next=s;

}

}

return head;

}

*10.输入一英文句子(以“.”结束),输出其中所包含的英文字母,要求用链表完成,每一节点的数据成员存放一个所出现的字母。

解:#include <>

#include <>

struct node { char c; struct node *next; };

void main()

{ struct node *head,*p,*q;

char str[81];

int i=0;

head=NULL;

while((str[i]=getchar())!=’.’)

{ if(str[i]>=’A’&& str[i]<=’Z’|| str[i]>=’a’&& str[i]<=’z’)

{ p=head;

while(p!=NULL)

if(p->c==str[i]) break;

else { q=p; p=p->next; }

if(p==NULL)

{ p=(struct node *)malloc(sizeof(struct node));

p->c=str[i];

p->next=NULL;

if(head==NULL) head=p;

else q->next=p;

}

}

i++;

}

p=head;

while(p!=NULL)

{ printf(“%2c”,p->c);

p=p->next;

}

}

*11.将一个链表按逆序排列,即将原来链头当作新链表的链尾,而原链尾当作链头。

解:#include <>

struct link { int data; struct link *next;};

struct link *f(struct link *head)

{ struct link *p,*q,newhead=NULL,*s;

while(head->next!=NULL)

{ p=head;

while(p->next!=NULL)

{ q=p; p=p->next;}

if(newhead==NULL) newhead=p;

else s->next=p;

s=p;

q->next=NULL;

}

s->next=head;

return newhead;

}

习 题 10

一、计算下列表达式的值

1.3&6 2.-12&7

4.-02||12

5.(x=13)^9 6.15/2^1

8.~15/3

9.7<<2 10.-9<<2

12.-9>>3

解:(1) 3&6 值为 2 (2) -12&7 值为 4

(3) 3|9 值为 11 (4) -02||12 值为 1

(5) (x=13)^9 值为 4 (6) 15/2^1 值为 6

(7) ~-14 值为 13 (8) ~15/3 值为 -5

(9) 7<<2 值为 28 (10) -9<<2 值为 -36

(11) (x=13)>>2 值为 3 (12) -9>>3 值为 –2

二、若有语句“short a,b;”,分别写出执行下列语句后a、b的值

1.a=2;b=7;a&b; 2.a=-3;b=a|4;

3.a=5;b=a<<2; 4.a=-15;b=~a>>2

解:(1) a为 2,b为 7 (2) a为 -3,b为 –3

(3) a为 5,b为 20 (4) a为 -15,b为 3

3.3|9

7.~-14

11.(x=13)>>2

三、写出下列程序的输出结果

1.

#include <>

int main(void)

{ union

{ char s[2];

int i;

}g;

=0x4142;

printf("=%xn",;

printf("[0]=%xt [1]=%xn",[0],[1]);

[0]=1;

[1]=0;

printf("=%xn",;

return 0;

}

解:=4142

[0]=42 g.s[1]=41

=1

2.

#include <>

void main()

{ union { char n[12];int m[4];double x[2];} a;

printf("%dn",sizeof(a));

}

解:16

3.

void main()

{

int x=3,y=9;

x=x^y;

y=x^y;

x=x^y;

printf("%d,%dn",x,y);

}

解:9,3

4.

#include <>

void swp(int *x,int *y)

{

*x=*x^*y;

*y=*x^*y;

*x=*x^*y;

}

void main()

{

int a,b,i;

for(i=0;i<4;i++){

scanf("%d%d",&a,&b);

swp(&a,&b);

printf("%d,%dn",a,b);

}

}

运行时输入:

9 –9↙

8 4↙

1 –5↙

23 –1↙

解:-9,9

4,8

-5,1

-1,23

四、编程题

1.输入一个整数,并输出该数的机内码。

解:#include <>

void main()

{ int a;

scanf(“%d”,&a);

printf(“%xH”,a);

}

2.输入一个整数,将其低8位全置为1,高8位保留原样,并以十六进制输出该数。

解:#include <>

void main()

{ int a;

scanf(“%d”,&a);

a|=0xff;

printf(“%xH”,a);

}

3.输入一个字符串,删除字符串中的所有非汉字的字符,并输出该字符串。

解:#include <>

#include <>

void main()

{ char str[81];

int i;

gets(str);

for(i=0;str[i]!=’0’;)

if((str[i]&0x80)==0) strcpy(str+i,str+i+1);

else i++;

puts(str);

}

*4. 对文本的简单加密与解密。输入一个文本及任意一个密码值,对该文本加密后,输出密文;重新输入密值后,输出解密后的原文。

解:#include <>

void main()

{ char s[81];

int m1,m2,i;

printf(“请输入要加密的文本:n”);

gets(s); 0’0’后面增加一个空格符。

【提示】参考例,逐个读入字符写入到临时文件,当读到“.”时多写一个空格符到临时文件。

解:#include <>

#include <>

void main()

{ FILE *fp1,*fp2;

char str[81],name[80],c;

printf(“请输入文件名:”);

gets(name);

if((fp1=fopen(name,”r”))==NULL)

{ printf(“不能打开文件%s !”,name); exit(0); }

if((fp2=fopen(“d:”,”w”))==NULL)

{ printf(“不能打开文件d:!”); exit(0); }

while((c=getc(fp1))!=EOF)

{ fputc(c,fp2);

if(c==’.’) putc(‘ ‘,fp2);

}

fclose(fp1); fclose(fp2);

remove(name);

rename(“d:”,name);

fp1=fopen(name,”r”);

while(fgets(str,80,fp1)!=NULL)

puts(str);

fclose(fp1);

}


本文标签: 输出 输入 变量 下列 程序