《经典C语言实例.pdf》由会员分享,可在线阅读,更多相关《经典C语言实例.pdf(18页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 C 语言经典编程实例 1.输出三个数中最大的数:1#include#include main()double n1,n2,n3,max;printf(“Input 3 real numbers,separate with comma,end with Enter:”);scanf(“%lf,%lf,%lf”,&n1,&n2,&n3);if(n1n2&n1n3)max=n1;else if(n2n1&n2n3)max=n2;else max=n3;printf(“n%.1f”,max);getch();2#include#include main()double n1,n2,n3,n;prin
2、tf(“Input three real numbers,separate with comma,end with Enter:”);scanf(“%lf,%lf,%lf”,&n1,&n2,&n3);if(n1n2)n=n1;n1=n2;n2=n;If(n2n3)n=n2;n2=n3;n3=n;printf(“n%.1f”,n3);getch();2.计算并输出一元二次方程a2+的实根。#include#include#include main()float a,b,c,d,x1,x2;printf(“Input 3 real numbers,separate with blank or En
3、ter,end with Enter:”);scanf(“%f%f%f”,&a,&b,&c);d=b*b-4*a*c;if(d0)x1=(-b+sqrt(d)/(2*a);x2=(-b-sqrt(d)/(2*a);else x1=x2=-b/(2*a);printf(“x1=%f,x2=%f”,x1,x2);getch();3.统计若干个学生成绩中几个人数,计算平均成绩,输出及格人数和平均成绩。#include#include void main()int n,grade,total=0,pass=0,k=0;float ave;printf(“Input the number of stud
4、ents:”);scanf(“%d”,&n);while(k=60)pass+;k+;if(n=0)printf(“No input!”);else ave=(float)total/n;printf(“number of students=%d,pass=%d”,n,pass);printf(“average=%fn”,ave);getch();4.界面颜色输入#include main()enum color Red=4,Green=3,Blue=1,White=15;enum color r=4,g=3,b=1,w=15;textbackground(r);textcolor(g);cl
5、rscr();printf(Thank You!);getch();textbackground(b);textcolor(w);clrscr();printf(Good Bye!);getch();5.从 D 盘根目录中文件 in.dat 读初始化数据,将结果保存到文件 out.dat 中。#include main()FILE*fp1,*fp2;int i=0;double x,y;fp1=fopen(“d:in.dat”,”r”);fp2=fopen(“d:out.dat”,”w”);if(fp1=NULL)printf(“Cant open file”);exit(1);while(i
6、+y)x=x-y;else y=y-x;printf(“%d”,x);7.计算=1+22!+33!+!+近似值,当通项绝对值小于106时停止累加。#include#include#include main()double s=1,term=1,x;int n=1;printf(“x=”);scanf(“%lf”,&x);while(fabs(term)=1e-6)term=term*x/n;s=s+term;n+;printf(“%.5f”,s);getch();8.验证公式f(x)=g(x)是否成立 f(x)=2(24+2+1)g(x)=2+1!=0(2)当x=x0时 若相对误差|f(x0)
7、-g(x0)|/|f(x0)|+|g(x0)|10-6 则认为f(x0)和g(x0)是相等的。#include#include#include main()int n;double delta=1e-6,x,eps,hx,g,f,temp,un;scanf(“%lf%lf”,&x,&eps);hx=x/2;g=exp(hx)*(hx*hx+hx+1);f=1,temp=1,un=1;n=1;while(fabs(un)eps)temp*=hx/n;un=(n*n+1)*temp;f+=un;n+;if(fabs(f-g)/(fabs(f)+fabs(g)delta)printf(“right,
8、x=%.1f,f=%f,g=%fn”,x,f,g);else printf(“wrong,x=%.1f,f=%f,g=%f”,x,f,g);getch();9.判断某一年份是否闰年。满足一下条件之一的年份为闰年:能被4整除但不能被100整除,或能被400整除。int year,leap;scanf(“%d”,&year);leap=year%4=0&year%100!=0|year%400=0;if(leap)printf(“%d is leap year!”,year);简化:leap=!(year%4)&year%100|!(year%400);10.求一元非线性方程的近似实根 求方程 6
9、-5x+4x2-3x3=0在1.0附近的一个近似实根。误差在10-6以内。1牛顿迭代法 公式 xn+1=xn-f(xn)/f(xn)(n=0,1,2)已知初值为x0#include#include#include double f(double x)return 6-x*(5-x*(4-3*x);double f1(double x)return-5+x*(8-9*x);main()double x=1.0,x1,eps=1e-6;do x1=x;x=x1-f(x1)/f1(x1);while(fabs(f(x)=eps);printf(“x=%f”,x);getch();2简单迭代法 公式将
10、方程f(x)=0等价变换为x=g(x)迭代公式:xn+1=g(xn)已知初值x0#include#include#include double f(double x)return 6-x*(5-x*(4-3*x);double g(double x)return(6+4*x*x-3*x*x*x)/5;main()double x=1.0,x1,eps=1e-6;do x1=x;x=g(x1);while(fabs(f(x)=eps);printf(“x=%f”,x);getch();3二分法 在a,b之间有根的情况下,计算其中间点x的值x=(b+a)/2,若|f(x)|或|b-a|即认为x是满
11、足误差要求的一个近似实根,输出x并结束。否则,继续做下步操作。#include#include#include double f(double x)return 6-x*(5-x*(4-3*x);main()double a,b,x,eps=1e-6;do printf(“input a and b:”);scanf(“%lf%lf”,&a,&b);while(f(a)*f(b)0);if(fabs(f(a)1e-6)x=a;else if(fabs(f(b)1e-6)x=b;else while(1)x=(b+a)/2;if(fabs(f(x)eps|fabs(b-a)eps)break;i
12、f(f(a)*f(x)0)b=x;else a=x;printf(“x=%f”,x);getch();4弦截法 与二分法基本相同,仅a,b中间点x的计算公式改为:x=()()()(a)#include#include#include double f(double x)return 6-x*(5-x*(4-3*x);main()double a,b,x,eps=1e-6;do printf(“input a and b:”);scanf(“%lf%lf”,&a,&b);while(f(a)*f(b)0);while(1)x=(a*f(b)-b*f(a)/(f(b)-f(a);if(fabs(f
13、(x)eps|fabs(b-a)eps)break;if(f(a)*f(x)0)b=x;else a=x;x=(a+b)/2;printf(“x=%fn”,x);getch();11.计算定积分的近似值 计算定积分近似值:(2+12+441)dx 1梯形法 基本思路:将积分区间a,b等分为n个小区间,被积函数曲线f(x)、直线y=0、直线x=a和x=b围成的曲边梯形由n个小梯形组成,计算n个小梯形面积之和即为定积分的近似值。每个小梯形的面积为:si=h*(f(xi)+f(xi+1)/2,(i=0,1,2,n)h=(b-a)/n x0=a,xi=a+ih,xn=a+nh=b 梯形法计算公式:()
14、()+()2+(1)+f(1)#include#include double f(double x)return x*x+12*x+4;main()int n,i;double a,b,h,s,x;scanf(“%d%lf%lf”,&n,&a,&b);h=(b-a)/n;s=(f(a)+f(b)/2;x=a;for(i=1;in;i+)x+=h;s+=f(x);printf(“x=%f”,s*h);getch();2矩形法 基本思路类同梯形法#include#include double f(double x)return x*x+12*x+4;main()int n,i;double a,b
15、,h,s,x;scanf(“%d%lf%lf”,&n,&a,&b);h=(b-a)/n;s=0;x=a;for(i=1;i=n;i+)s+=f(x);x+=h;printf(“s=%f”,s*h);getch();3辛普森法 将积分区间a,b等分为2n个小区间。计算公式 ()b a3()+()2+2(+(2 1)=1+(+2)=1#include#include double f(double x)return x*x+12*x+4;main()int n,i;double a,b,h,s,x;scanf(“%d%lf%lf”,&n,&a,&b);h=(b-a)/n/2;s=(f(a)+f(b
16、)/2;for(i=1;i=n;i+)s+=2*f(a+(2*i-1)*h)+f(a+2*i*h);printf(“s=%lfn”,s*(b-a)/3/n);getch();4运用指针调用定积分求解通用函数(这里用的是矩形法求解)。#include#include#include double f(double a,double b,int n,double(*g)(double)h=(b-a)/n;x=a;s=0;for(j=0;jn;j+)x=x+h;s=s+g(x);或 s=s+(*g)(x);return s*h;double f1(double x)return x*x+12*x+4
17、;main()int n;scanf(“%d”,&n);printf(“s=%f”,f(1,2,n,f1);getch();12.穷举法求解问题的一组解。1百钱买百鸡问题。1500年前我国古代著作算经中提出的问题:公鸡每只5钱,母鸡每只3钱,小鸡1钱3只。今有100钱要买100只鸡,有几种买法?#include#include main()int x,y,z;for(x=0;x=20;x+)for(y=0;y=33;y+)z=100-x-y;if(5*x+3*y+z/3=100&z%3=0)printf(“%d,%d,%d”,x,y,z);getch();2甲乙两个兵乓球队比赛,各处3名选手。
18、甲队选手为A、B、C,乙队选手为X、Y、Z。已抽签决定比赛名单。有人向队员打听比赛名单,A说他不和X比,C说他不和X、Z比。编程输出3对选手名单。#include#include main()char I,j,k;for(i=X;i=Z;i+)for(j=X;j=Z;j+)for(k=X;k=Z;k+)if(i!=X&k!=X&k!=Z&i!=j&j!=k&i!=k)printf(“A vs%c,B vs%c,C vs%c”,I,j,k);getch();13.验证哥德巴赫猜想(任何一个大于等于6的偶数等于两个素数之和),验证650范围内所有偶数。#include#include#includ
19、e int prime(int x)double m;int j;m=sqrt(x);for(j=2;j=m;j+)if(x%j=0)return 0;return 1;main()int I,p1,p2;for(i=6;i=50;i+=2)for(p1=3;p1I;p1+=2)if(!prime(p1)continue;p2=i-p1;If(prime(p2)break;if(p1i)printf(“n%d=%d+%d”,I,p1,p2);else printf(“Error!”);getch();14.函数int atoi(char*s)将形参s指向的数字字串转换为一个int类型整数后返回
20、该整数值。#include#include int atoi(char*s);main()printf(“%d”,atoi(“1234”)+1);getch();int atoi(char*s)int i,n=0;for(i=0;si!=0;i+)if(si=0&si9)n=10*n+si-0;return n;15.递归函数执行流程。1计算n!的函数#include#include main()long y;y=fact(4);getch();long fact(int n)if(n=1)return 1;else return n*fact(n-1);2honai塔问题(递归调用函数典型例
21、题)#include#include Void honai(int n,char x,char y,char z)main()honai(3,A,B,C);getch();void honai(int n,char x,char y,char z)if(n=1)printf(“n move%d from%c to%c”,n,x,z);return;else honai(n-1,x,z,y)printf(“n move%d from%c to%c”,n,x,z);honai(n-1,y,x,z);return;3函数void itoa(int n)不用printf函数输出整数n的十进制表示数字字
22、符串。#include void itoa(int n)main()itoa(123);itoa(-012);void itoa(int n)if(n0)putchar(-);n=-n;if(n10)putchar(n+0);else itoa(n/10);putchar(n%10+0);简化:void itoa(int n)if(n0)putchar(-);n=-n;if(n/10)itoa(n/10);putchar(n%10+0);4递归法计算s=x+x2/2!+x3/3!+xn/n!的值 double f1(int n)double f=1;int k;for(k=1;k=n;k+)f
23、*=k;return f;double f(double x,int n)if(n=1)return x;else return f(x,n-1)+pow(x,n)/f1(n);16static局部变量应用举例:计算s=1+1/2!+1/10!值#include#include long f(int n)main()int I;double s=0;for(i=1;i=10;i+)s+=1.0/f(i);printf(“%f”,s);getch();long f(int n)static long s;if(n=1)s=1;else s=s*n;return s;17.统计a数组中储存的数据
24、23,14,54,20,11,84中的数字09各自出现的次数,输出统计结果。#include#include main()int a6=23,14,54,20,11,84,b10=0,j;for(j=0;j6;j+)baj/10+;baj%10+;for(j=0;j0)ai+=n%10;n/=10;p1=a;p2=a+i-1;while(p1p2)if(*p1!=*p2)return 0;p1+;p2-;return 1;19.对一组资料的排序,有以下几种算法:1冒泡法 void sort(int x,int n)int I,j,t;for(i=0;in-1;i+)for(j=0;jxj+1)
25、t=xj;xj=xj+1;xj+1=t;递归法:void sort(int x,int n)int j,t;if(n=1)return;else for(j=0;jxj+1)t=xj;xj=xj+1;xj+1=t;sort(x,n-1);2选择法排序 void sort(int x,int n)int i,j,k,s;for(i=0;in-1;i+)k=i;for(j=i+1;jn;j+)if(xjxk)k=j;if(k!=i)s=xk;xk=xi;xi=s;递归法:void sort(int x,int n)int i,j,k,s;if(n=1)return;else j=0;for(i=1
26、;in;i+)if(xixj)j=i;if(j!=0)k=xj;xj=x0;x0=k;sort(x+1,n-1);3插入法排序 void sort(int x,int n)int i,j,k,t;for(i=1;in;i+)t=xi;for(j=0;xjxi&jj;k-)xk=xk-1;4希尔法#include#include void sort(int x,int n,int p)int a,b,m;if(p0)for(a=p;a=0&m*(x+b);b-=p)*(x+b+p)=*(x+b);*(x+b+p)=m;sort(x,n,p/2);main()int a10=3,2,1,5,9,7
27、,8,6,4,10,pa10=0;int i;for(i=0;i10;i+)pai=ai;sort(pa,10,5);for(i=0;i10;i+)printf(%3d,pai);getch();20查找的几种算法:1线性法查找:#include#include int search(int x,int n,int key)int i;for(i=0;in;i+)if(xi=key)return i;return-1;main()int a=45,67,23,43,45,34,5,23,64,56,k,I,key;scanf(“%d”,&key);k=search(a,10,key);if(k
28、!=-1)printf(“found!%d”,k);else printf(“not found!”);2折半法(二分法)查找(只能在有序表中应用)int search(int x,int low,int high,int key)int mid;while(low=high)mid=(low+high)/2;if(xmid=key)return mid;else if(keyxmid)high=mid-1;else low=mid+1;return-1;21.合并两个有序线性表 函数void merge(int a,int ma,int b,int mb,int c)将a和b指向的两个升序数
29、组归并到c数组并保持升序。ma:a数组元素个数 mb:b数组元素个数#include#include void merge(int a,int ma,int b,int mb,int c)int ic,ib,i,j;for(ic=0;icma;ic+)cic=aic;ic-;for(ib=0;ibcic)c+ic=bib;else for(i=0;i=ic;i+)if(bib=i;j-)cj+1=cj;ci=bib;ic+;main()int i,x5=1,3,5,7,9,y4=2,4,6,8,z10;merge(x,5,y,4,z);for(i=0;i9;i+)printf(“%3d”,zi
30、);getch();22.从线性表中删除指定的数据 函数int delete(int x,int n,int key)在x指向数组元素开始的连续n个元素中查找并删除所有key值,找不到显示”not found”,找到则显示被删除数据数量,函数返回x数组中剩余数据数量。#include#include int delete(int x,int n,int key)int i,j,m=n;for(i=0;in;i+)if(xi=key)for(j=i;jn-1;j+)xj=xj+1;n-;i-;if(n=m)printf(“n not found!”);else printf(“n deleted
31、%d numbers!n”,m-n);return n;main()int a100=45,67,23,43,45,34,5,23,64,56,key,count,i;count=10;scanf(“%d”,&key);count=delete(a,count,key);for(i=0;icount;i+)printf(“%4d”,ai);getch();23.在数组a中存储的55矩阵内查找满足以下条件的数组元素aij:其所在行所有元素值之和等于其所在列所有元素值之和。将满足条件的数组元素行下标和列下标保存到b数组。输出满足条件的数组元素名称。2 8 1 9 4 5 7 1 3 0 7 1 7 5 2 3 2 2 1 5 0 2 1 6 8 a03、a40 满足所有条件#include#include main()int a55=2,8,1,9,4,5,7,1,3,0,7,1,7,5,2,3,2,2,1,5,0,2,1,6,8,b52,i,j,k,sum1,sum2,n=0;for(i=0;i5;i+)for(j=0;j5;j+)sum1=sum2=0;for(k=0;k5;k+)sum1+=aik;sum2+=akj;if(sum1=sum2)bn0=i;bn1=j;n+;for(i=0;in;i+)printf(“a%d%d”,bi0,bi1);getch();
限制150内