版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C程序设计源程序(内部资料)主编:刘云二〇一三年十月第一部分简单C程序1.1.1显示一行文字产显示一行文字“WelcometoeWorld!”的程序・/#include<stdio.h>main()(prinは”WelcometoCWorld!\n',);}1.1.2两个整数求和/・计算并显示两整数之和的程序・/#include<stdio.h>main(){inta,b,sum;/・变量声明・/printf(?,Inputfirstinteger 显示提示信,息・/scanfC'%d",&a);/*读取ー个整数・/printfflnputsecondinteger\ガ’);/・显示提示信息・/scanf("%d”,&b);/*读取ー个整数字/sum=a+b;/・两数相カロ*/printf("Sumis%d'n”,sum);/*显示两数之和*/return〇;/・返回〇表示程序成功地结束*/)1.2.1算术运算#include<stdio.h>main()(printf("\nLI:40%%7二%d”,40%7);printf("\nL2:40%7=%d”,40%7);printfCu\nL3:3.O/-4.O+1,6*2.O/5,O=%f\3.0/-4.0+1.6*2,0/5.0);printf(t4\nL4:2/3*l000=%dM,2/3*1000);printf("\nL5:2/3*1000=%ド,2/3*1000);printf('ヘnL6:2/3*1000二%e“,2/3*1000);printf("\nL7:2.0/3*1000二%ド,2.0/3*1000);printf("\nL8:2f/3*1000二%ド,2173*1000);printf(l<\nL9:Sizeof3is%dM,sizeof(3));printf(uu\nL10:Sizeof3.0is%d”,sizeof(3.0));)1.2.2赋值运算#include<stdio.h>main()Iintk,x,y;k=5;x=k++;/*后缀运算,先把k的值赋给x,然后k的值加1*/printf("\nLl: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(,z\nL3:--xis%d,y--is%d”,--x,y一);k=x=y=5;k=++x-++y;printf(,z\nL4:%d,%d,%d”,k,x,y);k=++x+y++;printf("\nL5:%d,%d,%d”,k,x,y);k=x一+-y;printf(zz\nL6:%d,%d,%d”,k,x,y);kニーx+++y;printf('\nL7:%d,%d,%d,z,k,x,y);x=y=5;printf("\nL8:x+=x-=x*xis%d〃,x+=x-=x*x);printf(〃、nL9:y+=y-=y*二yis%dzz,y+=y-=y*=y);}3printf中输出表列求值#include<stdio.h>voidmain(){inti=8;printf(z%d,%d,%d,%d,%d\n〃,++i,--i,i--,i++,-i--);}4交换两个变量的值#include<stdio.h>main(){inta,b,tem;printf("Inputintegeraandb\n’');scanfC'%d,%d",&a,&b);tem=a;a=b;b=tem;printf(,,a=%d,b=%d\n,,,a,b);)5四舍五入#include<stdio.h>#include<math.h>main(){doublea,b;printf(MInputreala\nM);scanf("%lf\&a);b=noor(a*100+0.5)/100;printf(Hb=%.2f\nH,b);}第二部分分支程序设计2.1.1求绝对值#inchide"stdio.h"main(){intx,y;scanf("%d",&x);y=x;if(x<0)y=-x;printf(66x=%d,lxl=%d\n,,,x,y);}1.2显示三数中的奇数main()(intx,y,z;printf(uinputx,y,z:");scanf(a%dy%d,%d”,&x,&y,&z);if(x%2)printf(u%disoddnumber!\nv,x);if(y%2)printf("%disoddnumber!\n,y);if(z%2)printf("%disoddnumber!\nn,z);2.1.3三数中取极值main()(inta,b,c,max,min;printf("inputa,b,c:v;scanf("%d,%d,%d",&a,&b,&c);max=a;if(b>max)max=b;if(c>max)max=c;printf("themaximumis:%d\nx,,max);min=a;if(min>b)min=b;if(min>c)min=c;printf("theminimumis:%d\nM,min);2.2.1两数的比较#include”stdio.h"main()(intx,y;printf("inputx,y:");scanf("%d,%d”,&x,&y);if(x>y)printf("themaximumis:%dn,x);elseprintf("themaximumis:%d”,y);}2.2.2判定一数能否被另ー数整除main()printf("inputx,y:“);scanf("%d,%d",&x,&y);if(x%y)printf(“NO”);elseprintf("YES");}3.1分段函数求解main(){intx,y;scanf("%d",&x);if(x>=0)if(x>0)y=x+l;elsey=x;elsey=x-l;printf("x二%d,y二%d\n",x,y);}2.3.2一元二次方程求解#includenmath.hHmain(){floata,b,c,d,a2,xl,x2;printf(r,Inputa,b,c\n");scanf(”%f,%f,%f”,&a,&b,&c);if(a==0)/米解一元一次方程・/(xl="c/b;printf("root=%f\n”,x1);/*输出一次方程根・/}else/・解一元二次方程・/{d=b求b-4*a*c;a2=2*a;xl=-b/a2;if(d>=0)(x2=sqrt(d)/a2;printf(Mrealroot:\n");/・输出实根・/printf(,,rootl=%f,root2=%f\n',,xl+x2,xl-x2);)else(x2=sqrt(-d)/a2;printf(Hcomplexroot:\n");/*输出复根・/printf(,,rootl=%f+%fi\nM,xl,x2);printf("root2=%f-%fi\n',,xl,x2);3.3闰年判断问题①、普通年能被4整除且不能被100整除的为闰年。②、世纪年能被400整除的是闰年③、对于数值很大的年份,这年如果能整除3200,并且能整除172800则是闰年。如!72800年是闰年,86400年不是闰年#include**stdio.hMmain(){intyear,leap=0;/*leap=0:预置为非闰年・/printf("Pleaseinputtheyear:");scanf("%d",&year);if(year%100!=0){if(year%4==0)leap=1;}else{if(year%400==0)leap=1;}if(leap)printf("%disaleapyear.\n",year);elseprintf("%disnotaleapyear.\n",year);)3.4显示学生成绩与等级main()(intx;printf("pleaseinputx(0<=x<=l(X)):^^);scanf("%d”,&x);if(x>100llx<0)printf(Mx=%ddataerror!\n",x);elseif(x>=90)printfC4x=%disgradeA!\n",x);elseif(x>=80)printf(<<x=%disgradeB!\n",x);elseif(x>=60)printfC4x=%disgradeC!\n",x);elseprintf(<<x=%disgradeD!\n",x);}}第三部分循环程序设计1.1累加和程序1:应用for循环设计/*for循环求s=l*2+2*3+…99*10〇・/main(){longi,s;s=0;for(i=l;i<=99;i++)/・设置循环i=l,2,•••,99*/s+=i*(i+D;/*把通项i*(i+l)累加到s中・/printf(〃l*2+2*3+…+99*100=%ld\n”,s);)程序2:应用while循环设计/*while循环求s=1*2+2*3+-,,+99*100*/main(){longi,s;i=l;s=0;while(i<=99)/*设置循环i=l,2,…,99*/{s+=i*(i+l);i++;}/・把通项i*(i+l)累加到s中・/printf("l*2+2*3+…+99*100或Id\n",s);}程序3:应用dowhile循环设计/*dowhile循环求s=l*2+2*3+…+99*10〇・/main(){longi,s;i=l;s=0;do{s+=i*(i+l);i++;}/・把通项i*(i+l)累加到s中・/while(i<=99);/*设置循环i=l,2,•,,,99*/printfCl*2+2*3+―+99*100=%ld\n",s);}1.2代数和/・求s=l-l/2+l/3-l/4+--l/100*/main(){intk,n;floats=0;for(k=l;k<=100;k++)if(k%2=l)s+=1.0/k;/・应用分支实现符号一正一负・/elses-=l.0/k;printf(,zs=%9.6f”,s);}求C语言编程,e=l+l/l!+1/2!+l/3!+...+l/n!,精确度le-6#includeくstdio.h>mainOintn,k;floate;n=l;e=0;k=l;while(n<le-6)(e+=n;n=n/(k+l);)printf("e=%f\n”,e);1.3递归算法(求阶乘、最大公约数)/・循环累乘求阶乘n!*/main(){inti,n;longt;scanf("%d",&n);t=l;/・积变量t赋初值1*/for(i=l;i<=n;i++)t=t*i;/・循环变量i累乘到t,体现阶乘运算・/printf(/z%d!=%ld\nz\n,t);)/・递归求阶乘N!*/floatfac(n)intn;{longf;if(nニニ〇)f二1;/・初始条件・/elsef二n*fac(nT);/・递归关系・/return(f);)main(){intn;longy;printf("inputn:");scanf1%d”,&n);y=fac(n);printf(*%d!=%ld\n*,n,y);}递归算法(求阶乘、最大公约数)【例】用递归调用函数编写计算f(n)=n!的程序。longfact(intn)Iif(n<0)printf(un<0,dataerror!M);elseif(n=0||n二l)return1;elsereturn(n*fact(n-l));}main(){intn;longintp;printf("inputn:");scanf("%d",&n);p二fact(n);printf("%d!=%ld\n",n,p); )1百鸡问题钱买百鸡,,鸡翁一,值钱五,鸡母ー,值钱三,鸡雏三,值钱ー,百钱买百鸡,问翁、母、雏各几何?你的任务是求解下面这个问题。问题是这样描述的: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为整数,所以可以得出正确答案,有三种情况:.公鸡4只,母鸡18只,小鸡78只.公鸡8只,母鸡11只,小鸡81只.公鸡12只,母鸡4只,小鸡84只main(){intx,y,z;for(x=l;x<=19;x++)for(y=l;y〈=33;y++)for(z=l;z<=100;z++)if(z%3==0&&x+y+z==100&&5*x+3*y+z/3==100)printf(*x=%d,y=%d,z=%d\n”,x,y,z);/・同时满足时打印*/)3.2.2解Pel!方程/・解PELL方程:x'2-ny'2=l.*/^include<math.h>main(){intn,m,t;longa,x,y;printf("解PELL方程:x'2-ny"2=l.\n*):printf("请输入非平方正整数n:");scanf("%d",&n);m=sqrt(n);if(m*m==n){printf("n为平方数,方程无正整数解!、n");return;}printf("解PELL方程:x-2-%dy-2=l\n",n);for(y=1;y<=10000;y++)/・实施穷举,约定10000内・/{a=n*y*y;x=sqrt(a+l);if(x*x==a+l){printf("方程的基本解为:つ;printf("x=%ld,y=%ld\n”,x,y);break;}3.3.I穷举法编程计算100至999之间有多少个数,其各位数字之和是5。例如:122、131是满足要求的数的两个例子。main(){inti,j,k,m,count=0;for(m=100;m<=999;m++)(i=m/100; /・分离每一位数・/j=(m-i*100)/10;k=m-i*100-j*10;if(i+j+k=5) /・注意:等于运算符为“二"(两个等号)*/count++;)printfcount);}3.3.2累加求和求Sn=a+aa+aaa+-+aa-a(n个a)之值,其中a是一个数字。例如:2+22+222+2222+22222(此时n=5),n由键盘输入。Main(){inta,n,i,sn=0,tn;scanf("%d,%d",&a,&n);tn=a;for(i=l;i<=n;i++)(sn=sn+tn;tn=tn*10+a;printf("%d\n",sn);3.3.3质因数分解/・质因数分解乘积形式・/ttinclude^math.h"main(){longintb,i,k,m,n,w=0;printf(*[m,n]中整数分解质因数.\n");printf("请输入m,n:");scanf(z/%ld,%ld/z,&m,&n);for(i=m;i<=n;i++)/*i为待分解的整数・/{printf("%ld=",i);b=i;k=2;while(k<=sqrt(i))/*k为试商因数・/{if(b%k==O){b=b/k;if(b>l){printf("%ld*",k);continue;}/*k为质因数,返回・/if(b==l)printf("%ld\n",k);}k++;}if(b>l&&b<i)printf("%ld\n",b);/・输出大于i平方根的因数・/if(b==i){printf("(素数!)、n");w++;}/*b=i,表示i无质因数・/}printf("其中共%d个素数.\n",w);3.4.1最大公约与最小公倍数main(){longinta,b,r,k;scanf("%ld,%ld",&a,&b);k=a*b;r=a%b;while(r>0){a=b;b=r;r=a%b;}/・实施辗转相除・/printf("最大公约数为:%ld\nzz,b);printf("最小公倍数为:%ld\n",k/b);3.4.2水仙花数水仙花数是指ー个「位数(n23),它的每个位上的数字的n次幕之和等于它本身。(例如:「3+5c3+3A3=153)main(){inti,j,k,n;for(n=100;n<1000;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);})4.3完全数完全数(Perfectnumber),又称完美数或完备数,是ー些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和(即因子留数),恰好等于它本身。ttinclude"math,h”mainO{intb,i,k,m,n,c[100];longa,s,x,y,d[100];printf(“求区间[x,y]中的完全数.");printf("请输入整数x,y:");scanf("%ld,%ld",&x,&y);printf("[%ld,%ld]中的完全数有:、n",x,y);for(a=x;a<=y;a++){s=l;n=0;b=sqrt(a);for(k=2;k<=b;k++)/・试商寻求a的因数k*/if(a%k==0){s=s+k+a/k;n++;c[n]=k;d[n]=a/k;}/*a/k也是a的因数・/if(a==b*b){s=s-b;m=n-l;}/・若a=ビ2,去掉ー个b重复因数*/elsem=n;if(a==s){printf("%ld=l",a);/・分两段从小到大打印因数之和・/for(i=l;i<=n;i++)printf("+%d",c[i]);for(i=m;i>=l;i--)printf("+%ld",d[i]);if(a%2==l)printf("奇完全数!");printf("\n");}})3.4.4勾股数所谓勾股数,一般是指能够构成直角三角形三条边的三个正整数(a,b,c)。
BPa2+b2=c2,a,b,cGN/・勾股数组・/#include"math,h”main(){longa,b,x,y,z,d,n二〇;scanf(<4%ld,%ldM,&a,&b);printf("在国ld,%ld]范围内,寻求勾股数组:\n");for(x=a;x<=b-2;x++)/・设xくyくz,循环判别*/for(y=x+l;y<=b-l;y++){d=x*x+y*y;z=sqrt(d);if(d==z*z&&z<=b){n++;printf(u%ld,%ld,%ld\nM,x,y,z);})printf("共有%Id组勾股数。",n);}3.5.1金字塔main(){intn,k,m;printf(“请输入金字塔的行数n:つ;scanf("%d",&n);for(k=l;k<=n;k++)/・控制循环n次,打印n行・/{for(m=l;m<=50-k;m++)printf(*%c*,32);/・每行先打印50-k个空格・/for(m=l;m<=2*k-l;m++)printf("枇”,42);/・接着打印2k-1个"*"*/printf("\n");})5.2空心菱形#includeくmath.h>main(){intd,e,n,k,m;printf("请输入菱形的行数n(奇数):〃);scanfC%d*,&n);d=(n+l)/2;for(k=l;kく=n;k++)/・控制循环n次,打印n行・/{e=fabs(k-d);/・菱形上下对称,应用fabs(k-d)函数,求浮点x的绝对值・/for(m=1;m<=e+45;m++)printf("%c”,32);/*打印每行前面空格・/printf("%c”,42);/*打印每行的前一个星号・/if(e<d-l){for(m=l;m<=2*(d-e)-3;m++)printfC%c",32);/*打印中间空格・/printf('%c',42);}/・打印中间各行的后一个星号・/printf(*\n*);}第4部分数组程序设计1.1Fibonacci数列在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,Fl=l,Fn=F(n-l)+F(n-2)(n>=2,n《N*)/"Fibonacci数列递推求解・/main(){intk,n;longs,f[50];printf("求数列的第n项与前n项和,请输入n:");scanf(*%d*,&n);f[l]=l;f[2]=l;s=2;/・数组元素与和变量赋初值・/for(k=3;k<=n;k++){f[k]=f[k-l]+f[k-2];/・实施递推*/s+=f[k];}/・实施求和・/printfCF数列第%d项为:%ld\n〃,n,f[n]);printf("F数前%d项之和为:%ld\n”,n,s);)1.2复杂递推数列/*2x+3y递推程序・/main(){intm,n,t,k,i,h,j,w,a[30000];printf(,\ninputm:");scanf("%d",&m);a[1]=1;a[2]=2;t=2;n=0;for(k=2;kく=m;k++){for(i=l;i<=k-l;i++){w=2*a[k]+3*a[i];if(w<=m&&a[k]!=a[i])a[++t]=w;/・判断w是否为递推项・/w=2*a[i]+3*a[k];if(w<=m&&a[k]!=a[i])a[++t]=w;}}/・判断w是否为递推项・/for(j=l;j<=m;j++){for(k=l;k<=t;k++)if(a[k]==j){n++;printf(*%4d(%3d)”,j,n);break;}}printf("\nn=%d",n);4.2.1矩阵的处理(生成矩阵、交换和基本运算)【例】将一个二维数组行和列元素互换,存到另一个二维数组中。ftinclude<stdio.h>main()(inta[2][3]={{1,2,3},{4,5,6}};intb[3][2],i,j;printf("arraya:\n,z);for(i=0;i<=l;i++){for(j=O;j<=2;j++){printf("%5d",a[i][j]);b[J][i]=a[i][j];}printf("\n");}printf(warrayb:\n'z);for(i=0;i<=2;i++)(for(j=0;j<=l;j++)printf("%5dzz,b[i][j]);printf(zz\nH);}}【例】求・个3*3矩阵对角线元素之和程序分析:利用双重for循环控制输入二维数组,再将a[i][i]累加后输出。#include<stdio.h>main()floata[3][3],sum=0;intij;printf("pleaseinputrectangleelement:\n");for(i=0;i<3;i++)for(j=0;j<3;j++)scanf("%俨,&a[i皿);for(i=0;i<3;i++)sum=sum+a[i][i];printf("duijiaoxianheis%6.2f"/sum);【例】有一个3义4的矩阵,要求编程序求出其中值最大的那个元素的值,以及其所在的行号和列号。include<stdio.h>voidmain()(inti,j,row=0,colum=0,max;inta[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};max=a[〇][0];for(i=0;i<=2;i++)for(j=0;j<=3;j++)if(a[i][j]>max){max=a[i][j];row=i;colum=j;)printf(,fmax=%d,row=%d,colum二%d\n,
max,row,colum);}4.3.1数制转换/・十进制整数转换为P进制*/main(){longn;intc,m,k,p,s[100];charr[16];r[10]=K;r[ll]=B1;r[12]=C;r[13]= ;r[14]=E*;r[15]=FJ;m二〇;printf("\n请输入十进制数n:;scanf&n);printf(*\n请输入转换数制p(2-16)0;scanf&p);printfC(%ld)10=C,n);while(n!=0){c=n%p;n=n/p;m++;s[m]=c;}/・实施除P取余・/for(k=m;k>=l;k-)/・从后往前逐位打印输出・/if(s[k]>9)printf(*%c*,r[s[k]]);/*超过9时打印相应字母*/elseprintf(*%d*,s[k]);printf(")%d\n”,p);/・十进制小数转换为P进制・/main(){floatn;intc,m,k,p,t,s[100];charr[16];r[10]='A';r[ll]二'B';r[12]='C';r[13]=,D';r[14]='E';r[15]='F';m=0;printf("Xn请输入十进制纯小数n:");scanf("%f",&n);printf("\n请输入转换数制p(2T6);scanf&p);printf("\n请输入最多转换的位数t:");scanf("%d",&t);printfC(%f)10=(0.n);while(n!=0&&m<t){n=n*p;c=n;n=n-c;m++;s[m]=c;}/・实施乘P取整・/for(k=l;k<=m;k++)/・从前往后逐位打印输出・/if(s[k]>9)printf(*%c*,r[s[k]]);/*每一位超过9时打印相应字母*/elseprintf(*%d*,s[k]);printf(')%d\n”,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)内一定有零点,然后求f[(a+b)/2],现在假设f(a)く〇,f(b)>0,aくb如果f[(a+b)/2]二〇,该点就是零点,如果f[(a+b)/2]く〇,则在区间((a+b)/2,b)内有零点,按上述方法在求该区间中点的函数值,这样就可以不断接近零点如果f[(a+b)/2]>0,同上。通过每次把f(x)的零点所在小区间收缩一半的方法,使区间的两个端点逐步迫近函数的零点,以求得零点的近似值,这种方法叫做二分法。用二分法求下面方程在(T0,10)之间的根。2x3-4x2+3x-6=0#include<math.h>main(){floatxO,xl,x2,fxO,fxl,fx2;doprintf(wEnterxl&x2:");scanfド%f,%f",&xl,&x2);fxl=xl*((2*xl-4)*xl+3)-6;fx2=x2*((2*x2-4)*x2+3)-6;)while(fxl*fx2>0);do{x0=(xl+x2)/2;fx0=x0*((2*x0-4)*x0+3)-6;if((fxO*fxl)<O){x2=x0;fx2=fxO;}else{xl=xO;fxl=fxO;}}while(fabs(fx0)>=le-5);printf(Hx=%6.2f\n",xO);)3.3圆周率n的高精度计算/・高精度计算圆周率れ*/ttinclude"math.h〃main(){floats;intb,x,n,c,i,j,d,1,a[5000];printf("\n输入精确位数:");scanf("%d",&x);for(s=0,n=l;n<=5000;n++)/・累加确定计算的项数・/{s=s+log((2*n+l)/n);if(s/log(10)>x)break;}for(i=0;i<=x+l;i-H-)a[i]=0;for(c=l,j=n;j>=l;j-)/・按公式分步计算・/{d=2*j+l;for(i=0;iく=x;i++){a[i]=c/d;c=(c*d)*10+a[i+l];}a[x+l]=c/d;for(b=0,i=x+l;i>=0;i—){a[i]=a[i]*j+b;b=a[i]/10;a[i]=a[i]%10;)a[0]=a[0]+1;c=a[0];)for(b=0,i=x+l;i>=0;i—){a[i]=a[i]*2+b;b=a[i]/10;a[i]=a[i]%10;}printf(*\npi=%d.*,a[0]);/・遂位输出计算结果・/for(1=10,i=l;i<=x;i++){printfa[i]);1++;if(l%10—0)printf「ッ;if(l%50==0)printf("\n");}}1排序算法(选择法排序、冒泡法)【例】任意输入n个数,按由小到大的顺序排列并显示输出。(选择法排序)选择排序的思想:将数组中第一个元素的值与其后的所有元素的值进行比较,如果前者大于后者就互换,这样将所有元素中最小值就放在第一个元素中。依次类推,直到最后一个元素为止。#include<stdio.h>^definen5 /・对5个数按升序排列main()(inta[n],i,j,t;printf(input5number'n");for(i=0;i<n-l;i++)for(j=i+l;j<n;j++)if(a[i]>a[j]){t=a[j];a[j]=a[i];a[i]=t;)【例】冒泡法排序(升序)基本思想:(将相邻两个数比较,小的调到前头)1)有n个数(存放在数组a(n)中),第一趟将每相邻两个数比较,小的调到前头,经n-1次两两相邻比较后,最大的数已“沉底”,放在最后ー个位置,小数上升“浮起”;2)第二趟对余下的n-1个数(最大的数已“沉底”)按上法比较,经n-2次两两相邻比较后得次大的数;3)依次类推,n个数共进行n-1趟比较,在第j趟中要进行n-j次两两比较。#include<stdio.h>#definen10 /・对10个数按升序排列main()(inta[n],i,j,t;printf("input10numbers\n");for(i=l;i<n;i++)scanf("%d",&a);printf("\n");for(j=l;j<=9;j++)/*外循环9次for(i=l;i<10-j;i++)/・内循环if(a[i]>a[i+l]){t=a;a=a(i+l];a[i+l]=t;}printf("thesortednumbers:\n");for(i=l;i<=10;i++)printf("%dnH,a[i]);}【例】将一个数组逆序输出。(用第一个与最后一个交换。)#include<stdio.h>#definen5main(){inta[n]={9,6,5,4,1},i,temp;printf(zz\noriginalarray:\n*);for(i=0;iprintf("%4d",a[i]);for(i=0;i{temp=a[i];a[i]=a[n-i-l];a[n-i-l]=temp;}printf(zz\nsortedarray:\n");for(i=0;iprintf("%4d",a[i]);4.4.2査找算法(顺序査找、折半査找、统计、求和、计数)顺序査找查找是在程序设计中最常用到的算法之一,假定要从n个整数中查找x的值是否存在,最原始的办法是从头到尾逐个查找,这种查找的方法称为顺序查找。【例】从键盘上任意输入五个不同的整数存入a数组中,查找关键字x是否在数组a中。#include<stdio.h>#definen5main()(inta[n];intx,i;for(i=0;i<n;i++)scanf(”%d”,&a[i]);printf(“输入査找关键字x:");scanf("%d",&x);for(i=0;i<n;i++)if(x==a(i])break;if(i<n)printf("关键字在数组中,其位置是:%d\n〃,i+l);elseprintf(〃关键字%d不在数组中、n〃,x);)【例】折半查找法:输入六个有序(升序)的整数存放在a数组中,查找关键字x是否在数组a中。基本思想:先用“中间元素”与关键字比较,若相等,则找到;若关键字的值大于“中间元素”的值,则用右半部分的“中间元素”再与关键字比较;否则,用左半部分的“中间元素”再与关键字比较。#include<stdio.h>#definen7main()(inta[n];intx,しhigh,low,mid;for(i=0;i<n;i++)scanf("%d",&a[i]);printf("输入査找关键字x:");scanf("%d”,&x);low=0;high=6while(low<=high){mid=(low+high)/2;if(x<a[mid])high=mid-l;elseif(x>a[mid])low=mid+l;elsebresk;)if((low<=high))printf(〃关键字在数组中的位置是:%d\nウmid);elseprintf("关键字%d不在数组中'n”,x);}分析过程:a[0] a[l] a[2] a[3] a[4] a[5] a[6]20 30 35 45 50 60 70low=0 mid=(low+high)/2high=64.4.3有序数列的插入、删除操作(字符串的插入删除也类似)把ー个整数按大小顺序插入已排好序的数组中。为了把ー个数按大小插入已排好序的数组中,应首先确定排序是从大到小还是从小到大进行的。设排序是从大到小进序的,则可把欲插入的数与数组中各数逐个比较,当找到第一个比插入数小的元素1时,该元素之前即为插入位置。然后从数组最后ー个元素开始到该元素为止,逐个后移ー个单元。最后把插入数赋予元素i即可。如果被插入数比所有的元素值都小则插入最后位置。【例】将无序数从大到小排列#include<stdio.h>main()|inti,j,p,q,s,n/a[ll]={127,3,6,28,54,68,87,105,162,18);for(i=0;i<10;i++){p=i;q=a[i];for(j=i+l;j<10;j++)if(q<a[j]){p=j;q=a[j];}if(p!=i){s=a川;a[i]=a[p];a[p]=s;}printf("%d",a[i]);|printf("\ninputnumberin'');scanf("%d",&n);for(i=0;i<10;i++)if(n>a[i])for(s=9;s>=i;s—)a[s+l]=a[s];break;}a[i]=n;for(i=0;i<=10;i++)printf("%d",a[i]);printf("\n");}【例】在ー个有序的数列中找到ー个数并且删除它。#include<stdio.h>main(){inta[7]={0,l,2,3,5,6},i,k,j;for(k=0;k<6;k++)printf("%d",a[k]);printf("\nH);printf("Pleaseinputthenumbertodelete:H);scanf(”%d”,&i);for(k=0;k<6;k++){if(i==a[k])(for(j=k;j<5;j++)a[j]=a[j+l];break;})if(k==6)printf('*Thenumbernotfound");printf("Thesortedis:\n");for(k=O;k<5;k++)printf("%d"戸[k]);getch();}第五部分函数程序设计5.1.1求X#include"stdio.h"doublepow(doublex,intn)/・函数的定义在main。之前时不需要声明・/{doubley;inti;y=l;if(n==0)}return1.0;elseif(n>0){for(i=l;i<=n;i++)y=y*x;returny;)else{for(i=l;i<=-n;i++)y=y*x;return1/y;)main()(intx,y;printf(*inputx:");scanf &x);printf(*inputn:");scanf &y);printf("result:%f\n”,pow(x,y));5.1.2万年历^include<stdio.h>main()(inti,j,day,year,temp,tempi;longintYeardays:)longintsumdays(intyear);/・函数定义在main()之后,在main()中要声明・/intIsLeapYear(intyear);/・函数声明的格式和定义函数时的头ー样・/intmonth_day[]={0,31,28,31,30,31,30,31,31,30,31,30,31,29},everyday[6][14];/・此数组用来保存计算所得的日历・/printf("Pleaseentertheyear:");scanf("%d",&year);Year_days=sumdays(year);/・调用函数sumdays()计算天数,year是实在参数・/for(temp=l;temp<=6;temp++) /・分6次输出12个月的日历・/(for(i=0;i<6;i++)for(j=0;j<14;j++)everyday[i][j]=0;switch(temp)/・一行输出二个月份・/case1:printf(zz\tJanuary%d\t\tFebruary%d\n,year,year);break;case2:printf(*\tMarch %d\t\tApril %d\n*,year,year);break;case3:printf(*\tMay%d\t\tJune%d\n/z,year,year);break;case4:printf(*\tjuly%d\t\tAugust%d\n*,year,year);break;case5:printf〈\tSeptember%d\t\tOctober%d\n,year,year);break;case6:printf(*\tNovember%d\t\tDecember%d\n*,year,year);break;printf("MonTueWedThuFriSatSunMonTueWedThuFriSatSun\n");i=j=0;for(temp_i=0;temp_i<(Year_days%7);temp_i++)/・初始化数组・/everyday[0][j++]=0;day=1;while(dayく=month_day[2*tempT]) /・把奇数月的日历输入数组・/(if(j%7==0)j=0,i++;everyday[i][j++]=day;Yeardays++;day++;i=。,j=7;for(temp_i=0;temp_i<(Yeardays%7);tempi++)/・初始化数组・/everyday[0][j++]=0;day=l;if(IsLeapYear(year)&&2*temp==2)/・调用函数判断是否是闰年・/while(day<=month_day[13]) /・把闰年偶数月的日历输入数组*/|if(j%14==0)j=7,i++;everyday[i][j++]=day;Year_days++;day++;}elsewhile(day<=month_day[2*temp])/・把偶数月的日历输入数组・/if(j%14==0)j=7,i++;everyday[i][j++]=day;Year_days++;day++;}for(i=0;i<6;i++) /・输出存储在数组中的日期・/(for(j=0;j<14;j++){if(everyday[i][j]!=0)printf("%-4d”,everyday[i][j]);elseprintfC");if(j=6)printf(*つ;}printf('\n");}if(getch()=-q)exit(0);)getchO;)intIsLeapYear(intyear)/・定义函数IsLeapYear()用来判断是否是闰年・/{if((year%4==0)&&(year%100!=0)||(year%400=0))return1;elsereturn0;}longintsumdays(intyear)/・定义函数sumdays()计算输入年份之前的天数・/(intyearstart=l,leapsum=0;while(year_start<year){if(IsLeapYear(year_start))/・调用函数IsLeapYear()判断是否是闰年・/leapsum++;year_start++;return366*leapsum+365*(year-leapsum);5.2.1求最小值#include<stdio.h>main(){intx,y,z,min;intmintwo(int,int),minthree(int,int,int);printf(*\nPleaseinputthreeintergers:*);scanf(*%d%d%d”,&x,&y,&z);min=minthree(x,y,z); /・函数调用,传入三个实参・/printfCMinis%d”,min);getchO;}intmintwo(inta,intb)/・函数定义・/(return(a<b?a:b); /・使用条件语句,并将计算结果返回*/}intminthree(inta,intb,intc)(intz;}z=mintwo(a,b); /・函数内嵌套调用函数mintwoO*/z=mintwo(z,c);return(z);5.2.2奇偶函数调用#include<stdio.h>main()(floateven(),odd(),deal1(); /・声明需调用的函数・/floatsum;intn;printf(*\nPleaseinputainterger:*);while(1) /・判断用户输入的数据是否大于1*/scanf(*%d*,&n);if(n>l)break;)sum=(n%2==0)?deal1(even,n):deal1(odd,n);/・判断是奇还是偶,并调用对应的函数・/if(n%2==0)printf("Even=%f”,sum);elseprintf("Odd=%f”,sum);getchO;)floateven(intn)(floats=0;inti;for(i=2;i<=n;i+=2)s+=1.0/i;return(s);)floatodd(intn){floats=0;inti;for(i=l;i<=n;i+=2)s+=l.0/i;return(s);)floatdcall(float(*fp)(),intn){floats;)s=(*fp)(n); /・函数的嵌套调用,用指针实现多函数的调用・/return(s);2.3求阶乘倒数之和#include<stdio.h>main()longintrfact(intn);/・递归函数的声明・/longintn,i;floate=0,p;printf("Pleaseinputainteger:");scanf&n);for(i=l;i<=n;i++)(p=rfact(i); /求函数调用・/e=e+l.0/p; /・求和・/}printf("sum=%15.12f\n",e);getchO;)longintrfact(intn) /・递归函数定义・/(if(n<0) /・数据判断・/(printf("Negativeargument!\n");exit(-l); /・正常退出・/}elseif(n-O) /・递归的终点・/return(1);elsereturnn*rfact(n-l); /・递归调用・/第六部分指针及其应用1.1指针与地址voidmain()|inti=3;intj=4;int*p;p=&i;printf(4ti=%d,*p=%d\n,,,i,*p);P=&j;*p=6;printf(4j=%d,*p=%d\nMj,*p);}6.1.2指针变量赋值voidmain()(intnum__i=18;/*定义ー个int型变量num_i*/floatnum__f=5.18;/・定义•个float型变量num_f*/chamum_ch='A';/・定义一个char型变量num_ch*/定义一个指向int型数据的指针变量p_int*/float*p_f;/・定义一个指向float型数据的指针变量p_f*/char*p_ch;/*定义一个指向char型数据的指针变量p_ch*/}printf("*p_int=%d,*p_f=%4.2f,*p_ch=%c\n",*pjnt,*p_f,*p_ch);/*Tl*/printf(nsizep_int=%d,p_f=%d,p_ch=%d\n,',sizeof(p_int),sizeof(p_f),sizeof(p_ch));p_int=&num_i;/・取变量num_int的地址,赋值给p_int*/p_f=&num_f;/・取变量num_f的地址,赋值给p_f*/p_ch=&num_ch;/・取变量num_ch的地址,赋值给p_ch*/printf(nnum_i=%d,*p_int=%d\nH,num_i,*p_int);printf("num_f=%4.2f,*p_f=%4.2f\nM,num_f,*p_f);printf("num_ch=%c,*p_ch=%c\nH,num_ch,*p_ch);6.1.3交换指针变量voidmain()(longnuml,num2;long*p_num1=&numl,*p_num2=&num2,*p;printf("Inputthefirstnumber:M);scanf("%ld”,p_numl);printf("Inputthesecondnumber:M);scanf("%ld”,&num2);printf("numl"%Id,num2=%ld\n,\numl,num2);if(*p_numl>*p_num2レ*如果numl>num2,则交换指针・/p=p_numl;p_numl=p_num2;p_num2=p;)printfC4min=%ld,max=%ld\n,\*p_numl,*p_num2);}6.2.1指向ー维数组的指针#include<stdio.h>voidmain()(longarr[5]={1,234,5};/・定义了一个含有5个长整型元素的数组arr»并初始化・/long*pArr;/・定义了一个指向长整型变量的指针变量pArr*/pArr=arr;/・让pArr指向数组arr,这里没用因对数组名就代表数组首地址。*//・输出pArr,arr,&arr[0]*/printf(npArr:%04x\tarr:%04x\t&arr[0]:%04x\nH,pArr,arr,&arr[0]);/・输出・pArr,pArr[O],arr[0]*/printf(n*pArr:%ld\tpArr[0]:%Id\tarr[OJ:%ld\n",*pArr,pArr[0],arr[OJ);getchar();}6.2.2数组元素的多种表示方法1:用下标表示法voidmain()(inta[8],i;for(i=0;i<8;i++)scanf("%d”,&a[i]);for(i=0;i<8;i++)printf("%d”,a[i]);printf(“\n”);}方法2:用地址表示法voidmain(){inta[8],i;for(i=0;i<8;i++)scanf("%d”,a+i);for(i=0;i<8;i++)primf("%d”,*(a+i));printf(“\n”);方法3:用指针表示法voidmain(){inta[8],i,*p;p=&a[0];/*Tl*/for(i=0;i<8;i++)/*T2*/scanf「%d”,p+i);/*T3*/while(p<a+8)/*T4*/printf(<<%d,\*p++);/*T5*/printf(i4\n?,);}6.2.3指针与字符串#includeustdio.h"voidmain()(char*p=MIamastudent!";/*T1*/intlen=0;while(p[len]!=r\O,)(printf("%c”,p[len]);len++;)printf(H\n%sr,,p);/*T2*/printf(,,\nlen=%d\nM,len);}6.2.4字符串复制#include"stdio.h"voidStrCopy(char^pSou,char*pDes)(while("pSou!=ヘ〇')/・与while(*pSou),while(小pSou!=NULL)或while(*pSou!=0)等价*/(*pDes=*pSou;pSou++;pDes++;)*pDes='、〇’;/*Tl*/)voidmain()(inti=0;chars[2OO],d[2OO],*p=s;gets(p);/*T2*/StrCopy(s,d);printf("S=%s\nD=%s\n",s,d);2.5指针与二维数组#defineM3#defineN4voidmain(){inta[M][N]={l,2,3A5,6J,8,940,ll,12};inti,j;int*p=&a[0][0];/*Tl*/for(i=0;i<M;i++){for(j=0;j<N;j++)printfC%5d,\*(p+i*N+j));printf("\n”);2.6指针数组#include<stdio.h>voidmain(){inti;charc[3][6]={"boy","woman","girl"};char*pc[3]={c[0],c[l],c[2]};for(i=0;iく3;i++)printf(''pc[%i]=%s=%s\nzz,i,pc[i],c[i]);}2.7指针动态分配#include<stdio.h>#include<stdlib.h>#defineN3voidmain()inti,j;int*p[N];/・定义ー个指针数组,可以存放N个int型指针・/for(i=0;i<N;i++)/・循环,为每个指针动态分配空间。*/{p[i]=(int*)malloc((i+l)*sizeof(inり);/・分配i+!个元素的空间・/for(j=0;j<i+l;j++)/*然后为当前指针中所指向的每个元素赋值・/P[i][j]=j+l;}for(i=0;i<N;i++)/・输出每个指针中每个元素・/(for(j=0;j<i+l;j++)printf("%5d”,*(p[i]+j));primf("\n”);)for(i=0;i<N;++i)/・非常重要!最后一定要释放为毎个指针所分配的空间・/free(p[i]);getchar();}6.2.8指向指针的指针变量voidmain()(char*pDay[]={"Monday”「Tuesday”JWednesday”JThursday”,"Friday”,”Saturday”,"Sunday"};char**ppDay;inti;for(i=0;i<7;i++)(ppDay=pDay+i;printf("%su*ppDay);)printf("\n’');}6.3.1指针作为函数的参数#defineN5floatAverScore(float*pa);voidmain(){floatscore[N],av,*sp;inti;sp=score;printf("Pleaseinput%dscores:\nH,N);for(i=0;i<N;i++)scanf(M%f\&score[i]);av=AverScore(sp,N);printf(Haveragescoreis%5.2f*,av);}floatAverScore(float*pa,intn)(inti;floataver,s=0;for(i=0;i<n;i++)s+=*pa++;aver=s/n;returnaver;6.3.2指向函数指针的指针intmax(inta,intb)(returna>b?a:b;)voidmain()(int(*pmax)();/*Tl,定义pmax为函数指针变量・/intx,y,z;pmax=max;/*T2,把被调函数的入口地址赋予该函数指针变量・/printf(MPleaseinputtwonumbersAn'1);scanf("%d%d”,&x,&y);z=(*pmax)(x,y);/*T3,用函数指针变量形式调用函数*/printf(Hmaxmum=%d,\z);}6.3.3指针型函数char*DayName(intn)(staticchar*pDay[]={"Monday”,“Tuesday”,“Wednesday”,"Thursday”,“Friday”,“Saturday”,“Sunday”};returnpDay[n-1];)voidmain()(inti;char*pc;printf("inputDayNo:\nM);scanf("%d",&i);if(i>7lli<l)printf(tfcIIlagalday!\n");pc=DayName(i);printf(HDayNo:%2dis%s\nH,i,pc);)6.3.4main函数的参数voidmain(intargc,charargv[])/*T1*/(inti;printf(t4argc=%d\n",argc);for(i=0;i<argc;i++)printf(H%s",argv[i]);}1将数组元素倒放#include<stdio.h>#include<memory.h>voidswap(int*px,int*py);#defineN100voidresort(intarray[J,intmStartPos,intmAmount)(int*pStart,*pEndj;pStart=&array[mStartPos];/*pStart指向需交换数组元素的起始位置*/pEnd=&array[mStartPos+mAmount-1];/*pEnd指向需交换数组元素的最后,个位置・/for(i=0;i<mAmount/2;i++)(swap(pStart,pEnd);pStart++;pEnd—;})voidswap(int*px,int*py)/・函数定义・/Iinttemp;temp=*px;/・指针的间接引用*/*px=*py;*py=temp;}voidmain()intmret;intnumber[N],mStart,mAmount,i,k=-l;memset(number,O,N);/*将数组中的所有的元素赋值为〇・/printf("pleaseinputdata:\nn);do{k++;mret=scanf("%d",&number[k]);)while(k<N&&mret);fflush(stdin);printf("\nWheredoyouwanttostart:");scanf(n%d",&mStart);printf("\nHowmanynumbersdoyouwanttosort:");scanf("%d",&mAmount);printf("\nYouhadinputarrayasfollow:\n");for(i=0;i<k;i++)printf("%d二numbe巾]);resort(number,mStart,mAmount);printf("\nResortedarrayasfollow:\n");}for(i=0;i<k;i++)printf("%d",number[i]);2求矩阵的最值#include<stdio.h>#defineM100defineN100intMaxVal(intarr[][N],int*m,int*n);voidmain()(intarray[M][N],ij,line,col,max;printf("\nPleaseinputcolumnofarray:");scanf("%d",&col);printf("\nPleaseinputlineofarray:”);scanf("%d",&line);printf("\nPleaseinputdatausecommabetweendata:");for(i=0;i<line;i++)for(j=0;j<col;j++)scanf("%d",&array[i][j]);printf("\n");for(i=0;i<line;i++)for(j=0;j<col;j++)printf(u%6d",array[i]|j]);printf(H\nn);)printf("\nH);max=MaxVal(array,&line,&col);printf("\nThemaximumvalueis%d:n,max);printf("\nThelineis%d:H,line);printf("\nThecolumnis:%d:",col);}intMaxVal(intarr[][NJ,int*m,int*n)(inti,j,line=0,col=0;intmax=arr[〇][〇];/・先假设arr[〇][〇]是最大的元素・/int(*p)[N];p=arr;for(i=0;i<*m;i++)for(j=0;j<*n;j++)if(max<*(*(p+i)+j)){max=*(*(p+i)+j);line=i;col=j;}m=line;n=col;returnmax;.4.3数据的插入#include<stdio.h>intInsertData(intpArr[],intn,intx);main()(intn=15;inta[100]={68,56,45,45,38,32,21,20,20,20,8,5,2,1,-12);inti,x;printf("\nPleaseinputvalueofx:H);scanf(”%d”,&x);for(i=0;i<n;i++)(if(!(i%10))printf(H\nn);printf(n%5d",a[i]);}n=InsertData(a,n,x);printf(M\nM);n++;for(i=0;i<n;i++)(if(!(i%10))printf(,'\n,');primf("%5d”,a[i]);})intInsertData(intpArr[],intn,intx)(inti,j;/*寻找变量X在数组中的插入位置*/i=0;while(i<n&&x<pArr[i])i++;/・上面的语句运行后,pArr[i]即为变量x在数组中的插入位置,下面的语句是将数组的pArr[i]位置让出来・/for(j=n;j>i;j-)pArr[j]=pArr[j-1];/・将变量x的值存入数组的pArr[i]単元中・/pArr[i]=x;returnn++;第フ部分字符与字符串字符串处理(插入、删除、连接和比较)字符串输入函数get§(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年长春中医药大学风湿医院高层次卫技人才招聘笔试历年参考题库频考点附带答案
- 汕头广东汕头市卫生健康局下属汕头市人民医院招聘编外386人历年参考题库(频考版)含答案解析
- 枣庄2024年山东枣庄市妇幼保健院第三批急需紧缺人才引进11人历年参考题库(频考版)含答案解析
- 2024年重庆计生医院高层次卫技人才招聘笔试历年参考题库频考点附带答案
- 土地开发合作协议书(2篇)
- 通辽市物业安全管理规定
- 面包车租赁合同模版
- 输出基础理论讲稿教材课程
- 大数据合同评审管理办法
- 退役军人聘用补充
- 《铁路危险货物运输管理规则》
- 2024年托管装修责任协议
- 国家自然科学基金申请书模板三篇
- (医学课件)护理人文关怀
- 数据采集服务委托合同
- DB11T 1833-2021 建筑工程施工安全操作规程
- 信息检索课件 第2章 文献检索方法(1)-2
- 河长制工作总结报告5篇河长制年度工作总结
- 第二期专题04-短文填空(6选5)-冲刺中考英语必考题型终极预测(深圳专用)
- 民间借贷利息计算表
- 《白描花卉妙笔生》 课件 2024-2025学年岭南美版(2024) 初中美术七年级上册
评论
0/150
提交评论