《C语言编程基础》习题解答

发布时间:2020-04-17 07:39:32   来源:文档文库   
字号:

《C语言编程基础(第2版)》习题答案

前 言

《C语言编程基础(第2版)》每章后面都安排了一定数量的习题,这有利于读者理解、消化和掌握各单元的学习内容。习题中,除了有填空题、选择题、回答问题等适合掌握基本概念的题型外,大部分是分析程序运行结果和要求编写实用程序,这有利于读者训练编程技巧和增强编程能力。应广大读者要求,特别是一线教学老师的要求,我们给出全部习题答案,供读者参考。编程答案只是实现题目算法要求的一种,并不一定是最好的。希望读者自己多做思考,利用多种方法进行编程,用以提高自己的程序设计水平和锻炼自己的创新能力。由于作者水平所限,错误和不当之处在所难免,恳请批评指正。

习题一

1、填空题。

C语言程序由__函数__组成,其中必须有且只能有一个名为_main__的函数。C程序的执行从___名为main的主__函数开始。

每个C语句必须以____号结束。

标识符只能由_英文字母_、__数字_和_下划线__三类符号构成,而且标识符的第一个字符必须是__英文字母__或__下划线__。

关键字是指___C语言编译系统所固有的、具有专门意义的标识符___。

C程序中,注释的内容应放在__/*_和_*/__符号之间。

2、选择题。

下面合法的C语言标识符是___ C ___。

C语言中主函数的个数是___ A______。

以下有关注释的描述中,错误的是___ C ___。

C程序中,main函数的位置____ D___。

3、指出并改正下面程序中的错误。

main 应为 main()

应在本程序最后加上大括号 }

语句结束应有分号。如:

int a,b

a=1b=2

printf("%d",a+b)

4、分析下列程序,写出运行结果。

该程序是计算两个整数a和b的乘积并赋值给c,运行结果为:

c=30

该程序输出一个字符串和一排星号,运行结果为:

Hello!

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

5、编程题

按题目要求编写输出固定信息的程序如下:

main()

{

pt();

printf(" Welcome!");

pt();

}

pt()

{

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

}

按题目要求编写输入数据输出其表达式的程序如下:

main()

{

int a,b,c;

scanf("%d",&a);

scanf("%d",&b);

c=a*b+10;

printf("c=%d",c);

}

习题二

1、单项选择题。

C语言中的变量名只能由字母、数字和下划线组成,且第一个字符_ C _

⑵ 合法的常量是__ D ___

C语言中的基本数据类型所占存储空间长度的顺序是__ D___

下列符号串中与123.0相同的合法常量是__ C___

2、填空。

