c语言案例源程序_第1页
c语言案例源程序_第2页
c语言案例源程序_第3页
c语言案例源程序_第4页
c语言案例源程序_第5页
已阅读5页,还剩51页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、c程序设计源程序(内部资料)主编:刘 云二一三年十月42第一部分 简单 C 程序1.1.1 显示一行文字/*显示一行文字“Welcome to C World!”的程序*/ #include main() printf(”Welcome to C World!n”); 1.1.2 两个整数求和 /*计算并显示两整数之和的程序*/ #include main() int a,b,sum; /*变量声明*/ printf(”Input first integer n”); /*显示提示信息*/ scanf(”%d”,&a); /*读取一个整数*/ printf(”Input second inte

2、ger n”); /*显示提示信息*/ scanf(”%d”,&b); /*读取一个整数*/ sum=a+b; /*两数相加*/ printf(”Sum is %d n”,sum); /*显示两数之和*/return 0; /*返回 0 表示程序成功地结束*/ 1.2.1 算术运算 #include main() printf(“nL1:40%7=%d”, 40%7); printf(“nL2:40%7=%d”, 40%7); printf(“nL3:3.0/-4.0+1.6*2.0/5.0=%f”, 3.0/-4.0+1.6*2.0/5.0); printf(“nL4:2/3*1000=%d

3、”, 2/3*1000); printf(“nL5:2/3*1000=%f”, 2/3*1000); printf(“nL6:2/3*1000=%e”, 2/3*1000); printf(“nL7:2.0/3*1000=%f”, 2.0/3*1000); printf(“nL8:2f/3*1000=%f”, 2f/3*1000); printf(“nL9:Size of 3 is %d”,sizeof(3); printf(“nL10:Size of 3.0 is %d”,sizeof(3.0); 1.2.2 赋值运算 #include main() int k,x,y; k=5; x=k+

4、; /*后缀运算,先把 k 的值赋给 x,然后 k 的值加 1*/ printf(nL1:k=%d,x=%d,k,x); k=5; y=+k; /*前缀运算,先使 k 的值加 1,然后将 k 的值赋给 y */ printf(nL2:k=%d,y=%d,k,y); x=y=5; printf(nL3:-x is %d,y- is %d,-x,y-); k=x=y=5; k=+x-+y; printf(nL4:%d,%d,%d,k,x,y); k=+x+y+; printf(nL5:%d,%d,%d,k,x,y); k=x-+-y; printf(nL6:%d,%d,%d,k,x,y); k=-

5、x+y; printf(nL7:%d,%d,%d,k,x,y); x=y=5; printf(nL8:x+=x-=x*x is %d,x+=x-=x*x); printf(nL9:y+=y-=y*=y is %d ,y+=y-=y*=y); 1.2.3 printf 中输出表列求值 #include void main() int i=8; printf(%d,%d,%d,%d,%dn,+i,-i,i-,i+,-i-); 1.2.4 交换两个变量的值 #include main() int a,b,tem; printf(”Input integer a and bn”); scanf(”%d

6、,%d”,&a, &b); tem=a; a=b; b=tem; printf(”a=%d,b=%dn”,a,b); 1.2.5 四舍五入 #include #include main() double a,b; printf(Input real a n); scanf(%lf,&a); b=floor(a*100+0.5)/100; printf(b=%.2fn,b); 第 二部分 分支程序设计 2.1.1 求绝对值 #include”stdio.h” main() int x, y; scanf(“%d”,&x); y=x; if(xmax) max=b; if(cmax) max=c;

7、 printf(“the maximum is:%dn”,max); min=a; if(minb) min=b; if(minc) min=c; printf(“the minimum is:%dn”,min); 2.2.1 两数的比较 #include”stdio.h” main() int x,y; printf(“input x,y:”); scanf(“%d,%d”,&x,&y); if(xy) printf(“the maximum is:%d”,x); else printf(“the maximum is:%d”,y); 2.2.2 判定一数能否被另一数整除 main() in

8、t x,y; printf(“input x,y:”); scanf(“%d,%d”,&x,&y); if(x%y) printf(“NO”); else printf(“YES”); 2.3.1 分段函数求解 main() int x,y; scanf(“%d”,&x); if (x=0)if(x0) y=x+1; else y=x; else y=x-1; printf(“x=%d,y=%dn”,x,y); 2.3.2 一元二次方程求解 #includemath.h main() float a,b,c,d,a2,x1,x2; printf(Input a,b,cn); scanf (%f

9、,%f,%f,&a,&b,&c); if (a=0) /*解一元一次方程*/ x1=-c/b; printf(root=%fn,x1); /*输出一次方程根*/ else /*解一元二次方程*/ d=b*b-4*a*c; a2=2*a; x1=-b/a2; if(d=0) x2=sqrt(d)/a2; printf(real root:n); /*输出实根*/ printf(root1=%f, root2=%fn,x1+x2,x1-x2); else x2=sqrt(-d)/a2; printf(complex root:n); /*输出复根*/ printf(root1=%f+%fin,x1

10、,x2); printf(root2=%f-%fin,x1,x2); 2.3.3 闰年判断问题 、普通年能被4整除且不能被100整除的为闰年。、世纪年能被400整除的是闰年、对于数值很大的年份,这年如果能整除3200,并且能整除172800则是闰年。如172800年是闰年,86400年不是闰年#include”stdio.h” main() int year,leap=0; /* leap=0:预置为非闰年*/ printf(Please input the year:); scanf(%d,&year); if (year % 100!=0) if (year % 4 = 0) leap=1

