《C语言基础复习-精品文档资料整理.doc》由会员分享,可在线阅读,更多相关《C语言基础复习-精品文档资料整理.doc(53页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、文件的使用包括文件的建立、打开、关闭、存取及应用等基本操作例把命令行参数中的前一个文件名标识的文件, 复制到后一个文件名标识的文件中, 如命令行中只有一个文件名则把该文件写到标准输出文件(显示器)中。#includemain(int argc,char *argv)FILE *fp1,*fp2;char ch;if(argc=1)printf(have not enter file name strike any key exit);getch();exit(0);if(fp1=fopen(argv1,rt)=NULL)printf(Cannot open %sn,argv1);getch()
2、;exit(1);if(argc=2) fp2=stdout;else if(fp2=fopen(argv2,wt+)=NULL)printf(Cannot open %sn,argv1);getch();exit(1);while(ch=fgetc(fp1)!=EOF)fputc(ch,fp2);fclose(fp1);fclose(fp2);本程序为带参的main函数。程序中定义了两个文件指针 fp1 和fp2,分别指向命令行参数中给出的文件。如命令行参数中没有给出文件名,则给出提示信息。程序第18行表示如果只给出一个文件名,则使fp2指向标准输出文件(即显示器)。程序第25行至28行用循
3、环语句逐个读出文件1中的字符再送到文件2中。再次运行时,给出了一个文件名(由例10.2所建立的文件), 故输出给标准输出文件stdout,即在显示器上显示文件内容。第三次运行,给出了二个文件名,因此把string中的内容读出,写入到OK之中。常用级数、数列求和(递推算法)例 累加和程序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
4、,s); 程序2: 应用while循环设计 /* while循环求s=1*2+2*3+99*100 */main() long 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); 例 代数和/* 求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-
5、=1.0/k; printf(s=%9.6f,s); 例 阶乘计算/* 循环累乘求阶乘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-
6、1); /* 递归关系 */ return (f); main() int n; long y; printf(input n:); scanf(%d,&n); y=fac(n); printf(%d!=%ldn,n,y);二分法/折半法(只能对有序数列进行查找)基本思想:设n个有序数(从小到大)存放在数组a1-an中,要查找的数为x。用变量bot、top、mid 分别表示查找数据范围的底部(数组下界)、顶部(数组的上界)和中间,mid=(top+bot)/2,折半查找的算法如下: (1)x=a(mid),则已找到退出循环,否则进行下面的判断; (2)xa(mid),x必定落在mid+1和to
7、p的范围之内,即bot=mid+1; (4)在确定了新的查找范围后,重复进行以上比较,直到找到或者bot=top。 将上面的算法写成如下程序: void main() int a10,mid,bot,top,x,i,find; printf(please input the array:n); for(i=0;i10;i+) scanf(%d,&a); printf(please input the number you want find:n); scanf(%d,&x); printf(n); bot=0;top=9;find=0; while(bottop&find=0) mid=(to
8、p+bot)/2; if(x=amid) find=1;break; else if(xamid) top=mid-1; else bot=mid+1; if (find=1) printf(the number is found the no%d!n,mid); else printf(the number is not found!n); 梯形积分法#includemath.hmain() int i,n=1000; float a,b,h,t1,t2,s,x; printf(请输入积分限a,b:); scanf(%f,%f,&a,&b); h=(b-a)/n; for(s=0,i=1;i
9、=n;i+) x=a+(i-1)*h;t1=exp(-x*x/2);t2=exp(-(x+h)*(x+h)/2); s+=(t1+t2)*h/2; /* 梯形面积累加 */ printf(梯形法算得积分值:%f.n,s);其实也不用这么麻烦,比较08年真题,他给出了近似公式,这样就只相当于求级数了。穷举法穷举法是最简单也是最低率的,它是指试用所有可能的情况,如下题解方程:8y+4x+y*y=41 x*x+7y+10=2 (0x50, 10y100)基本思想是用两个forfor(x=0;x50;x+) for(y=10;y100;y+) if(8*y+4*x+y*y= =41& x*x+7*y+
10、10 = =2)1选择法排序(升序)基本思想: 1)对有n个数的序列(存放在数组a(n)中),从中选出最小的数,与第1个数交换位置; 2)除第1 个数外,其余n-1个数中选最小的数,与第2个数交换位置; 3)依次类推,选择了n-1次后,这个数列已按升序排列。程序代码如下: void main() int i,j,imin,s,a10; printf(n input 10 numbers:n); for(i=0;i10;i+) scanf(%d,&a); for(i=0;i9;i+) imin=i; for(j=i+1;jaj) imin=j; if(i!=imin) s=a; a=aimin;
11、 aimin=s; printf(%dn,a); 冒泡法排序(升序)基本思想:(将相邻两个数比较,小的调到前头) 1)有n个数(存放在数组a(n)中),第一趟将每相邻两个数比较,小的调到前头,经n-1次两两相邻比较后,最大的数已“沉底”,放在最后一个位置,小数上升“浮起”; 2)第二趟对余下的n-1个数(最大的数已“沉底”)按上法比较,经n-2次两两相邻比较后得次大的数; 3)依次类推,n个数共进行n-1趟比较,在第j趟中要进行n-j次两两比较。 程序段如下 void main() int a10; int i,j,t; printf(input 10 numbersn); for(i=0;i
12、10;i+) scanf(%d,&a); printf(n); for(j=0;j=8;j+) for(i=0;iai+1) t=a;a=ai+1;ai+1=t; printf(the sorted numbers:n); for(i=0;i10;i+) printf(%dn,a); 顺序查找查找是在程序设计中最常用到的算法之一,假定要从n个整数中查找x的值是否存在,最原始的办法是从头到尾逐个查找,这种查找的方法称为顺序查找。顺序查找的程序如下:#define N 15main()void bi_search(int a,int n,int x);int a100,x,i,n=15;print
13、f(input the numbers:n);for(i=0;i scanf(%d,&a);printf(input x:n);scanf(%d,&x);bi_search(a,n,x);void bi_search(int a,int n,int x)int i=0,find;find=0;while(i if(x=a)printf(find:%3d,it is a%d,x,i);printf(n);find=1;i+; if(!find)printf(%3d not been found.,x);printf(n);有序数列的插入/删除字符串的插入删除也类似把一个整数按大小
14、顺序插入已排好序的数组中。 为了把一个数按大小插入已排好序的数组中, 应首先确定排序是从大到小还是从小到大进行的。设排序是从大到小进序的, 则可把欲插入的数与数组中各数逐个比较, 当找到第一个比插入数小的元素i时,该元素之前即为插入位置。然后从数组最后一个元素开始到该元素为止,逐个后移一个单元。最后把插入数赋予元素i即可。如果被插入数比所有的元素值都小则插入最后位置。main()int i,j,p,q,s,n,a11=127,3,6,28,54,68,87,105,162,18;for(i=0;i10;i+) p=i;q=ai; for(j=i+1;j10;j+) if(qaj) p=j;q=
15、aj; if(p!=i) s=ai; ai=ap; ap=s; /以上是将无序数从大到小排列printf(%d ,ai);printf(ninput number:n);scanf(%d,&n);for(i=0;iai) for(s=9;s=i;s-) as+1=as; break;ai=n;for(i=0;i=10;i+)printf(%d ,ai);printf(n);如果删除,红色段代码改成for(i=0;i10;i+)if(n=ai) for(s=i;s=9;s+) as=as+1; break;在一个有序的数列中找到一个数并且删除它main() int a7=0,1,2,3,5,6,
16、i,k,j; for (k=0;k6;k+) printf(%d ,ak); printf(n); printf(Please input the number to delete: ); scanf(%d,&i); for (k=0;k6;k+) if (i=ak) for (j=k;j5;j+) aj=aj+1; break; if (k=6) printf(The number not found); printf(The sorted is :n); for (k=0;kn; (2) m除以n得余数r; (3) 若r=0,则n为求得的最大公约数,算法结束;否则执行(4); (4) mn
17、,nr,再重复执行(2)。 例如: 求 m=14 ,n=6 的最大公约数. m n r 14 6 2 6 2 0 void main() int nm,r,n,m,t; printf(please input two numbers:n); scanf(%d,%d,&m,&n); nm=n*m; if (mn) t=n; n=m; m=t; r=m%n; while (r!=0) m=n; n=r; r=m%n; printf(最大公约数:%dn,n); printf(最小公倍数:%dn,nm/n); 此题用穷举法来做也可以,定义法的核心代码像这样for(i=1;i=10000;i+) if(
18、i%n=0&j%m=0)最大数int main()int i,a10,max;for ( i=0; i10; i+ )scanf ( %d,&ai ) ;max = a0;for ( i=0; i10; i+ )if ( max ai )max = ai ;printf ( output max %d. n, max ) ;return 0 ;最小数int main()int i,a10,min;for ( i=0; i10; i+ )scanf ( %d,&ai ) ;min = a0;for ( i=0; i ai )min = ai ;printf ( output max %d. n,
19、 max ) ;return 0 ;素数只能被1或本身整除的数称为素数 基本思想:把m作为被除数,将2INT( )作为除数,如果都除不尽,m就是素数,否则就不是。(可用以下程序段实现) void main() int m,i,k; printf(please input a number:n); scanf(%d,&m); k=sqrt(m); for(i=2;i=k) printf(该数是素数); else printf(该数不是素数); 将其写成一函数,若为素数返回1,不是则返回0 int prime( m%) int i,k; k=sqrt(m); for(i=2;ik;i+) if(m
20、%i=0) return 0; return 1; 掌握判断素数的基本方后,打印出1到X间的素数,1到X间有多少个素数,这样的题也该会做矩阵的处理(生成、交换及基本运算2 矩阵的和与转置main() int i,j,m,n,x,y,a45,b45; printf(输入a矩阵:n); for(i=1;i=3;i+) for(j=1;j=4;j+) scanf(%d,&aij); /* 输入a矩阵的元素 */ printf(输入b矩阵:n); for(i=1;i=3;i+) for(j=1;j=4;j+) scanf(%d,&bij); /* 输入b矩阵的元素 */ printf(a矩阵:n);
21、for(i=1;i=3;i+) for(j=1;j=4;j+) printf(%3d,aij); /* 打印a矩阵 */ printf(n); printf(b矩阵:n); for(i=1;i=3;i+) for(j=1;j=4;j+) printf(%3d,bij); /* 打印b矩阵 */ printf(n); printf(a,b矩阵之和:n); for(i=1;i=3;i+) for(j=1;j=4;j+) printf(%4d,aij+bij); /* 计算并打印a+b的元素 */ printf(n); printf(a矩阵的转置:n); for(j=1;j=4;j+) /* 打印a
22、矩阵的转置 */ for(i=1;i=3;i+) printf(%4d,aij); printf(n); 6.2.3 矩阵的积求a,b矩阵的积前提是我们要在数学上会矩阵的积main() int i,j,k,d,a45,b53; printf(输入a矩阵:n); for(i=1;i=3;i+) for(j=1;j=4;j+) scanf(%d,&aij); /* 输入a矩阵的元素 */ printf(输入b矩阵:n); for(i=1;i=4;i+) for(j=1;j=2;j+) scanf(%d,&bij); /* 输入b矩阵的元素 */ printf(a矩阵:n); for(i=1;i=3
23、;i+) for(j=1;j=4;j+) printf(%3d,aij); /* 打印a矩阵 */ printf(n); printf(b矩阵:n); for(i=1;i=4;i+) for(j=1;j=2;j+) printf(%3d,bij); /* 打印b矩阵 */ printf(n); printf(a,b矩阵之积:n); for(i=1;i=3;i+) for(j=1;j=2;j+) for(d=0,k=1;k0) printf(st1st2n);if(k0) printf(st1st2n);测字符串长度函数strlen 格式: strlen(字符数组名) 功能:测字符串的实际长度(
24、不含字符串结束标志0) 并作为函数返回值。#includestring.hmain() int k;static char st=C language;k=strlen(st);printf(The lenth of the string is %dn,k);字符串拷贝函数strcpy 格式: strcpy (字符数组名1,字符数组名2) 功能:把字符数组2中的字符串拷贝到字符数组1中。串结束标志“0”也一同拷贝。字符数名2, 也可以是一个字符串常量。这时相当于把一个字符串赋予一个字符数组。#includestring.hmain()static char st115,st2=C Langua
25、ge;strcpy(st1,st2);puts(st1);printf(n);此文章的程序已尽量确保其正确性,但作者不对其正确性做担保,计算机C语言程序设计:简单C程序2.1.1 显示一行文字/*显示一行文字“Welcome to C World!”的程序*/#includemain()printf(”Welcome to C World!n”);2.1.2 两个整数求和/*计算并显示两整数之和的程序*/#includemain()int a,b,sum; /*变量声明*/printf(”Input first integer n”); /*显示提示信息*/scanf(”%d”,&a); /*
26、读取一个整数*/printf(”Input second integer n”); /*显示提示信息*/scanf(”%d”,&b); /*读取一个整数*/sum=a+b; /*两数相加*/printf(”Sum is %d n”,sum); /*显示两数之和*/ return 0; /*返回0表示程序成功地结束*/2.2.1 算术运算#includemain()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);p
27、rintf(“nL4:2/3*1000=%d”, 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);2.2.2 赋值运算#includemain()int k,x,
28、y;k=5;x=k+; /*后缀运算,先把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=-x+y;printf(nL7:%
29、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);2.2.3 printf中输出表列求值#includevoid main()int i=8;printf(%d,%d,%d,%d,%dn,+i,-i,i-,i+,-i-);2.2.4 交换两个变量的值#includemain()int a,b,tem;printf(”Input integer a and bn”);scanf(”%d,%d”,&a, &b);tem=a;a=b;b=tem;pri
30、ntf(”a=%d,b=%dn”,a,b);2.2.5 四舍五入#include#includemain()double a,b;printf(Input real a n);scanf(%lf,&a);b=floor(a*100+0.5)/100;printf(b=%.2fn,b);计算机C语言程序设计:函数程序设计7.1.1 求Xn#include stdio.hdouble pow(double x,int n)/*函数的定义在main()之前时不需要声明*/ double y; int i; y=1; if(n=0) return 1.0; else if(n0) for(i=1;i=
31、n;i+) y=y*x; return y; else for(i=1;i=-n;i+) y=y*x; return 1/y; main()int x,y;printf(input x:);scanf(%d,&x);printf(input n:);scanf(%d,&y);printf(result:%fn,pow(x,y);7.1.2 万年历#include main() int i,j,day,year,temp,temp_i; long int Year_days; long int sumdays(int year);/*函数定义在main()之后,在main()中要声明*/ int
32、 IsLeapYear(int year);/*函数声明的格式和定义函数时的头一样*/ int month_day=0,31,28,31,30,31,30,31,31,30,31,30,31,29,everyday614; /*此数组用来保存计算所得的日历*/ printf(Please enter the year: ); scanf(%d,&year); Year_days=sumdays(year); /*调用函数sumdays()计算天数,year是实在参数*/ for( temp=1; temp=6; temp+ ) /*分6次输出12个月的日历*/ for(i=0;i6;i+) f
33、or(j=0;j14;j+) everydayij=0; switch(temp) /*一行输出二个月份*/ case 1: printf(tJanuary %dtt February %dn,year,year);break; case 2: printf(tMarch %dtt April %dn,year,year);break; case 3: printf(tMay %dtt June %dn,year,year);break; case 4: printf(tJuly %dtt August %dn,year,year);break; case 5: printf(tSeptemb
34、er %dtt October %dn,year,year);break; case 6: printf(tNovember %dtt December %dn,year,year);break; printf(Mon Tue Wed Thu Fri Sat Sun Mon Tue Wed Thu Fri Sat Sunn); i=j=0; for( temp_i=0; temp_i(Year_days % 7); temp_i+) /*初始化数组*/ everyday0j+=0; day = 1; while(day=month_day2*temp-1) /*把奇数月的日历输入数组*/ if(j%7=0) j=0,i+; everydayij+=day