C语言复习第三天---谭浩强第四章课后练习

比较好的书本例题

4.7用switch处理菜单命令。在许多应用程序中,用菜单对流程进行控制,例如从键盘输入一个’A’或‘a’字符,就会执行A操作,输入一个’B’或’b’字符,就会执行B操作

#include<stdio.h>
#include<stdlib.h>
int main()
{
	void action1(int,int),action2(int,int);
	char ch;
	int a=12,b=89;
	ch=getchar();
	switch(ch)
	{
	case'a':
	case'A':action1(a,b);break;
	case'b':
	case'B':action2(a,b);break;
	}

system("pause");
return 0;
}
void action1(int x,int y)
{
	printf("x+y=%d\n",x+y);
}
void action2(int x,int y)
{
	printf("x*y=%d\n",x*y);
}

4.8判断是否是闰年

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int year,leap;
	scanf("%d",&year);
	if((year%4==0&&year%100!=0)||(year%400==0))
		leap=1;
	else
		leap=0;
	if(leap)
		printf("%d 是闰年哦",year);
	else
		printf("%d 不是闰年哦",year);
system("pause");
return 0;
}

4.9
C语言复习第三天---谭浩强第四章课后练习
这个代码我检查了很多遍都感觉没有问题,但不知道为什么输入数字后运行出来的却像是乱码,uu们可以自行检查

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
	double a,b,c,disc,x1,x2,realpart,imagpart;
	scanf("%lf,%lf,%lf",&a,&b,&c);
	printf("The equation");
	if(fabs(a)<=1e-6)//绝对值
		printf("is not a equation");
	else
	{
		disc=b*b-4*a*c;
		if(fabs(disc)<=1e-6)
			printf("equal:%8.4f\n",-b/(2*a));
		else
		{
			if(disc>=1e-6)
			{
				x1=-b+sqrt(disc)/(2*a);
				x2=-b-sqrt(disc)/(2*a);
				printf("distinct:%8.4f and %8.4f",x1,x2);
			}
			else
			{
				realpart=-b/(2*a);
				imagpart=sqrt(-disc)/(2*a);
				printf("complex\n");
				printf("%8.4f+%8.4fi\n",realpart,imagpart);
				printf("%8.4f-%8.4fi\n",realpart,imagpart);
			}
		}
	}
system("pause");
return 0;
}

disc是实数,实数在计算和存储时会有微小误差,因此不能做如下判断:if(disc==0)…,这样可能导致本来为0的值由于上述误差而被判别为不等于0 而造成错误,所以引入1e-6相当于10的负6次方。

课后习题

4.有3个整数a,b,c由键盘输入,输出其中最大的数

//小于号判别
#include<stdio.h>
#include<stdlib.h>
int main()
{
	int a,b,c;
	printf("请以空格为分隔输入三个数字\n");
	scanf("%d%d%d",&a,&b,&c);
	if(a<b)
	{
		if(b<c)
			printf("the max is %d",c);
		else
			printf("the max is %d",b);
	}
	else if(a<c)
		printf("the max is %d",c);
	else
		printf("the max is %d",a);
	
system("pause");
return 0;
}
//大于号判别
#include<stdio.h>
#include<stdlib.h>
int main()
{
	int a,b,c;
	printf("请以空格为分隔输入三个数字\n");
	scanf("%d%d%d",&a,&b,&c);
	if(a>b)
	{
		if(c>a)
			printf("the max is %d",c);
		else
			printf("the max is %d",a);
	}
	else if(c>b)
		printf("the max is %d",c);
	else
		printf("the max is %d",b);
	
system("pause");
return 0;
}

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int a,b,c,temp,max;
	printf("请输入三个整数:\n");
	scanf("%d%d%d",&a,&b,&c);
	temp=(a>b)?a:b;   //将a和b之中的大者存入temp
	max=(temp>c)?temp:c;    //将大者与c比较,取最大者
	printf("the max is %d",max);
	
system("pause");
return 0;
}