11、; else if (year%400=0) leap=1; if (leap) printf(%d is a leap year.n,year); else printf(%d is not a leap year.n,year); 2.3.4 显示学生成绩与等级main() int x; printf(“please input x(0=x100|x=90) printf(“x=%d is grade A!n”,x); elseif (x=80) printf(“x=%d is grade B!n”,x); elseif(x=60) printf(“x=%d is grade C!n”,x

12、); elseprintf(“x=%d is grade D! n”,x); 第 三部分 循环程序设计 3.1.1 累加和 程序 1:应用 for 循环设计 /* for 循环求 s=1*2+2*3+99*100 */ main() long i,s; s=0; for(i=1;i=99;i+) /* 设置循环 i=1,2,99 */ s+=i*(i+1); /* 把通项 i*(i+1)累加到 s 中 */ printf(1*2+2*3+99*100=%ldn,s); 程序 2: 应用 while 循环设计/* while 循环求 s=1*2+2*3+99*100 */ main() long

13、 i,s; i=1;s=0; while(i=99) /* 设置循环 i=1,2,99 */ s+=i*(i+1);i+; /* 把通项 i*(i+1)累加到 s 中 */ printf(1*2+2*3+99*100=%ldn,s); 程序 3: 应用 do while 循环设计 /* do while 循环求 s=1*2+2*3+99*100 */ main() long i,s; i=1;s=0; do s+=i*(i+1);i+; /* 把通项 i*(i+1)累加到 s 中 */ while(i=99); /* 设置循环 i=1,2,99 */ printf(1*2+2*3+99*100

14、=%ldn,s); 3.1.2 代数和 /* 求 s=1-1/2+1/3-1/4+-1/100 */ main() int k,n;float s=0; for(k=1;k=100;k+) if(k%2=1) s+=1.0/k; /* 应用分支实现符号一正一负 */ else s-=1.0/k; printf(s=%9.6f,s); 求C语言编程,e=1+1/1!+1/2!+1/3!+.+1/n!,精确度1e-6#includemain()int n,k;float e;n=1; e=0;k=1;while(n1e-6)e+=n;n=n/(k+1);printf(e=%fn,e);3.1.3

15、递归算法(求阶乘、最大公约数)/* 循环累乘求阶乘 n! */ main() int i,n; long t; scanf(%d,&n); t=1; /* 积变量 t 赋初值 1 */ for(i=1;i=n;i+) t=t*i; /* 循环变量 i 累乘到 t,体现阶乘运算 */ printf(%d!=%ldn,n,t); /* 递归求阶乘 N!*/ float fac(n) int n; long f; if(n=0) f=1; /* 初始条件 */ else f=n*fac(n-1); /* 递归关系 */ return (f); main() int n; long y; printf

16、(input n:); scanf(%d,&n); y=fac(n); printf(%d!=%ldn,n,y); 递归算法(求阶乘、最大公约数)【例】用递归调用函数编写计算f(n)=n!的程序。long fact(int n) if(n0) printf(“n0,data error!”); else if(n=0|n=1)return 1;else return(n*fact(n-1); main() int n; long int p; printf(input n:); scanf(%d,&n); p=fact(n); printf(%d!=%ldn,n,p); 3.2.1 百鸡问题

17、钱买百鸡”鸡翁一,值钱五,鸡母一,值钱三,鸡雏三,值钱一,百钱买百鸡,问翁、母、雏各几何?你的任务是求解下面这个问题。问题是这样描述的:a文钱可买一只公鸡,b文钱可买一只母鸡,c文钱可买d只小鸡。用m文钱买n只鸡,那么有公鸡x只、母鸡y只、小鸡z只。求解出符合题意的x,y,z。设母鸡X只,公鸡Y只,小鸡100-X-Y只, 所以5Y+3X+(100-X-Y)/3=100 且X,Y为整数,所以可以得出正确答案, 有三种情况: 1.公鸡4只,母鸡18只,小鸡78只 2.公鸡8只,母鸡11只,小鸡81只 3.公鸡12只,母鸡4只,小鸡84只main() int x,y,z; for(x=1;x=19;

18、x+) for(y=1;y=33;y+) for(z=1;z=100;z+) if(z%3=0 & x+y+z=100 & 5*x+3*y+z/3=100)printf(x=%d,y=%d,z=%dn,x,y,z); /* 同时满足时打印 */ 3.2.2 解 Pell 方程 /* 解 PELL 方程: x2-ny2=1. */ #include main() int n,m,t; long a,x,y; printf(解 PELL 方程: x2-ny2=1.n); printf(请输入非平方正整数 n:); scanf(%d,&n); m=sqrt(n); if(m*m=n) printf(

19、n 为平方数,方程无正整数解!n); return; printf(解 PELL 方程:x2-%dy2=1n,n); for(y=1;y=10000;y+) /* 实施穷举,约定 10000 内 */a=n*y*y;x=sqrt(a+1); if(x*x=a+1) printf(方程的基本解为:); printf( x=%ld , y=%ldn,x,y); break; 3.3.1 穷举法 编程计算100至999之间有多少个数,其各位数字之和是5。例如:122、131是满足要求的数的两个例子。main()int i,j,k,m,count=0;for (m=100;m=999;m+) i=m/

20、100; /*分离每一位数*/ j=(m-i*100)/10; k=m-i*100-j*10;if (i+j+k=5) /*注意:等于运算符为“=”(两个等号)*/ count+;printf(“%d”,count);3.3.2 累加求和求Sn=a+aa+aaa+aaa(n个a)之值,其中a是一个数字。例如:2+22+222+2222+22222(此时n=5),n由键盘输入。Main( )int a,n,i,sn=0,tn; scanf(“%d,%d”,&a,&n);tn=a;for (i=1;i=n;i+)sn=sn+tn; tn=tn*10+a; printf(“%dn”,sn);3.3.

21、3 质因数分解 /* 质因数分解乘积形式 */ #includemath.h main() long int b,i,k,m,n,w=0; printf(m,n中整数分解质因数.n); printf(请输入 m,n:); scanf(%ld,%ld,&m,&n); for(i=m;i=n;i+) /* i 为待分解的整数 */ printf(%ld=,i); b=i;k=2; while(k1) printf(%ld*,k);continue; /* k 为质因数,返回 */ if(b=1) printf(%ldn,k); k+; if(b1 & b0) a=b;b=r;r=a%b; /* 实

22、施辗转相除 */ printf(最大公约数为:%ldn,b); printf(最小公倍数为:%ldn,k/b); 3.4.2 水仙花数 水仙花数是指一个 n 位数 ( n3 ),它的每个位上的数字的 n 次幂之和等于它本身。(例如:13 + 53 + 33 = 153)main() int i,j,k,n; for(n=100;n1000;n+) i=n/100;j=(n/10)%10;k=n%10; /* 分离 n 各位数字 i,j,k */ if(n=i*i*i+j*j*j+k*k*k) /* 检验是否符合条件 */ printf(%d ,n); 3.4.3 完全数 完全数(Perfect

23、 number),又称完美数或完备数,是一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。#include math.h main() int b,i,k,m,n,c100; long a,s,x,y,d100; printf(求区间x,y中的完全数.); printf(请输入整数 x,y:); scanf(%ld,%ld,&x,&y); printf(%ld,%ld中的完全数有:n,x,y); for(a=x;a=y;a+) s=1;n=0;b=sqrt(a); for(k=2;k=b;k+) /* 试商寻求 a 的因数 k */ if(a%k=0)

24、 s=s+k+a/k;n+;cn=k;dn=a/k; /* a/k 也是 a 的因数 */ if(a=b*b) s=s-b;m=n-1; /* 若 a=b2,去掉一个 b 重复因数 */ else m=n; if(a=s) printf(%ld=1,a); /* 分两段从小到大打印因数之和 */ for(i=1;i=1;i-) printf(+%ld,di); if(a%2=1) printf( 奇完全数!); printf(n); 3.4.4 勾股数 所谓勾股数,一般是指能够构成直角三角形三条边的三个正整数(a,b,c)。 即a2+b2=c2,a,b,cN/* 勾股数组 */ #includ

25、e “math.h” main() long a,b,x,y,z,d,n=0; scanf(“%ld,%ld”,&a,&b); printf(“在%ld,%ld范围内,寻求勾股数组:n”); for(x=a;x=b-2;x+) /* 设 xyz,循环判别 */ for(y=x+1;y=b-1;y+) d=x*x+y*y; z=sqrt(d); if(d=z*z & z=b) n+; printf(“%ld,%ld,%ldn”,x,y,z); printf(“共有%ld 组勾股数。”,n); 3.5.1 金字塔 main() int n,k,m; printf(请输入金字塔的行数 n:); sc

26、anf(%d,&n); for(k=1;k=n;k+) /* 控制循环 n 次,打印 n 行 */ for(m=1;m=50-k;m+) printf(%c,32);/* 每行先打印 50-k 个空格 */ for(m=1;m=2*k-1;m+) printf(%c,42);/* 接着打印 2k-1 个”*” */ printf(n); 3.5.2 空心菱形 #include main() int d,e,n,k,m; printf(请输入菱形的行数 n(奇数):); scanf(%d,&n); d=(n+1)/2; for(k=1;k=n;k+) /* 控制循环 n 次,打印 n 行 */

27、e=fabs(k-d); /* 菱形上下对称,应用 fabs(k-d)函数 ,求浮点x的绝对值 */ for(m=1;m=e+45;m+) printf(%c,32); /* 打印每行前面空格 */ printf(%c,42); /* 打印每行的前一个星号 */ if(ed-1) for(m=1;m=2,nN*)/* Fibonacci 数列递推求解 */ main() int k,n; long s,f50; printf(求数列的第 n 项与前 n 项和,请输入 n:); scanf(%d,&n); f1=1;f2=1;s=2; /* 数组元素与和变量赋初值 */ for(k=3;k=n;

28、k+) fk=fk-1+fk-2; /* 实施递推 */ s+=fk; /* 实施求和 */ printf(F 数列第%d 项为:%ldn,n,fn); printf(F 数前%d 项之和为:%ldn,n,s); 4.1.2 复杂递推数列 /* 2x+3y 递推程序 */ main()int m,n,t,k,i,h,j,w,a30000; printf(n input m:); scanf(%d,&m); a1=1;a2=2;t=2;n=0; for(k=2;k=m;k+) for(i=1;i=k-1;i+) w=2*ak+3*ai; if(w=m & ak!=ai) a+t=w; /* 判断

29、 w 是否为递推项 */ w=2*ai+3*ak; if(w=m & ak!=ai) a+t=w; /* 判断 w 是否为递推项 */ for(j=1;j=m;j+) for(k=1;k=t;k+) if(ak=j) n+;printf(%4d(%3d) ,j,n);break; printf(n n=%d,n); 4.2.1 矩阵的处理(生成矩阵、交换和基本运算)【例】将一个二维数组行和列元素互换,存到另一个二维数组中。#include main() int a23=1,2,3,4,5,6; int b32,i,j; printf(array a:n); for (i=0;i=1;i+) f

30、or (j=0;j=2;j+) printf(%5d,aij); bji=aij; printf(n); printf(array b:n);for (i=0;i=2;i+) for(j=0;j=1;j+) printf(%5d,bij); printf(n); 【例】求一个3*3矩阵对角线元素之和 程序分析:利用双重for循环控制输入二维数组,再将aii累加后输出。# include main()float a33,sum=0;int i,j;printf(please input rectangle element:n);for(i=0;i3;i+)for(j=0;j3;j+)scanf(

31、%f,&aij);for(i=0;i3;i+)sum=sum+aii;printf(duijiaoxian he is %6.2f,sum);【例】 有一个34的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。 #include void main() int i,j,row=0,colum=0,max; int a34=1,2,3,4,9,8,7,6, -10,10,-5,2; max=a00; for (i=0;i=2;i+) for (j=0;jmax) max=aij; row=i; colum=j; printf(max=%d,row=%d,colum=%dn,

