求一元二次方程的根

c语言程序设计 - 图1
用求根公式来解答这个问题会先求出c语言程序设计 - 图2判断值,并通过
c语言程序设计 - 图3
求出来,但在c语言中这样做是绝对行不通的,因为电脑看不懂你写的到底是啥意思,而在程序里如何写出来呢?

  1. #include stdio.h
  2. #include math.h
  3. int main(){
  4. float a ,b ,c X1, X2 ,q ,d;
  5. printf("Please input a,b,c\n")
  6. scanf("%f, %f, %f",&a,&b,&c);
  7. q = b*b - 4*a*c;
  8. d = sqrt(q);
  9. X1 = (-b+d)/(2*a);
  10. X2 = (-b-d)/(2*a);
  11. printf("X1 = %.2f,X2 = %.2f\n",X1,X2);
  12. }

很简单的一个程序,其中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 取余即为其中一个
当然这种运算还有其他的

  1. #include stdio.h
  2. void main(){
  3. int n,a = 0;
  4. n++;
  5. n--;
  6. ++n;
  7. --n;
  8. a+=n;
  9. a-=n;
  10. a*=n;
  11. a/=n;
  12. }

一段很没有意义的代码
其中的a+=n即为
其中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以上 免费

  1. #include stdio.h
  2. void main(){
  3. int money ,x;
  4. scanf("%d",&x);
  5. money = (x<13)?20:(x>69)?0:80;
  6. printf("money is %d",money);
  7. }

位运算

位运算主要有三个 &与 |或 ^异或 ~取反 >>右移 <<左移
与运算为相同为1,不同为0
或运算为一个1为1,两个0为0
异或为相同为0,不同为1
>> <<为左移右移不同的位数
优先级
可以用来将二进制的首位或者末尾至0,将数扩大多少倍
异或甚至可以不用引入第三个变量交换两个数的值