C语言程序设计(第4版)课后习题答案 ||| 苏小红,赵玲玲,孙志岗,王宇凝等|||高等教育出版社

自己整理复习使用,如有错误还请斧正

习题及答案目录

习题3

3.1—分析并写出下列程序的运行结果。

(1)

#include<stdio.h>
int main(void)
{
int a=12,b=3;
float x=18.5,y=4.6;
printf("%f\n",(float)(a*b)/2);
printf("%d\n",(int)x%(int)y);
}

18.000000
2

(2)

//(2)
#include<stdio.h>
int main(void)
{
int x=32,y=81,p,q;
p=x++;
q=--y;
printf("%d%d\n",p,q);
printf("%d%d\n",x,y);
}

3280
3380

3.2—参考例3.1程序,从键盘任意输入一个3位整数,编程计算机并输出它的逆序数(忽略整数前的正负号)。例如,输入-123,则忽略负号,由123分离出其中百位1、十位2、个位3,然后计算

3*100+2*10+1=321

,并输出321。

#include<stdio.h>
int main(void)
{
	int j,k;
	int a,b,c;
	printf("请输入一个3位整数 :");
	scanf("%d",&j);
	a=j/100;
	b=j/10%10;
	c=j%10;
	k=c*100+b*10+a;
	printf("%d",k);
}

3.3—设银行定期存款的年利率rate为2.25%,已知存款期为n年,存款本金为capital元,试编程以复利方式计算并输出n年的本利之和deposit。

#include<stdio.h>
#include<math.h>
int main(void)
{
	int i=0,n;
	float capital,deposit;
	float rate=0.0225;
	printf("请输入您的本金,存期年数:");
	scanf("%f,%d",&capital,&n);
	while (i<n)
    {
        deposit=(capital*(1+rate));
        i++;
    }
	printf("您的本利之和为%f\n",deposit);
}

3.4—编程计算并输出一元二次方程ax²+bx+c=0(a≠0)的两个实根,x=[-b±√(b²-4ac)]/2a,其中a,b,c的值由用户从键盘输出,假设a,b,c的值能保证方程有两个不相等的实根(即b²-4ac>0)。

#include<stdio.h>
#include<math.h>
int main(void)
{
	int a,b,c;
	int x1,x2,d;
	printf("请输入a,b,c的值:");
	scanf("%d,%d,%d",&a,&b,&c);
	d=b*b-4*a*c;
	if(b*b-4*a*c>0)
	{
		x1=(-b+sqrt(d))/(2*a);
		x2=(-b-sqrt(d))/(2*a);
		printf("方程两个根为x1=%d,x2=%d\n",x1,x2);
	}
	else
	printf("方程不是两个不相等的实数根或方程没有实数根");
}

3.5—参考例3.4和例3.5程序,分别使用宏定义和const常量定义π的值,编程计算并输出球的体积和表面积,球的半径r的值由用户从键盘输入。

#define PI 3.14159
#include <stdio.h>
int main(void)
{
    float r, v,s;
    printf("输入球的半径:");
    scanf("%f",&r);
    v = 4 * PI * r * r * r/3;
    s = 4 * PI * r * r;
    printf("球的体积为:%f\n球的面积为:%f\n",v,s);
    return 0;
}

#include <stdio.h>
int main(void)
{
	const double PI =3.14159;
    float r, v,s;
    printf("输入球的半径:");
    scanf("%f",&r);
    v = 4 / 3 * PI * r * r * r;
    s = 4 * PI * r * r;
    printf("球的体积为:%f\n球的面积为:%f\n",v,s);
    return 0;
}

习题4

4.1

(1)

aabbcc

(2)

a=12%,b=15%

(3)

12,56

4.4—参考4.2程序,编程从键盘输入一个小写字母,将其转换成大写字母后,将转换后的大写英文字母及其十进制deASCII码值显示到屏幕上。

#include<stdio.h>
int main(void)
{
	printf("请输入一个小写字母,我将输出他的大写字母和ASCII值:\n");
	char ch=getchar();
	ch=ch-32;
	printf("%c,%d",ch,ch);
}