32、 max,row,colum); 4.3.1 数制转换 /* 十进制整数转换为 P 进制 */ main() long n;int c,m,k,p,s100;char r16; r10=A;r11=B;r12=C; r13=D;r14=E;r15=F; m=0; printf(n 请输入十进制数 n:); scanf(%ld,&n); printf(n 请输入转换数制 p(2-16):); scanf(%d,&p); printf(%ld)10=(,n); while(n!=0) c=n%p;n=n/p;m+;sm=c; /* 实施除 P 取余 */ for(k=m;k=1;k-) /* 从后

33、往前逐位打印输出 */ if(sk9) printf(%c,rsk); /* 超过 9 时打印相应字母 */ else printf(%d,sk); printf()%dn,p); /* 十进制小数转换为 P 进制 */ main() float n;int c,m,k,p,t,s100;char r16; r10=A;r11=B;r12=C; r13=D;r14=E;r15=F; m=0; printf(n 请输入十进制纯小数 n:); scanf(%f,&n); printf(n 请输入转换数制 p(2-16):); scanf(%d,&p); printf(n 请输入最多转换的位数 t:

34、); scanf(%d,&t); printf(%f)10=(0.,n); while(n!=0 & mt) n=n*p;c=n;n=n-c;m+;sm=c; /* 实施乘 P 取整 */ for(k=1;k9) printf(%c,rsk); /* 每一位超过 9 时打印相应字母 */ else printf(%d,sk); printf()%dn,p); 4.3.2 二分法 一般地,对于函数f(x),如果存在实数c,当x=c是f(c)=0,那么把x=c叫做函数f(x)的零点。 解方程即要求f(x)的所有零点。 先找到a、b,使f(a),f(b)异号,说明在区间(a,b)内一定有零点,然后求

