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

更新时间:2024-06-20 11:06:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

C语言程序设计习题答案

习题一 C语言程序设计概述

一、名词解释

(1)程序P1 (2)程序设计P1 (3)机器语言P1 (4)汇编程序P2 (5)高级语言P2 (6)编译程序P3 (7)解释程序P3 (8)算法P4 (9)结构化的程序设计P9 二、简述题

1. 设计程序时应遵循哪些基本原则?P4

答:正确性、可靠性、简明性、有效性、可维护性、可移植性。 2. 算法的要素是什么?算法具有哪些特点?

答:算法的要素是:操作与控制结构;算法的特点有:有穷性、确定性、有效性、有零个或多个输入、有一个或多个输出。

3. 算法的表示形式有哪几种?

答:算法的表示形式有:自然语言、传统流程图、伪代码、结构化的流程图(N_S流程图,盒图)。 4. 有哪三种基本结构?

答:三种基本结构是:顺序结构、选择结构和循环结构。 5. 传统流程图与N-S流程图最大的区别是什么?

答:N-S流程图去掉了在传统流程图中常用的流程线,使得程序的结构显得更加清晰、简单。

三、用传统流程图、N-S图分别表示求解以下问题的算法。

1. 有3个数a,b,c,要求按由大到小的顺序把它们输出。 输入三个数给a,b,c 输入一个数给x 如果a

将a与b的值互换 输入下一个数给x 如果a

Yes No 将a与c的值互换

max = x 如果b

yes no 如果min>x Yes No 将b与c的值互换 min = x 输出a,b,c的值

n = n + 1 2. 依次将10个数输入,求出其中最大的数

输出max,min的值 和最小的数并输出。

3. 求1+2+3+?+100的值。

s=0; i=1 s=1; i=1

当i小于等于100时 当i小于等于10时

s=s+i; i = i+1; s=s*i; i = i+1;

输出s的值 4. 求1×2×3×?×10的值。

1

输出s的值

5. 求下列分段函数的值。

3X (X<1) 输入一个数给x