习题4

5.1—从键盘任意输入一个实数,不使用计算绝对值函数编程计算并输出该实数的绝对值。

#include<stdio.h>
int main()
{
	float num;
	printf("Input a float number:");
	scanf_s("%f", &num);
	if (num >= 0)
	{
		printf("Absolute value of x is %.2f\n", num);
	}
	else
	{
		printf("Absolute value of x is %.2f\n", -num);
	}
	return 0;
}

5.2—从键盘任意输入一个整数,编程判断它的奇偶性。

#include<stdio.h>
int main()
{
    int a;
    printf("Input an integer number:");
    scanf("%d",&a);
    if(a%2==0)
    {
        printf("a is an even number\n");
    }
    else
        printf("a is an odd number\n");
        return 0;
}	  		   

5.3—在例3.8的基础上,从键盘任意输入三角形的三边长为a,b,c,编程判断a,b,c的值能否构成一个三角形,若能构成三角形,则计算并输出三角形的面积,否则输出“不能构成三角形”。已知构成三角形的条件是:任意两边之和大于第三边。

#include<stdio.h>
#include<math.h>
#define Eps 1e-6

int main(void)
{
    float a,b,c;
    scanf("%f,%f,%f",&a,&b,&c);
    if(((a+b-c)>=Eps) && ((b+c-a)>=Eps) && ((c+a-b)>=Eps))
    {
        float s = (a+b+c)/2;
        float area = sqrt(s * (s-a) * (s-b) * (s-c));
        printf("Area = %f\n",area);
    }
    else
    {
        printf("不能构成三角形\n");
    }
    return 0;
}

5.4—已知银行整存整取存款不同期限存款的年利率分别为:2.25% 期限一年;2.43% 期限二年;2.70% 期限三年;2.88% 期限五年;3.00% 期限八年;要求输入存钱的本金和期限,求到期时能从银行得到的利息与本金的合计。

#include<stdio.h>
int main(void)
{
    int year;
    double capital, rate, deposit;
    printf("Please enter year,capital:");
    scanf("%d,%lf", &year, &capital);
    if(year == 1)
        rate = 0.0225;
    else if(year == 2)
        rate = 0.0243;
    else if(year == 3)
        rate = 0.0270;
    else if(year == 5)
        rate = 0.0288;
    else if(year == 8)
        rate = 0.0300;
    else
	{
        printf("Error rate!\n");
        return 0;
	}
    deposit = capital*year*rate + capital;
    printf("rate = %lf, deposit = %lf\n", rate, deposit);
    return 0;
}

5.5—阅读下面程序,按要求在空白处填写适当的表达式或语句,使程序完整并符合题目要求。已知下面程序的功能是:从键盘任意输入一个年号,判断它是否是闰年。若是闰年输出“Yes”,否则输出“No”。已知符合下列条件之一者是闰年:

(1)能被4整除,但不能被100整除;(2)能被400整除

#include<stdio.h>
int main(void)
{
	int year,flag;
	printf("Enter year:");
	scanf("%d",&year);
	if((year%4==0 && year%100!=0) || (year%400 == 0)) //7行,且if后括号内为问题①
		flag = 1;
	else
		flag = 0;                                     //10行
	if(flag){                                         //if后括号内为问题②
		printf("%d is a leap year!\n",year);
	}
	else{
		printf("%d is not a leap year!\n",year);
	}
	return 0;
}

5.6—将5.5程序中的的第7~10行if语句改用条件表达式重新编写该程序。

#include<stdio.h>
int main(void)
{
	int year, flag;
	printf("输入年份:\n");
	scanf("%d", &year);
	flag = ((year % 4 == 0 && year % 100 != 0) || year % 400 )== 1 ? 1 : 0;	//运用条件表达式代替if语句

	if (flag == 1)
		printf("%d is a leap year!\n",year);
	else
		printf("%d is not a leap year!\n",year);
	return 0;
}