35、f(a+b)/2, 现在假设f(a)0,ab 如果f(a+b)/2=0,该点就是零点,如果f(a+b)/20,同上。通过每次把f(x)的零点所在小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值,这种方法叫做二分法。用二分法求下面方程在(-10,10)之间的根。 2x3-4x2+3x-6=0#include main()float x0,x1,x2,fx0,fx1,fx2;do printf(“Enter x1 & x2:”); scanf(“%f,%f”,&x1,&x2); fx1=x1*(2*x1-4)*x1+3)-6; fx2=x2*(2*x2-4)*x2+3)

36、-6;while (fx1*fx20);dox0=(x1+x2)/2; fx0=x0*(2*x0-4)*x0+3)-6;if (fx0*fx1)=1e-5);printf(“x=%6.2fn”,x0);4.3.3 圆周率 的高精度计算 /* 高精度计算圆周率 */ #include math.h main() float s; int b,x,n,c,i,j,d,l,a5000; printf(n 输入精确位数:); scanf(%d,&x); for (s=0,n=1;nx) break; for (i=0;i=1;j-) /* 按公式分步计算 */ d=2*j+1; for (i=0;i=

37、0;i-) ai=ai*j+b; b=ai/10;ai=ai%10; a0=a0+1;c=a0; for (b=0,i=x+1;i=0;i-) ai=ai*2+b; b=ai/10;ai=ai%10; printf(n pi=%d.,a0); /* 遂位输出计算结果 */ for (l=10,i=1;i=x;i+) printf(%d,ai);l+; if (l%10=0) printf( ); if (l%50=0) printf(n); 4.4.1 排序算法(选择法排序、冒泡法)【例】任意输入n个数,按由小到大的顺序排列并显示输出。(选择法排序)选择排序的思想:将数组中第一个元素的值与其后

