C语言入门级教程 icesongqiang
2016.10.31
总结
- 现在很多同学已经知道数据类型为double, float时判断数据大小使用绝对值,但是要提的是我们要尽量使用
fabs(a)
, 而 abs() 的返回值为int型,希望大家注意; - 关于税收的问题,注意是分段累计求和;
税收
很多同学都是使用switch() case{}
语句,这里给出一个比较简单直观的方式。
// @author: zyd
#include<stdio.h>
int main()
{
int s;
float x;
printf("请输入月收入\n");
scanf("%d",&s);
s<=3000?(x=0):(x=0.05*(s-3000));
s<=3500?(x=x):(x=x+0.05*(s-3500));
s<=4500?(x=x):(x=x+0.05*(s-4500));
s<=6000?(x=x):(x=x+0.05*(s-6000));
s<=8000?(x=x):(x=x+0.05*(s-8000));
printf("应缴所得税%f元",x);
return 0;
}
π的推算
// @author: fhy
#include<stdio.h>
int main(){
double pi=2;
int n;
for(n=1;n<=1000;n++){
pi=pi*(2.0*n)*(2.0*n)/((2.0*n-1)*(2.0*n+1));
}
printf("π的近似值为%f",pi);
return 0;
}
二分法求解
关于π的推算有很多种方法,除了书上这一种公式外,也还有别的公式.
// @author: lxh
#include <stdio.h>
#include <math.h>
int main()
{
double a,b,x;
for(a=-10,b=10;fabs(2*a*a*a-4*a*a+3*a-6)>1e-6;){
x=(a+b)/2;
if(2*x*x*x-4*x*x+3*x-6<=0)
a=x;
else
b=x;
}
printf("%f",x);
system("pause");
return 0;
}
我们最常见的还可以采用蒙特卡罗仿真,具体如下:
step1. 在边长为1的正方形中,以右下角的顶点为原点,建立直角左边系,想象一个四分之一圆放在该正方形中,那么可以很简单得到四分之一圆与正方形的面积比是
π4:1=pi:4
;
step2. 在正方形中任意取一点,计算该点到原点的距离,如果距离小于1, 则认为该点落在圆内;
step3. 多次重复step2, 记下落在圆内的次数和总的仿真次数,两者的比例可以看成这个面积比,假设结果为m:n;
step4. 那么
π4=mn
,
π=4∗mn
感兴趣的可以自己写写代码。
牛顿法求解
将题中所给的函数式编写成自己的函数,很大程度上简化自己的代码,保证程序的易读性。
/*y初值为x=1.5时的函数值,x2初值为牛顿迭代的第一项,
** 判断条件为两个x的差是否足够小,若不满足精度要求
** 则将x2赋值给x,并用牛顿迭代产生新的x2,重复此流程
@ author chenyang
*/
#include<stdio.h>
#include<math.h>
double f(double x){
double y;
y=2*x*x*x-4*x*x+3*x-6.0;
return(y);
}
int main(){
float x=1.5,x2;
x2=x-f(x)/(6*x*x-8*x+3.0);
while (fabs(x-x2)>=1e-6){
x=x2;
x2=x-f(x)/(6*x*x-8*x+3.0);
}
printf("x=%f\n",x2);
return 0;
}