5.7—在例4.2和第4章实验程序的基础上,从键盘输入一个英文字母,如果它是大写英文字母,则将其转换为小写英文字母;如果它是小写英文字母,则将其转换为大写英文字母,然后将转换后的英文字母及其ASCII码值显示到屏幕上;如果不是英文字母,则不转换并直接将它及其ASCII码值输出到屏幕上。

#include<stdio.h>
int main(void)
{
    char c;
    scanf("%c",&c);
    if(c >= 'a' && c <= 'z')
	{
        c = c - 32;
        printf("%c,%d\n",c,c);
    }
    else if (c >= 'A' && c <= 'Z')
	{
        c = c + 32;
        printf("%c,%d\n",c,c);
    }
    else
	{
        printf("%c,%d\n",c,c);
    }
    return 0;
}


5.8—从键盘任意输入一个字符,编程判断该字符是数字字符、大写字符、小写字符、空格还是其他字符。

#include<stdio.h>
int main(void)
{
    char c;
    scanf("%c",&c);
    if(c >= 'a' && c <= 'z')
        printf("小写字符\n");
    else if (c >= 'A' && c <= 'Z')
        printf("大写字符\n");
    else if (c>='0' && c<='9')
        printf("数字字符\n");
    else if (c == ' ')
        printf("空格\n");
    else
        printf("其他字符\n");
    return 0;
}

5.9—参考例5.8程序的测试结果,改用if-else语句编程,根据输入的百分制成绩score,转换成相应的五分制成绩grade后输出。

#include<stdio.h>

int main()
{
    float score;
    char grade;
    scanf("%f",&score);
    if(score >= 90 && score <= 100)
        grade = 'A';
    else if(score >= 80)
        grade = 'B';
    else if (score >= 70)
        grade = 'C';
    else if (score >= 60)
        grade = 'D';
    else
        grade = 'F';
    printf("grade = %c\n",grade);
    return 0;
}

5.10—参考习题5.5中判断闰年的方法,编程从键盘输入某年某月(包括闰年),用switch语句编程输出该年的该月的天数。要求考虑闰年以及输入月份不在合法范围内的情况。已知闰年的2月有29天,平年的2月有28天。

#include<stdio.h>

int main()
{
    int month,year;
    scanf("%d%*c%d",&year,&month);
    int flag;
    if((year%4==0 && year%100 != 0) || (year%400 == 0))
		flag = 1;
	else
		flag = 0;
	switch(month)
	{
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:{
            printf("31天\n");
            break;
        }
        case 2:{
            if(flag){
                printf("29天\n");
            }
            else{
                printf("28天\n");
            }
            break;
        }
        case 4:
        case 6:
        case 9:
        case 11:{
            printf("30天\n");
            break;
        }
        default:{
            printf("错误月份\n");
            break;
        }

	}
	return 0;
}

5.11—身高预测。每个做父母的都关心自己孩子成人后的身高,根据有关生理卫生知识与数理统计分析表明,影响小孩成人后身高的因素包括遗传、饮食习惯与体育锻炼等。小孩成人后的身高与其父母的身高和自身的性别密切相关。

设faHeight为其父身高,moHeight为其母身高,身高预测公式为:
男性成人时身高=(faHeight+moHeight)*0.54cm
女性成人时身高=(faHeight * 0.923 + moHeight)/ 2cm
此外,若喜爱体育锻炼,则可增加身高2%;若有良好的卫生饮食习惯,则可增加身高1%。
编程从键盘输入用户的性别(用字符型变量sex存储,输入字符F表示女性,输入字符M表示男性)、父母身高(用实型变量存储,faHeight为其父身高,moHeight为其母身高)、是否喜爱体育锻炼(用字符型变量sports存储,输入字符Y表示喜爱,输入字符N表示不喜爱)、是否有良好的饮食习惯等条件(用字符型变量diet存储,输入字符Y表示喜爱,输入字符N表示不喜爱),利用给定公式和身高预测方法对小孩的身高进行预测。

#include<stdio.h>

