C语言程序设计教程书后作业参考答案2013
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
重要提醒:请同学们认真复习,为后续课程打好基础,祝取得好成绩!
五种题型:填空、选择、阅读程序写结果,程序填空,编程题
每章基本概念要熟练掌握(教材中填空和选择有可能认真做一遍)
常用算法一定要掌握:
顺序结构:定义,赋值(输入),处理,输出
分支结构:能够读懂各种结构程序
循环结构:读程序,填空
最大公约数,最小公倍数,求和,阶乘,水仙花数,回文数,完数,同构数,素数判断,哥德巴赫猜想,孪生素数等。
数组:一维数组排序,查找(顺序,折半),找最大小值,求平均值等
二维数组;输入和输出二维数组,杨辉三角形
函数:能将上述循环、数组部分用函数实现,并正确调用
指针:掌握相关概念,能够阅读程序写结果
预处理:基本概念,阅读程序
自定义数据类型、文件中的基本概念(填空,选择)
附书后作业的选择和填空题的全部答案及部分编程题的参考答案
练习题1参考答案
一、选择题
二、填空题
1.程序设计语言主要分为以下三类:机器语言、汇编语言和高级语言。
2.在C语言中,一个函数一般由两个部分组成,它们是函数首部和函数体。
3.C程序开发过程的一般步骤为:源程序的编辑、编译、连接和运行。
4. C程序源文件的扩展名为.c ,编译成功后产生的文件扩展名为.obj ,连接成功后产生文件扩展名为.exe 。
三、应用题
略
练习题2参考答案
一、选择题
二、填空题
1.通常一个字节包含8 个二进制位。
在一个字节中能存放的最大(十进制)整
数是255(无符号),127(带符号),最小(十进制)整数是-128 ,它的二进制数的形式是10000000 。
2.在C语言中,十进制数30的八进制数表示形式是 036 ,十六进制数表示形式是 0x1e ,在内存中它的二进制数表示形式是 0000000000011110 。
3.条件“20<x<30或x<-100”的C语言表达式是 x>20&&x<30||x<-100 。
4.若a、b和c均是int型变量,则计算表达式a=(b=4)+(c=2)后,a值为 6 ,b 值为 4 ,c值为 2 。
5.已知int y; float x=-3; ,执行语句y=x%2; 后,变量y的值为语句出错。
6.字符串"ab\034\\\x79"的长度为 5 。
7.在C语言中(以16位PC机为例),一个float型数据在内存中所占用的字节数为4 ;一个double型数据在内存中所占的字节数为 8 。
8.若s是int型变量,且s=6,则s%2+(s+1)%2表达式的值为 1 。
9.表达式pow(2.8,sqrt(double(x)))值的数据类型为 double 。
10.若a是int型变量,则表达式(a=4*5, a*2), a+6的值为 26 。
11.若a是int型变量,则执行表达式a=25/3%3后a的值为 2 。
12.若i为int整型变量且赋值为6,则运算i++后表达式的值是 6 ,变量i的值是 7 。
13.若x为int型变量,执行语句:x=10;x+=x-=x-x;则x的值为 20 。
14.若x和y为double型变量,则表达式x=1,y=x+3/2的值是 2.000000 。
15.(-b+sqrt(b*b-4*a*c))/(2*a)的数学式子是 [-b+√(b^2-4ac)]/2a
16.sqrt(p*(p-a)*(p-b)*(p-c))的数学式子是√[p*(p-a)*(p-b)*(p-c)] 。
17.判断某一年份是否为闰年的表达式是(year%4==0||year%100==0) && year%400!=0)。
18.用随机函数rand()产生一个在[-20,20]两位整数的表达式是 x=rand()%41-20。
三、阅读分析下列程序。
1. 写出下列程序的输出结果。
18
2. 已知字母B的ASCII码为66,写出下列程序的输出结果。
67,E
3. 写出下列程序的输出结果。
a=4,b=3
练习题3参考答案
一、选择题
二、填空题
1.C语句句尾用分号结束。
2.若有变量定义:int a=1,b=2,c=3,d=4,x=5,y=6;则表达式(x=a>b)&&(y=c>d) 的值为0 。
3.使用强制转换方法将正整数转换成字符。
本题程序如下:
本程序的执行结果为输入一个正整数(小于255):97
a的ASCII码为97 。
4.下面程序的输出是 -100,50
i=-100,j=50
i=-100
j=50。
5.执行以下程序时,若从第一列开始输入数据,为使变量a=2,b=8,x=
6.5, y=56.62, el='C',c2='b',正确的数据输入形式是 a=2 b=8x=6.5 y=56.62c1=C c2=b 。
三、程序设计题
1.编写程序交换两个变量a,b的值,并输出。
如输入时a=3,b=5,输出a=5,b=3。
#include<stdio.h>
void main()
{
int a,b,c;
printf(“输入两个数:a,b”);
scanf(“a=%d,b=%d”,&a,&b);
c=a;
a=b;
b=c;
printf(“a=%d,b=%d”,a,b);
}
2. 编写程序输入小写字符boy,输出大写字符BOY。
#include<stdio.h>
void main()
{
char c;
printf(“Input:”);
scanf(“%c”,&c);
c=c-32;
printf(“%c”,c);
}
3.已知华氏温度与摄氏温度的转换公式为:C=(F-32)*5/9。
编写程序当输入华氏温度F 时,输出对应的摄氏温度。
#include<stdio.h>
void main()
{float F;
scanf(“%f”,&F);
printf(“%f”,(F-32)*5/9);}
4.设圆的半径r=1.5,圆柱高h=3,编写程序求圆周长、圆面积、圆球表面积、圆球体积及圆柱体积。
用scanf函数输入数据,输出计算结果,输出时要求有文字说明,取小数点后2位数字。
#include<stdio.h>
int main()
{float h,r,l,s,sq,vq,vz;
float pi=3.141592;
printf(“请输入圆半径r,圆柱高h:”);
scanf(“%f,%f”,&r,&h);
l=2*pi*r;
s=r*r*pi;
sq=4*pi*r*r;
vq=3.0/4.0*pi*r*r*r;
vz=pi*r*r*h;
printf(“圆周长为: l=%6.2f\n”,l);
printf(“圆面积为: s=%6.2f\n”,s);
printf(“圆球表面积为: sq=%6.2f\n”,sq);
printf(“圆球体积为: vq=%6.2f\n”,vq);
printf(“圆柱体积为: vz=%6.2f\n”,vz);
ruturn 0;}
5.编写程序输入梯形的上底a,下底b和高h,输出该梯形的面积。
#include<stdio.h>
void main()
{float a,b,h,s;
printf(“请输入梯形上底,下底和高:\n”);
scanf(“%f%f%f”,&a,&b,&h);
s=(a+b)*h/2;
printf(“梯形面积为: %f\n”,s);}
练习题4参考答案
一、选择题
二、填空题
1.表示“整数x的绝对值大于5”时值为“真”的C语言表达式是 abs(x)>5 && floor(x)==x 。
2.以下程序运行后的输出结果是 20,0 。
3.若从键盘输入58,则以下程序输出的结果是 585858 。
4.以下程序输出的结果是 0 。
5.以下程序的输出结果是 2 。
6.若int i=10; 则行下列程序后,变量i的正确结果是 13 。
三、程序设计题
1.编写程序输入有3个整数a、b、c,并按照从小到大的顺序输出。
#include<stdio.h>
int main()
{int a,b,c,t;
printf(“please input a b c\n”);
scanf(“%d%d%d”,&a,&b,&c);
if(a>b)
{t=a;a=b;b=t; }
if(a>c)
{t=a;a=c;c=t;}
if(b>c)
{t=b;b=c;c=t;}
printf(“%d,%d,%d\n ”,a,b,c); return 0;} 2.有一个函数: ⎪⎩
⎪
⎨⎧≥-<≤-<=10
113101121x x x x x x y
编写一个程序,输入x 的值,输出y 的值。
#include<stdio.h> int main() {int x,y;
printf(“输入x:”); scanf(“%d ”,&x); if(x<1)
{y=x;
printf(“x=%d, y=x=%d\n ”,x,y);} else if(x<10)
{y=2*x-1;
printf(“x=%d, y=2*x-1=%d\n ”,x,y);} else
{y=3*x-11;
printf(“x=%d, y=3*x-11=%d\n ”,x,y);} return 0;}
3.输入学生的百分制成绩,要求输出学生的成绩、等级以及相应的评语。
设用‘A ’、‘B ’、‘C ’、‘D ’、‘E ’五个等级,且90分以上为等级‘A ’,评语为“成绩优秀”,80-89分为等级‘B ’,评语为“成绩良好”,70-79分为等级‘C ’,评语为“成绩中等”,60-69分为等级‘D ’,评语为“成绩及格”,60分以下为等级‘E ’,评语为“成绩不及格”。
分别用if 条件语句和switch 开关语句编写程序。
方法一:if 条件语句 #include<stdio.h> void main() {
int score;
printf("输入成绩:"); scanf("%d",&score);
if(score>100 || score<0) printf("输入错误!\n"); else if(score>=90)
printf("成绩为%d,等级为A,成绩优秀\n",score); else if(score>=80)
printf("成绩为%d,等级为B,成绩良好\n",score); else if(score>=70)
printf("成绩为%d,等级为C,成绩中等\n",score); else if(score>=60)
printf("成绩为%d,等级为D,成绩及格\n",score);
else
printf("成绩为%d,等级为E,成绩不及格\n",score);
}
方法二:switch开关语句
#include<stdio.h>
void main(){
int score;
printf("输入成绩:");
scanf("%d",&score);
if(score>100 || score<0)
printf("输入错误!\n");
else
switch(score/10)
{
case 10:
case 9:
printf("成绩为%d,等级为A,成绩优秀\n",score);break;
case 8:
printf("成绩为%d,等级为B,成绩良好\n",score);break;
case 7:
printf("成绩为%d,等级为C,成绩中等\n",score);break;
case 6:
printf("成绩为%d,等级为D,成绩及格\n",score);break;
default:
printf("成绩为%d,等级为E,成绩不及格\n",score);
}
}
4.编写程序输入三个整数,判断它们是否能够构成三角形。
若能构成三角形,则输出三角形的类型(等边三角形、等腰三角形、一般三角形),并计算三角形的面积;若不能构成三角形,则输出“不能构成三角形”的信息。
#include<stdio.h>
#include<math.h>
void main()
{
float a,b,c,s,t;
printf("input a,b,c\n");
scanf("%f%f%f",&a,&b,&c);
if((a+b>c)&& (a+c>b)&& (b+c>a))
{
t=(a+b+c)/2;
s=sqrt(t*(t-a)*(t-b)*(t-c));
if(a==b&&b==c)
{printf("这是等边三角形,面积为%f\n",s);}
else if((a==b)&&(b!=c)||(b==c)&&(a!=c)||(a==c)&& (a!=b))
{printf("这是等腰三角形,面积为%f\n",s);}
else printf("这是一般三角形,面积为%f\n",s);
}
else
printf("不能构成三角形");
}
7.编写程序计算个人所得税。
个人所得税的计算方法:(实发工资-3500)*税率-扣除数,
#include<stdio.h>
void main()
{
float a; //实发工资
float b; //应纳税部分工资
float s; //税率
float kouchu;//扣除数
float ptax; //个人所得税
printf("输入工资:");
scanf("%f",&a);
b=a-3500;
if(b>0&&b<=1500)
{s=0.03;kouchu=0;}
else if(b<=4500)
{s=0.1;kouchu=105;}
else if(b<=9000)
{s=0.2;kouchu=555;}
else if(b<=35000)
{s=0.25;kouchu=1005;}
else if(b<=55000)
{s=0.3;kouchu=2755;}
else if(b<=80000)
{s=0.35;kouchu=5505;}
else
{s=0.45;kouchu=13505;}
ptax=b*s-kouchu;
printf("个人所得税为%f\n",ptax);
}
10.编写程序对数据进行加密。
设加密方法为:对任意给定的4位整数,每一位数字均加2,若某位数字加2后大于9,则取其除以10的余数,如数据6987加密后的数据为8109。
#include<stdio.h>
void main()
{
int a,b,c,d,m;
scanf("%d",&m);
a=m%10+2;if(a>=10) a=a%10;
b=m/10%10+2;if(b>=10) b=b%10;
c=m/100%10+2;if(c>=10) c=c%10;
d=m/1000+2;if(d>=10) d=d%10;
m=a+b*10+c*100+d*1000;
printf("%d\n",m);
}
练习题5参考答案
一、选择题
二、填空题
1.以下程序的输出结果是 52 。
2.以下程序的输出结果是 17 。
3.有以下程序:
程序运行时,如果从键盘输入:Y? N?<回车>,则输出结果为 X 。
4.下面程序的运行结果 s=254 。
5.下面程序段中循环体的执行次数是 3 。
6.下面程序段的运行结果是 ** 。
7.下面程序的运行结果是 1, -2 。
8.下面程序段的运行结果是 8 。
9.下面程序的功能是:计算1~10之间的奇数之和与偶数之和,试完善程序。
10.下面程序的功能是:输出100以内能被3整除且个位数为6的所有整数,请填空。
三、程序设计题
1.编写程序计算1+3+5+7+…+97+99的值。
#include<stdio.h>
void main()
{
int i,sum;
sum=0;
for(i=1;i<=99;i+=2)
{
sum=sum+i;
}
printf("%d\n",sum);
}
2.编写程序从键盘输入正整数n,求n!。
#include<stdio.h>
void main()
{
int i,n,fact=1;
scanf ("%d",&n);
for(i=1;i<=n;i++)
{
fact*=i;
}
printf("n=%d,n!=%d\n",n,fact);
}
3.编写程序求一个十进制整数的位数。
#include<stdio.h>
void main()
{
int n,m;
scanf("%d",&n);
if(n<0)
printf("请输入正整数!谢谢合作!\n");
if(n<=9&&n>=0)
m=1;
else
{
m=0;
while(n>=1)
{
n=n/10;
++m;
}
}
printf("%d\n",m);
}
4.编写程序输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
#include<stdio.h>
int main(void)
{
//输入一行字符,分别统计出其中英文字母、空格、数字和其他字符的个数。
char ch;
int char_num=0,kongge_num=0,int_num=0,other_num=0;
while((ch=getchar())!='\n')//回车键结束输入,并且回车符不计入
{
if(ch>='a'&&ch<='z'||ch<='z'&&ch>='a')
char_num++;
else if(ch==' ')
kongge_num++;
else if(ch>='0'&&ch<='9')
int_num++;
else
other_num++;
}
printf("字母= %d,空格= %d,数字= %d,其它= %d\n",char_num,kongge_num,int_num,other_num);
return 0;
}
5.编写程序判断一个3位数是否为回文数。
所谓回文数是指从左向右读或从右向左读都是相同的数,也就左右对称的数,如:232、3553、123321等。
(此处用函数实现)#include<stdio.h>
#include<string.h>
int huiwen(int n) //此处仅判断三位数的回文数
{
int a,c;
a=n/100; //百位
c=n%10; //个位
if(a==c)
return 1;
else
return 0;
}
void main()
{
int huiwen(int n);
int x;
printf("请输入一个3位正整数:");
scanf("%d",&x);
if(huiwen(x))
printf("%d是回文数\n",x);
else
printf("%d不是回文数\n",x);
}
6.编写程序用两种方法(一种方法是使用三重循环形成100~999之间的所有数,另一种方法是使用单重循环直接形成100~999之间的所有数)求100~999之间的所有“水仙花数”。
所谓“水仙花数”是指一个三位数,其各位数字的立方和等于该数本身。
例如:153是一个
水仙花数,因为153=13+53+33。
方法一:三重循环
#include<stdio.h>
int main()
{int i,j,k,n;
printf("parcissus numbers are:");
for(i=1;i<=9;i++)
for(j=0;j<=9;j++)
for(k=0;k<=9;k++)
{
n=i*100+j*10+k;
i f(n==i*i*i+j*j*j+k*k*k)
printf("%5d",n);
}
printf("\n");
return 0;
}
方法二:单重循环
#include<stdio.h>
int main()
{int i,j,k,n;
printf("parcissus numbers are:");
for(n=100;n<1000;n++)
{
i=n/100;
j=n/10-i*10;
k=n%10;
i f(n==i*i*i+j*j*j+k*k*k)
printf("%5d",n);
}
printf("\n");
return 0;
}
7.编写程序找出1000之内的所有“完美数(完全数、完备数)”。
“完美数”也称为“完数”,它是指一个数恰好等于它的因子之和。
例如,6的因子为1、2、3,而6=1+2+3,因此6是“完数”。
#include<stdio.h>
void main()
{
int m,s,i;
for(m=2;m<1000;m++)
{
s=0;
for(i=1;i<m;i++)
if((m%i)==0)s=s+i;
if(s==m)
{
printf("%d,its factors are 1 ",m);
for(i=2;i<m;i++)
if(m%i==0) printf("+%3d",i);
printf("\n");
}
}
}
14.编写程序验证哥德巴赫猜想(任何一个大于等于6的偶数都可以分解为两个素数之和),验证范围限定为6到2000。
#include <stdio.h>
int main()
{
int i,x,k;
int prime(int n);
printf("请输入一个6到2000的偶数:");
scanf("%d",&x);
for (i=2;i<=(int)(x/2);i++)
{
k=x-i;
if (prime(i)&&prime(k))
{
printf("%d + %d = %d\n",i,k,x);
break; //验证成立就退出
}
}
return 0;
}
int prime(int n)
{
int i;
for(i=2;i<=n/2;i++)
{
if (n%i==0) return 0;
}
return 1;
}
练习题6 参考答案
一、选择题
二、填空题
1.下面程序的运行结果是
1 1
2 3
5 8 13 21
34 55
2.以下程序的输出结果是 abc 。
3.若有定义:int a[3][4]={{1, 2}, {0}, {4, 6, 8, 10}}; ,则初始化后,a[1][2]得到的初值是 0 ,a[2][1]得到的i初值是 6 。
4.以下程序可求出所有水仙花数(水仙花数是指一个3位正整数,其各位数字的立方之和等于该正整数。
如:407=4*4*4+0*0*0+7*7*7,故407是一个水仙花数)。
请填空。
#include <stdio.h>
void main()
{ int x,y,z,a[8],m,i=0;
printf("The special numbers are:\n");
for(m=100;m<1000; m++)
{ x=m/100;
y= (m/10)%10 ;
z=m%10;
if(x*100+y*10+z==x*x*x+y*y*y+z*z*z)
{ a[i]=m ; i++;}
}
for(x=0; x<i; x++)
printf("%6d",a[x]);
}
5.下面程序的功能是:将字符数组a中下标值为偶数的元素从小到大排列,其他元素不变,请填空。
#include <stdio.h>
#include <string.h>
void main()
{ char a[]="c language", t;
int i,j,k;
k=strlen(a);
for(i=0;i<=k-2;i+=2)
for(j=i+2;j<k; j+=2; )
if( a[i]>a[j] )
{ t=a[i]; a[i]=a[j]; a[j]=t; }
puts(a);
printf("\n");
}
8.以下程序是求矩阵a,b的和,结果存入矩阵C中,并按矩阵形式输出。
请填空。
#include <stdio.h>
void main()
{ int a[3][4]={{3,-2,7,5},{1,0,4,-3},{6,8,0,2}};
int b[3][4]={{-2,0,1,4},{5,-1,7,6},{6,8,0,2}};
int i,j,c[3][4];
for(i=0;i<3;i++)
for(j=0;j<4;j++)
c[i][j]= a[i][j]+b[i][j] ;
for(i=0;i<3;i++)
{ for(j=0;j<4;j++)
printf("%3d",c[i][j]);
printf("\n") ;
}
}
三、程序设计题
1.从键盘输入某个班级的30名学生信息(设只含有学号),编写程序用折半查找法通过输入一个学生的学号查找某一学生(注意:查找前要先进行排序)。
#include<stdio.h>
#define N 30
void main()
{
i nt a[N];
i nt i,j,t,x,mid,low=0,high=N-1;
p rintf("请输入%d名学生的学号:\n",N);
f or(i=0;i<N;i++)
scanf("%d",&a[i]);
f or(j=0;j<N-1;j++)
for(i=0;i<N-j-1;i++)
if(a[i]>a[i+1])
{t=a[i];a[i]=a[i+1];a[i+1]=t;}
p rintf("请输入需要查找的学生的学号:\n");
s canf("%d",&x);
d o
{
mid=(low+high)/2;
if(a[mid]==x)break;
else if(a[mid]>x)
high=mid-1;
else
low=mid+1;
}while(low<=high);
i f(low<=high)
printf("这个学生学号为%d\n",x);
e lse
printf("查找不到\n");
}
2.设有某班级35名学生的一门课程考试成绩,编写程序求超过平均的学生(包括学号和成绩),并将所有学生按成绩降序排列输出。
#include <stdio.h>
#define NUM 35
void main( )
{ int a[NUM][2];
float sum=0,ave;
int i,j,t;
printf("请输入%d位同学的学号和成绩:\n",NUM);
for(i=0;i<NUM;i++)
scanf("%d%d",&a[i][0],&a[i][1]);
for(i=0;i<NUM;i++)
sum=sum+a[i][1];
ave=sum/NUM;
for(i=0;i<NUM;i++)
if(a[i][1]>ave)
printf("超过平均分的学生学号为:%d,成绩为:%d\n",a[i][0],a[i][1]);
for(j=0;j<NUM-1;j++)
for(i=0;i<NUM-j-1;i++)
if(a[i][1]<a[i+1][1])
{t=a[i][0];a[i][0]=a[i+1][0];a[i+1][0]=t;
t=a[i][1];a[i][1]=a[i+1][1];a[i+1][1]=t;
}
p rintf("所有学生成绩(降序排列):\n");
for(i=0;i<NUM;i++)
printf("学号为:%d,成绩为:%d\n",a[i][0],a[i][1]);
}
4.输入一行字符串,编写程序分别统计各个英文字母出现的次数(不区分字母大小写)。
#include <stdio.h>
int main()
{
int let[26] = {0};
int i;
char ch;
while((ch=getchar())!='\n')
{
if (ch>='A' && ch<='Z')
let[ch-'A']++;
else if (ch >='a' && ch <='z')
let[ch-'a']++;
}
for (i=0;i<26;i++)
printf("%c: %d\n", i+'a', let[i]);
return 0;
}
5.编写程序输出以下杨辉三角形(要求打印出10行)。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
……
#include<stdio.h>
#define N 10
void main()
{
int i,j,k;
int a[N][N];
for(i=0;i<N;i++)
{
a[i][0]=1;
a[i][i]=1;
}
for(i=2;i<N;i++)
for(j=1;j<i;j++)
a[i][j]=a[i-1][j-1]+a[i-1][j];
for(i=0;i<N;i++)
{
for(j=0;j<=i;j++)
printf("%4d ",a[i][j]) ;
printf("\n");
}
}
6.编写程序输入并求一个4×4矩阵的两条对角线元素之和、四周靠边元素之和。
#include <stdio.h>
#define N 4
void main()
{
int a[N][N];
int i,j;
int sum1=0; //对角线元素之和
int sum2=0; //四周靠边元素之和
printf("请输入%d*%d矩阵:\n",N,N);
for(i=0;i<N;i++)
for(j=0;j<N;j++)
scanf("%d",&a[i][j]);
printf("产生的矩阵如下:\n");
for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
printf("%4d",a[i][j]);
printf("\n");
}
//计算对角线元素之和
for(i=0;i<N;i++)
for(j=0;j<N;j++)
if(i==j||i+j==N-1)
sum1+=a[i][j];
printf("两条对角线上的元素之和为:%5d\n",sum1);
for(i=0;i<N;i++)
for(j=0;j<N;j++)
if(i==0||i==N-1||j==0||j==N-1)
sum2+=a[i][j];
printf("四周靠边的元素之和为:%5d\n",sum2);
}
练习题7参考答案
二、填空题
1.下列程序的输出结果是 5 6 。
2.下面程序的运行结果是 10 。
3.下面程序的运行结果是 A+B=9 。
4.以下程序的输出结果是 246 。
三、程序设计题
1.编写程序在主函数中键盘输入两个整数,通过调用两个函数分别求出两个整数的最大公约数和最小公倍数,并输出结果。
#include<stdio.h>
int gcd(int m,int n) //最大公约数函数定义
{
int r;
r=m%n;
while(r!=0) //先判断后执行,有可能一次也不执行循环体。
{
m=n;
n=r;
r=m%n;
}
return n;
}
//最小公倍数函数定义
int lcm(int m,int n) //最大公约数在前面已定义,调用前可不作函数声明
{
return m*n/gcd(m,n);
}
int main()
{
int a,b;
int gcd(int m,int n); //函数声明
int lcm(int m,int n); //函数声明
printf("输入两个数:");
scanf("%d%d",&a,&b);
printf("最大公约数:%d\n",gcd(a,b));
printf("最小公倍数:%d\n",lcm(a,b));
return 0;
}
2.编写程序在主函数输入一个整数,通过调用一个判素数的函数求素数,并输出是否是素数的信息。
#include <stdio.h>
int prime(int x); //在函数外部声明,作用域为整个文件
int main()
{
int m;
while(1) //可实现多次判断
{
printf("请输入数字(输入0退出):");
scanf("%d",&m);
if (m == 0) return 0;
if (prime(m))
printf("%d是素数!",m);
else
printf("%d不是素数!",m);
}
return 0;
}
int prime(int x) //不同方法,同一算法思想 {
int n,flag=1; for(n=2;n<x;n++) if(x%n==0) {
flag=0; break; }
return flag; }
3.编写程序在主函数中输入一个给定的3×3的二维整型数组,通过调用一个用函数将这个二维整型数组进行转置,最后输出转置后的二维数组。
#include <stdio.h> //用二个不同数组存放 int b[3][3]; void main() {
void convert(int a[3][3]); int i,j,a[3][3]; for(i=0;i<3;i++)
for(j=0;j<3;j++)
scanf("%d",&a[i][j]);
convert(a);
for(i=0;i<3;i++) {
for(j=0;j<3;j++)
printf("%d ",b[i][j]); printf("\n"); }
getchar(); }
void convert(int a[3][3]) { int i,j,t;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
b[j][i]=a[i][j];
}
10.编写程序用函数递归的方法求n 阶勒让德多项式的值,递归公式为:
⎪⎩
⎪
⎨⎧≥---⋅-===--1
n /))(*)1()()12((1n 0n 1)(21n x p n x p x n x x p n n n
#include <stdio.h>
#include <stdlib.h>
float p(int n,float x)
{
if (n==0)
return 1;
else if (n==1)
return x;
else
return ((2 * n - 1) * x - p(n - 1 , x) - (n - 1) * p(n - 2, x)) / n;
}
int main()
{
int n,x;
float result;
printf("please input n,x:");
scanf("%d,%d",&n,&x);
result = p(n,x);
printf("the result is : %f\n",result);
return 0;
}
练习题8参考答案
一、选择题
二、填空题
1. C 提供的预处理功能主要有__条件编译___、_宏定义____、__文件包含_等三种。
2. C 规定预处理命令必须以# 开头;定义宏的关键字是_define______。
3.在预编译时将宏名替换成___字符串_______的过程称为宏展开。
4. 预处理命令不是 C 语句,不必在行末加____分号_____。
5. 以头文件 stdio.h 为例,文件包含的两种格式为:______#include<stdio.h>_____,_______#include “stdio.h”____。
6.下面程序的运行结果为 12 。
7.以下程序的输出结果是 28 。
8.以下程序输出的结果是 c=0 。
三、程序设计题
1. 定义一个带参的宏,求两个整数的余数。
通过宏调用,输出求得的结果。
#include <stdio.h>
#define R(m,n) (m)%(n)
void main()
{ int m,n;
printf("enter two integers:\n");
scanf("%d%d",&m,&n);
printf("remainder=%d\n",R(m,n));
}
练习题9参考答案
一、选择题
二、填空题
1. 下列程序的输出结果是 7 1 。
2. 一个专门用来存放另一个变量地址的变量称为指针。
3. 下列程序执行后的输出结果是 6 。
4.有以下程序,执行后输出的结果是 x=8,y=4 。
三、程序设计题(要求用指针方法完成)
1.输入10个整数,按由小到大顺序排序。
#include<stdio.h>
void main()
{
int i,m,a[10],*p=a,k,j,t;
printf( "输入10 个数:");
for(i=0;i<=9;i++)
scanf("%d",p+i);
for(i=0;i<9;i++)
{
k=i;
for(j=i+1;j<=9;j++)
if(*(p+k)>*(p+j))
k=j;
{t=*(p+k);*(p+k)=*(p+i);*(p+i)=t;}
}
for(i=0;i<=9;i++)
printf("%5d",*(p+i));
printf("\n");
}
2.从键盘上输入n个整数存放到一维数组中,用函数实现将n个整数按输入时的顺序逆序排列,函数中对数据的处理要用指针方法实现。
#include "stdio.h"
int main()
{
int n,*a,i,temp;
printf("请输入数组元素个数:");
scanf("%d",&n);
a=malloc(n*sizeof(int));
printf("请输入%d个整数,以空格隔开:",n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<n/2;i++)
{
temp=a[i];
a[i]=a[n-1-i];
a[n-1-i]=temp;
}
printf("\n反序输出为:");
for(i=0;i<n;i++)
printf("%5d",*a++);
}
3.从键盘上输入10个整数存放到一维数组中,将其中最小的数与第一个数对换,最大的数与最后一个数对换。
要求进行数据交换的处理过程编写成一个函数,函数中对数据的处理要用指针方法实现。
#include <stdio.h>
void swap(int *p1,int *p2);//交换两个数据元素
void fun(int *p);//找最大小数并交换
int main()
{
int a[10],i;
printf("Input 10 datas:\n");
for(i=0;i<10;i++) //输入数组元素
scanf("%d",&a[i]);
fun(a); //处理数据
printf("交换后的10 datas:\n");
for(i=0;i<10;i++) //输出交换后的数组元素
printf("%d ",a[i]);
}
void swap(int *p1,int *p2)
{ int t;
t=*p1;
*p1=*p2;
*p2=t;
}
void fun(int *pa)
{ int max,min,i,maxp,minp;
max=*pa;maxp=0;
min=*pa;minp=0;
for(i=1;i<10;i++)
{
if(max<pa[i])
{max=pa[i]; maxp=i; }
if(min>pa[i])
{min=pa[i]; minp=i; }
}
swap(&pa[0],&pa[minp]);
swap(&pa[9],&pa[maxp]);
}
4.从键盘上输入10个数据到一维数组中,然后找出数组中的最大值和该值所在的元素下标。
要求调用子函数search(int *pa,int n,int *pmax,int *pflag)完成,数组名作为实参,指针作为形参,最大值和下标在形参中以指针的形式返回。
#include <stdio.h>
int search(int *pa,int n,int *pmax,int *pflag);
int main()
{
int a[10],i,max,flag,pmax;
printf("Input 10 numbers:");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
pmax=search(a,10,&max,&flag);
printf("Max is:%d\n",max);
printf("Max position is:%d\n",flag);
}
int search(int *pa,int n,int *pmax,int *pflag)
{
int i,*max;
max=pmax;
*pmax=pa[0];
for(i=1;i<n;i++)
{
if(*pmax<pa[i])
{
*pmax=pa[i];
*pflag=i;
}
}
return *max;
}
练习题10参考答案
一、选择题
二、填空题
1.设有以下结构类型说明和变量定义,则变量a在内存所占字节数是 22 。
2.表达式 ++p->n 的值是6。
3.以下程序用来输出结构体变量ex所占存储单元的字节数,请填空。
printf("ex size:%d\n",sizeof( ex ));
4.下面程序的运行结果是 2,3 。
5.表达式pn->b/n.a*++pn->b的值是 12 ,表达式(*pn).a+pn->f的值是 6.000000 。
6.下面程序的运行结果是 5,3 。
练习题11参考答案
二、填空题
1.以下程序中用户由键盘输入一个文件名,然后输入一串字符(用“#”结束输入)存放到此文件中形成文本文件,并将字符的个数写到文件尾部,请填空。
(1) fname (2) fp
2.下面程序把从终端读入的l0个整数以二进制数方式写到一个名为bi.dat的新文件中,请填空。
(1) "bi.dat" (2) fp
3.以下程序由终端输入一个文件名,然后把从终端键盘输入的字符依次存放到该文件中,用“#”作为结束输入的标志,请填空。
(1) fopen(fname, "w") (2) ch
4.若执行fopen()函数时发生错误,则函数的返回值是 NULL 。
5.在C语言中,数据可以用二进制和 ASCII 两种代码形式存放。
6.feof(fp)函数用来判断文件是否结束,如果遇到文件结束,函数值为非零值或1 ,否则为 0 。
三、程序设计题
1.设计一个程序统计一个文本文件中字母、数字及其他字符各有多少个。
#include<stdio.h>
#include <stdlib.h>
void main()
{
char ch;
int num1=0,num2=0,num3=0;
FILE *fp;
int i;
if((fp=fopen("d:\\home.txt","r"))==NULL) /* 打开一个文件*/
{
printf("can not open file, enter any key exit!\n");
getch();
exit(1);
}
while ((ch=fgetc(fp))!=EOF)
{
if(ch>='a'&&ch<='z')
num1++;
else if(ch>='A'&&ch<='Z')
num1++;
else if(ch>='0'&&ch<='9') num2++;
else
num3++;
}
printf("字母:%d\n",num1); printf("数字:%d\n",num2); printf("其它:%d\n",num3); fclose(fp);
}。