数值计算方法编程作业(C语言版)汇总
c语言算法100例

c语言算法100例以下是一些经典的C语言算法题目,总共提供100个例子供你练习和学习:1.编写一个程序,计算并输出斐波那契数列的前20个数。
2.编写一个程序,判断一个数是否为素数。
3.编写一个程序,计算并输出一个数的阶乘。
4.编写一个程序,实现两个数的交换(不使用第三个变量)。
5.编写一个程序,找出一个数组中的最大值。
6.编写一个程序,将一个字符串反转。
7.编写一个程序,判断一个字符串是否为回文字符串。
8.编写一个程序,实现冒泡排序算法对一个数组进行排序。
9.编写一个程序,实现二分查找算法在一个有序数组中查找指定的元素。
10.编写一个程序,计算并输出斐波那契数列的第n个数。
11.编写一个程序,将一个二维数组顺时针旋转90度。
12.编写一个程序,计算并输出一个数的平方根。
13.编写一个程序,判断一个字符串中是否包含重复字符。
14.编写一个程序,实现插入排序算法对一个数组进行排序。
15.编写一个程序,将一个有序数组合并为一个有序数组。
16.编写一个程序,判断一个数是否为完全数(即所有因子之和等于该数本身)。
17.编写一个程序,计算并输出一个数的倒数。
18.编写一个程序,判断一个字符串是否是另一个字符串的子串。
19.编写一个程序,实现选择排序算法对一个数组进行排序。
20.编写一个程序,计算并输出两个数的最大公约数。
21.编写一个程序,实现快速排序算法对一个数组进行排序。
22.编写一个程序,将一个字符串中的所有空格替换为指定的字符。
23.编写一个程序,判断一个数是否是回文数。
24.编写一个程序,计算并输出两个数的最小公倍数。
25.编写一个程序,实现归并排序算法对一个数组进行排序。
26.编写一个程序,判断一个字符串是否是有效的括号串。
27.编写一个程序,计算并输出一个数的立方根。
28.编写一个程序,实现堆排序算法对一个数组进行排序。
29.编写一个程序,判断一个数是否是质数。
30.编写一个程序,计算并输出一个数的二进制表示。
c语言数组编程题目

c语言数组编程题目含详解共5道1. 计算数组元素的和编写一个程序,计算给定数组中所有元素的和。
```c#include <stdio.h>int main() {int arr[] = {1, 2, 3, 4, 5};int n = sizeof(arr) / sizeof(arr[0]);int sum = 0;for (int i = 0; i < n; ++i) {sum += arr[i];}printf("数组元素的和: %d\n", sum);return 0;}```2. 查找数组中的最大值和最小值编写一个程序,查找给定数组中的最大值和最小值。
```c#include <stdio.h>int main() {int arr[] = {5, 2, 8, 1, 4};int n = sizeof(arr) / sizeof(arr[0]);int max = arr[0];int min = arr[0];for (int i = 1; i < n; ++i) {if (arr[i] > max) {max = arr[i];}if (arr[i] < min) {min = arr[i];}}printf("最大值: %d\n", max);printf("最小值: %d\n", min);return 0;}```3. 反转数组元素的顺序编写一个程序,反转给定数组的元素顺序。
```c#include <stdio.h>int main() {int arr[] = {1, 2, 3, 4, 5};int n = sizeof(arr) / sizeof(arr[0]);int temp;for (int i = 0; i < n / 2; ++i) {temp = arr[i];arr[i] = arr[n - i - 1];arr[n - i - 1] = temp;}printf("反转后的数组: ");for (int i = 0; i < n; ++i) {printf("%d ", arr[i]);}return 0;}```4. 删除数组中的指定元素编写一个程序,删除给定数组中的指定元素。
C语言编程例题

