C語(yǔ)言求定積分
利用梯形法計(jì)算定積分
其中, f(x)=x3+3x2-x+2。
算法思想
根據(jù)定積分的定義分析可得:[x0,x1],[x1,x2],···,[xn-1,xn],將定積分的區(qū)間 [a,b] 分成 n 個(gè)子區(qū)間,其中:
若右邊的極限存在,其極限值即為定積分的值。理論上區(qū)間分得越細(xì),越逼近定積分實(shí)際的值,一般采用梯形法近似計(jì)算定積分的值,把區(qū)間 [a,6] 劃分成 n 等份,則任意第 f 個(gè)小梯形的面積為 (上底+下底)×高/2,si=H×[f(xi)-1)+f(xi)]/2,其中 xi+1=a+(i+1)×H;xi=a+i×H;H=(b-a)/n。該實(shí)例問(wèn)題實(shí)際上轉(zhuǎn)換為求 n 等份梯形的面積累計(jì)和。
程序代碼
#include <stdio.h>
#include <math.h>
float collect(float s,float t,int m,float (*p)(float x));
float fun1(float x);
float fun2(float x);
float fun3(float x);
float fun4(float x);
int main()
{
int n,flag;
float a,b,v=0.0;
printf("Input the count range(from A to B)and the number of sections.\n");
scanf("%f%f%d",&a,&b,&n);
printf("Enter your choice:'1' for fun1,'2' for fun2,'3' for fun3,'4' for fun4==>");
scanf("%d",&flag);
if(flag==1)
v=collect(a,b,n,fun1);
else if(flag==2)
v=collect(a,b,n,fun2);
else if(flag==3)
v=collect(a,b,n,fun3);
else
v=collect(a,b,n,fun4);
printf("v=%f\n",v);
return 0;
}
float collect(float s,float t,int n,float (*p)(float x))
{
int i;
float f,h,x,y1,y2,area;
f=0.0;
h=(t-s)/n;
x=s;
y1=(*p)(x);
for(i=1;i<=n;i++)
{
x=x+h;
y2=(*p)(x);
area=(y1+y2)*h/2;
y1=y2;
f=f+area;
}
return (f);
}
float fun1(float x)
{
float fx;
fx=x*x-2.0*x+2.0;
return(fx);
}
float fun2(float x)
{
float fx;
fx=x*x*x+3.0*x*x-x+2.0;
return(fx);
}
float fun3 (float x)
{
float fx;
fx=x*sqrt(1+cos(2*x));
return(fx);
}
float fun4(float x)
{
float fx;
fx=1/(1.0+x*x);
return(fx);
}
調(diào)試運(yùn)行結(jié)果
程序運(yùn)行結(jié)果如下所示:
Input the count range(from A to B)and the number of sections.
0 1 100
Enter your choice:'1' for fun1,'2' for fun2,'3' for fun3,'4' for fun4==>2
v=2.750073
總結(jié)
① 定義 collect() 函數(shù)時(shí),函數(shù)的首部 “float collect(float s,float t,int n,float (*p)(float x))” 中的 “float (*p)(float x)” 表示 p 是指向函數(shù)的指針變量,該函數(shù)的形參為實(shí)型。在 main() 函數(shù)的 if 條件結(jié)構(gòu)中調(diào)用 collect() 函數(shù)時(shí),除了將 a,b,n 作為實(shí)參傳給 collect 的形參 s,n,t 外,還必須將函數(shù)名 fun1,fun2,fun3,fun4 作為實(shí)參將其入口地址傳遞給 collect() 函數(shù)中的形參 p。
② 函數(shù)也是有地址的,函數(shù)名作為函數(shù)的首地址?梢远x一個(gè)指向函數(shù)的指針變量,將函數(shù)入口地址賦予指針變量,然后通過(guò)指針變量調(diào)用函數(shù),這樣的指針變量即稱為指向函數(shù)的指針。
③ 函數(shù)指針也是指針變量,可以實(shí)現(xiàn)指針變量的運(yùn)算,但不能進(jìn)行算術(shù)運(yùn)算,因?yàn)楹瘮?shù)指針的移動(dòng)是毫無(wú)意義的,不同于數(shù)組指針變量,加減一個(gè)整數(shù)可以使指針指向后面或前面的數(shù)組元素。
④ 在函數(shù)調(diào)用中 “(* 指針變量名)” 兩邊的括號(hào)不可少,其中此處為一種表示符號(hào),而不是求值運(yùn)算。
作者:大學(xué)生新聞網(wǎng) 來(lái)源:大學(xué)生新聞網(wǎng)
發(fā)布時(shí)間:2025-03-10 閱讀:
- C語(yǔ)言求空間兩點(diǎn)之間的距離
- 定義一個(gè)表示三維空間點(diǎn)坐標(biāo)的結(jié)構(gòu)類型,通過(guò)函數(shù)求空間上任意兩點(diǎn)之間的距離。
- 03-10 關(guān)注:0
- C語(yǔ)言整數(shù)逆序輸出
- 將一個(gè)從鍵盤輸入的整數(shù)存放到一個(gè)數(shù)組中,通過(guò)程序的運(yùn)行按照數(shù)組中的逆序輸出該整數(shù),利用遞歸的方法解決問(wèn)題。
- 03-10 關(guān)注:0
- C語(yǔ)言約瑟夫環(huán)問(wèn)題
- 編號(hào)為 1,2,3,…,n 的 n 個(gè)人圍坐一圈,任選一個(gè)正整數(shù) m 作為報(bào)數(shù)上限值,從第一個(gè)人開始按順時(shí)針?lè)较驁?bào)數(shù),報(bào)數(shù)到 m 時(shí)停止,報(bào)
- 03-10 關(guān)注:1
- C語(yǔ)言輸出等腰三角形
- 本實(shí)例要求從鍵盤輸入任意整數(shù) n,通過(guò)程序運(yùn)行輸出對(duì)應(yīng)高度為 n 的等腰三角形。
- 03-10 關(guān)注:0
- C語(yǔ)言字符串加密和解密算法
- 在本實(shí)例中要求設(shè)計(jì)一個(gè)加密和解密算法。在對(duì)一個(gè)指定的字符串加密之后,利用解密函數(shù)能夠?qū)γ芪慕饷埽@示明文信息。
- 03-09 關(guān)注:3