5.从键盘输入一个小于1000的正数,要求输出它的平方根(如平方根不是整数,则输出整数部分)。要求在输入数据后先对其进行检查是否为小于1000的正数。若不是,则要求重新输入。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
	int a,b;
	printf("请输入一个小于1000的正数:\n");
	scanf("%d",&a);
	if(a>1000)
	{
		printf("不符合要求,请重新输入:");
	    scanf("%d",&a);
	}
	b=sqrt(1.0*a);   //规定为double类型
	printf("%d其平方根整数部分为:%d\n",a,b);

system("pause");
return 0;
}

知识点sqrt()函数

#include<math.h>    //所需头文件
double sqrt(double x);   //函数原型
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
	printf("%d\n",sqrt(25));   //返回值应为double类型

system("pause");
return 0;
}
1>d:\c++try\c\c\c.cpp(6): error C2668: “sqrt”: 对重载函数的调用不明确
1>          d:\baidunetdisk\vc\include\math.h(589): 可能是“long double sqrt(long double)”
1>          d:\baidunetdisk\vc\include\math.h(541): 或       “float sqrt(float)”
1>          d:\baidunetdisk\vc\include\math.h(127): 或       “double sqrt(double)”
1>          尝试匹配参数列表“(int)”时
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
	printf("%f\n",sqrt(25.0));

system("pause");
return 0;
}
//即可正确输出

6.有一个函数
y={ x x<1
| 2x-1 1<=x<10
{ 3x-11 x>=10
写一段程序,输入x,输出y

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
	float x,y;
	printf("请输入x的值:\n");
	scanf("%f",&x);
	if(x<1)
		{
			y=x;
			printf("y=%3.1f",y);
	     }

	else if(x<10)
		{
			y=2*x-1;
	        printf("y=%3.1f",y);
	    }

	else
		{
			y=3*x-11;
			printf("y=%3.1f",y);
	    }

system("pause");
return 0;
}

8.给出一个百分制成绩,要求输出成绩等级A、B、C、D、E。
90分以上为A,80至89分为B,70至79分为C,60至69分为D,60分以下为E。

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int score,a;
	char c;
	printf("请输入0~100成绩:\n");
	scanf("%d",&score);
	if(score<0||score>100)
		printf("不符合规范,请重新输入");
	a=int(score/10);
	switch(a)
	{
	case 10:
	case 9:c='A';break;
    case 8:c='B';break;
    case 7:c='C';break;
	case 6:c='D';break;
	case 5:
	case 4:
	case 3:
	case 2:
	case 1:
	case 0:c='E';break;
	}
	printf("成绩是%d,成绩等级是%c\n",score,c);
system("pause");
return 0;
}

写到这里,其实最重要的是你整个的逻辑思路,你把思路顺清楚了,写这种代码不是很难。
我们再看后面几道题,主要跟数学方面有点关系。

9.给一个不多于5位的正整数,要求: ①求出它是几位数②分别输出每一位数③按逆序输出各位数字,例如原数为123,应输出321

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
	int num,indiv,ten,hundreds,thousand,ten_thousand,place;
    printf("请输入一个不多于五位的正整数\n");
	scanf("%d",&num);
	if(num>9999)
		place=5;
	else if(num>999)
		place=4;
	else if(num>99)
		place=3;
	else if(num>9)
		place=2;
	else
		place=1;
	printf("你输入的数字位数为%d\n",place);
	printf("每位数字为");
	ten_thousand=num/10000;
	thousand=int((num-ten_thousand*10000)/1000);
	hundreds=int((num-ten_thousand*10000-thousand*1000)/100);
	ten=int((num-ten_thousand*10000-thousand*1000-hundreds*100)/10);
	indiv=int(num-ten_thousand*10000-thousand*1000-hundreds*100-ten*10);
	switch(place)
	{
	case 5:printf("%d,%d,%d,%d,%d",ten_thousand,thousand,hundreds,ten,indiv);
			   printf("\n反序数字为");
		printf("%d,%d,%d,%d,%d",indiv,ten,hundreds,thousand,ten_thousand);
		break;
	case 4:printf("%d,%d,%d,%d",thousand,hundreds,ten,indiv);
		printf("\n反序数字为");
		printf("%d,%d,%d,%d",indiv,ten,hundreds,thousand);
		break;
	case 3:printf("%d,%d,%d",hundreds,ten,indiv);
		printf("\n反序数字为");
		printf("%d,%d,%d",indiv,ten,hundreds);
		break;
	case 2:printf("%d,%d",ten,indiv);
		printf("\n反序数字为");
		printf("%d,%d",indiv,ten);
		break;
	case 1:printf("%d",indiv);
		printf("\n反序数字为");
		printf("%d",indiv);
		break;

	}