C语言编程例题1编程:由键盘输入两个整型变量a和b的值。
编程计算并输出a 与b的和、差、积、商、a除以b的余数、a b的值。
输入输出参考示例如下:提示:用到C语言的运算符(参见P52)+、-、*、/、%、函数pow()(参见附录C P385)请输入a,b的值:a=3,b=2a+b=5a-b=1a*b=6a/b=1a%b=1a^b=92、编程:求一元二次方程ax2+bx+c=0的实根x1,x2,。
a,b,c的值由键盘输入,设b2-4ac>0。
输入输出示例如下:请输入三个系数a,b,c的值:a=1,b=3,c=2x1=-1.00x2=-2.003、由键盘输入一个圆柱体的底面半径r和高度h的值,编程计算并输出该圆柱体的体积。
(注意:体积=底面积*高,要求将圆周率定义为符号常量PI)4、编写程序,从键盘输入两个数字字符并分别存放在字符型变量a和b中,要求通过程序将与这两个字符对应的数字相加后输出,例如,输入字符型数字7和5,输出的则是整型数12。
5、判断用户从键盘输入的任意一个字符是数字字符、字母字符还是其他字符,要求有必要的输入提示和输出信息;如果输入的是英文字母,再利用switch语句判断该字母是否是元音字母,并以“yes”或“no”字样输出判断结果。
6、编程实现:任意输入一个百分制成绩,输出成绩等级A、B、C、D。
当输入的分数小于0分或大于100分时,显示出错信息;在85~100分时为A,70~84分为B,55~69分为C,55分以下为D。
7、编写程序:从键盘输入x,利用幂级数展开计算sinx的近似值,要求误差小于10-6。
数值计算C语言常用小程序

数值计算C语言常用小程序C语言是一种流行的编程语言,广泛应用于计算机科学和软件开发领域。
在数值计算方面,C语言提供了一些常用的函数和技巧,可以帮助我们进行各种数值计算任务。
本文将介绍一些C语言常用的数值计算小程序。
1.求平均数```c#include <stdio.h>int maiint num;int sum = 0;int count = 0;float average;printf("请输入数字: ");while(num != -1)scanf("%d", &num);if(num != -1)sum += num;count += 1;}}average = (float)sum / count;printf("平均值为: %.2f\n", average);return 0;```这个程序会要求用户输入一系列数字,直到输入-1为止。
然后计算这些数字的平均值并输出。
2.求阶乘```c#include <stdio.h>int factorial(int n)if(n == 0)return 1;} elsereturn n * factorial(n-1);}int maiint n;int result;printf("请输入一个正整数: ");scanf("%d", &n);result = factorial(n);printf("%d的阶乘为: %d\n", n, result);return 0;```这个程序会要求用户输入一个正整数,然后使用递归的方式计算该整数的阶乘,并输出结果。
3.求平方根```c#include <stdio.h>#include <math.h>int maidouble num;printf("请输入一个数字: ");scanf("%lf", &num);if(num < 0)printf("无法计算负数的平方根\n");} elsedouble result = sqrt(num);printf("该数字的平方根为: %.2lf\n", result);}return 0;```这个程序会要求用户输入一个数字,然后计算该数字的平方根并输出。
c语言编程习题及答案

