求一元二次方程的根
用求根公式来解答这个问题会先求出判断值,并通过
求出来,但在c语言中这样做是绝对行不通的,因为电脑看不懂你写的到底是啥意思,而在程序里如何写出来呢?
#include stdio.h
#include math.h
int main(){
float a ,b ,c X1, X2 ,q ,d;
printf("Please input a,b,c\n")
scanf("%f, %f, %f",&a,&b,&c);
q = b*b - 4*a*c;
d = sqrt(q);
X1 = (-b+d)/(2*a);
X2 = (-b-d)/(2*a);
printf("X1 = %.2f,X2 = %.2f\n",X1,X2);
}
很简单的一个程序,其中sqrt()函数是math库中的一个函数,用来计算平方根。
但其中有两个点需要注意,一个是float,另一个是x1,x2的复合运算。
如果把float改为int,程序还能正常运行吗?
很明显,如果改为int结果在某些情况下就会出现偏差。
在求X1和X2的过程中,会遇到除法,因为int本身的特性 ,小数点后会被省略,因此导致最后结果不准。
而在程序设计中,这种int相除的情况并不会报错,编辑器会认为这是正确的做法,而这种隐性的错误也会让你将错误的结果认为是对的。因此在面对除法时一定要注意整数的影响。
在计算机存储中,int型的存储为
而float的存储为
可以看出来,之所以整型相除会出错,期实质上是int和float的存储方法不同。
那我在定义变量的时候一直定义float不就解决这个问题了?
同样的原理,float分为单精度和双精度,在下溢出时一样会不准确 在多次使用除法时float会不准确没有int的准确度高
那改为int型没法除,一直定义float也不可以,万一遇到必须要定义为int型,又必须要除的情况咋办?
答案就是判断,在c语言里有许多数学中没有的运算符, x%n
取余即为其中一个
当然这种运算还有其他的
#include stdio.h
void main(){
int n,a = 0;
n++;
n--;
++n;
--n;
a+=n;
a-=n;
a*=n;
a/=n;
}
关系运算
双目比较,两个目标通过关系运算符选出一个目标
常见的关系运算符有>,>=,<,<=,=,!= 六个
结果为0,1这两个数,0代表假false,1代表真true。c语言中没有特定的关键字用来定义真假
其中前四个优先级相同高于后两个等于相关的关系运算符
但都低于算数运算符
关系比较常用于 if(条件){语句};
中,其中单个语句块可不加花括号 if(a>b) x=a;
逻辑运算
相对于关系运算的,逻辑运算可以处理更复杂的情况,设计多个条件的取舍。关系表达式 逻辑运算符 关系表达式
关系表达式可以时运算式可以是单个变量,也可以是关系式子。
逻辑运算符有三个 ||,&&,!
其中 ! 为单目运算符。
&&与运算为全为1结果为1
||或运算为全为0结果为0
与运算&&的优先级高于或运算||高于非运算!
但算数运算>关系运算>逻辑运算
条件运算
c语言中唯一一个三目运算符 (关系式)?表达式1:表达式2
若为真则输出表达式1为假输出表达式2
其中优先级仅仅高于优先级最低的赋值号
结合和优先级是两个不同的概念
例如i+++j结合为从右向左
x = a+b*c虽然是从右向左计算,但结合仍然是从左向右
结合
例如,景区卖票,规定如下:
0~12 ¥20
13~69 ¥80
70以上 免费
#include stdio.h
void main(){
int money ,x;
scanf("%d",&x);
money = (x<13)?20:(x>69)?0:80;
printf("money is %d",money);
}
位运算
位运算主要有三个 &与 |或 ^异或 ~取反 >>右移 <<左移
与运算为相同为1,不同为0
或运算为一个1为1,两个0为0
异或为相同为0,不同为1
>> <<为左移右移不同的位数
优先级
可以用来将二进制的首位或者末尾至0,将数扩大多少倍
异或甚至可以不用引入第三个变量交换两个数的值