38、的所有元素的值进行比较,如果前者大于后者就互换,这样将所有元素中最小值就放在第一个元素中。依次类推,直到最后一个元素为止。#include#define n 5 /*对5个数按升序排列main() int an,i,j,t;printf(input 5 numbern);for(i=0;in-1;i+) for(j=i+1;jaj) t=aj; aj=ai; ai=t; 【例】冒泡法排序(升序) 基本思想:(将相邻两个数比较,小的调到前头) 1)有n个数(存放在数组a(n)中),第一趟将每相邻两个数比较,小的调到前头,经n-1次两两相邻比较后,最大的数已“沉底”,放在最后一个位置,小数上升“浮

39、起”; 2)第二趟对余下的n-1个数(最大的数已“沉底”)按上法比较,经n-2次两两相邻比较后得次大的数; 3)依次类推,n个数共进行n-1趟比较,在第j趟中要进行n-j次两两比较。 #include#define n 10 /*对10个数按升序排列main() int an,i,j,t;printf(input 10 numbersn); for(i=1;in;i+) scanf(%d,&a); printf(n); for(j=1;j=9;j+) /*外循环9次for(i=1;iai+1) t=a;a=ai+1;ai+1=t; printf(the sorted numbers:n); f

40、or(i=1;i=10;i+) printf(%dn,ai); 【例】将一个数组逆序输出。(用第一个与最后一个交换。)#include#define n 5main() int an=9,6,5,4,1,i,temp;printf(n original array:n);for(i=0;iprintf(%4d,ai);for(i=0;itemp=ai;ai=an-i-1;an-i-1=temp;printf(n sorted array:n);for(i=0;iprintf(%4d,ai);4.4.2 查找算法(顺序查找 、折半查找、统计、求和、计数)顺序查找 查找是在程序设计中最常用到的算法

41、之一,假定要从n个整数中查找x的值是否存在,最原始的办法是从头到尾逐个查找,这种查找的方法称为顺序查找。 【例】从键盘上任意输入五个不同的整数存入a数组中,查找关键字x是否在数组a中。 #include#define n 5main() int an;int x,i; for(i=0;i n;i+)scanf(%d,&ai); printf(输入查找关键字x:); scanf(%d,&x); for(i=0;i n;i+) if(x=ai) break; if(in) printf(“关键字在数组中,其位置是:%dn”,i+1);else printf(“关键字%d不在数组中n”,x);【例】折半查找法:输入六个有序(升序)的整数存放在a数组中,查找关键字x是否在数组a中。基本思想:先用“中间元素”与关键字比较,若相等,则找到;若关键字的值大于“中间元素”的值,则用右半部分的“中间元素”再与关键字比

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论