int main(void)
{
	char sex;
	printf("Input your sex(F/M)\n");
	scanf("%c",&sex);
	getchar();

	float faHeight,moHeight;
	printf("Input the height of your father and mother\n");
	scanf("%f%*c%f",&faHeight,&moHeight);
	getchar();

	char sports;
	printf("Do you like sports(Y/N)\n");
	scanf("%c",&sports);
	getchar();

	char diet;
	printf("Do you have good diet(Y/N)\n");
	scanf("%c",&diet);
	printf("%f,%f,%c,%c,%c\n",faHeight,moHeight,sex,sports,diet);

	float height;
	if(sex == 'M')
		height = (faHeight + moHeight) * 0.54;
	if(sex == 'F')
		height = (faHeight * 0.923 + moHeight) / 2;
	if(sports == 'Y')
		height = (1 + 0.02) * height;

	if(diet == 'Y')
		height = (1 + 0.015) * height;

	printf("height = %f\n",height);
	return 0;
	
}

5.11—体型判断。医务工作者经广泛的调查和统计分析,根据身高与体重因素给出了以下按“体指数”进行体型判断的方法:

**体指数t = 体重w / (身高h)^2 **
当t<18时,为低体重;
当t介于18和25之间,为正常体重;
当t介于25和27之间,为超重体重;
当t≥27时,为肥胖。

分别使用 if 语句和 if-else 语句编程,从键盘输入体重 w 和身高 h,根据给定 的上述公式计算体指数t,然后判断你的体重属于何种类型。

//if
#include<stdio.h> 
int main(void) 
{ 
	double t,w,h;//定义 t,w,h 
	printf("input 体重(kg) 身高(m)\n");//请输入体重和身高 
	scanf("%lf%*c%lf",&w,&h);//输入 w,h 的值 
	t=w/(h*h);//求 t 
	printf("%f\n",t); 
	if(t<18) 
{ 
		printf("低体重"); 
}//如果 t 小于 18 则为低体重 
	if(18<=t&&t<25) 
{ 
		printf("正常体重"); 
}//如果 t 大于等于 18 小于 25 则为正常体重 
	if(25<=t&&t<27) 
{ 
		printf("超重体重"); 
}//如果 t 大于等于 25 小于 27 则为超重体重 
	if(t>=27) 
{ 
		printf("肥胖"); 
}//如果 t 大于等于 27 则为肥胖体重 
	return 0; 
} 

//if-else
#include<stdio.h> 
int main(void){ 
	double t,w,h;//定义 t,w,h 变量 
	printf("input 体重(kg) 身高(m)\n"); //请输入体重和身高 
	scanf("%lf%*c%lf",&w,&h);//输入体重和身高 
	t=w/(h*h);//用体重和身高计算 t 
	printf("%f\n",t);//输出 t 的值 
	if(t<18) 
{ 
		printf("低体重"); 
}//如果 t 小于 18 则输出低体重 
	else if(t<25) 
{ 
		printf("正常体重"); 
}//如果 t 小于 25 大于等于 18 则输出正常体重 
	else if(t<27) 
{ 
		printf("超重体重"); 
} //如果 t 小于 27 大于等于 25 则输出超重体重 
	else if(t>27) 
{ 
		printf("肥胖"); 
}//如果 t 大于等于 27 则输出肥胖 
	return 0;//结束指令 
} 

习题6

6.4—参考例6.4程序,编程计算并输出1到n之间的所有数的平方和立方。其中,n值由用户从键盘输入。

#include<stdio.h>
int main(void)
{
    int n,i;
    scanf("%d",&n);
    for(i = 1;i <= n;i++){
        printf("x^2 = %d\n",i*i);
        printf("x^3 = %d\n\n",i*i*i);
    }
    return 0;
}

6.5—某人在国外留学,不熟悉当地天气预报中的华氏温度值,请编程按每隔10°输出0°到300°之间的华氏温度到摄氏温度的对照表,以方便他对照查找。

已知华氏和摄氏温度的转换公式为:C = 5 / 9 *(F - 32),其中,C表示摄氏温度,F表示华氏温度。

#include<stdio.h>
int main(void)
{
    int i;
    for(i=0;i<=300;i+=10){
        printf("F:%d\t C:%f\n",i,5.0/9.0*(i-32));
    }
    return 0;
}