system("pause");
return 0;
}

10.利润I低于或等于10万元时,奖金可提10%;
利润高于10万元,低于20万元(10000< I≤200000)时, 其中10万元按10%提成,高于10万元的部分,可提成7.5%;200000,400000 之间时,其中20万元仍按上述办法提成(下同),高于20万元的部分按5%提成; 400000,600000 之间时,高于40万元的部分按3%提成;
600000,1000000之间时,高于60万的部分按1.5%提成;
I>1000000时,超过100万的部分按1%提成。
从键盘输入当月利润I,求应发放奖金总数。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
	double i,bonus,bonus1,bonus2,bonus4,bonus6,bonus10;
    bonus1 = 100000*0.1;
	bonus2 = bonus1 + 100000*0.075;
	bonus4 = bonus2 + 200000*0.05;
	bonus6 = bonus4 + 200000*0.03;
	bonus10 = bonus6 + 400000*0.015; 	
    while(1)
    {
        printf("请输入当月利润:");
        scanf("%lf",&i);       
        int branch=(int)(i/100000);
        switch(branch)
        {
        case 0:
            bonus = i * 0.1;
            break;
        case 1:
            bonus = bonus1 + (i-100000)*0.075;
            break;
        case 2:
        case 3:
            bonus = bonus2 + (i-200000)*0.05;
            break;
        case 4:
        case 5:
            bonus = bonus4 + (i-400000)*0.03;
            break;
        case 6:
        case 7:
        case 8:
        case 9:
            bonus = bonus6 + (i-600000)*0.015;
            break;
        default:
            bonus = bonus10 + (i-1000000)*0.01;
            break;
        }
        printf("应得的奖金是:%.2lf\n", bonus);
    }

system("pause");
return 0;
}

11输入四个整数,要求从小到大的顺序输出

int a,b,c,d,t;
	printf("请输入四个整数:");
	scanf("%d,%d,%d,%d",&a,&b,&c,&d);
	if(a>b)
		{ t=a;a=b;b=t;}
	if(a>c)
		{ t=a;a=c;c=t;}
    if(a>d)
		{ t=a;a=d;d=t;}
	if(b>c)
		{ t=b;b=c;c=t;}
	if(b>d)
		{ t=b;b=d;d=t;}
	if(c>d)
		{ t=c;c=d;d=t;}
	printf("%d,%d,%d,%d",a,b,c,d);

12. 有4个圆塔,圆心分别为(2,2)、(-2,2)、(-2,-2)、(2,-2),圆半径为1,这4个塔的高度为10m,塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为零)。

#include <stdio.h>
#include <math.h>
int main()
{
    int x, y, h;
    double p1, p2, p3, p4;
    //输入坐标
    printf("Please enter coordinate: ");
    scanf("%d %d", &x, &y);
    //4个圆塔的坐标方程
    p1 = pow(x-2, 2) + pow(y-2, 2);
    p2 = pow(x-2, 2) + pow(y+2, 2);
    p3 = pow(x+2, 2) + pow(y-2, 2);
    p4 = pow(x+2, 2) + pow(y+2, 2);
    //判断坐标是否在圆塔内并输出结果
    (p1<=1 || p2<=1 || p3<=1 || p4<=1) ? h = 10 : h = 0;
    printf("The building height on this point is %d\n", h);
    return 0;
}
上一篇:前端、JavaScript之变量与常量、基本数据类型、函数


下一篇:3 数码管静态显示