比较好的书本例题
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
这个代码我检查了很多遍都感觉没有问题,但不知道为什么输入数字后运行出来的却像是乱码,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;
}