《C程序设计》学习记录1010

关系运算符

在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来判断它们属于“真”或“假”。

要注意其执行方式

181ae99e30864252be6e8f5dcc09461e.jpeg0831753a18ad41ee8597c905f59d1b52.jpeg

条件运算符

为了简化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.有一函数:

c5bff87ade6c461e80df28f353ecf7bc.jpeg

写程序,输入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.有一函数:

1a9f0ddf597b4b61b910e34066fc71e1.jpeg

有人编写了以下两个程序,请分析它们是否能实现提目要求。不要急于上机运行程序,先分析两个程序的逻辑,画出它们的流程图,分析它们的运行情况。然后上机运行程序,观察和分析结果。

(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;
}

27bdb1dd33fb404d8bcd25625032ba92.jpeg96a8790cef5b4d0d8d6e45ee8718ac44.png

它不能实现题目的要求。出现了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;
}

8a29a53c769b4678889d5b9f4fec1ead.jpeg275f776adc2b4b249954e1a58ea0faf0.png

它也不能实现题目的要求。如果输入的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;
}

结果为:

02d59a298f384f9ca5233dff9c3029ee.png

第二种:

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,塔以外无建筑物。今输入任一点的坐标,求该点的建筑高度(塔外的高度为零)。

040e137d50a548498087abd7f837a6d0.jpeg

#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;
}

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七十二旹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值