C语言中的基本数据类型包括____整型(int_、____浮点型(flot__ 和_字符型(char_三种。

整型常数有_十进制整数_、_八进制整数_和_十六进制整数_三种表示形式; 整型变量可分为四类: _一般整型(int_、_短整型(short_、_长整型long_、_无符号型_。其中_无符号型_又可分为_无符号整型(unsigned int、_无符号短整型(unsigned short和_无符号长整型(unsigned long_3种。

有10个用指数形式表示的符点常数:

请指出合法的有___③④⑥⑧⑩___。

在C中,没有专为存贮字符串的变量,但可以用__字符型数组__ 或__字符型指针变量_存贮字符串。其定义格式为_ char str[6];_和_ char *a;_。

数据类型混合运算时, 要进行同型转换, 转换方式分为__自动转换(隐式转换)__和__强制转换(显式转换)__两种。

3、写出下列程序运行结果。

⑴ 215/9=23…8

⑵ 97 b

⑶ 4.000000

4、编写程序。

按题目要求编写求三个已知数的乘积,程序如下:

main()

{

int a,b,c;

a=19;

b=22;

c=650;

printf("a*b*c=%d\n",a*b*c);

}

按题目要求,编写将值整数化后赋值的程序如下:

main()

{

int a1,a2;

float b,c;

b=35.425;

c=52.954;

a1=(int)(b*c);

a2=(int)c%(int)b;

printf("a1=%d;a2=%d\n",a1,a2);

}

按题目要求,编写计算圆周长、面积和圆柱体积的程序如下:

main()

{

int r,h,c,s,v;

r=15;

h=3;

c=2*3.14*15; s=3.14*r*r; v=s*h;

printf("c=%d, s=%d , v=%d\n",c,s,v);

}

习题三

1、填空题。

设有int x=11;则表达式(x++*1/3)的值是_____3____。

已知数学表达式y=x²-2x+5,写出对应的C语言表达式_y=x*x-2*x+5_。

已知a=10,则表达式x=(a=a+b,a-b)的值为__x=10__。

2、选择题。

在C语言中,下列运算符的操作数必须是int类型的运算符是( D )。

假设所有变量均为整型,则表达式(a=2,b=5,a++,b++,a+b)的值为( A )。

已定义int m=6,n=5;,则执行m%=n-1;之后,m的值是( B )。

已有int a=1,b=1;则执行b=(a=2*3,a*5),a+7之后,a,b的值是B

已有int x=2,y=1;则执行x++==y--;的结果是D

3、求下面算术表达式的值。

2.500000

3.500000

4、分析下列程序,写出运行结果。

注意,在C语言中,因为函数调用中参数按从右到左的顺序求值,因此该程序执行打印输出的结果为:

3 1 1

该程序在计算条件表达式的值赋给a时,其x值已为6,y值已为7,因此运行结果为:

a=7,b=0,c=6

该程序利用运算符与结合性的优先级不同,而取得a与b的值。(因为该题使用了逻辑运算符,可在学了第5章以后再详细分析)运行结果如下:

a=2,b=1

该程序应用复合的赋值运算符和从右至左结合性的运算规则,求取n的值,运行结果如下:

n=28

该程序在执行语句“y=x++-1;”时,y为0而x在执行后变为2;在执行语句“z=--y+1;”时,z为0而y便成了-1。运行结果如下:

x=2,y=-1,z=0

5、编程

用符号常量编写简单计算程序如下(复杂应用应在第9章学习后再做):

#define N 12

#define M 25

main()

{

float c;

printf("N+M=%d\n",N+M);

printf("N-M=%d\n",N-M);

printf("N*M=%d\n",N*M);

c=(float)N/M;

printf("N/M=%f\n",c);

}

查看i++++j运算结果差异的程序,编写如下:

main()

{

int i=20,j=20;

printf("i++:%d\n++j:%d\n",i++,++j);

}

查看m----n运算结果差异的程序,编写如下:

main()

{

int m=20,n=20;

printf("m--:%d\n--n:%d\n",m--,--n);

}

习题四

1、单项选择题。

⑴ 下列叙述不正确的是__B__。

⑵ 当输入数据为12345678时,下面程序运行的结果是__C___。

⑶ putchar函数可以向终端输出一个__D___。

⑷ 按格式输出的格式符__ C__。

2、回答问题

⑴ 在键盘上输入数据格式如下:

12,24,Aa2.58-2.58168.5

(□代表空格,其中数据1是为了对付%*f占位,↙代表回车)

该题是求输入任意两个整数ab的和。若读入a=b=5,其运行结果为:

type a number please!a=?

5

type another please!b=?

5

a sum b is 10

3、写出下列程序的执行结果。

执行结果:

32767,-32768

2147483647,-2147483648

65535,0

执行结果:

yes,I am computer.

执行结果:

a\b□□□□□tw

123

执行结果:

58.887299,555.677979

58.887299□□□,555.677979

□□58.887, □555.678,58.887,555.678,58.887299,555.677979

5.88873e+01, □□□5.6e+02

B,66,102,42

7567890,34675022,7a12

11232,25740,2be0,11232

COMPUTER, □□ABC

4、编写程序。

对输入的大写字母改用小写输出的程序,编写如下:

#include

main()

{

char c;

printf("输入一个大写字母:\n");

c=getchar();

putchar(c+32);

}

计算三门课总成绩等数据的程序,编写如下:

#include

main()

{

float a,b,c,sum,ave,mod;

printf("输入三门课程的成绩:\n");

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

sum=a+b+c;

ave=(a+b+c)/3;

mod=fmod(sum,3);

printf("总成绩=%5.1f,平均成绩=%5.1f,总成绩除3的余值=%3.1f\n",sum,ave,mod);

}

已知数据,按输出结果的要求编写输出程序如下:

main()

{

int a=1,b=2,c=3,g=12345;

float d=7.2,e=-5.5,f=1.56;

long h=123456;

char i='o',j='p';

printf("a=%d b=%d c=%d\n",a,b,c);

printf("d=%f,e=%f,f=%f\n",d,e,f);

printf("d+e=%4.2f e+f=%4.2f d+f=%5.3f\n",d+e,e+f,d+f);

printf("g=%7d h=%ld\n",g,h);

printf("i=%c or %d\nj=%c or %d\n",i,i,j,j);

}

习题五

1、单项选择题。

⑴ C语言用__C__表示逻辑量为“假”

⑵ 要求当A的值为奇数时,表达式的值为“真”;A的值为偶数时,表达式的值为“假”。以下不满足要求的表达式是__D__

if语句的嵌套中,else总是与__C__配对。

下面对for循环概念描述正确的是__D__

2、填空题

⑴ switch后面的“表达式”,通常为__型或_字符_型表达式;每个case的常量表达式的值__不能相同__。

⑵ 如果不算goto语句构成的循环结构,那么C语言可以构建循环的语句一共有_3_种,分别是__for循环、while循环、do-while循环__。

⑶ continue语句与break语句在使用时,有两点主要的不同:①它不适用于_switch_语句;②它跳转时是__跳过循环体中下面的语句从下一次循环开始__。

⑷ 把下面的两条if分支语句合并成一条if分支语句应该写成

if(x>=y) printf(m=%d\n, m=2);

else printf(n=%d\n, n=1);

3、指出以下程序的打印结果。

该程序运行结果如下:

x=11 y=10

x=55 y=10

x=8 y=10 z=10

x=2 y=2

x=3 y=3

x=4 y=4

x=5 y=5

x=6 y=6

x=7 y=7

x=8 y=8

x=9 y=9

x=2 y=2

x=1 y=1000

x=2 y=100

x=3 y=10

4、编写程序。

按要求,用两种循环方式编写相关程序如下:

-①的for循环

#include

main()

{

int r;

float v;

for (r=1;r<=100;r+=2)

{

v=4/3*3.14*pow(r,3);

printf("r=%d,v=%f\n",r,v);

}

}

⑴-①的while循环

#include

main()

{

int r;

float v;

r=1;

while (r<=100)

{

v=4/3*3.14*pow(r,3);

printf("r=%d,v=%f\n",r,v);

r+=2;

}

}

⑴-②的for循环

main()

{

int s,i;

s=0;

for (i=13;i<=103;i+=10) s=s+i;

printf("s=%d\n",s);

}

⑴-②的while循环

main()

{

int s,i;

s=0;

i=13;

while (i<=103)

{

s+=i;

i+=10;

}

printf("s=%d\n",s);

}

找出学生成绩中的最高分和最低分的程序,编写如下:

main()

{

int max,min,n;

printf("请输入成绩,-1结束:");

scanf("%d",&n);

max=min=n;

while (n!=-1)

{

if (n>max) max=n;

if (n

scanf("%d",&n);

}

printf("最高分:%d,最低分:%d\n",max,min);

}

输出“水仙花数”的程序,编写如下:

#include

main()

{

int n,a,b,c;

for (n=100;n<=999;n++)

{

a=n/100;

b=n%10;

c=(n%100-b)/10;

if (pow(a,3)+pow(b,3)+pow(c,3)==n) printf("%d\n",n);

}

}

习题六

1、填空题

数组是一组具有相同___类型__的数据的集合。

如果一个数组的长度为10,则该数组中数组元素下标的最小值为_0_,最大值为_9_。

若有 int a[]={10,20,30,40}; 则数组a的长度为__4__。

在C语言中,没有字符串变量,字符串的存储是通过__字符数组__来实现的。

strlen函数的功能是__测试字符串的长度__,strcmp函数的功能是__比较两个字符串的大小__。

2、选择题。

定义一个有100个元素的int型数组,下面正确的语句是__D__。

下面正确的对数组b进行初始化的语句是__C__。

在C程序中,引用一个数组元素时,其下标的数据类型允许是__D__。

下面语句中正确的是___A__。

若有定义:char str[]="Hello" ; 则数组str所占的空间为___B__。

3、分析下列程序,写出运行结果。

⑴ 该程序通过for循环为数组元素自动赋值,然后输出。运行结果如下:

a[0]=1

a[1]=2

a[2]=3

a[3]=4

a[4]=5

a[5]=6

a[6]=7

a[7]=8

a[8]=9

a[9]=10

程序定义并初始化了a、b、c三个数组,然后分别输出各数组的各个元素,用来验证初始化的结果。运行结果如下:

数组a:10 20 30 40 50

数组b: 1 2 3 0 0

数组c: 0 1 2 3

该程序通过gets()函数为字符数组接收字符,然后输出各元素。运行结果如下:

abc↙(输入的字符)

str[0]=a

str[1]=b

str[2]=c

4、编写程序。

对输入一组数进行相关统计的程序,编写如下:

main()

{

int i,num[10];

int max,min,sum=0;

float average;

clrscr();

printf("输入10:\n");

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

{

scanf("%d",&num[i]);/* 输入数值 */

sum+=num[i]; /* 累加求和 */

}

average=(float)sum/10;/* 求平均值 */

max=min=num[0];

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

if(num[i]>max)max=num[i]; /*求最大值*/

else if(num[i]/*求最小值*/

printf("最大值=%d\n",max);

printf("最小值=%d\n",min);

printf("10个数的和为:%d\n",sum);

printf("平均为:%6.2f",average);

}

求素数的程序编写如下:

main()

{

int i,j,k,m=0;

clrscr();

for(i=2;i<=100;i++)

{ k=0;

for(j=2;j<=i-1;j++)

if(i%j==0)

{ k=1;break;}

if(k==0)

{ printf("%4d",i);

m=m+1;

if(m%8==0)

printf("\n");

}

}

}

判断一个浮点数是否在一个浮点型数组中的程序,编写如下:

main()

{

int i,exist;

float a[4],n;

printf("输入浮点型数组:\n");

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

{

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

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

printf("\n");

}

printf("输入一个浮点数:");

exist=0;

scanf("%f",&n);

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

{

printf("a[%d]=%f;\n",i,a[i]);

if (a[i]==n) exist=1;

}

if (exist==1) printf("%f在数组中。\n",n);

else printf("%f不在数组中!\n,n);

}

此题前面的浮点型数组的值,也可通过初始化直接赋值的办法得到。

⑷ 输出二维数组中最大值及位置的程序,编写如下:

main()

{

int i,j,row=0,col=0,max;

int a[4][6];

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

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

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

max=a[0][0];

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

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

if(a[i][j]>max)

{max=a[i][j];row=i;col=j;}

printf(max=%d,row=%d,col=%d\n,max,row,col);

}

在字符串中的指定位置插入字符串的程序,编写如下:

main()

{

char ch1[10],ch2[3],ch3[13];

int i=0,n;

printf("输入字符串1(长度为10):\n");

scanf("%s",ch1);

printf("输入字符串2(长度为3):\n");

scanf("%s",ch2);

printf("插入位置n(n<10):\n");

scanf("%d",&n);

n--;

for (i=0;i

for (i=n;i

for (i=n;i<10;i++) ch3[i+3]=ch1[i];

printf("%s",ch3);

}

习题七

1、填空题。

C语言函数分成__系统提供的库函数__和__用户自定义函数_两大类。

一个C程序由主函数和若干__个自定义函数__组成,各个函数在程序中的定义是__相互独立__的。

函数的递归调用是指__函数直接或间接地调用自己__。

当__数组名__作函数参数时,实参与形参的传地址传递”。

根据变量的作用范围的不同,可将变量分为_局部_变量和_全局_变量。根据变量生存期的不同,可以将变量分为__动态存储__变量和__静态存储__变量。

static变量的特点是__其值始终存在__。

2、选择题。

如果一个函数有返回值,那么这个函数只有__A__个返回值。

下面关于空函数的定义,正确的是___B___。

以下错误的描述是__C___。

调用一个不含return语句的函数,以下正确的说法是___D___。

下面函数调用语句中含有实参的个数为___C___。

数组名作函数参数时,实参传递给形参的是__B___。

3、指出并改正下面程序在函数定义或调用中的错误

被调函数f(x)定义时对形式参数x未做参数说明。应改为:

f(int x)

或:

f(x)

int x;

函数调用时,实际参数的类型应与被调函数形式参数的类型相一致。本题在主函数中的整型变量a应改为浮点型:

int a; 改为 float a;

被调函数f( )定义时不需要加分号,f( ); 应改为:f( )

C程序中,不能在一个函数的函数体内定义另一个函数。该题在主函数中定义f( )为空值类型且作为一个语句是错误的。应去掉 void f( );

4、分析下列程序,写出运行结果。

主函数以a=2为实参调用f(x)函数,f(x)通过 return语句向主函数返回y的值赋给b,结果应为:

b=4

该程序实参变量a、b和形参变量x、y分别占用不同的存储单元,虽然在swap函数中x、y的值发生了交换,但主函数中a、b的值却没有改变。运行结果应为:

a=1↙

b=2↙

x=2,y=1

a=1,b=2

全局变量x初始化为1,调用被调函数f( ) 执行一次x++ ,然后再执行x++ 后输出x值应为:

x=3

x为定义在整个函数体和复合语句内的同名自动变量,其作用域不同。int x=20;定义在复合语句中,只在复合语句中有效。运行结果如下:

x=20 x=11

执行被调函数,将原数组元素初值分别加1,因此输出结果为:

num[0]=2

num[1]=3

num[2]=4

num[3]=5

num[4]=6

5、编写程序。

该题目要求使用判断奇偶数函数,编写程序如下:

main()

{

int n;

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

scanf("%d",&n);

a(n);

}

a(int n)

{

if (n%2==0) printf("%d是偶数\n",n);

else printf("%d 是奇数\n",n);

}

编写一个将3个数从小到大顺序输出函数如下:

sort(x,y,z)

int x,y,z;

{ int t;

if (x>y)

{t=x; x=y; y=t;}

if (x>z)

{t=x; x=z; z=t;}

if (y>z)

{t=y; y=z; z=t;}

Printf("%d %d %d",x,y,z);

}

输入的秒数值,转换为时::秒输出,编程如下:

int hou=0,min=0;

main()

{

int sec,sec2;

clrscr();

printf("请输入秒数:\n");

scanf("%d",&sec);

sec2=change(sec);

printf("%d 个小时:%d 分钟:%d ",hou,min,sec2);

}

int change(sec1)

int sec1;

{

if(sec1>3600)

{hou=sec1/3600;

min=(sec1%3600)/60;

sec1=sec1%60;}

else if(sec1>60)

{hou=0;

min=sec1/60;

sec1=(sec1%60);}

return(sec1);

}

求一组学生成绩的总分、平均分、最高分和最低分的程序,编写如下:

main()

{

float s,ave,score[100];

int I,m;

clrscr();

printf("输入学生人数:") ;

scanf("%d",&m);

printf("输入%d个学生的成绩:\n",m);

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

{

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

s=s+score[i];

}

printf("总成绩=%.2f\n",s);

ave=average(score,m);

printf("最高分=%d\n",max);

printf("最低分=%d\n",min);

printf("平均成绩=%.2f",ave);

}

float max=0,min=0;

float average(array,n)

float array[];int n;

{

int i;

float aver,sum=array[0];

max=min=array[0];

for(i=1;i

{ if(array[i]>max) max=array[i]; /*求最高分*/

else if(array[i]/*求最低分*/

sum=sum+array[i]; }

aver=sum/n; /* 求取平均成绩 */

return(aver); /* 返回主程序值 */

}

显示菜单并实现相应选择功能的程序,编写如下

#include

main()

{

int i;

while (i!=3)

{

clrscr( );

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

printf("1.求整数n的立方\n");

printf("2.求整数n的立方根\n");

printf("3.结束程序\n");

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

scanf("%d",&i);

if (i==1) lifang();

else if (i==2) lifanggen();

}

}

lifang()

{

int n;

long s;

printf("input n:\n");

scanf("%d",&n);

s=pow(n,3);

printf("%d 的立方为:%ld\n\n",n,s);

}

lifanggen()

{

int n;

double s;

printf("input n:\n");

scanf("%d",&n);

s=(double)1/3;

s=pow(n,s);

printf("%d 的立方根为:%f\n\n",n,s);

}

用递归法求n!的程序,编写如下:

main()

{

long f(),t;

int n;

printf("input number:\n");

scanf("%d",&n);

t=f(n);

printf("%d 的阶乘为:%ld",n,t);

}

long f(int n)

{

static long s=1;

if (n>1) f(n-1);

s*=n;

}

习题八

1、填空。

(1) 文件是存贮在外部存贮设备上的_信息集合_。一般分为_程序_文件和_数据_文件。

(2) C 语言文件存贮在磁盘上有两种形式 , 一种是按_ASCII码存储_, 另一种是按_二进制码存储_。

(3) 定义文件指针变量的格式为__FILE *fp__ 。

(4) feof()函数是_文件尾_ 检测函数,当文件位置指针处于_文件尾_ 时,它返回一个__非0_ 值。

(5) 对流式文件可以进行顺序读写,也可以进行随机读写,关键是_如何控制文件的位置指针_ 。

2、回答问题。

有三大好处:保存运算的中间结果或最终结果,方便使用;将数据独立于程序之外,便于多处、多人共享;事先录入保存所需数据,可以提高程序运行时的效率。

在ASCII码文件中,一个字节代表一个字符,便于字符的输入输出处理,但占用存储空间较大;二进制文件占用的存储空间较小,但在文件中,一个字节并不代表一个字符。

w: 创建一个ASCII码文件只写;

r: 打开一个ASCII码文件只读;

a: 打开一个ASCII码文件添加;

wb: 创建一个二进制文件只写;

rb+:打开一个二进制文件读/写。

文件操作完以后及时关闭,可将文件指针脱离该文件,并将内存缓冲区中的数据写入磁盘,用以保证写入文件的数据完整。

EOF在stdio.h中定义为-1,它也是一个合法的二进制整数,用fgetc()函数检查文件尾容易发生错判。

3、程序改错

该程序是要求键盘输入一些字符写入磁盘文件xt1.txt中,程序中有两处错误:

1 (检查文件是否存在且要向文件写,注意文件名和打开方式

fp=fopen("xt.txt","r") 为:fp=fopen("xt1.txt","w")

(向文件中写而不是读)

fgetc(fp); 应改为:fputc(c,fp);

该程序是要求从文件中读并统计其正数、负数和零的个数,在屏幕上显示。程序中有两处错误:

(当不是文件尾时才读取并统计)

while(feof(p)==1) 应改为: while(feof(p)==0)

(f为存储负数的变量应取i<0)

else if(i=0)f++; 应改为:else if(i<0)f++;

4、编写程序。

将字符串写入文件的程序,编写如下:

#include

FILE *fp;

main()

{

char a[2][8]={"Turbo C","BASIC"};

fp=fopen("lx1.txt","w");

fputs(a[0],fp);

fputs(a[1],fp);

fclose(fp);

}

将字符串从文件中读出的程序,编写如下:

#include

FILE *fp;

main()

{

char *a;

if((fp=fopen("lx1.txt","r"))==NULL)

{ printf("cannot open file\n");

exit(1);}

fgets(a,13,fp);

clrscr();

printf("%s\n",a);

fclose(fp);

}

将三个数写入文件的程序,编写如下:

#include

FILE *fp;

main()

{

int a,b,c;

fp=fopen("lx2.txt","wb");

fprintf(fp,"%d\n%d\n%d",100,200,300);

fclose(fp);

}

将数值从文件中读出并求其和的程序,编写如下:

#include

FILE *fp;

main()

{

int a,b,c;

if (!(fp=fopen("lx2.txt","rb")))

{ printf("cannot open file!\n");

exit(1);}

fscanf(fp,"%d%d%d",&a,&b,&c);

printf("%d+%d+%d=%d\n",a,b,c,a+b+c);

fclose(fp);

}

将10个整数写入文件的程序,编写如下:

#include

FILE *fp;

main()

{

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

fp=fopen("lx3.txt","wb");

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

{

fwrite(&a[i],2,1,fp);

}

fclose(fp);

}

将指定位置的整数从文件中读出的程序,编写如下:

#include

FILE *fp;

main()

{

int n,i,num;

if (!(fp=fopen("lx3.txt","rb")))

{printf("cannot open file\n");

exit(1);}

printf("输入数值i:");

scanf("%d",&i);

n=2*(i-1);

fseek(fp,n,SEEK_SET);

fread(&num,2,1,fp);

printf("第%d号数据是:%d\n",i,num);

fclose(fp);

}

习题九

1.选择题

将C的库函数中数学函数库的头文件包含到程序中,应在程序的头部加上( C )。

欲将一个文件file.c包含到程序中,应该在程序的头部加上( A )。

“文件包含”预处理语句的使用形式中,当#include后面的文件名用 括起时,寻找被包含的文件的方式为( B )。

在C语言中,编译预处理命令都是以( B )符号开头的。

2、分析下列程序,写出运行结果。

该程序是定义了一个带参数的宏:S(x),在程序运行时它的置换内容是x*x,用实参代替形参后计算(3+1)的平方。其运行结果为:

a=16

该程序是定义了一个带两个参数的宏:MIN(x,y),在程序运行时它的置换内容是条件表达式(x)<(y)?(x):(y),用实参代替形参后其运行结果为:

500

该程序运行时,先执行宏PRINT1,输出A*B的值,然后执行宏PRINT,输出回车换行;最后执行宏PRINT2,输出(A+1)*(B+1)的值,运行结果为:

15

24

该程序定义时用了宏嵌套,控制循环终值的宏NUM,其值应为:

(M+1)*M/2=(N+1+1)*[(N+1)/2]=(2+1+1)*[(2+1)/2]=4*2=8

运行结果为:

12345678

3、编程

用带参数的宏实现求两个整数相除取余的程序,编写如下:

#define DIV(x,y) x%y

main()

{

int a,b,d;

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

d=DIV(a,b);

printf("%d\n",d);

}

利用宏按从大到小顺序输出3个整数的程序,编写如下:

#define chag(x,y) (x=x+y,y=x-y,x=x-y)

main()

{

int a,b,c;

printf("输入3个整数:\n");

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

if (a

if (a

if (b

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

}

按题目要求,利用条件编译方法编写程序如下:

#include

#define LOWCASE 0

main()

{

char *a;

printf("输入字符串:\n");

scanf("%s",a);

#if LOWCASE

a=strlwr(a);

#else

a=strupr(a);

#endif

printf("%s\n",a);

}

习题十

1.选择题

若已定义“int *p,a;”,则语句“p=&a”中的运算符“&”的含义是( D )。

执行该程序断后,a的值为( B )。

程序段的运行结果是( A )。

若有定义int a[3][5],i,j;(且0≤i<3,0≤j<5),则a[i][j]的地址不正确的是( D )。

设有语句“int (*p)()”,则p是一个( B )。

给出程序的输出结果为( A )。

2.填空题

⑴ 以下程序用来输出字符串。

printf(%s\n, *p );

⑵ exchange函数的调用语句为“exchange(&a,&b,&c);”。他将3个数按由小到大的顺序调整后依次放入a,b,c三个变量中,a中放最大值,请填空。

if(*q3>*q2) swap( q2,q3 );

if(*q1<*q3) swap( q1,q3 );

if(*q1<*q2) swap( q1,q2 );

⑶ 以下程序段完成给数组所有元素输入数据。

while(j<10) scanf(%d, &a[j] );

以下函数用来求出两整数之和,并通过形参将结果传回,请填空。

void func(int x,int y, _int *_ z)

{ *z=x+y; }

程序的输出结果是__7__。

3.分析下列程序,写出运行结果。

该程序用指针变量取得ab的地址,用来比较哪个地址中变量的值更大并输出。运行结果如下:

max=33

该程序用指针变量做循环控制变量,控制输出字符的个数。运行结果如下:

ABCDE

BCDE

CDE

DE

E

利用指针做函数参数,在执行子函数时,将a+b的值赋给了c,a-b的值赋给了d。输出c、d,运行结果如下:

7,1

利用指针做函数参数,在执行子函数时,用两个指针变量指向a数组的首地址和尾地址,通过循环控制指针,交换不同位置的数组元素达到反序排列。运行结果如下:

GFEDCBA

4、编程题

输入三个数后,按由小到大的顺序输出。编程如下:

main()

{

int a,b,c,*p1,*p2,*p3;

printf("输入3个数:\n");

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

if (a>=b) p1=&b,p3=&a;

else p1=&a,p3=&b;

if (c>=*p3) p2=p3,p3=&c;

else if (c<=*p1) p2=p1,p1=&c;

else p2=&c;

printf("%d,%d,%d\n",*p1,*p2,*p3);

}

按题目要求,编写排序函数及程序如下:

int *sort(int a[],int n)

{

int i,j,t;

for (i=0;i

{

for (j=i+1;j

{

if (a[i]>a[j]) t=a[i],a[i]=a[j],a[j]=t;

}

}

return a;

}

main()

{

int *b,i,a[10];

printf("输入10个数:");

for (i=0;i<10;i++) scanf("%d",&a[i]);

b=sort(a,10);

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

printf("\n");

}

按题目要求,编写统计输入字符串中大小写字母个数的函数及程序如下:

#include

count(char *p)

{

int u=0,l=0;

while (*p)

{

if (islower(*p)) l++;

if (isupper(*p)) u++;

p++;

}

printf("大写字母个数:%d;小写字母个数:%d",u,l);

}

main()

{

char *a;

printf("输入字符串:\n");

scanf("%s",a);

count(a);

}

⑷ 按题目要求,编写连接字符串的函数及程序如下:

main()

{

char *strcat(),*str1,*str2,*p;

printf("输入字符串1:\n");

scanf("%s",str1);

printf("输入字符串2:\n");

scanf("%s",str2);

p=strcat(str1,str2);

printf("%s\n",p);

}

char *strcat(char *s1,char *s2)

{

char *p;

p=s1;

while (*p) p++;

while (*s2) *p=*s2,p++,s2++;

return s1;

}

按题目要求,编写查找字符所在位置的函数及程序如下:

char *index(char *str,char ch)

{

char *p;

int c=0;

p=str;

while (*p)

{

if (*p==ch) return p;

p++;

}

p=&c;

return p;

}

main()

{

char *a,*b,ch;

long n;

printf("输入字符串:\n");

scanf("%s",a);

printf("输入一个字符:\n");

ch=getch();

b=index(a,ch);

if (*b==0) printf("找不到字符%c!\n",ch);

else {

n=b-a+1;

printf("字符 %c 在字符串%s的第 :%ld个位置\n",ch,a,n);}

}

本文来源:https://www.2haoxitong.net/k/doc/ddd9f7f8b80d6c85ec3a87c24028915f814d84c3.html

《《C语言编程基础》习题解答.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式