6.6—假设银行一年整存零取的月息为1.875%,现在某人手头有一笔钱,他打算在今后5年中,每年年底取出1000元作为孩子来年的教育金,到第5年孩子毕业时刚好取完这笔钱,请编程计算第一年年初时他应存入银行多少钱。注意:每年年底结算一次,扣除取出的钱,剩下的作为下一年存款本金。每年的利息按月计算,不是复利。

#include<stdio.h>
#define a 12*1.875/100//利息
int main(void)
{
	int i = 0;
	double x = 0;
	//从公式上看就是:(((x*(1*a)-1000)*(1+a)-1000)*(1+a)-1000)...=0
	while (i < 5)
	{
		x = (x + 1000) /(1+ a);//不要忘了1
		i++;
	}

	printf("第一年年初应该存%f元 \n",x);
	return 0;
}

6.7—假设今年的工业产值为100万元,产值增长率从键盘输入,请编程计算工业产值过多少年后可实现翻一番(即增加一倍)。

#include<stdio.h>
int main(void)
{
    int year=0,n=100;
    float incraese;
    scanf("%f",&incraese);
    while(n<200){
		n=n*(1+incraese);
        year++;
    }
    printf("增长率为%f的时候,需要%d年才可以翻一倍\n",incraese,year);
    return 0;
}

习题7

7.3—用函数编程计算两整数的最大值,在主函数中调用该函数计算并输出从键盘任意输入的两整数的最大值。

#include<stdio.h>
int maxi(int a,int b)
{
    if(a<b)
       return b;
    else
       return a;
}
int main(void)
{
    int a,b;
    scanf("%d%*c%d",&a,&b);
    printf("max=%d\n",maxi(a,b));
    return 0;
}

7.4–利用穷举法,用编程实现计算两个正整数的最小公倍数的函数。

#include<stdio.h>
int LCM(int x,int y)
{
    int big;
    if(x>y)
        big=x;
    else
        big=y;
    for(;;big++){
        if(big%x==0 && big%y==0){
            return big;
        }
    }
}
int main(void)
{
    int x,y;
    scanf("%d,%d",&x,&y);
    printf("LCM=%d\n",LCM(x,y));
    return 0;
}

7.5–利用求阶乘函数Fact(),编程计算并输出从1到n之间所有数的阶乘值。

#include<stdio.h>
int Fact(int n){
    int m=0;
    for (int i = 1; i <= n; i++)
        m+=i;
    return m;

}
int main(void){
    printf("请输入一个数,我将输出他的前n项和\n");
    int n;
    scanf("%d",&n);
    printf("前n项和为%d\n",Fact(n));
    
}

7.6–利用求阶乘函数Fact(),编程计算并输出1!+…+n!的值

#include<stdio.h>
int Fact(int n){
    int p=1;
   for (int i = 1; i <=n; i++)
   {
        p*=i;						//i!运算
   }
   return p;
}
int main(void){
    printf("请输入一个数n,我将输出1!+2!+...+n!\n");
    int n,num=0;
    scanf("%d",&n);
    for (int i = 1; i <= n; i++)
    {
        num+=Fact(i);				//第i个阶乘
    }
    
    printf("%d\n",num);
    
}

7.7–求两个整数的最大公约数

#include<stdio.h>
int GCD(int x,int y)
{
    int i;
    if(x>=y)
        i = y;
    else
        i = x;
    for(;i>=1;i--){
        if(x%i==0 && y%i==0){
            return i;
        }
    }
}
int main(void)
{
    int x,y;
    scanf("%d,%d",&x,&y);
    printf("GCD=%d\n",GCD(x,y));
    return 0;
}

7.13–素数

#include<stdio.h>
int isPrime(int x)
{
    int i;
    for(i=2;i<x;i++){
        if(x % i == 0){
            return 0;
        }
    }
    return 1;
}

int main(void)
{
    int x;
    scanf("%d",&x);
    if(isPrime(x)){
        printf("%d is prime\n",x);
    }
    else{
        printf("%d is not prime\n",x);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值