C程序例题集.doc_第1页
C程序例题集.doc_第2页
C程序例题集.doc_第3页
C程序例题集.doc_第4页
C程序例题集.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

编程题集例1两数互换。main()int a,b,c;printf(Please input a,b:);scanf(%d,%d,&a,&b);printf(a,b=%d,%dn,a,b);c=a;a=b;b=c;printf(a,b=%d,%dn,a,b);例2从十个数中选出最大数。main()int a,b,n;printf(Please input a:);scanf(%d,&a);printf(Please input b:);for(n=0;n9;n+)scanf(%d,&b); if (a=b) a=b;printf(max digit is:%dn,a);例3求12!。(注意:在求阶乘值时,长整型、无符号长整型仅能输出12!=479001600,13!=6227020800,达62亿多,而无符号长整型最大只能达4294967295,约43亿)main()int i; /*整型最大能达32767,约3万3千 */unsigned int t; /*无符号长整型最大能达4294967295,约43亿 */t=1;i=2;do t=t*i; i+;while (i=12);if (t32767 */printf(%d!=%lun,i-1,t); /* %lu 无符号长整型格式符 */例4求两个正整数m和n的最大公约数的流程图。main()int m,n,r;scanf (%d,%d,&m,&n);r=m % n;while (r!=0) m=n; n=r; r=m % n;printf (max common divisor is:%dn,n);例5绘制余弦曲线:在屏幕上用“*”显示0360的余弦函数cos(x)曲线。#include /* 预处理指令 */#include /* 包含数学函数*/main() double y; int x,n; for (y=1;y=-1;y-=0.1) /*y为列方向,值从1到-1,步长为-0.1*/ m=acos(y)*10; /* 计算出y对应的弧度值m,乘10为图形放大倍数*/for (x=1;xm;x+) printf( );printf(*); /*生成同一行中左侧*号 */for(;x62-m;x+) printf( );printf(*n); /*生成同一行中右侧*号 */ 说明:1. “62”由来是2=6.28*10的整数部分。2画*号时,在同一行上先画出两个对称的*号。3对称轴为x=处。例6求的近似值:精度要求:先求出前2n项的值,再求出2n+2项的值,直到两者之差小于10-5为止。 (注:99春C语言上机试卷(C1) )程序如下:(书上的参考答案)# include # include main() float pi1,pi2=1,term;float n=1;term=(2.0*n)/(2.0*n-1)*(2.0*n)/(2.0*n+1);pi1=pi2;pi2=pi2*term;while(fabs(pi2-pi1)1e-5) n+; term=(2.0*n)/(2.0*n-1)*(2.0*n)/(2.0*n+1); pi1=pi2; pi2=pi2*term; printf(n=%f pi=%fn,n,2*pi2);程序2:# includemain()float l,t,n=1,an=1.0,an1=1.0;do n+; for(t=1,an=1;t=n;t+) /* 此循环求2n项 */ l=2.0*t*2.0*t/(2.0*t-1)*(2.0*t+1); an=an*l; for(t=1,an1=1;t1e-5);printf(n=%f pi=%fn,n,2*an1);注意:此算法不好,重复运算次数过多(for循环每次都从1开始循环),影响程序效率,浪费运算时间。程序3:# include # include main() int n=1;float pi1=1.0,pi2,term;pi1=(2.0/1.0)*(2.0/3.0);pi2=pi1*(4.0/3.0)*(4.0/5.0);for(n=3;fabs(pi2-pi1)1e-5;n+) pi1=pi2; term=(2.0*n)/(2.0*n-1)*(2.0*n)/(2.0*n+1); pi2=pi2*term; printf(n=%d pi=%fn,n-1,2*pi2);例7求能被3整除且其中至少有两位数字为6的四位数,并求出满足条件的四位数的个数。如9669,9666均为满足条件的四位数。程序代码如下:(1999年春上机试卷(C2) )# include # include main() int i,j,k,m,count=0; for(i=1;i=9;i+) for(j=0;j=9;j+) for(k=0;k=9;k+) for(m=0;m=9;m+) if(i*1000+j*100+k*10+m)%3=0) if(i=6&j=6| i=6&k=6| i=6&m=6|j=6&k=6 |j=6&m=6|k=6&m=6) if(count %15=0) printf(n); /* 1行满15个数则换行 */ printf(%d ,i*1000+j*100+k*10+m); count+; /* 累积满足条件的数字个数 */ printf(ncount=%dn,count); 程序2:#includemain() int a,b,c,d,t,i=0;for(t=1000;t=9999;t+) a=t/1000; b=t/100-10*a; c=t/10-100*a-10*b; d=t-1000*a-100*b-10*c; #define A a!=6 #define B b!=6 #define C c!=6 #define D d!=6if(!(A&B&C&D)|(A&B&C)|(A&B&D)|(B&C&D)|(A&C&D)&(t%3=0) if(i+ %15=0) printf(n);printf(%d ,t); printf(n);例8改错题:(1998年秋上机试卷(C2) )假设有一叠卡片,编号为152,并且所有卡片的下面朝上。从卡号2开始,把凡是偶数的卡片都翻成正面朝下。再从3号卡片开始,把凡是卡片号为3的倍数的卡片都翻一个面(即把正面朝上的翻成正面朝下,正面朝下的翻成正面朝上)。下一步从4号卡片开始,把凡是卡片号为4的倍数的卡片都翻转一次,依次类推。含有错误的源程序为:# define N 53main( ) int aN,i,j,k; for(i=1;iN;i+) ai=1; /* 1代表正面朝上,我的注释 */ for(i=1;iN;i+) /* i=2;iN;i+=2 */ ai=0; /* 0代表正面朝下,我的注释 */ for(j=3;jN;j+) for(i=1;jN;j+) /* i=j;iN;i+=j */ if(ai=0) ai=1; /* ai= =0 */ else ai=0; printf(the final result:n); for (i=1;iN;i+) printf(%d,ai); printf(n); k=0; for(i=1;iN;i+) if(ai=1) /* aI= =1 */ k=k+1; printf(the face up is:%dn,i); printf(total is:%d,k);例9谭教材上p258习题10.13 (以及教材p245要求)写一个用矩形法求定积分的通用函数,分别求:(说明:sin、cos、exp已在系统的数学函数库中,程序开头要用#include )#include main() float integral(float (*p)(float),float a,float b,int n);函数声明 float fsin(float); float fcos(float); float fexp(float); float a1,b1,a2,b2,a3,b3,c,(*p)(float); /* (*p)(float)为指向函数的指针*/ int n=20;/* 分割成的小矩形数量*/ printf(Input a1,b1:); scanf(%f,%f,&a1,&b1);输入所求各函数定积分的上下限 printf(Input a2,b2:); scanf(%f,%f,&a2,&b2); printf(Input a3,b3:); scanf(%f,%f,&a3,&b3); p=fsin; c=integral(p,a1,b1,n); printf(The integral of sin(x) is:%fn,c); p=fcos; c=integral(p,a2,b2,n); printf(The integral of cos(x) is:%fn,c); p=fexp; c=integral(p,a3,b3,n); printf(The integral of exp(x) is:%fn,c); float integral(float (*p)(float),float a,float b,int n) int i; float x,h,s; h=(b-a)/n; x=a; s=0; for(i=1;i=n;i+) x=x+h; s=s+(*p)(x)*h; return(s); float fsin(float x) return sin(x); float fcos(float x) return cos(x); float fexp(float x) return exp(x); 例10改错题:(2001年春上机试卷(C2) )本程序读入一字符串(以“#”结束),将串中含同一字母重复出现次数最多的那个单词(若这样的单词多于一个,则只取第一个),以及该单词中重复次数最多的那个字母和重复次数显示输出。假定串中只含小写字母和其他非字母字符,把由非字母字符隔开的字母串叫做单词,而不管它是否有意义。含有错误的源程序为:#include char a100,ch;int i,big,f,t;testword(int i) /* testword() */ int j,k,b26;char c,ch1; for(j=0,j26;j+) /* for(j=0;j=a) & (ai=z) bai-97+;i+; for(c=a;ck)k=bc-97;ch1=c; if(kbig)big=k;f=j;t=i-1;ch=ch1; /* big为最大重复次数,f为重复次数最 大字母所在单词的起点,t为终点,ch为 最大重复次数的字母 */main() int n=-1; do a+n=getchar(); while(an= =#); /* an!=# */ getchar();i=0;big=0; while(i=a) &( ai=f;i-) /* i=f ; i= t ; i+ */putchar(ai); printf(“ have %d letter %cn”,big,ch);注:调试程序后时,可以随意输入测试数据。最后运行本程序时,必须从键盘上输入下列数据:tootow program asdededere reeber q#要求:1、把上述程序写到笔记本上,把错误之处指出,并加以改正。2、错误含语法错误及逻辑错误。3、改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或编译预处理命令,但不能增加其他语句,也不能删除去整条语句。例11编程题:(2001年春上机试卷(C2) )题目:首先将正整数:121、221、2198、1234、2111、0(“0”只作结束标记)存入整型数组中,然后在这些正整数中找出连续两个数字(或更多个数字)同为奇数字或同为偶数字的所有正整数。例如,221便是这样的一个数。将所有这样的数写入文件myf2.out中。要求:1将源程序取名为myf2.c,输出结果文件取名为myf2.out。2数据文件的打开、使用、关闭均按Turbo C文件操作实现。#include main() /* n中为用于当前处理的数字 */ FILE fp; /* k为处理过程中的中间变量 */ int m1,m2,k,flag,n; /* m1,m2为相邻两数 */ int i=0,num6; /* flag为是否符合要求的标志变量 */ fp=fopen(myf2.out,w); for(i=0;i0) k=n;flag=0; m1=k%10;k=k/10; while(k!=0) m2=k%10;k=k/10; if(m1%2!=0)=(m2%2!=0) flag=1;k=0; else m1=m2; if(flag) fprintf(fp,%6d,n); n=num+i; fprintf(fp,n); fclose(fp);程序2:#includeint find(int i) /* 自定义函数,返回值为1则把写入文件 */ int r=0,j=0,k,m,num5; int flag=0; m=i; while(m0) /*把主程序中的ai各位数字写入数组num中*/ r=m%10; numj=r; m=m/10; j=j+1; for(k=0;kj-1;k+) /*如果相邻两数同为奇数或偶数,返回1*/ if(numk%2!=0)= =(numk+1%2!=0) flag=1; return(flag); main() int i=0,flag; int a6=121,221,2198,1234,2111,0; FILE *fp; fp=fopen(myf2.out,wb); for(i=0;i6;i+) flag=find(ai); if(flag= =1) fprintf(fp,%6d,ai); fclose(fp); 例12写一函数,使给定的一个二维数组(33)转置,即行列互换。(教材p1868.4)#define N 3int arrayNN;void convert(int array33) /*函数类型可定义为void,也可用默认的int*/int i,j,t;/*因为函数形实参是数组,按地址传递*/*两个数组所用空间相同,函数无需返回值*/for(i=0;iN;i+) for(j=i+1;jN;j+)/*j=i+1防止两元素对调后再次恢复原位*/ t=arrayij; arrayij=arrayji; arrayji=t; main() int i,j; void convert(int );/*注意此处的 形式,表明是二维数组*/ printf(Input array:n);/* 因为函数原型处仅检查形参个数、类型名、for(i=0;iN;i+) /* 顺序,而不检查形参名。所以只写成 形式 for(j=0;jN;j+)/* 即可。仅对void时如此,对int似乎不成立?*/ scanf(%d,&arrayij);printf(noriginal array:n);for(i=0;iN;i+) for(j=0;jN;j+) printf(%5d,arrayij); printf(n); convert(array);printf(convert array:n);for(i=0;iN;i+) for(j=0;jN;j+) printf(%5d,arrayij); printf(n); 例13已有一个已排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组中。(C教程p141习题7.4)main()int a11=1,4,6,9,13,16,19,28,40,100; int place,number,end,i,j; printf(array a:n); for(i=0;iend) a10=number; else for(i=0;inumber) place=i;break; for(j=9;j=place;j-) /*注意j=place中的运算符不应该是= */ aj+1=aj; aplace=number; printf(Now,array a:n); for(i=0;i11;i+) printf(%6d,ai); printf(n); main() /*谭提供算法*/int a11=1,4,6,9,13,16,19,28,40,100; int temp1,temp2,number,end,i,j; printf(array a:n); for(i=0;iend) a10=number; else for(i=0;inumber) temp1=ai; ai=number; for(j=i+1;j11;j+) temp2=aj; aj=temp1; temp1=temp2; break; printf(Now,array a:n); for(i=0;i11;i+) printf(%6d,ai); printf(n);例14直接插入排序法:main() int a10=3,9,6,7,123,23,56,72,36,99; int i,j,x; for(i=0;i10;i+) printf(%d ,ai); printf(n); for(i=2;i=0 & xaj) aj+1=aj;/*已排序元素后移,腾出空间*/ j=j-1;/*向前寻找插入位置*/ aj+1=x; for(i=0;iy?x:y; return(z);3)用下面的scanf函数输入数据,使a=3,b=7,x=8.5,y=71.82,c1=A,c2=a。问在键盘上如何输入?main() int a,b; float x,y; char c1,c2; scanf(“a=%d b=%d”,&a,&b); scanf(“%f %e”,&x,&y); scanf(“ %c %c”,&c1,&c2); printf(“a=%d,b=%d,x=%f,y=%f,c1=%c,c2=%cn”,a,b,x,y,c1,c2);解:可按如下方式在键盘上输入: a=3 b=7 8.5 71.82 A a输出为:a=3,b=7,x=8.500000,y=71.820000,c1=A,c2=a请注意:在第三个scanf函数双引号中第一个字符为空格字符。如果没有这个空格字符,而写成:scanf(“%c %c”,&c1,&c2);按以上的输入,输出就会变成以下两行:a=3,b=7,x=8.500000,y=71.820000,c1=,c2=A注意:第二、三行的scanf函数就相当于一行scanf函数,即 scanf(“%f %e%c %c”,&x,&y,&c1,&c2); 如果第一个%c前无空格的话,则相当于 scanf(“%f %e%c %c”,&x,&y,&c1,&c2); 则在输入数据时,%e数据读完后,其后的任何一个字符都会被读入c1中。这是因为在输入完第二行后按的回车键被作为一个字符送到内存输入缓冲区中,因此第三个scanf函数中的第一个变量c1读入了回车符(实际上是回车符的ASCII码)。第三行输入的第一个字符A被c2读取,所以在执行printf函数输出c1时,就输出一个回车符,输出c2时就输出字符A。在程序第三个scanf函数双引号中第一个字符处放了一个空格符,这样第二行末尾输入的回车符就不会输入给c1,而是与该空格字符对应,第三行输入的第一个字符A就被c1读取。也可以不在scanf函数中加空格,而在第三个函数前加一个getchar函数:getchar();(注意加#include )将前面的回车符“吃掉”。在一个函数中如果有几个scanf函数,在输入数据时往往会也出现一些意想不到的情况,其中一个很重要的原因就是由回车符引起的。4)求一个33矩阵对角线元素之和。 main() int a33,sum=0;int i,j;printf(“enter data:n”);for(i=0;i3;i+) for(j=0;j3;j+) scanf(“%d”,&aij);for(i=0;i3;i+) sum=sum+aii;printf(“sum=%5dn”,sum); main() float a33,sum=0; int i,j; printf(enter data:n); for(i=0;i3;i+) for(j=0;j3;j+) scanf( %f,&aij); /* 在%f前有一空格,否则无法输入数据 */ for(i=0;i3;i+) sum=sum+aii; printf(sum=%6.2fn,sum);在Tubo C 2.0环境下运行此程序时,出现运行错误,在输入数据后系统显示出错信息: scanf:floating point formats not linked Abnormal program termination经检查,程序的逻辑和语法都是正确的,而且在其他的C系统中(如Borland C+)系统中可以正常运行。出现这种情况的原因是所用的C编译系统不完善。现在只能迁就所用的C系统,修改程序,避开其缺陷。修改方案:把原来的第57行改为:for(j=0;j3;j+)scanf(“%f %f %f”,&a0j,&a1j,&a2j);上机验证后,正常运行。注意,如果输入如下数据:1.1 2.2 3.3 4.4 5.5 6.6 7.7 8.8 9.9则其对应的内存存储结构应该为:1.1 4.4 7.72.2 5.5 8.83.3 6.6 9.9通过此例我们可知,在上机调试程序时出错但程序本身又无语法、逻辑错误时,只好采取“迂回”的办法,使程序能正常运行。定义一个结构体变量(包括年、月、日)。计算该9在本年中是第几天,注意闰年问题。露:解法一:见图111。结构体变量da舵中的成员对应于输人的年、月、日。day5为天数。structint year;id咖nth 5iDt doy g 3山t。E阳;n()I mt daysl 队mtf(yI卯u L yla?咖nth?dAy:”)3 scanf(“d,d,dP,Ldate邓ar,8Ldate moMth,8Lda

温馨提示

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

评论

0/150

提交评论