c语言编程习题及答案C语言是一种广泛使用的计算机编程语言,以其高效性和灵活性而闻名。
以下是一些C语言编程习题及其答案,供学习者练习和参考。
习题1:求两个数的和编写一个C程序,输入两个整数,输出它们的和。
```c#include <stdio.h>int main() {int num1, num2, sum;printf("请输入两个整数:");scanf("%d %d", &num1, &num2);sum = num1 + num2;printf("%d + %d = %d\n", num1, num2, sum);return 0;}```习题2:计算圆的面积编写一个C程序,输入圆的半径,计算并输出圆的面积。
```c#include <stdio.h>#define PI 3.14159int main() {double radius, area;printf("请输入圆的半径:");scanf("%lf", &radius);area = PI * radius * radius;printf("圆的面积是:%.2f\n", area);return 0;}```习题3:判断一个数是奇数还是偶数编写一个C程序,输入一个整数,判断并输出它是奇数还是偶数。
```c#include <stdio.h>int main() {int num;printf("请输入一个整数:");scanf("%d", &num);if (num % 2 == 0) {printf("%d 是偶数。
\n", num);} else {printf("%d 是奇数。
C语言经典算法100例

【程序21】题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
以后每天早上都吃了前一天剩下的一半零一个。
到第10天早上想再吃时,见只剩下一个桃子了。
求第一天共摘了多少。
1.程序分析:采取逆向思维的方法,从后往前推断。
2.程序源代码:main(){int day,x1,x2;day=9;x2=1;while(day>0){x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/x2=x1;day--;}printf("the total is %d\n",x1);}==============================================================【程序22】题目:两个乒乓球队进行比赛,各出三人。
甲队为a,b,c三人,乙队为x,y,z三人。
已抽签决定比赛名单。
有人向队员打听比赛的名单。
a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。
2.程序源代码:main(){char i,j,k;/*i是a的对手,j是b的对手,k是c的对手*/for(i='x';i<='z';i++)for(j='x';j<='z';j++){if(i!=j)for(k='x';k<='z';k++){ if(i!=k&&j!=k){ if(i!='x'&&k!='x'&&k!='z')printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);}}}}==============================================================【程序23】题目:打印出如下图案(菱形)【程序31】题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。
数值计算方法编程作业汇总

数值计算方法编程作业汇总数值计算方法是数值分析的重要内容之一,它是通过数学模型和计算机技术对数学问题进行近似计算的方法。
在实际应用中,我们常常需要对各种数学问题进行求解,例如求方程的解、求函数的极值、求积分等。
本文将对数值计算方法的几个主要内容进行介绍,并给出C语言的编程实现示例。
1.数值解法的分类数值计算方法主要包括近似求解方法和数值计算方法两类。
近似求解方法是通过一系列逼近的方法来逼近最优解,包括插值与外推法、最小二乘法和优化等。
数值计算方法主要是采用数值计算的方法对具体问题进行求解,包括方程求根、线性方程组的求解、插值与拟合、积分与微分等。
2.数值解法的代码实现下面以方程求根和插值与拟合为例,给出C语言的编程实现示例。
(1)方程求根方程求根是数值计算方法的基本问题之一、常见的方程求根方法包括二分法、牛顿迭代法、割线法和弦截法等。
以下是二分法的C语言实现示例:```c#include <stdio.h>double f(double x)//定义方程f(x)=x^2-2return x * x - 2;double bisection(double a, double b, double eps) while (b - a > eps)double c = (a + b) / 2.0;if (f(c) == 0)return c;}else if (f(a) * f(c) < 0)b=c;}elsea=c;}}return (a + b) / 2.0;int maidouble a = 1.0;double b = 2.0;double eps = 1e-8;double root = bisection(a, b, eps);printf("Root: %lf\n", root);return 0;```(2)插值与拟合插值与拟合是数值计算方法中的重要问题,常用的方法包括拉格朗日插值、牛顿插值和最小二乘法等。
C语言作业题总结

