关系运算符
在C语言中,比较符(或称为比较运算符)成为关系运算符。
数值比大小,大家都会,只不过在C语言中,关系表达式是正确的,条件满足的,则表达式值为“真”,用“1”代表;如果不满足条件,则值为“假”,用“0”代表。
C语言把任何非零和非空的值假定为ture,把零或null假定为false。
优先次序
C语言提供6种关系运算符
优先级(高)<,<=,>,>=;
优先级(低)==(等于),!=(不等于)
当然,关系运算符与其他运算符也有优先次序(由高到低)为:
(1)!(非)(2)算术运算符(3)关系运算符(4)&&和||(&&优先级大于||)(5)赋值运算符
此外,还要注意:
例如 若a=3,b=2,c=1,“f=a>b>c"的值为0。
因为“>”运算符是自左至右的结合方向,先执行“a>b"的值为1,再执行关系运算”1>c”,得值为0,赋给f。
逻辑运算符
简单说明
我们熟知“and为与”,“or为或”,“not为非” 。
而C语言中用“&&”代表逻辑与,“||”代表逻辑或,“!”代表逻辑非。
C语言把任何非零和非空的值假定为ture,把零或null假定为false。所以“! 4”的值为0。
它们的优先次序上面蓝字有写到。
运算结果也是0和1,不会是其他数。
而运算对象不但可以是0和1,或者是0和非0的整数,也可以是字符型、浮点型、枚举型或指针型的纯量型数据。系统最终以0和非0来判断它们属于“真”或“假”。
要注意其执行方式
条件运算符
为了简化if语句中冗长的代码,将其改为一个三目运算符:表达式1?,表达式2:表达式3;
使用效果和if语句类似。
P107习题
3.写出下面各逻辑表达式的值。设a=3,b=4,c=5。
题目分析与想法说明:
我们可以用if语句中布尔表达式的性质来实现。
if(boolean_expression)
{
/*如果布尔表达式为真将执行的语句*/
}
else
{
/*如果布尔表达式为假将执行的语句*/
}
如果布尔表达式为ture,则执行if块内的代码。如果布尔表达式为false,则执行else块的代码。
C语言把任何非零和非空的值假定为ture,把零或null假定为false。
再根据逻辑表达式值(为真,值为1;为假,值为0)得,就可将以上组合起来。
利用if语句的执行,将逻辑表达式值具象出来。
换一个方法,使用条件表达式来操作。
(1)a+b>c&&b==c 输出值为 0 。
int main()
{
int a = 3, b = 4, c = 5, l;
if (a + b > c && b == c)
{
l = 1;
}
else
{
l = 0;
}
printf("%d\n", l);
return 0;
}
(2) a||b+c&&b-c 输出值为 1 。
(3)!(a>b)&&!c||1 输出值为 1 。
int main()
{
int a = 3, b = 4, c = 5, l;
l = (!(a > b) && !c || 1) ? 1 : 0;
printf("%d\n", l);
return 0;
}
(4)!(x=a)&&(y=b)&&0 输出值为 0 。
(5)!(a+b)+c-1&&b=c/2 输出值为1。
4.有3个整数a,b,c,由键盘输入,输出其中最大值。
int main()
{
int a, b, c;
printf("请依次输入三个整数:");
scanf("%d%d%d", &a, &b, &c);
a = (a > b) ? a : b;
a = (a > c) ? a : c;
printf("最大值为%d", a);
return 0;
}
5.从键盘输入一个小于1000的正数,要求输出它的平方根(如果平方根不是整数,则输出其整数部分)。要求在输入数据后先对其进行检查是否为小于1000的正数。若不是,则要求从新输入。
根据要求一步步写出来,
注:题目并没有说明所需数为整数,只要求正数,所以正小数也包括在内,所以数据类型应为double(双精度浮点型)。
#include<stdio.h>
#include<math.h>
int main()
{
double M;
printf("请输入一个小于1000的正数:");
while (1)//创造循环
{
scanf("%lf", &M);
if (M > 0 && M < 1000)//检查是否为小于1000的正数
break;//跳出循环
else
printf("输入错误,请重新输入:");
continue;//可不写
}
double k = sqrt(M);
if (k != (int)k)//判断是否为整数
{
double pp = floor(k);//求出不大于k的最大整数的函数
printf("%lf",pp);
}
else
printf("%lf", k);
return 0;
}
换一个判断循环体,换一个整数判断方法:
int main()
{
double M;
printf("请输入一个小于1000的正数:");
do
{
scanf("%lf", &M);
if (M > 0 && M < 1000)
break;
else
printf("输入错误,请重新输入:");
} while (1);
double k = sqrt(M);
if (k - (int)k== 0)
{
printf("%lf", k);
}
else
{
double pp = floor(k);
printf("%lf", pp);
}
return 0;
}
6.有一函数:
写程序,输入x的值,输出y相应的值。
int main()
{
int x, y;
scanf("%d", &x);
if (x < 0)
y = -1;
else if (x == 0)
y = 0;
else if(x > 0)
y = 1;
printf("%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
y = 0;
printf("x=%d,y=%d\n", x, y);
return 0;
}
它不能实现题目的要求。出现了if和else的配对错误。根据就近原则,else是与第9行的if匹配,而不是与第8行的if配对的。
运行结果:结果显然不对。
(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;
}
它也不能实现题目的要求。如果输入的x<0,则输出y=0。
运行结果:结果显然不对。
8.
给出一百分制成绩,要求输出成绩等级 ‘A’,‘B’,‘C’,‘D’,‘E’。90分以上为‘A’,80~89分为‘B’,70~79分为‘C’,60~69分为‘D’,60分以下为‘E’。
int main()
{
float score;
char grade;
printf("请输入学生成绩:");
scanf("%f", &score);
while (score > 100 || score < 0)
{
printf("\n 输入有误,请重输");
scanf("%f", score);
}
switch ((int)(score / 10))//利用十位数分级
{
case 10:
case 9:grade = 'A';
break;
case 8:grade = 'B';
break;
case 7:grade = 'C';
break;
case 6:grade = 'D';
break;
case 5:
case 4:
case 3:
case 2:
case 1:
case 0:grade = 'E';
}
printf("成绩是%5.1f,相应的等级是%c\n", score, grade);
return 0;
}
9.给一个不多于5位的正整数,要求:
(1)求出它是几位数;
(2)分别输出每一位数字;
(3)按逆序输出各位数字。
第一种:
int main()
{
int k, cun = 0;
printf("请输入一个不多于5位的正整数:");
while (1)//判断的循环
{
scanf("%d", &k);
if (k> 0 && k< 100000)
break;
else
printf("输入错误,请重新输入:");
}
printf("输出每一位数字: ");
double d,li=0;
for (int n = 5; n >0; n--)
{
int p = pow(10, n-1);
int m = k / p % 10;//除位数取模,取每一位上的数字。
d = static_cast<double>(m) / p;//逆序,但是小数
if (m != 0)
{
printf("%d ",m);
cun++;
}
li = li + d;//累加
}
printf("\n");
printf("它是%d位数\n", cun);
printf("逆序为 %f", li*pow(10, cun-1));//转为整数
return 0;
}
结果为:
第二种:
int main()
{
int k, cun = 0;
printf("请输入一个不多于5位的正整数:");
while (1)
{
scanf("%d", &k);
if (k> 0 && k< 100000)
break;
else
printf("输入错误,请重新输入:");
}
printf("输出每一位数字: ");
for (int n = 5; n >0; n--)
{
int p = pow(10, n-1);
int m = k / p % 10;
if (m != 0)
{
printf("%d ",m);
cun++;
}
}
printf("\n");
printf("它是%d位数\n", cun);
int sum=0;
while (k)
{
int l = k % 10;
k /= 10;
sum = sum * 10 + l;
}
printf("逆序为% d", sum);
return 0;
}
10.
企业发放的奖金根据利润提成。利润I低于或等于100 000元的,奖金可提成10%;利润高于100 000元,低于200 000元(100 000<I<=200 000)时,低于100 000元的部分按10%提成,高于100 000元的部分,可提成7.5%;200 000<I<=400 000时,低于200 000元的部分仍按上述办法提成(下同)。高于200 000元的部分按5%提成;400 000<I<=600 000元时,高于400 000元的部分按3%提成;600 000<I<=1 000 000时,高于600 000的部分按1.5%提成;I>1 000 000时,超过1 000 000元的部分按1%提成。从键盘输入当月利润I,求应发奖金总数。
要求:(1)用if语言编程序。(2)用switch语句编程序。
(1)
#include<stdio.h>
int main()
{
double I, J;
printf("请输入当月利润:");
scanf("%lf", &I);
if (I <= 100000)
J = I * 0.1;
else if (I <= 200000)
J = 100000 * 0.1 + (I - 100000) * 0.075;
else if (I <= 400000)
J = 100000 * 0.1 + (200000 - 100000) * 0.075 + (I - 200000) * 0.05;
else if (I <= 600000)
J = 100000 * 0.1 + (200000 - 100000) * 0.075 + (400000 - 200000) * 0.05 + (I - 400000) * 0.03;
else if (I <= 1000000)
J = 100000 * 0.1 + (200000 - 100000) * 0.075 + (400000 - 200000) * 0.05 + (600000 - 400000) * 0.03 + (I - 600000) * 0.015;
else
J = 100000 * 0.1 + (200000 - 100000) * 0.075 + (400000 - 200000) * 0.05 + (600000 - 400000) * 0.03 + (1000000 - 600000) * 0.015 + (I - 1000000) * 0.01;
printf("奖金是:%f\n", J);
return 0;
}
(2)
#include <stdio.h>
int main()
{
int i, j;
int c = i / 10000;
printf("请输入利润:");
scanf("%d", &i);
if (c > 10)
c = 10;
switch (c)
{
case 0:j = i * 0.1;
break;
case 1:100000 * 0.1 + (i - 100000) * 0.075;
break;
case 2:
break;
case 3:200000 * 0.1 + (i - 200000) * 0.05;
break;
case 4:
break;
case 5:400000 * 0.1 + (i - 400000) * 0.03;
break;
case 6:
break;
case 7:
break;
case 8:
break;
case 9:600000 * 0.1 + (i - 600000) * 0.015;
break;
case 10:1000000 * 0.1 + (i - 1000000) * 0.01;
break;
default:
break;
}
printf("利润是:%d\n", j);
return 0;
}
11.输入4个整数,要求按照由小到大的顺序输出。
(1)if语句写出的基础代码,当然也可用条件表达式代替
#include<stdio.h>
int main()
{
int t,a,b,c,d;
printf("请输入4个数:");
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;
}
(2)依据数组和算法知识可用冒泡排序
void bubble_sort(int arr[], int sz)//排序函数
{
int i = 0;
for (i = 0; i < sz - 1; i++)
{
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int t = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = t;
}
}
}
}
int main()
{
int arr[4];
for (int b = 0; b < 4; b++)//输入
{
printf("请输入第%d个数:",b+1);
scanf("%d", &arr[b]);
}
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz);
printf("由小到大排序为:");
for (int pr = 0; pr < 4; pr++)//打印
{
printf("%d ", arr[pr]);
}
return 0;
}
12.有4个圆塔,圆心分别为(2,2)、(-2,2)、(-2,-2)、(2,-2),圆半径为1,见图。
这4个塔的高度为10m,塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为零)。
#include <stdio.h>
int main()
{
int h=10;
float x1=2,y1=2;
float x2=-2,y2=2;
float x3=-2,y3=-2;
float x4=2,y4=-2;
float x,y,d1,d2,d3,d4;
printf("请输入一个点(x,y):");
scanf("%f,%f",&x,&y);
d1=(x-x4)*(x-x4)+(y-y4)*(y-y4);//求该点到各中心点的距离
d2=(x-x1)*(x-x1)+(y-y1)*(y-y1);
d3=(x-x2)*(x-x2)+(y-y2)*(y-y2);
d4=(x-x3)*(x-x3)+(y-y3)*(y-y3);
if(d1>1 && d2>1 && d3>1 && d4>1)//判断该点是否在塔外
{
h=0;
}
printf("该点高度为%d.",h);
return 0;
}