4X-1 (X=1) X<=1 Y= 5(X-1)+6 (1

Yes no

6-3X (X≥5) X<1 x<5

Yes no yes no

Y=3x y=4x-1 y=5x+1 y=6-3x

输出s的值 6. 求100~200之间的所有素数。

i =100 当i<=200时 n=2; flag=1; 当n< i时 i能否被n整除? yes no flag=0 n = n+1 flag=1? yes no 输出i的值 i = i+1 22

7. 求一元二次方程ax+bx+c=0的根。分别考虑d=b-4ac大于0、等于0和小于0三种情况。

四、注释下面C程序的各个组成部分。

main() /*主函数 */ { /*程序开始 */

int a,k,m; /*定义三个用来存放整数的变量 */ a=10; /*将整数10赋值给变量a */ k=2; /*将整数2赋值给变量k */ m=1; /*将整数1赋值给变量1 */

a=(k+m)*k/(k-m); /*先求出算术表达式的值,并将其赋值给变量a */ printf(\/*在屏幕上打印出变量a 的值 */ } /*程序结束 */

习题二 数据类型、运算符与表达式

一、选择题

1~10:BCDCB DDBCA 11~20: ADDAA DBADC 21~28: DABAD CDD

2

二、填空题

1.字母 L 或字母 l 2. 字符或%c 、 整数或%d

3.在程序运行过程中,其值可以在一定的范围内变化的量。 4. ‘\\0’

5. 小数形式 、 指数形式 6. 关键字 、 预定义标识符 、 用户标识符 7. 字母 、 数字 、 下划线 、 数字 8. 18

9. 2 、 1 、 30 10. 双精度实数或double

11. 赋值 、 逗号 、20、 20 、 20、 4 12. 4

习题三 顺序程序设计

一、选择题

1~10:BCCBC CCDCC

二、填空题

1. printf( ) 、 scanf( ) 2. l (注:long的第1个字符) 3. 域宽,即在格式字符前加一个整数,如] 4. ‘\\0’ 5. e 、 g 6. 6 7. s 、 c 8. *

9. - 、 + 10. i

三、编程题

1. 编写程序,从键盘输入一个以秒为单位的时间数,将其换算成几小时几分几秒,然后进 行输出。例如输入的时间为4258秒,则输出结果为:1小时10分58秒。 答:程序参见文件Cprogram\\xt3_3_01.c

#include \main() {int x,h,m,s; scanf(\

h=x/3600; m=x600/60; s=x`; printf(\}

2. 编写程序,读入三个整数给变量a、b、c,然后交换它们中的数,把a中原来的值给b,

3

把b中原来的值给c,把c中原来的值给a。 答:程序参见文件Cprogram\\xt3_3_02.c

#include \main() {int a,b,c,t;

printf(\

scanf(\

printf(\ t=a;a=c;c=b;b=t;

printf(\}

习题四 选择结构程序设计

一、填空题

1. 1 、 0 2. ! % + <= != && || = 3. x==0 4. 0,2 5. 20 、 0 、 0

二、选择题

1~7:DDCAD DC 三、程序阅读题

1. 595959 2. 0.500000 3. 1 4. 2 5. 6

6. a=2,b=1 7. pass warn 8. 1 四、编程题

1. 设a为整型变量且其值大于零,请将以下if语句改写成switch语句。

if ( a<60) m=1; else if(a<70) m=2;

else if(a<80) m=3;

else if(a<90) m=4; else m=5; 答:程序参见文件Cprogram\\xt4_4_1.c 或Cprogram\\xt4_4_1b.c

#include \main() {int a,m;

scanf(\ switch(a/10)

{case 0:case 1:case 2:case 3: case 4:case 5:m=1;break;

4

case 6:m=2;break; case 7:m=3;break; case 8:m=4;break; default:m=5;break; }

printf(\}

Cprogram\\xt4_4_1b.c

#include \main() {int a,m;

scanf(\ m=0;

switch(a/10) {default:m++; case 8:m++; case 7:m++; case 6:m++;

case 5:case 4:case 3:case 2: case 1:case 0:m++; }

printf(\}

2. 编写程序,从键盘输入一个整数,打印出它是奇数还是偶数。 答:程序参见文件Cprogram\\xt4_4_2.c

#include \main() {int a;

scanf(\ if(a%2==1)

printf(\ else

printf(\}

3. 编写程序,从键盘输入一个字符,判别它是否是小写字母,如果是,将它转换为大写字母;如果不是,

不转换。然后输出最后得到的字符。 答:程序参见文件Cprogram\\xt4_4_3.c

#include \main() {char ch;

scanf(\ if(ch>='a' && ch<='z') ch=ch-32;

printf(\}

4. 编写程序,从键盘输入一个不多于4位的正整数,打印出它是几位数。 答:程序参见文件Cprogram\\xt4_4_4.c

#include \main()

5

11~20:BCDCC DABBC 21~30:CCADC ABBCB

31~41:BDDDD CDCCB A 二、填空题

1. 9 、 0 2. 先行后列

3. 连续的存储空间中 4. QuickC

5. (c=getchar( )) 、 ‘A’+i或65+i 6. ‘\\0’ 、 str1[i]-str2[i] 7. CDABC 8. 10 14 9. 6 10. 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 11. 600 12. AzyD 13 4 some string *test 三、编程题

1. 定义一个有20个元素的整型数组,分别求出下标为奇数和偶数的元素的平均值。 答:程序参见文件Cprogram\\xt6_3_01.c

#include \#include \main()

{int i,s0=0,s1=0,a[20]; for(i=0;i<20;i++) a[i]=rand()0; for(i=0;i<20;i+=2) {printf(\ s0=s0+a[i]; }

printf(\ sum is:%d ave=%f\\n\ for(i=1;i<20;i+=2) {printf(\ s1=s1+a[i]; }

printf(\ sum is:%d ave=%f\\n\ }

2. 设有一个整型数组,另输入一个整数,编程查找这个整数是否在数组中出现过,若出现,则输出第一次出现的位置,否则,输出no found。 答:程序参见文件Cprogram\\xt6_3_02.c

#include \#include \main()

11

{int i,s,a[20];

for(i=0;i<20;i++) a[i]=rand()0; scanf(\ for(i=0;i<20;i++) if(a[i]==s)

{printf(\ break; }

if(i==20)

printf(\ for(i=0;i<20;i++) printf(\ printf(\}

3. 设有一个已排好序的数组,今输入一个数,要求按原来排序的规律将它插入到数组中。 答:程序参见文件Cprogram\\xt6_3_03.c

#include \#define N 10 main() {int i,j,s;

//int a[N]={1,3,5,7,9,11,13,15,17}; int a[N]={17,15,13,11,9,7,5,3,1}; scanf(\ i=0;

if (a[0]

while(s>a[i]) i++; else

while(si;j--) a[j]=a[j-1]; a[j]=s;

for(i=0;i

printf(\ printf(\}

4. 编一程序,从一个已排好序的数组中删去某个位置上的元素。 答:程序参见文件Cprogram\\xt6_3_04.c

#include \#define N 10 main() {int i,j;

int a[N]={1,3,5,7,9,11,13,15,17,19}; for(i=0;i

printf(\ printf(\ scanf(\ for(j=i;j

12

for(i=0;i

printf(\ printf(\}

5. 将一个二维数组的行、列互换后存到另一个二维数组中并输出结果。 答:程序参见文件Cprogram\\xt6_3_05.c

#include \main() {int i,j;

int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23},b[4][3]; for(i=0;i<4;i++) for(j=0;j<3;j++) b[i][j]=a[j][i]; printf(\ for(i=0;i<3;i++) {for(j=0;j<4;j++)

printf(\ printf(\ }

printf(\ for(i=0;i<4;i++) {for(j=0;j<3;j++)

printf(\ printf(\ } }

6. 编一程序,在一个二维数组中,查找第一次出现的负数,并输出该数及其所在的行、列号。 答:程序参见文件Cprogram\\xt6_3_06.c

#include \main() {int i,j,flag;

int a[3][4]={1,3,5,7,9,11,13,-15,17,19,-21,23}; flag=0;

for(i=0;i<3;i++) for(j=0;j<4;j++) if(a[i][j]<0) {flag=1;

printf(\ i=j=100;//可使双重循环提前结束 } if(flag==0)

printf(\ printf(\ for(i=0;i<3;i++) {for(j=0;j<4;j++)

printf(\ printf(\ } }

7. 编程将一个字符数组中的字母,按由大到小的顺序进行排序。

13

答:程序参见文件Cprogram\\xt6_3_07.c

#include \#include \main()

{char t,s[]=\ int i,j,n; puts(s); n=strlen(s);

for(i=0;i

{t=s[i];s[i]=s[j];s[j]=t;} puts(s); }

8. 输入一行字符,统计其中有多少个英语单词,单词之间用空格隔开。 答:程序参见文件Cprogram\\xt6_3_08.c

#include \#include \main()

{char s[81]; int w,i,n; gets(s);

i=0;n=0;w=0; while(s[i]!='\\0') {if(s[i]==' ')

w=0; /*end of a word*/ else

if(w==0) {w=1;n++;} /*begin of a word*/ i++; }

printf(\}

9. 编程将两个一维数组中的对应元素的值相减后进行输出。 答:程序参见文件Cprogram\\xt6_3_09.c

#include \#include \main()

{int i,a[10],b[10]; for(i=0;i<10;i++)

{a[i]=rand()0; printf(\ printf(\

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

{b[i]=rand()0; printf(\ printf(\

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

printf(\ printf(\}

10. 有n个无序的数放在数组a中,请将相同的那些数删得只剩得一个,输出经过删除后的数据。

14

答:程序参见文件Cprogram\\xt6_3_10.c

#include \main()

{int i,j,k,a[10]={90,20,40,30,50,50,50,50,20,80}; for(i=0;i<10;i++)

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

for(j=i+1;j<10;j++) if(a[j]==a[i]) {a[j]=-888;} k=0;

for(i=0;i<10;i++) if(a[i]!=-888)

{ printf(\ a[k++]=a[i]; } //不相同的有效元素只有K个了 printf(\ }

11. 求二维数组中这样一个元素的位置:它在行上最小,在列上也最小。如果没有这样的元素则输出相应的信息。

答:程序参见文件Cprogram\\xt6_3_11.c

#include \#include \main()

{int j,i,k,flag,fz=0,a[4][5]; for(i=0;i<4;i++)

{for(j=0;j<5;j++) {a[i][j]=rand()0; printf(\ }

printf(\ }

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

{for(j=0;j<5;j++) {flag=1;

for(k=0;k<5;k++) if(a[i][k]

if(fz==0)

printf(\}

12. 在一个二维数组中形成并输出如下矩阵:

1 1 1 1 1

15

2 1 1 1 1 A= 3 2 1 1 1 4 3 2 1 1 5 4 3 2 1

答:程序参见文件Cprogram\\xt6_3_12.c

#include \#define N 5 main()

{int j,i,a[N][N]; for(i=0;i

for(i=0;i

{for(j=0;j

13. 已知A是一个3╳4的矩阵,B是一个4╳5的矩阵,编程求A╳B得到的新矩阵C,并输出C矩阵。 答:程序参见文件Cprogram\\xt6_3_13.c

#include \

main()

{int j,i,k,a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

int b[4][5]={3,2,1,5,4,4,3,2,5,1,2,3,5,4,1,7,8,5,6,9}, c[3][5]; printf(\ for(i=0;i<3;i++)

{for(j=0;j<4;j++) printf(\ printf(\ }

printf(\ for(i=0;i<4;i++)

{for(j=0;j<5;j++) printf(\ printf(\ }

for(i=0;i<3;i++) for(j=0;j<5;j++) {c[i][j]=0; for(k=0;k<4;k++) c[i][j]+=a[i][k]*b[k][j]; }

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

16

{for(j=0;j<5;j++) printf(\ printf(\ } }

14. 编程输出两个字符串中对应位置上相同的字符。 答:程序参见文件Cprogram\\xt6_3_14.c

#include \main() {int i;

char a[81]=\ char b[81]=\ printf(\ printf(\ printf(\ i=0;

while(a[i]!='\\0' && b[i]!='\\0') {if(a[i]==b[i]) printf(\ i++; }

printf(\}

15. 设有一字符串已按升序排列在字符数组a中,请将另一字符串b中的字符按升序的规律插到数组a中。

答:程序参见文件Cprogram\\xt6_3_15.c

#include \#include \main() {int i,j,k;

char a[81]=\ char b[81]=\ printf(\ printf(\ i=0;

while(b[i]!='\\0') {j=0;

while(a[j]=j) {a[k+1]=a[k];k--;} a[j]=b[i]; i++; }

printf(\}

16. 将已按升序排列的两个字符串a和b中的字符按升序归并到字符数组c中。 答:程序参见文件Cprogram\\xt6_3_16.c

17

#include \#include \main() {int i,j,k;

char a[81]=\ char b[81]=\ char c[81];

printf(\ printf(\ i=0;j=0;k=0;

while(a[i]!='\\0'&&b[j]!='\\0') {if(a[i]

c[k++]=a[i++]; else

c[k++]=b[j++]; }

while(a[i])

c[k++]=a[i++]; while(b[j])

c[k++]=b[j++]; c[k]='\\0';

printf(\}

习题七 函数

一、选择题

1~10:BDCDD BDBAC 11~20:AABBB ABAAC

21~31:CDAAC DDABB A 二、填空题

1. 函数声明

2. 自动将其转换为函数定义时的类型 3. 10 4. 1100 5. 9.000000 6. i<=n 、 s 、 0 、 f(k) 7. 0.5*(x0+a/x0) 、 a,x1 8. Itis 9. 2721 10. 0246 11. k 、 -1 12. 2 、 2 13. p= j 、 x[i][p] 14. 5 15. 7 16. 24

17. age(n-1)+2 、 age(n)

18

18. m 、 m/10 、 m或m!=0 、 r(m)

三、编程题

1. 编一函数,判断某年是否为闰年,若是返回1,否则返回0。 答:程序参见文件Cprogram\\xt7_3_01.c

#include fun(int m)

{ return (m%4==0)&&(m0!=0)||(m@0==0);} main() { int n;

for (n=1987;n<2009;n++) if(fun(n))

printf(\}

2. 编写计算三角形面积的程序,将计算面积定义成函数。三角形面积公式为:

A=s(s?a)(s?b)(s?c)

式中s=(a+b+c)/2

其中A为三角形面积,a、b、c为三角形的三条边的长度。 答:程序参见文件Cprogram\\xt7_3_02.c

#include #include

float fun(float a,float b,float c) {float f,s;

s=(a+b+c)/2;

if((s<=a)||(s<=b)||(s<=c))//或(a+b)>c&&(a+c)>b&&(b+c)>a f=0; else

f=sqrt(s*(s-a)*(s-b)*(s-c)); return f; }

main()

{ float a,b,c;

scanf(\ printf(\}

3. 编写两个函数,分别求出两个整数的最大公约数和最小公倍数,用主函数调用这两 个函数,并输出结果,两个整数由键盘输入。 答:程序参见文件Cprogram\\xt7_3_03.c

#include #include int fmax(int m,int n) {int r; r=m%n; while (r!=0)

{m=n;n=r;r=m%n;} return n; }

int fmin(int m,int n)

19

{ return m*n/fmax(m,n);} main() { int a,b;

scanf(\

printf(\ printf(\}

4. 编写函数,根据整型形参m的值,计算公式 t=1-

111--?-的值。例如,若m=5,则应输出0.536389。

2*23*3m*m 答:程序参见文件Cprogram\\xt7_3_04.c

#include float fun(int m) {float t=1; int i;

for(i=2;i<=m;i++) t=t-1.0/i/i; return t; }

main() {

printf(\}

5. 计算s=1+

111++?+。n由终端输入,将计算n!定义成函数。 2!3!n! 答:程序参见文件Cprogram\\xt7_3_05.c #include float fun(int m) {int i;

float s=0,t=1; for(i=1;i<=m;i++) {t=t/i; s=s+t; } return s; }

main()

{ printf(\ }

6. 编写函数,利用公式:

?2?1?1121231234???????????? 3353573579-5

计算π的近似值,当某一项的值小于10时,认为达到精度要求。 答:程序参见文件Cprogram\\xt7_3_06.c

#include double fun()

{int n; double pi=1,t=1; n=1; do

{t=t*n/(2*n+1); pi=pi+t;

20

n++;

}while(t>1e-5); return 2*pi; }

main()

{ printf(\

7. 编一函数,判断某一整数是否为回文数,若是返回1,否则返回0。所谓回文数就是该数正读与反读是一样的。例如12321就是一个回文数。 答:程序参见文件Cprogram\\xt7_3_07.c

#include #include int huiwen(int m) {int t,n=0; t=m; while(t)

{n++; t=t/10;} //求出M是几位的数 t=m; while(t)

{if(t/(int)pow(10,n-1)!=t) //比较其最高位和最低位 return 0; else

{t=t%(int)pow(10,n-1); //去掉其最高位 t=t/10; //去掉其最低位 n=n-2; //位数去掉了两位 } }

return 1; }

main() { int x;

scanf(\ if (huiwen(x))

printf(\ else

printf(\}

8. 编写一个求水仙花数的函数,然后通过主函数调用该函数求100到999之间的全部水仙花数。所谓水仙花数是指一个三位数,其各位数字的立方和等于该数本身。

例如:153就是一个水仙花数:153=1*1*1+5*5*5+3*3*3 答:程序参见文件Cprogram\\xt7_3_08.c

#include #include int fun8(int m) {int a,b,c;

a=m/100; b=m/10; c=m; if(m==a*a*a+b*b*b+c*c*c) return 1; else

return 0; }

21

main() { int i;

for(i=100;i<=999;i++) if(fun8(i))

printf(\ printf(\}

9. 编一函数primedec(m),求整数m的所有因子并输出。例如:120的因子为:2,2,2,3,5 答:程序参见文件Cprogram\\xt7_3_09.c

#include #include void primedec(int m) {int n=2; while(m>1)

{while(m%n==0)

{printf(\ \ n++; }

printf(\}

main()

{ int x; scanf(\ primedec(x); }

10. 求100~200之间的所有素数,按每行6个输出。 答:程序参见文件Cprogram\\xt7_3_10.c

#include #include int prime(int m) {int n,f=1;

for(n=2;n

main()

{ int x,n=0;

for(x=100;x<=200;x++) if(prime(x)) {n++;

printf(\ if(n%6==0) printf(\ }

printf(\}

11. 编一函数,求末尾数非0的正整数的逆序数,如:reverse(3407)=7043。 答:程序参见文件Cprogram\\xt7_3_11.c

#include #include

22

int reverse(int m) {int x=0; while(m)

{x=x*10+m; m=m/10; } return x; }

main() { int w;

scanf(\

printf(\}

12. 编一函数,将一个字符数组中的数字字符存于另一个字符数组中。 答:程序参见文件Cprogram\\xt7_3_12.c

#include #include

void fun12(char a[],char b[]) {int i=0,j;

for(j=0;j='0'&&b[j]<='9') a[i++]=b[j]; a[i]='\\0'; }

main()

{ char s1[81],s2[81]; gets(s2); fun12(s1,s2); puts(s2);puts(s1); }

13. 编一函数,统计一个字符串中字母、数字、空格和其它字符的个数。 答:程序参见文件Cprogram\\xt7_3_13.c

#include #include void fun13(char s[])

{int i,num=0,ch=0,sp=0,oh=0; char c;

for(i=0;(c=s[i])!='\\0';i++) if(c==' ') sp++;

else if(c>='0'&&c<='9') num++;

else if(toupper(c)>='A' && toupper(c)<='Z') ch++; else oh++;

printf(\}

main()

{ char s1[81]; gets(s1); fun13(s1);

23

}

14. 用递归的方法实现求1+2+3+?+n。 答:程序参见文件Cprogram\\xt7_3_14.c

#include #include int fun14(int m) {int w; if(m==1) w=1; else

w=fun14(m-1)+m; return w; }

main() { int x,i;

scanf(\

printf(\}

15. 用递归的方法将一个整数转换成字符串。例如:输入345,应输出字符串“345”。 答:程序参见文件Cprogram\\xt7_3_15.c #include #include void fun15(int m) { if(m!=0)

{fun15(m/10);

printf(\ } }

main() { int x;

scanf(\ printf(\ fun15(x); printf(\}

16. 用递归的方法计算下列函数的值:

p(x,n)=x-x+x-x+??(-1)x n>0 答:程序参见文件Cprogram\\xt7_3_16.c

#include \#include \float p(float x,int n) {float f; if(n==0) f=0; else

24

2

3

4

n-1n

f=p(x,n-1)+pow(-1,n-1)*pow(x,n); return f; }

main() {

printf(\}

17. 采用递归的方法计算x的n次方。 答:程序参见文件Cprogram\\xt7_3_17.c

#include \#include \float p(float x,int n) {float f; if(n==0) f=1; else

f=p(x,n-1)*x; return f; }

main() {

printf(\}

18. 根据勒让德多项式的定义计算Pn(x)。n和x为任意正整数,把计算Pn(x)定义成递归函数。 1 n=0 Pn(x) = x n=1 ((2n-1)Pn-1(x)-(n-1)Pn-2(x))/n) n>1 答:程序参见文件Cprogram\\xt7_3_18.c

#include \float p(float x,int n) {float f; if(n==0) f=1;

else if(n==1) f=x; else

f=((2*n-1)*p(x,n-1)-(n-1)*p(x,n-2))/n; return f; }

main() {

printf(\}

习题八 用户标识符的作用域和存储类 一.选择题

1—10:ADBBC CABDB 11-20: DBABC CCDAC

25

二.填空题

1. 静态局部变量的作用域是 从定义点到函数体(或复合语句)结束 。 2. 凡在函数中未指定存储类别的变量,其隐含的存储类别为 auto 。

3. 变量的作用域是指变量的有效范围,在作用域内可以引用该变量。按作用域来说,变量可分为 ①局部 变量和 ②全局 变量。

4. 根据函数能否被其它源文件调用,函数可分为 ① 外部函数和 ②静态(或内部)函数。 5. 下列程序的输出结果是 2468 。 #include

#define MAX_COUNT 4 void fun(); main()

{ int count; for(count=1; count<=MAX_COUNT; count++) fun(); void fun()

{ static int i; i+=2; printf(\ } 6. 下列程序的输出结果是 2,5,1,2,3,-2 。

main()

{ int a=3,b=2,c=1;c-=++b; b*=a+c;

{ int b=5,c=12; c/=b*2; a-=c; printf(“%d,%d,%d,”,a,b,c); a+=--c; } printf(“%d,%d,%d\\n”,a,b,c); }

7. 下列程序的输出结果是 。

#include static int a=5; a=5 main() a*a=25 { printf(“a=%d\\n”,a); p1(); p2();} a*a*a=8 p1()

{ printf(“a*a=%d\\n”,a*a); a=2;} p2()

{ printf(“a*a*a=%d\\n”,a*a*a);}

8. 下列程序的输出结果是 20,10 。

#include main()

{ int x=10;

{ int x=20; printf(“%d,”,x); } printf(“%d\\n”,x); }

9. 下列程序由两个文件组成,其运行结果是 x=2 。

/* 文件1 */ int x; sub()

{x=4; }

/* 文件2 */ static int x=2; main()

{sub();printf(“x=%d\\n”,x); }

10. 下列程序由两个文件组成,其运行结果是 x=25,y=25 。

26

}

/* 文件1 */

#include int x=10;int y=10; void add(void)

{ y=x+10; x*=2;} main()

{ extern void sub(); x+=5; add(); sub();printf(“x=%d,y=%d\\n”,x,y);} /* 文件2 */ void sub(void)

{ extern int x; x-=5;}

11. 下列程序由两个文件组成,其运行结果是 。 /* 文件1 */

#include int x=10;int y=10;

add: y=25; sub:y=5; main: x=25; main: y=10 extern void sub(); void add(void)

{ int y=5; y=x+10; x*=2; printf(“add:y=%d; ”,y);} main()

{ x+=5; add(); sub();printf(“main:x=%d; main:y=%d\\n”,x,y);} /* 文件2 */ extern int x; void sub(void)

{ int y=5; x-=y; printf(“sub:y=%d; ”,y);} 12. 下列程序由两个文件组成,其运行结果是 。 /* 文件1 */

#include

in add1 x=4 y=6in add2 x=20 y=8 static int x=2;int y=3;

in add1 x=6 y=11in add2 x=30 y=13 extern void add2();

in main x=6 y=13 void add1(); main()

{ add1(); add2();add1();add2();printf(“in main x=%d y=%d\\n”,x,y);} void add1(void)

{ x+=2; y+=3; printf(“in add1 x=%d y=%d”,x,y);} /* 文件2 */ static int x=10; void add2(void)

{ extern int y; x+=10; y+=2; printf(“in add2 x=%d y=%d\\n”,x,y); }

习题九 编译预处理

一. 选择题

1—10: DDCBC CABBB 11-20: BBCBB 二. 填空题

1. 下列程序的输出结果是 1000 10 。

#define N 10 #define s(x) x*x

27

#define f(x) (x*x) main()

{ int i1,i2;i1=1000/s(N);i2=1000/f(N);printf(“%d %d\\n”,i1,i2);}

2. 设有如下宏定义:

#define MYSWAP(z,x,y) {z=x;x=y;y=z;}

以下程序段通过宏调用实现变量a、b内容交换,请填空。 float a=5,b=16,c;MYSWAP( c ,a,b); 3. 下列程序的输出结果是 11 。

#define NX 2+3 #define NY NX*NX main()

{ int i=0,m=0; for(;i

#define MAX(x,y) (x)>(y)?(x):(y) main()

{ int a=5,b=2,c=3,d=3,t; t=MAX(a+b,c+d)*10; printf(“%d\\n”,t);} 5. 下列程序的输出结果是 MIN 。

#define MAX(a,b) a>b #define EQU(a,b) a==b #define MIN(a,b) a

{ int a=5,b=6; if(MAX(a,b)) printf(“MAX\\n”); if(EQU(a,b)) printf(“EQU\\n”); if(MIN(a,b)) printf(“MIN\\n”);}

6. 下列程序的输出结果是 0 1 1 。

#define TEST main()

{ int x=0,y=1,z; z=2*x+y; #ifdef TEST

printf(“%d %d ”,x,y); #endif

printf(“%d\\n”,z); }

三. 编程题

1. 定义一个带参的宏,求两个整数的余数。通过宏调用,输出求得的结果。

#define R(m,n) (m)%(n) #include void main() { int m,n;

printf(\ scanf(\

printf(\}

2. 分别用函数和带参的宏,从3个数中找出最大者。

#include

#define MAX(a,b) ((a)>(b)?(a):(b)) // implementation by MACRO int max3(int a,int b,int c) //implementation by function

28

{int m;

m=a>b?a:b; m=m>c?m:c; return m; }

void main() { int m,n,k;

printf(\ scanf(\

printf(\ printf(\}

3. 输入一个整数m,判断它能否被3整除。要求利用带参的宏实现。

#include

#define DIVIDEDBY3(m) (m)%3==0 void main() { int m;

printf(\ scanf(\ if(DIVIDEDBY3(m)) printf(\ else printf(\}

习题十 指针

一.填空题

1. 指针变量是把内存中另一个数据的 首地址 作为其值的变量。 2. 能够直接赋值给指针变量的整数是 0 。 3. 如果程序中已有定义:int k;

1) 定义一个指向变量k的指针变量p的语句是 int *p=&k; 。 2) 通过指针变量,将数值6赋值给k的语句是 *p=6; 。

3) 定义一个可以指向指针变量p的变量pp的语句是 int **pp; 。 4) 通过赋值语句将pp指向指针变量p的语句是 pp=&p; 。

5) 通过指向指针的变量pp,将k的值增加一倍的语句是 (**pp)*=2; 。 4. 当定义某函数时,有一个形参被说明成int *类型,那么可以与之结合的实参类型可以是 整型数组名 、

指向整型数据的指针值 等。 5. 以下程序的功能是:将无符号八进制数字构成的字符串转换为十进制整数。例如,输入的字符串为:556,则输出十进制整数366。请填空。 #include main( )

{ char *p,s[6]; int n; p=s; gets(p); n=*p-'0';

while( *(p++) != '\\0') n=n*8+*p-'0'; printf(\ }

29

二.选择题

1—10: BCADC AAABB 11-15: CBCDC

16. 以下count函数的功能是统计substr在母串str中出现的次数。 int count(char *str,char *substr) { int i,j,k,num=0;

for(i=0; ① ;i++)

{for( ② ,k=0;substr[k]==str[j];k++,j++) if(substr[ ③ ]==?\\0?) {num++;break;}

}

return num; }

① A) str[i]==substr[i] B) str[i]!=‘\\0’ C) str[i]==?\\0? D) str[i]>substr[i]

② A) j=i+1 B) j=i C) j=i+10 D) j=1 ③ A) k B) k++ C) k+1 D) ++k

17. 以下Delblank函数的功能是删除字符串s中的所有空格(包括Tab、回车符和换行符)。

void Delblank(char *s) { int i,t;

char c[80];

for(i=0,t=0; ① ;i++)

if(!isspace( ② ))c[t++]=s[i]; c[t]=?\\0?; strcpy(s,c); }

① A) s[i] B) !s[i] C) s[i]=?\\0? D) s[i]==?\\0? ② A) s+i B) *c[i] C) *(s+i)=?\\0? D) *(s+i)

18. 以下conj函数的功能是将两个字符串s和t连接起来。

char *conj(char *s,char *t) { char *p=s;

while(*s) ① ; while(*t)

{*s= ② ;s++;t++;} *s=?\\0?;

③ ; }

① A) s-- B) s++ C) s D) *s ② A) *t B) t C) t-- D) *t++ ③ A) return s B) return t C) return p D) return p-t

19. 下列程序的输出结果是 。

#include main()

{int **k,*a,b=100;a=&b; k=&a;printf(“%d\\n”,**k);}

A) 运行出错 B) 100 C) a的地址 D) b的地址 20. 下列程序的输出结果是 。 #include

30

for(i=0;i

{ printf(\ printf(\

scanf(\ printf(\

scanf(\ for(j=0;j<3;j++) { printf(\

scanf(\ } }

average=0; max=0; maxi=0;

for(i=0;imax) { max=sum; maxi=i; } }

average/=N;

printf(\ No. name scorel score2 score3 average\\n\ for(i=0;i

printf(\

printf(\ printf(\ stu[maxi].score[1],stu[maxi].score[2],stu[maxi].avr); } 4.设单向链表head1和head2已建立。编写将单向链表head2连接到单向链表head1之后的函数,以head1返回,如图11.13所示。

/* 结点结构 Node */ struct Node { int data;

struct Node *next; };

36

head1 连接前 1 head1 连接后 1 2 5 图11.13 链表的连接

head2 2 5 \\0 7 9 \\0 7 9 \\0

提示:函数原型为:struct Node *link(struct Node *head1, struct Node *head2);

struct Node *link(struct Node *head1, struct Node *head2) {

struct Node *p ,*head0; p=head1; head0=head1; while(p->next!=NULL) p=p->next; p->next=head2; return head0; }

5.有两个链表a 和 b。设结点中包括学号、姓名。从a链表中删除去与b链表中有相同学号的那些结点。

#include #include #define LA 4 #define LB 5 struct student { int num;

char name[8];

struct student *next; }a[LA],b[LB];

void main()

{struct student a[LA]={{101,\ struct student b[LB]={{103,\ {108,\ int i;

struct student *p,*p1,*p2,*head1,*head2; head1=a; head2=b; printf(\ \\n\

for(p1=head1,i=1;i<=LA;i++) {if(inext=a+i; else p1->next=NULL;

printf(\ if(inext; }

printf(\

for(p2=head2,i=1;i<=LB;i++) { if(inext=b+i; else p2->next=NULL;

printf(\ if(inext; }

37

p1=head1;

while(p1!=NULL) {p2=head2;

while((p1->num!=p2->num)&&(p2->next!=NULL)) p2=p2->next;

if(p1->num==p2->num) if(p1==head1)

head1=p1->next; else

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

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

printf(\ p1=head1;

while(p1!=NULL)

{printf(\ \\n\ p1=p1->next; } }

习题十二 位运算

一、选择题

1—8: CBDBC AAB 二、填空题

1. 5+3<<2的值为 32 。

2. a为任意整数,能将变量a清零的表达式是__a&0__。

3. 能将两字节变量x的高字节置全1,低字节保持不变的表达式是_x|0xFF00_。 4. 下列程序的输出结果是 64 。 #include main()

{char x=040;printf(“%d\\n”,x=x<<1);} 三、编程题

1. 取一个整数a从右端开始的4~7位。

#include main() {

int num, mask;

printf(\ scanf(\ printf(\

num >>= 4; /*右移4位,将4~7位移到低4位上*/

mask = ~ ( ~0 << 4); /*间接构造1个低4位为1、其余各位为0的整数*/ printf(\ :0x%x\\n\ }

38

2. 编一个将十六进制数转换成二进制形式显示的程序。

#include \void main() {

int num, mask, i;

printf(\scanf(\

mask = 1<<15; /*构造1个最高位为1、其余各位为0的整数(屏蔽字)*/ printf(\for(i=1; i<=16; i++)

{ putchar(num&mask ? ’1’ : ‘0’); /*输出最高位的值(1/0)*/

num <<= 1; /*将次高位移到最高位上*/ if( i%4==0 ) putchar(‘,’); /*四位一组,用逗号分开*/ }

printf(\}

习题十三 文件

一、选择题 1—7: BDABB BC 二、填空题

1. 2 !feof(f1) f2

2. fopen(filename,”w”) ch 3. 0 “r” !feof(fp) 4. BBBCCCDDD

5. “w” str[I]-32 “r” 6. “bi.dat” fp 7. fopen ftell 三、编程题

编程题1: 调用fputs函数,把10个字符串输出到文件中;再从此文件中读入这10个字符串放在一个数组中;最后把字符串数组中的字符串输出到终端屏幕,以检查所有操作的正确性。

#include void main() { int i;

FILE *fp=fopen(\

char *str[10]={ \

\

char str2[10][20]; if(fp==NULL)

{ printf(\ return; }

for(i=0;i<10;i++) { fputs(str[i],fp);

fputs(\

}

fclose(fp);

fp=fopen(\ if(fp==NULL)

39

{ printf(\ return; } i=0;

while(i<10&&!feof(fp))

{ printf(\ i++; }

}

编程题2:从键盘读入10个浮点数,以二进制形式存入文件中。再从文件中读出数据显示在屏幕上。修改文件中第四个数据。再从文件中读出数据显示在屏幕上,以验证修改的正确性。

#include \void ctfb(FILE *fp) { int i; float x; for(i=0;i<10;i++) { scanf(\ fwrite(&x,sizeof(float),1,fp); } }

void fbtc(FILE *fp) { float x; rewind (fp); fread(&x,sizeof(float),1,fp); while(!feof(fp)) { printf(\ fread(&x,sizeof(float),1,fp); } }

void updata(FILE *fp,int n,float x)

{ fseek(fp,(long)(n-1)*sizeof(float),0); fwrite(&x,sizeof(float),1,fp); } main()

{ FILE *fp; int n=4; float x; if((fp=fopen(\ { printf(\ exit(0); } ctfb(fp); fbtc(fp); scanf(\ updata(fp,n,x); fbtc(fp); fclose(fp); }

40

本文来源:https://www.bwwdw.com/article/9313.html

Top