1、编写程序:从键盘输入两个数,计算两个数的和、差、积、商,将这些结果输出。
(有能力的同学,可以试一试完成一个简单的计算器)# include <stdio.h># include <math.h>int main(){float r1,r2,p1,p2,p3,p4;r1=8;r2=2;p1=r1+r2;p2=r1-r2;p3=r1*r2;p4=r1/r2;printf("p1=%f\np2=%f\np2=%f\np4=%f\n",p1,p2,p3,p4);return 0;}按要求编写程序,并上机运行。
题目为:设半径r=1.5,圆柱高h=3,求圆周长、圆面积、圆球表面积、圆球体积,圆柱体积。
用scanf输入数据,输出计算结果。
输出时要有文字说明,取小数点后两位数字。
# include<stdio.h># define PI 3.14void main(){float r,h,C1,S1,S2,V1,V2;scanf ("%f%f",&r,&h);C1=2*PI*r;S1=PI*r*r;S2=4*PI*r*r;V1=4.0/3*PI*r*r*r;V2=PI*r*r*h;printf("C1=%.2f\nS1=%.2f\nS2=%.2f\nV1=%.2f\nV2=%.2f\n",C1,S1,S2,V1,V2);}编程序,用getchar函数读入两个字符给c1、c2,然后分别用putchar函数和printf 函数输出这两个字符。
#include<stdio.h>void main(){char c1,c2;c1=getchar();c2=getchar();putchar(c1);putchar('\n');printf("%c\n",c2);return 0;}(1).给出一个百分制成绩,要求输出成绩等级A、B、C、D、E。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1:第二章(1)二分法求解非线性方程:#include<stdio.h>#include <math.h>#define f(x) ((x*x-1)*x-1)void main(){ float a,b,x,eps;int k=0;printf("intput eps\n");/* 容许误差*/scanf("%f",&eps);printf("a,b=\n");for(;;){scanf("%f, %f",&a ,&b);if(f(a)*f(b)>=0) /* 判断是否符合二分法使用的条件*/printf("二分法不可使用,请重新输入:\n");else break;}do{ x=(a+b)/2;k++;if(f(a)*f(x)<0) /* 如果f(a)*f(x)<0,则根在区间的左半部分*/b=x;else if(f(a)*f(x)>0) /* 否则根在区间的右半部分*/a=x;else break;}while(fabs(b-a)>eps);/*判断是否达到精度要求,若没有达到,继续循环*/x=(a+b)/2; /* 取最后的小区间中点作为根的近似值*/printf("\n The root is x=%f, k=%d\n",x,k);}运行结果:intput eps0.00001a,b=2,-5The root is x=1.324721, k=20Press any key to continue总结:本题关键在于两个端点的取值和误差的判断,此程序较容易。
二分法收敛速度较快,但缺点是只能求解单根。
(2)牛顿法求解非线性方程:#include <stdio.h>#include <math.h>float f(float x) /* 定义函数f(x) */{ return((-3*x+4)*x-5)*x+6; }float f1(float x) /* 定义函数f(x)的导数*/{ return (-9*x+8)*x-5; }void main(){ float eps,x0,x1=1.0;printf("input eps:\n");scanf("%f",&eps); /* 输入容许误差*/do{ x0=x1; /* 准备下一次迭代的初值*/x1=x0-f(x0)/f1(x0); /* 牛顿迭代*/}while(fabs(x1-x0)>eps); /*当满足精度,输出近似根*/printf("x=%f\n",x1);}程序运行结果:x=1.265328总结:关键是牛顿迭代的应用,程序中最大缺点是函数及其导数已唯一给出确定不可求的随意函数的根,牛顿法比二分法收敛快,可以求重根。
2:第三章(1)列主元素消去法求解线性方程:#include<iostream>#include<cmath>#define N 20using namespace std;void load();float a[N][N];int m;int main(){int i,j;int c,k,n,p,r;float x[N],l[N][N],s,d;cout<<"下面请输入未知数的个数m=";cin>>m;cout<<endl;cout<<"请按顺序输入增广矩阵a:"<<endl;load();for(i=0;i<m;i++){for(j=i;j<m;j++)c=(fabs(a[j][i])>fabs(a[i][i]))?j:i; /*找列最大元素*/for(n=0;n<m+1;n++){s=a[i][n]; a[i][n]=a[c][n]; a[c][n]=s;} /*将列最大数防在对角线上*/for(p=0;p<m+1;p++)cout<<a[i][p]<<"\t";cout<<endl;for(k=i+1;k<m;k++){l[k][i]=a[k][i]/a[i][i];for(r=i;r<m+1;r++) /*化成三角阵*/a[k][r]=a[k][r]-l[k][i]*a[i][r];}}x[m-1]=a[m-1][m]/a[m-1][m-1];for(i=m-2;i>=0;i--){d=0;for(j=i+1;j<m;j++)d=d+a[i][j]*x[j];x[i]=(a[i][m]-d)/a[i][i]; /*求解*/}cout<<"该方程组的解为:"<<endl;for(i=0;i<m;i++)cout<<"x["<<i<<"]="<<x[i]<<"\t";//system("pause");return 0;}void load(){int i,j;for(i=0;i<m;i++)for(j=0;j<m+1;j++)cin>>a[i][j];}运行结果:下面请输入未知数的个数m=3请按顺序输入增广矩阵a:1 2 3 45 1 0 84 6 9 24 6 9 20 -6.5 -11.25 5.50 -1.86265e-008 -0.115385 3.92308该方程组的解为:x[0]=-9.99999 x[1]=58 x[2]=-34 Press any key to continue总结:列主元素消去法的目的是为了防止减去一个较小的数时大数淹没小数,而使结果产生较大误差,本程序关键在每次消元时找到相应列中的最大项,然后交换两行位置,在进行计算。
(2)LU分解法求解线性方程:#include<stdio.h>void solve(float l[][100],float u[][100],float b[],float x[],int n){int i,j;float t,s1,s2;float y[100];for(i=1;i<=n;i++) /* 第一次回代过程开始*/{s1=0;for(j=1;j<i;j++){t=-l[i][j];s1=s1+t*y[j];}y[i]=(b[i]+s1)/l[i][i]; }for(i=n;i>=1;i--) /* 第二次回代过程开始*/{s2=0;for(j=n;j>i;j--){t=-u[i][j];s2=s2+t*x[j];}x[i]=(y[i]+s2)/u[i][i];}}void main(){float a[100][100],l[100][100],u[100][100],x[100],b[100];int i,j,n,r,k;float s1,s2;for(i=1;i<=99;i++)/*将所有的数组置零,同时将L矩阵的对角值设为1*/ for(j=1;j<=99;j++){l[i][j]=0,u[i][j]=0;if(j==i) l[i][j]=1;}printf ("input n:\n");/*输入方程组的个数*/scanf("%d",&n);printf ("input array A:\n");/*读取原矩阵A*/for(i=1;i<=n;i++)for(j=1;j<=n;j++)scanf("%f",&a[i][j]);printf ("input array B:\n");/*读取列矩阵B*/for(i=1;i<=n;i++)scanf("%f",&b[i]);for(r=1;r<=n;r++)/*求解矩阵L和U*/ {for(i=r;i<=n;i++){s1=0;for(k=1;k<=r-1;k++)s1=s1+l[r][k]*u[k][i];u[r][i]=a[r][i]-s1;}for(i=r+1;i<=n;i++){s2=0;for(k=1;k<=r-1;k++)s2=s2+l[i][k]*u[k][r];l[i][r]=(a[i][r]-s2)/u[r][r];}}printf("array L:\n");/*输出矩阵L*/ for(i=1;i<=n;i++){for(j=1;j<=n;j++)printf("%7.3f ",l[i][j]);printf("\n");}printf("array U:\n");/*输出矩阵U*/ for(i=1;i<=n;i++){for(j=1;j<=n;j++)printf("%7.3f ",u[i][j]);printf("\n");}solve(l,u,b,x,n);printf("解为:\n");for(i=1;i<=n;i++)printf("x%d=%f\n",i,x[i]);}运行结果:input n:3input array A:2 2 34 7 7-2 4 5input array B:3 1 -7array L:1.000 0.000 0.0002.000 1.000 0.000-1.000 2.000 1.000array U:2.000 2.0003.0000.000 3.000 1.0000.000 0.000 6.000解为:x1=2.000000x2=-2.000000x3=1.000000Press any key to continue总结:关键是把矩阵分解为L、U两个三角矩阵,回代过程比较简单。
3:第四章(1)拉格朗日差值多项式;#include<stdio.h>#include<math.h>#define MAX 100void main(){ int i,j,k,m,n,N,mi;float tmp,mx;float X[MAX][MAX],Y[MAX],x[MAX],y[MAX],a[MAX];printf("\n 输入拟合多项式的次数:\n");scanf("%d",&m);printf("\n 输入给定点的个数n及坐标(x,y):\n");scanf("%d",&N);printf("\n");for(i=0;i<N;i++)scanf("%f,%f",&x[i],&y[i]);for(i=0;i<=m;i++){for(j=i;j<=m;j++){tmp=0;for(k=0;k<N;k++)tmp=tmp+pow(x[k],(i+j));X[i][j]=tmp;X[j][i]=X[i][j];}}for(i=0;i<=m;i++){tmp=0;for(k=0;k<N;k++)tmp=tmp+y[k]*pow(x[k],i);Y[i]=tmp;}for(j=0;j<m;j++){for(i=j+1,mi=j,mx=fabs(X[j][j]);i<=m;i++)if(fabs(X[i][j])>mx){mi=i;mx=fabs(X[i][j]);}if(j<mi){tmp=Y[j];Y[j]=Y[mi];Y[mi]=tmp;for(k=j;k<=m;k++){tmp=X[j][k];X[j][k]=X[mi][k];X[mi][k]=tmp;}}for(i=j+1;i<=m;i++){tmp=-X[i][j]/X[j][j];Y[i]+=Y[j]*tmp;for(k=j;k<=m;k++)X[i][k]+=X[j][k]*tmp;}}a[m]=Y[m]/X[m][m];for(i=m-1;i>=0;i--){a[i]=Y[i];for(j=i+1;j<=m;j++)a[i]-=X[i][j]*a[j];a[i]/=X[i][i];}printf("\n 所求的二次多项式为:\n");printf("P(x)=%f",a[0]);for(i=1;i<=m;i++)printf("+(%f)*x^%d",a[i],i);}运行结果:输入拟合多项式的次数:5输入给定点的个数n及坐标(x,y):31,25,34,2所求的二次多项式为:P(x)=1.980417+(0.282759)*x^1+(-0.299937)*x^2+(0.022071)*x^3+(0.016624)*x^4+(-0.0 01934)*x^5Press any key to continue总结:拉格朗日计算公式中,只需要知道各个点即可4:第五章(1)曲线拟合:#include<stdio.h>#include<math.h>#define MAX 100void main(){ int i,j,k,m,n,N,mi;float tmp,mx;float X[MAX][MAX],Y[MAX],x[MAX],y[MAX],a[MAX];printf("\n 输入拟合多项式的次数:\n");scanf("%d",&m);printf("\n 输入给定点的个数n及坐标(x,y):\n");scanf("%d",&N);printf("\n");for(i=0;i<N;i++)scanf("%f,%f",&x[i],&y[i]);for(i=0;i<=m;i++){for(j=i;j<=m;j++){tmp=0;for(k=0;k<N;k++)tmp=tmp+pow(x[k],(i+j));X[i][j]=tmp;}}for(i=0;i<=m;i++){tmp=0;for(k=0;k<N;k++)tmp=tmp+y[k]*pow(x[k],i);Y[i]=tmp;}for(j=0;j<m;j++){for(i=j+1,mi=j,mx=fabs(X[j][j]);i<=m;i++)if(fabs(X[i][j])>mx){mi=i;mx=fabs(X[i][j]);}if(j<mi){tmp=Y[j];Y[j]=Y[mi];Y[mi]=tmp;for(k=j;k<=m;k++){tmp=X[j][k];X[j][k]=X[mi][k];X[mi][k]=tmp;}}for(i=j+1;i<=m;i++){tmp=-X[i][j]/X[j][j];Y[i]+=Y[j]*tmp;for(k=j;k<=m;k++)X[i][k]+=X[j][k]*tmp;}}a[m]=Y[m]/X[m][m];for(i=m-1;i>=0;i--){a[i]=Y[i];for(j=i+1;j<=m;j++)a[i]-=X[i][j]*a[j];}printf("\n 所求的二次多项式为:\n");printf("P(x)=%f",a[0]);for(i=1;i<=m;i++)printf("+(%f)*x^%d",a[i],i);}输入拟合多项式的次数:2输入给定点的个数n及坐标(x,y):51,25,32,48,3-1,5所求的二次多项式为:P(x)=3.952280+(-0.506315)*x^1+(0.050877)*x^2Press any key to continue 5:第六章(1)辛普生求积方法:#include <stdio.h>#define N 16 /* 等分数*/float func(float x){ float y;y=4.0/(1+x*x);return(y);}void gedianzhi(float y[],float a,float h){ int i;for(i=0;i<=N;i++)y[i]=func(a+i*h);}float simpson(float y[],float h){ float s,s1,s2;int i;s1=y[1];s2=0.0;for(i=2;i<=N-2;i=i+2){ s1+=y[i+1]; /* 计算奇数项的函数值之和*/s2+=y[i]; /* 计算偶数项的函数值之和 */}s=y[0]+y[N]+4.0*s1+2.0*s2;return(s*h/3.0);}main(){ float a,b,h,s,f[N+1];scanf("%f,%f",&a,&b);h=(b-a)/( float)N;gedianzhi(f,a,h);s=simpson(f,h);printf("s=%f\n",s);}运行结果:1,3s=1.854590Press any key to continue总结:辛普生算法是一种积分方法,采用三点法插值,如果h 较小的话,误差很小,因为它的插值余项)(2180)()4(4ξf h a b f R ⎪⎭⎫ ⎝⎛--=,辛普生算法比较精确,程序关键是对所取的点的取和,注意 6:第七章(1)改进欧拉法求解常微分方程的初值问题#include <stdio.h>float func(float x,float y){ return(y-x);}float euler(float x0,float xn,float y0,int N){ float x,y,yp,yc,h;int i;x=x0;y=y0;h=(xn-x0)/(float)N;for(i=1;i<=N;i++){ yp=y+h*func(x,y);x=x0+i*h;yc=y+h*func(x,yp);y=(yp+yc)/2.0;}return(y);}main(){ float x0,xn,y0,e;int n;printf("\ninput n:\n ");scanf("%d",&n);printf("input x0,xn:\n ");scanf("%f,%f",&x0,&xn);printf("input y0:\n ");scanf("%f",&y0);e=euler(x0,xn,y0,n);printf("y(%f)=%6.4f",y0,e);}input n:20input x0,xn:1,6input y0:2y(2.000000)=7.0000Press any key to continue (2)四阶龙格—库塔法#include <stdio.h>float func(float x,float y){ return(x-y);}float runge_kutta(float x0,float xn,float y0,int N) { float x,y,y1,y2,h,xh;float d1,d2,d3,d4;int i;x=x0;y=y0;h=(xn-x0)/(float)N;for(i=1;i<=N;i++){ xh=x+h/2;d1=func(x,y);d2=func(xh,y+h*d1/2.0);d3=func(xh,y+h*d2/2.0);d4=func(xh,y+h*d3);y=y+h*(d1+2*d2+2*d3+d4)/6.0;x=x0+i*h; }return(y);}main(){ float x0,xn,y0,e;int N;printf("\ninput n:\n ");scanf("%d",&N);printf("input x0,xn:\n ");scanf("%f,%f",&x0,&xn);printf("input y0:\n ");scanf("%f",&y0);e=runge_kutta(x0,xn,y0,N);printf("y(%f)=%8.6f",y0,e);}input n:10input x0,xn:1,2input y0:5y(5.000000)=2.833863Press any key to continue 2-2 Gauss-Seidel方法#include <math.h>#include<stdio.h>int gsdl(a,b,n,x,eps)int n;double a[],b[],x[],eps;{int i,j,u,v;double p,t,s,q;for(i=0;i<=n-1;i++){u=i*n+i;x[i]=0.0;for(j=0;j<=n-1;j++){v=i*n+j;p=p+fabs(a[v]);}}if(p>=fabs(a[u])){printf(“fail\n”);return(-1);}}p=eps+1.0;while(p>=eps){for(i=0;i<=n-1;i++){t=x[i];s=0.0;for(j=0;j<=n-1;j++){if(j!=i){s=s+a[i*n+j]*x[j];}x[i]=(b[i]-s)/a[i*n+j];q=fabs(x[i]-t)/(1.0+fabs(x[i]));{p=q;}}}return(1);}main(){int i;double eps;static double a[4][4]={{7,2,1,-2}{9,15,3,-2}{-2,-2,11,5}{1,3,2,13}}; static double x[5],b[4]={4,7,-1,0};eps=0.000001;if(dsdl(a,b,4,x,eps)>0){for(i=0;i<=3;i++){printf(“x(%d)=%13.7e\n”,i,x[i]);}}。