//习题1.什么是算术运算?什么是关系运算?什么是逻辑运算?
算术运算就是我们数学中的加、减、乘、除,以及取余,一般进行数值的运算。
关系运算就是判断给出的两个数值是否具有(大于、小于、等于、不等于)的运算。
逻辑运算就是判断给出的条件在逻辑上是否为‘真’或‘假’。
//习题2. C语言中如何表示“真”和“假”?系统如何判断一个量的“真”和“假”?
在C语言中,用1表示为真,用0表示为假。
//习题3.写出下面各逻辑表达式的值。设:a=3,b=4,c=5。
(1) a+b>c && b==c
0
(2) a||b+c && b一c
1
(3) !(a>b) && !c|| 1
1
(4) !(x=a) && (y=b) && 0
0
(5) !(a+b)+c-1 && b+c/2
1
//习题4.有3个整数a,b,c,由键盘输人,输出其中最大的数。
#include<stdio.h>
int main()
{
float a,b,c,t;
scanf("%f,%f,%f",&a,&b,&c);
if(a>b)
{
t=a; //借助变量t,实现变量a和变量b互换值
a=b;
b=t;
} //互换后,a小于或等于b
if(a>c)
{
t=a; //借助变量t,实现变量a和变量c互换值
a=c;
c=t;
} //呼唤后,a小于或等于c
if(b>c) //还要
{
t=b; //借助变量t,实现变量b和变量c互换值
b=c;
c=t;
} //互换后,b小于或等于c
printf("%5.2f,%5.2f,%5.2f\n",a,b,c); //顺序输入a,b,c的值
return 0;
}
//习题5.从键盘输人一个小于1000的正数,要求输出它的平方根(如平方根不是整数,则输出其整数部分)。要求在输人数据后先对其进行检查是否为小于1000的正数。若不是,则要求重新输人。
#include <stdio.h>
#include <math.h>
int main()
{
int num,n;//num用来接收输入的数,n用来输出平方根
printf("please enter a number:\n");
scanf("%d",&num);
while(abs(num)>=1000) //判断num是不是一个大于等于1000的正数
scanf("%d",&num);
n=sqrt(float(num)); //sqrt()为开方函数
printf("num的平方根为%d",n);
return 0;
}
//习题6.有一个函数:
写程序,输人x的值,输出y相应的值。
#include <stdio.h>
int main()
{
int x,y;
printf("please enter x:");
scanf("%d",&x);
if(x<1)
y=x;
else if((x>1)&&(x<10))
y=2*x-1;
else
y=3*x-11;
printf("y=%d\n",y);
return 0;
}
//习题7.有一函数:
有人编写了以下两个程序,请分析它们是否能实现题目要求。不要急于上机运行程序,先分析两个程序的逻辑,画出它们的流程图,分析它们的运行情况。然后上机运行程序,观察和分析结果。
(1)
#include<stdio.h>
int main()
{
int x,y;
printf(" enter x:");
scanf(" %d",&x);
y=-1;
if(x!=0)
if(x>0)
y=1;
else
printf(“x= %d,y= %d\n”,x,y);
return 0;
}
(2)
#include<stdio.h>
int main()
{
int x,y;
printf(“enter x!”);
scanf("%d" ,&x);
y=0;
if(x>=0)
if(x>0)
y=1;
else
y=-1;
printf(“x= %d,y= %d\n”,x,y);
return 0;
}
(1)流程图
程序1在程序在第运行时会把else和最近的一个if看成一个语句,所以达不到预期的效果
(2)流程图
程序2也不可以达到预期的效果,原因同程序1
//习题8.给出一百分制成绩,要求输出成绩等级'A'B'C'D'、'E'。90分以上为'A',80~89分为'B',70~79分为‘C' ,60~69分为'D' ,60分以下为'E"。
#include <stdio.h>
int main()
{
int score;
printf("please enter score:");
scanf("%d",&score);
switch(score/10)
{
case 10:
case 9:printf("该成绩为A\n");break;
case 8:printf("该成绩为B\n");break;
case 7:printf("该成绩为C\n");break;
case 6:
case 5:
case 4:
case 3:
case 2:
case 1:printf("改成绩为D\n");break;
}
return 0;
}
//习题9.给一个不多于5位的正整数,要求:
①求出它是几位数;
②分别输出每一位数字;
③按逆序输出各位数字,例如原数为321,应输出123。
#include <stdio.h>
int main()
{
int num,n,count=0,m;
printf("please enter num:");
scanf("%d",&num);
while(num>9999)
{
printf("please enter num:");
scanf("%d",&num);
}
n=num;
while(n!=0)//(1)求输入的数字为几位数
{
count++;
n=n/10;
}
printf("输入了一个%d位数\n",count);
n=num;
printf("分别输出每一个数字\n");//(2)分别输出每一位数字
if(num>1000&&num<9999)//当它为4位数时
{
printf("%d\t",n/1000);
n=n-n/1000*1000;
printf("%d\t",n/100);
n=n-n/100*100;
printf("%d\t",n/10);
n=n-n/10*10;
printf("%d\n",n);
/*如果是大于五位数的数字也可以改成下面这种形式
int i=1000;
while(n!=0)
{
printf("%d\t",n/i);
n=n-n/i*i;
i=i/10;
}
printf("\n");
*/
}
else if(num>100&&num<999)//当它为3位数时
{
printf("%d\t",n/100);
n=n-n/100*100;
printf("%d\t",n/10);
n=n-n/10*10;
printf("%d\n",n);
}
else if(num>10&&num<99)//当它为2位数时
{
printf("%d\t",n/10);
n=n-n/10*10;
printf("%d\n",n);
}
else//当它为1位数时
printf("%d\n",n);
printf("按逆序输出每一位数字\n");
while(num!=0) //(3)按逆序输出每一位数字
{
printf("%d\t",num%10);
num=num/10;
}
printf("\n");
return 0;
}
//习题10.企业发放的奖金根据利润提成。利润I低于或等于100000元的,奖金可提成10%;利润高于100000元,低于200000元(100000<I<200000)时,低于100000元的部分按10%提成,高于100000元的部分,可提成7.5%;200000<1≤400000时,低于200000元的部分仍按上述办法提成(下同)。高于200000元的部分按5%提 成;400000<I≤600 000元时,高于400 000元的部分按3%提成;600 000<1<1 000 000时,高于600 000元的部分按1. 5%提成;I>100000时,超过1 000 000元的部分按1%提成。从键盘输人当月利润I,求应发奖金总数。
要求:
(1)用if语句编程序;
#include <stdio.h>
int main()
{
float I,S;//I、S分别为利润、奖金总数;
float n1,n2,n3,n4,n5,n6;
printf("请输入利润:");
scanf("%f",&I);
n1=99999*0.1;//低于100000时的奖金
n2=n1+(I-100000)*0.075;//高于100000低于200000的奖金
n3=n2+(I-200000)*0.05;//高于200000低于400000的奖金
n4=n2+(I-400000)*0.03;//高于400000低于600000的奖金
n5=n2+(I-600000)*0.015;//高于600000低于1000000的奖金
n6=n2+(I-1000000)*0.01;//高于600000低于1000000的奖金
if(I<=100000)
S=I*0.1;
else if(I>100000&&I<=200000)
S=n2;
else if(I>200000&&I<=400000)
S=n3;
else if(I>400000&&I<=600000)
S=n4;
else if(I>600000&&I<=1000000)
S=n5;
else
S=n6;
printf("当利润为%.0f时能拿到%.2f奖金\n",I,S);
return 0;
}
(2)用switch语句编程序。
#include <stdio.h>
int main()
{
float I,S;//I、S分别为利润、奖金总数;
float n1,n2,n3,n4,n5,n6;
printf("请输入利润:");
scanf("%f",&I);
n1=99999*0.1;//低于100000时的奖金
n2=n1+(I-100000)*0.075;//高于100000低于200000的奖金
n3=n2+(I-200000)*0.05;//高于200000低于400000的奖金
n4=n2+(I-400000)*0.03;//高于400000低于600000的奖金
n5=n2+(I-600000)*0.015;//高于600000低于1000000的奖金
n6=n2+(I-1000000)*0.01;//高于600000低于1000000的奖金
switch(int(I)/100000)
{
case 0:S=I*0.1;break; //100000以下的奖金
case 1:
case 2:S=n2;break;//高于100000低于200000的奖金
case 3:
case 4:S=n3;break;//高于200000低于400000的奖金
case 5:
case 6:S=n4;break;//高于400000低于600000的奖金
case 7:
case 8:
case 9:S=n5;break;//高于600000低于1000000的奖金
case 10:S=n6;break;//高于1000000的奖金
}
printf("当利润为%.0f时能拿到%.2f奖金\n",I,S);
return 0;
}
//习题11.输人4个整数,要求按由小到大的顺序输出。
#include<stdio.h>
int main()
{
int a,b,c,d,t;//t用来交换两个数
printf("please enter fours number:");
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\n",a,b,c,d);
return 0;
}
//习题12.有4个圆塔,圆心分别为(2,2)、(一2,2)、(一2,一2)、(2,一2),圆半径为1,见图4.17。这4个塔的高度为10m,塔以外无建筑物。今输人任一点的坐标,求该点的建筑高度(塔外的高度为零)。
本题解题思路是:
以下是代码实现:
#include <stdio.h>
#include <math.h> //需要使用到fabs,sqrt函数
int main()
{
float x,y;
printf("please enter x,y:");
scanf("%f%f",&x,&y);
x=fabs(x-2);y=fabs(y-2);//计算输入坐标距离圆心的位置
if(sqrt(x*x+y*y)>1)//判断圆心到输入坐标位置是否大于半径
{
printf("输入坐标在圆塔外,该点建筑高度为0m");//输出判断结果
}
else
printf("输入坐标在圆塔内,该点建筑高度为10m");
printf("\n");
return 0;
}