c语言习题答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
习题三 顺序程序设计
一、 编程题
1. 编写程序,从键盘输入一个以秒为单位的时间数,将其换算成几小时几分几秒,然后进
行输出。例如输入的时间为4258秒,则输出结果为:1小时10分58秒。
答:程序参见文件Cprogram\xt3_3_01.c
#include "stdio.h"
main()
{int x,h,m,s;
scanf("%d",&x);
h=x/3600; m=x%3600/60; s=x%60;
printf("%ds=%d:%d:%d!\n",x,h,m,s);
}
2. 编写程序,读入三个整数给变量a、b、c,然后交换它们中的数,把a中原来的值给b,
把b中原来的值给c,把c中原来的值给a。
答:程序参见文件Cprogram\xt3_3_02.c
#include "stdio.h"
main()
{int a,b,c,t;
printf("input a b c:");
scanf("%d%d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d\n",a,b,c);
t=a;a=c;c=b;b=t;
printf("a=%d,b=%d,c=%d\n",a,b,c);
}
习题四 选择结构程序设计
一、 编程题
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;
答:
#include "stdio.h"
main()
{int a,m;
scanf("%d",&a);
switch(a/10)
{case 0:case 1:case 2:case 3:
case 4:case 5:m=1;break;
case 6:m=2;break;
case 7:m=3;break;
case 8:m=4;break;
default:m=5;break;
}
printf("m=%d\n",m);
}
//////////////////////////////////////////////////////////
#include "stdio.h"
main()
{int a,m;
scanf("%d",&a);
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("m=%d\n",m);
}
3. 编写程序,从键盘输入一个字符,判别它是否是小写字母,如果是,将它转换为大写字母;如果不是,不转换。然后输出最后得到的字符。
答:
#include "stdio.h"
main()
{char ch;
scanf("%c",&ch);
if(ch>='a' && ch<='z')
ch=ch-32;
printf("%c\n",ch);
}
5. 当一个人的月收入在2000元以下时免税;月收入在2000元到5000元之间时,超过2000的部分纳税8%;月收入在5000元以上时,2000至5000之间的部分纳税8%,超过5000的部分纳税15%。编写程序从键盘输入月收入income,计算并输出应交税款tax。
答:
#include "stdio.h"
main()
{int income;
float tax;
scanf("%d",&income);
if(income<=2000)
tax=0;
else if(income<=5000)
tax=0.08*(income-2000);
else
tax=0.08*(5000-2000)+0.15*(income-5000);
printf("tax=%f\n",tax);
}
习题五 循环结构程序设计
一、 编程题
1. 编写程序,打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字的立方之和等于该数本身。例如,407是一个“水仙花数”,因为:407=43+03+73。(注:若将题意改为打印出最大的或最小的“水仙花数”,则应将循环语句作如何调整?)。
答:
#include "stdio.h"
main()
{int a,b,c,k;
for(k=100;k<=999;k++)
//求最大的“水仙花数”改用:for(k=999;k>=100;k--)
{a=k/100;b=k/10%10;c=k%10;
if(k==a*a*a+b*b*b+c*c*c)
{ printf("%5d",k);
//求最大或最小“水仙花数”时增加一个语句:break;
}
}
printf("\n");
}
4. 编写程序,计算并输出下列级数的前n项之和Sn。n的值从键盘输入。
答:
#include "stdio.h"
main()
{int fz,fm,n,i;
float s,t;
fz=2;fm=1;s=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{t=(1.0*fz)/fm;
s=s+t;
fz=fz+fm; fm=fz-fm;
}
printf("s=%f\n",s);
}
5.编写程序,求e的值e=1+1/1!+1/2!+1/3!+1/4!+…+1/n!
答:
#include "stdio.h"
void main()
{int n,i;
float t,fm=1,e=1;
scanf("%d",&n);
for(i=1;i<=n;i++)
{fm=fm*i; t=1.0/fm; e=e+t; }
printf("n=%d,e=%f\n",n,e);
}
6. 已知某球从80米高度自由落下,落地后反复弹起,每次弹起的高度都是上次高度的一半。求此球8次落地所经过的总路程。
答:
#include "stdio.h"
void main()
{int n;
float s=80,h=s/2;
for(n=2;n<=8;n++)
{s=s+2*h;
h=h/2;
}
printf("s=%f\n",s);
}
11. 编写程序,求3到100之间的所有素数之和。
答:
#include "stdio.h"
main()
{int s,i,k,flag;
s=0;
for(i=3;i<=100;i++)
{flag=1;
for(k=2;kif(i%k==0)
{flag=0;break;}
if(flag)
{s=s+i;printf("%4d",i);}
}
printf("\nsum=%d\n",s);
}
习题六 数组
一、 编程题
1. 定义一个有20个元素的整型数组,分别求出下标为奇数和偶数的元素的平均值。
答:
#include "stdio.h"
#include "math.h"
main()
{int i,s0=0,s1=0,a[20];
for(i=0;i<20;i++)
a[i]=rand()%100;
for(i=0;i<20;i+=2)
{printf("%3d",a[i]);
s0=s0+a[i];
}
printf(" sum is:%d ave=%f\n",s0,s0/10.0);
for(i=1;i<20;i+=2)
{printf("%3d",a[i]);
s1=s1+a[i];
}
printf(" sum is:%d ave=%f\n",s1,s1/10.0);
}
2. 设有一个整型数组,另输入一个整数,编程查找这个整数是否在数组中出现过,若出现,则输出第一次出现的位置,否则,输出no found。
答:
#include "stdio.h"
#include "math.h"
main()
{int i,s,a[20];
for(i=0;i<20;i++)
a[i]=rand()%100;
scanf("%d",&s);
for(i=0;i<20;i++)
if(a[i]==s)
{printf("found:a[%d]=%d\n",i,a[i]);
break;
}
if(i==20)
printf("no found\n");
for(i=0;i<20;i++)
printf("%3d",a[i]);
printf("\n");
}
7. 编程将一个字符数组中的字母,按由大到小的顺序进行排序。
答:
#include "stdio.h"
#include "string.h"
main()
{char t,s[]="ABCDIVBHFBVCNLKFDB";
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);
}
10. 有n个无序的数放在数组a中,请将相同的那些数删得只剩得一个,输出经过删除后的数据。
答
:
#include "stdio.h"
main()
{int i,j,k,a[10]={90,20,40,30,50,50,50,50,20,80};
for(i=0;i<10;i++)
printf("%4d",a[i]);
printf("\n");
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("%4d",a[i]);
a[k++]=a[i]; } //不相同的有效元素只有K个了
printf("\n");
}
习题七 函数
一、 编程题
1. 编一函数,判断某年是否为闰年,若是返回1,否则返回0。
答:
#include
fun(int m)
{ return (m%4==0)&&(m%100!=0)||(m%400==0);}
main()
{ int n;
for (n=1987;n<2009;n++)
if(fun(n))
printf("year:%d is a leap! \n",n);
}
2. 编写计算三角形面积的程序,将计算面积定义成函数。三角形面积公式为:
A= 式中s=(a+b+c)/2
其中A为三角形面积,a、b、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("%f%f%f",&a,&b,&c);
printf("area is:%f\n",fun(a,b,c));
}
3. 编写两个函数,分别求出两个整数的最大公约数和最小公倍数,用主函数调用这两
个函数,并输出结果,两个整数由键盘输入。
答:
#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)
{ return m*n/fmax(m,n);}
main()
{ int a,b;
scanf("%d%d",&a,&b);
printf("fmax is:%d\n",fmax(a,b));
printf("fmin is:%d\n",fmin(a,b));
}
4. 编写函数,根据整型形参m的值,计算公式
t=1- - -…- 的值。例如,若m=5,则应输出0.536389。
答:
#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("t(5)=%f\n",fun(5));
}
6. 编写函数,利用公式:
计算π的近似值,当某一项的值小于10-5时,认为达到精度要求。
答:
#include
double fun()
{int n; double pi=1,t=1;
n=1;
do
{t=t*n/(2*n+1);
pi=pi+t;
n++;
}while(t>1e-5);
return 2*pi;
}
main()
{ printf("pi=%f\n",fun());}
17. 采用递归的方法计算x的n次方。
答:
#include "stdio.h"
#include "math.h"
float p(float x,int n)
{float f;
if(n==0)
f=1;
else
f=p(x,n-1)*x;
return f;
}
main()
{
printf("p(2,8)=%f",p(2,8));
}
习题十 指针
三.编程题
1. 编写函数,对传递进来的两个整型量计算它们的和与积之后,通过参数返回。
#include
void compute(int m, int n, int *sum, int *p);
void compute(int m, int n, int *sum, int *p)
{ *sum=m+n;
*p=m*n;
}
void main()
{ int x,y,sum,product;
printf("enter 2 integers:\n");
scanf("%d%d",&x
,&y);
compute(x,y,&sum,&product);
printf("x=%d y=%d sum=%d product=%d\n",x,y,sum,product);
}
3. 编写函数实现,计算字符串的串长。
#include
#include
int StringLength(char *s);
int StringLength(char *s)
{ int k;
for(k=0;*s++;k++);
return k;
}
void main()
{ char string[81];
printf("enter a string:\n");
gets(string);
printf("length of the string=%d\n",StringLength(string));
}
8. 由一个整型二维数组,大小为m×n,要求找出其中最大值所在的行和列,以及该最大值。请编一个函数max,数组元素在main函数中输入,结果在函数max中输出。
见导学 例10.26
习题十一 结构体、共用体和用户定义类型
三、编程题
1.编写程序,进行两个复数的相减。
#include
struct Complex{
double m_r,m_i;
};
struct Complex sub(struct Complex c1,struct Complex c2)
{ struct Complex c;
c.m_r=c1.m_r-c2.m_r;
c.m_i=c1.m_i-c2.m_i;
return c;
}
void main()
{ struct Complex c1 ={1.2,2.3},c2={0.2,0.3};
struct Complex c;
c=sub(c1,c2);
printf(“c=%g+i%g\n”,c.m_r,c.m_i);
}
2.定义一个包括年、月、日的结构体。输入一个日期,计算该日在本年中是第几天?注意闰年问题。
#include
struct ymd
{
int day;
int month;
int year;
};
int dayof[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int days(struct ymd *p)
{
int i,d;
if(p->year%4==0&&p->year%100!=0||p->year%400==0)
dayof[2]=29;
d=p->day;
for(i=1;i
d=d+dayof[i];
return (d);
}
void main()
{
struct ymd date;
int d;
for (;;)
{
printf("date(yyyy/mm/dd)=? (yyyy=0--Exit)\n\n");
scanf("%d/%d/%d",&date.year,&date.month,&date.day);
if(date.year==0)
break;
d=days(&date);
printf("\nThe day of the year is %d !\n\n",d);
}
}
3.有10个学生,每个学生的数据包括学号、姓名、3门课程的成绩。从键盘输入10个学生的数据,要求输出3门课程的总平均成绩,以及最高分的学生的学号、姓名、3门课程成绩、平均分数。
#include
#define N 10
struct student
{ char num[6];
char name[8];
float score[3];
float avr;
}stu[N];
void main()
{ int i,j,maxi;
float sum,max,average;
for(i=0;i
printf("No.:");
scanf("%s",stu[i].num);
printf("name:");
scanf("%s",stu[i].name);
for(j=0;j<3;j++)
{
printf("score %d:",j+1);
scanf("%f",&stu[i].score[j]);
}
}
average=0;
max=0;
maxi=0;
for(i=0;i
for(j=0;j<3;j++)
sum+=stu[i].score[j];
stu[i].avr=sum/3.0;
average+=stu[i].avr;
if(sum>max)
{ max=sum;
maxi=i;
}
}
average/=N;
printf(" No. name scorel score2 score3 average\n");
for(i=0;i
printf("%5s%10s",st
u[i].num,stu[i].name);
for(j=0;j<3;j++)
printf("%9.2f",stu[i].score[j]);
printf(" %8.2f\n",stu[i].avr);
}
printf("average=%5.2f\n",average);
printf("The highest score is : student %s,%s.\n",stu[maxi].num,stu[maxi].name);
printf("His scores are: %6.2f,%6.2f,%6.2f,average:%5.2.\n",stu[maxi].score[0],
stu[maxi].score[1],stu[maxi].score[2],stu[maxi].avr);
}