还剩17页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
编程题集例1.两数互换__in{intabc;printfPleaseinputab;scanf%d%dab;printfab=%d%d\nab;c=a;a=b;b=c;printfab=%d%d\nab;}例2.从十个数中选出最大数__in{intabn;printfPleaseinputa:;scanf%da;printfPleaseinputb:;forn=0;n9;n++{scanf%db;ifa=ba=b;}printf__xdigitis:%d\na;}例3.求12!注意在求阶乘值时,长整型、无符号长整型仅能输出12!=479001600,13!=6227020800,达62亿多,而无符号长整型最大只能达4294967295,约43亿__in{inti;/*整型最大能达32767,约3万3千*/unsignedintt;/*无符号长整型最大能达4294967295,约43亿*/t=1;i=2;do{t=t*i;i++;}whilei=12;ift32767/*7!=5040*/printf%d!=%d\ni-1t;else/*8!=4032032767*/printf%d!=%lu\ni-1t;/*%lu无符号长整型格式符*/}例4.求两个正整数m和n的最大公约数的流程图__in{intmnr;scanf%d%dmn;r=m%n;whiler!=0{m=n;n=r;r=m%n;}printf__xcommondivisoris:%d\nn;}例5.绘制余弦曲线在屏幕上用“*”显示0°~360°的余弦函数cosx曲线#includestdio.h/*预处理指令*/#include__th.h/*包含数学函数*/__in{doubley;intxn;fory=1;y=-1;y-=
0.1/*y为列方向,值从1到-1,步长为-
0.1*/{m=acosy*10;/*计算出y对应的弧度值m乘10为图形放大倍数*/forx=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))程序如下(书上的参考答案)#includestdio.h#include__th.h__in{floatpi1pi2=1term;floatn=1;term=
2.0*n/
2.0*n-1*
2.0*n/
2.0*n+1;pi1=pi2;pi2=pi2*term;whilefabspi2-pi11e-5{n++;term=
2.0*n/
2.0*n-1*
2.0*n/
2.0*n+1;pi1=pi2;pi2=pi2*term;}printfn=%fpi=%f\nn2*pi2;}程序2#include__th.h__in{floatltn=1an=
1.0an1=
1.0;do{n++;fort=1an=1;t=n;t++/*此循环求2n项*/{l=
2.0*t*
2.0*t/
2.0*t-1*
2.0*t+1;an=an*l;}fort=1an1=1;t=n+1;t++/*此循环求2n+2项*/{l=
2.0*t*
2.0*t/
2.0*t-1*
2.0*t+1;an1=an1*l;}}whilefabsan1-an1e-5;printfn=%fpi=%f\nn2*an1;}注意此算法不好,重复运算次数过多(for循环每次都从1开始循环),影响程序效率,浪费运算时间程序3#includestdio.h#include__th.h__in{intn=1;floatpi1=
1.0pi2term;pi1=
2.0/
1.0*
2.0/
3.0;pi2=pi1*
4.0/
3.0*
4.0/
5.0;forn=3;fabspi2-pi11e-5;n++{pi1=pi2;term=
2.0*n/
2.0*n-1*
2.0*n/
2.0*n+1;pi2=pi2*term;}printfn=%dpi=%f\nn-12*pi2;}例7.求能被3整除且其中至少有两位数字为6的四位数,并求出满足条件的四位数的个数如96699666均为满足条件的四位数程序代码如下(1999年春上机__(C2))#includestdio.h#includestring.h__in{intijkmcount=0;fori=1;i=9;i++forj=0;j=9;j++fork=0;k=9;k++form=0;m=9;m++{ifi*1000+j*100+k*10+m%3==0ifi==6j==6||i==6k==6||i==6m==6||j==6k==6||j==6m==6||k==6m==6{ifcount%15==0printf\n;/*1行满15个数则换行*/printf%di*1000+j*100+k*10+m;count++;}/*累积满足条件的数字个数*/}printf\ncount=%d\ncount;}程序2#include__th.h__in{intabcdti=0;fort=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;#defineAa!=6#defineBb!=6#defineCc!=6#defineDd!=6if!ABCD||ABC||ABD||BCD||ACDt%3==0{ifi++%15==0printf\n;printf%dt;}}printf\n;}例8.改错题(1998年秋上机__(C2))假设有一叠卡片,编号为1~52,并且所有卡片的下面朝上从__2开始,把凡是偶数的卡片都翻成正面朝下再从3号卡片开始,把凡是卡片号为3的倍数的卡片都翻一个面(即把正面朝上的翻成正面朝下,正面朝下的翻成正面朝上)下一步从4号卡片开始,把凡是卡片号为4的倍数的卡片都翻转一次,依次类推含有错误的源程序为#defineN53__in{inta[N]ijk;fori=1;iN;i++a[i]=1;/*‘1’代表正面朝上,我的注释*/fori=1;iN;i++/*i=2;iN;i+=2*/a[i]=0;/*‘0’代表正面朝下,我的注释*/forj=3;jN;j++fori=1;jN;j++/*i=j;iN;i+=j*/ifa[i]=0a[i]=1;/*a[i]==0*/elsea[i]=0;printfthefinalresult:\n;fori=1;iN;i++printf%da[i];printf\n;k=0;fori=1;iN;i++ifa[i]=1/*a[I]==1*/{k=k+1;printfthefa__upis:%d\ni;}printftotalis:%dk;}例9.谭教材上p258习题
10.13以及教材p245要求写一个用矩形法求定积分的通用函数,分别求(说明sin、cos、exp已在系统的数学函数库中,程序开头要用#include__th.h)#include__th.h__in{floatintegralfloat*pfloatfloatafloatbintn;floatfsinfloat;floatfcosfloat;floatfexpfloat;floata1b1a2b2a3b3c*pfloat;/**pfloat为指向函数的指针*/intn=20; /*分割成的小矩形数量 */printfInputa1b1:;scanf%f%fa1b1;printfInputa2b2:;scanf%f%fa2b2;printfInputa3b3:;scanf%f%fa3b3;p=fsin;c=integralpa1b1n;printfTheintegralofsinxis:%f\nc;p=fcos;c=integralpa2b2n;printfTheintegralofcosxis:%f\nc;p=fexp;c=integralpa3b3n;printfTheintegralofexpxis:%f\nc;}floatintegralfloat*pfloatfloatafloatbintn{inti;floatxhs;h=b-a/n;x=a;s=0;fori=1;i=n;i++{x=x+h;s=s+*px*h;}returns;}floatfsinfloatx{returnsinx;}floatfcosfloatx{returncosx;}floatfexpfloatx{returnexpx;}例10.改错题(2001年春上机__(C2))本程序读入一字符串(以“#”结束),将串中含同一字母重复出现次数最多的那个单词(若这样的单词多于一个,则只取第一个),以及该单词中重复次数最多的那个字母和重复次数显示输出假定串中只含小写字母和其他非字母字符,把由非字母字符隔开的字母串叫做单词,而不管它是否有意义含有错误的源程序为#includestdio.hchara
[100]ch;intibigft;testwordinti/*testword*/{intjkb
[26];charcch1;forj=0j26;j++/*forj=0;j26;j++*/b[j]=0;j=i;k=0;whilea[i]=’a’a[i]=’z’{b[a[i]-97]++;i++;}forc=’a’;c=’z’;c++ifb[c-97]k{k=b[c-97];ch1=c;}ifkbig{big=k;f=j;t=i-1;ch=ch1;}/*big为最大重复次数,f为重复次数最}大字母所在单词的起点,t为终点,ch为最大重复次数的字母*/__in{intn=-1;doa[++n]=getchar;whilea[n]==’#’;/*a[n]!=’#’*/getchar;i=0;big=0;whileinifa[i]=’a’a[i]=’z’testword;elsei++;fori=t;i=f;i--/*i=f;i=t;i++*/putchara[i];printf“h__e%dletter%c\n”bigch;}注调试程序后时,可以随意输入测试数据最后运行本程序时,必须从键盘上输入下列数据tootowprogramasdedederereeberq#要求
1、把上述程序写到笔记本上,把错误之处指出,并加以改正
2、错误含语法错误及逻辑错误
3、改错时,可以修改语句中的一部分内容,调整语句次序,增加少量的变量说明或编译预处理命令,但不能增加其他语句,也不能删除去整条语句例11.编程题(2001年春上机__(C2))题目首先将正整数
121、
221、
2198、
1234、
2111、0(“0”只作结束标记)存入整型数组中,然后在这些正整数中找出连续两个数字(或更多个数字)同为奇数字或同为偶数字的所有正整数例如,221便是这样的一个数将所有这样的数写入文件myf
2.out中要求1.将源程序取名为myf
2.c,输出结果文件取名为myf
2.out2.数据文件的打开、使用、关闭均按TurboC文件操作实现#includestdio.h__in/*n中为用于当前处理的数字*/{FILEfp;/*k为处理过程中的中间变量*/intm1m2kflagn;/*m1m2为相邻两数*/inti=0num
[6];/*flag为是否符合要求的标志变量*/fp=fopenmyf
2.outw;fori=0;i=5;i++{scanf%dnum[i];}n=num[i=0];whilen0{k=n;flag=0;m1=k%10;k=k/10;whilek!=0{m2=k%10;k=k/10;ifm1%2!=0==m2%2!=0{flag=1;k=0;}elsem1=m2;}ifflagfprintffp%6dn;n=num[++i];}fprintffp\n;fclosefp;}程序2#includestdio.hintfindinti/*自定义函数,返回值为1则把写入文件*/{intr=0j=0kmnum
[5];intflag=0;m=i;whilem0/*把主程序中的a[i]各位数字写入数组num中*/{r=m%10;num[j]=r;m=m/10;j=j+1;}fork=0;kj-1;k++/*如果相邻两数同为奇数或偶数,返回1*/ifnum[k]%2!=0==num[k+1]%2!=0{flag=1;returnflag;}}__in{inti=0flag;inta
[6]={1212212198123421110};FILE*fp;fp=fopenmyf
2.outwb;fori=0;i6;i++{flag=finda[i];ifflag==1fprintffp%6da[i];}fclosefp;}例12.写一函数,使给定的一个二维数组3×3转置,即行列互换教材p186_
8.4#defineN3intarray[N][N];voidconvertintarray
[3]
[3]/*函数类型可定义为void,也可用默认的int*/{intijt; /*因为函数形实参是数组,按地址传递*//*两个数组所用空间相同,函数无需返回值*/fori=0;iN;i++ forj=i+1;jN;j++ /* j=i+1防止两元素对调后再次恢复原位 */{t=array[i][j]; array[i][j]=array[j][i];array[j][i]=t;}}__in{intij;voidconvertint[][]; /*注意此处的[][]形式,表明是二维数组*/printfInputarray:\n; /*因为函数原型处仅检查形参个数、类型名、fori=0;iN;i++ /*顺序,而不检查形参名所以只写成[][]形式forj=0;jN;j++ /*即可仅对void时如此,对int似乎不成立?*/scanf%darray[i][j];printf\noriginalarray:\n;fori=0;iN;i++{forj=0;jN;j++printf%5darray[i][j];printf\n;}convertarray;printfconvertarray:\n;fori=0;iN;i++{forj=0;jN;j++printf%5darray[i][j];printf\n;}}例13.已有一个已排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组中(C教程 p141-习题
7.4)__in {inta
[11]={14691316192840100};intpla__numberendij;printfarraya:\n;fori=0;i10;i++printf%5da[i];printf\n;printfInsertdata:;scanf%dnumber;end=a
[9];ifnumberenda
[10]=number;else{fori=0;i10;i++ifa[i]number{pla__=i;break;}forj=9;j=pla__;j--/*注意j=pla__中的运算符不应该是=*/a[j+1]=a[j];a[pla__]=number;}printfNowarraya:\n;fori=0;i11;i++printf%6da[i];printf\n;}__in/*谭 提供算法*/{inta
[11]={14691316192840100};inttemp1temp2numberendij;printfarraya:\n;fori=0;i10;i++printf%5da[i];printf\n;printfInsertdata:;scanf%dnumber;end=a
[9];ifnumberenda
[10]=number;else{fori=0;i10;i++{ifa[i]number{temp1=a[i];a[i]=number;forj=i+1;j11;j++{temp2=a[j];a[j]=temp1;temp1=temp2;}break;}}}printfNowarraya:\n;fori=0;i11;i++printf%6da[i];printf\n;}例14.直接插入排序法__in{inta
[10]={39671232356723699};intijx;fori=0;i10;i++printf%da[i];printf\n;fori=2;i10;i++{x=a[i]; /*确定未排序数x*/j=i-1; /*确定已排序数的位置*/whilej=0xa[j]{a[j+1]=a[j]; /*已排序元素后移,腾出空间*/j=j-1; /*向前寻找插入位置*/}a[j+1]=x;}fori=0;i10;i++printf%da[i];printf\n;}疑难问题1)__in{floatj;floatz=2;j=fffz; 整型值赋值给实型变量,自动转换printf%f\nj;}intffffloatx函数返回值为整型{printf%f\nx*x;return2*x*x;}本题说明当变量jz为float实型数据时,fff函数必须先进行函数原型的声明否则,结果不正确2)__in{floatabc;scanf%d%dab;c=__xab;printf__xis%fc;}__xfloatxfloaty{floatz;z=xyx:y;returnz;}3)用下面的scanf函数输入数据,使a=3b=7x=
8.5y=
71.82c1=’A’c2=’a’问在键盘上如何输入?__in{intab;floatxy;charc1c2;scanf“a=%db=%d”ab;scanf“%f%e”xy;scanf“%c%c”c1c2;printf“a=%db=%dx=%fy=%fc1=%cc2=%c\n”abxyc1c2;}解可按如__式在键盘上输入a=3b=
78.
571.82Aa输出为a=3b=7x=
8.500000y=
71.820000c1=Ac2=a请注意在第三个scanf函数双引号中第一个字符为空格字符如果没有这个空格字符,而写成scanf“%c%c”c1c2;按以上的输入,输出就会变成以下两行a=3b=7x=
8.500000y=
71.820000c1=c2=A注意第
二、三行的scanf函数就相当于一行scanf函数,即scanf“%f%e%c%c”xyc1c2;如果第一个%c前无空格的话,则相当于scanf“%f%e%c%c”xyc1c2;则在输入数据时,%e数据读完后,其后的任何一个字符都会被读入c1中这是因为在输入完第二行后按的回车键被作为一个字符送到内存输入缓冲区中,因此第三个scanf函数中的第一个变量c1读入了回车符(实际上是回车符的ASCII码)第三行输入的第一个字符A被c2读取,所以在执行printf函数输出c1时,就输出一个回车符,输出c2时就输出字符A在程序第三个scanf函数双引号中第一个字符处放了一个空格符,这样第二行末尾输入的回车符就不会输入给c1,而是与该空格字符对应,第三行输入的第一个字符A就被c1读取也可以不在scanf函数中加空格,而在第三个函数前加一个getchar函数getchar;(注意加#includestdio.h)将前面的回车符“吃掉”在一个函数中如果有几个scanf函数,在输入数据时往往会也出现一些意想不到的情况,其中一个很重要的原因就是由回车符引起的4求一个3×3矩阵对角线元素之和__in{inta
[3]
[3]sum=0;intij;printf“enterdata:\n”;fori=0;i3;i++forj=0;j3;j++scanf“%d”a[i][j];fori=0;i3;i++sum=sum+a[i][i];printf“sum=%5d\n”sum;}__in{floata
[3]
[3]sum=0;intij;printfenterdata:\n;fori=0;i3;i++forj=0;j3;j++scanf%fa[i][j];/*在%f前有一空格,否则无法输入数据*/fori=0;i3;i++sum=sum+a[i][i];printfsum=%
6.2f\nsum;}在TuboC
2.0环境下运行此程序时,出现运行错误,在输入数据后系统显示出错信息scanf floatingpointfor__tsnotlinkedAbnor__lprogramtermination经检查,程序的逻辑和语法都是正确的,而且在其他的C系统中(如BorlandC++)系统中可以正常运行出现这种情况的原因是所用的C编译系统不完善现在只能迁就所用的C系统,修改程序,避开其缺陷修改方案把原来的第5—7行改为forj=0;j3;j++scanf“%f%f%f”a
[0][j]a
[1][j]a
[2][j];上机验证后,正常运行注意,如果输入如下数据
1.
12.
23.
34.
45.
56.
67.
78.
89.9则其对应的内存存储结构应该为
1.
14.
47.
72.
25.
58.
83.
36.
69.9通过此例我们可知,在上机调试程序时出错但程序本身又无语法、逻辑错误时,只好采取“迂回”的办法,使程序能正常运行定义一个结构体变量包括年、月、日计算该9在本年中是第几天,注意闰年问题露解法一见图11.1结构体变量da舵中的成员对应于输人的年、月、日day5为天数struct{intyear;id咖nth5iDtdoyg3山tE阳;nImtdaysl队mtfyI卯uLyla[咖nthdAy”3scanf“%d,%d,%dP,Ldate.邓ar,8LdatemoMth,8Ldate.dayswuchdde咖nthca8e1days=dateda炸凹sG2days=dateday十31;ca8e3dsy5=企tl.day十59;田5c4days=d5bd9y十90P船舱5da阳=da[eday十120lcase6dap—Me.切十151;taIe7d印s=dotLday41815coIe8doys=datLday十2129cas29doys=dab.dBy十2械Ec05e10d勾5=dateday十273ca3eH d“膨=da[e.d印十304c8sel2days=da论d盯十334ifdate州r%4==O6LLds论阴r奶1002=o[此e.阳r%400==o8A6Ldate.咖nth>=3dM阳十=1;四Mtf”\n%d/%dmthe%dthdayin%L”,datemonth,dateda入days,date咽r运行情况如下InpMty仍r,mnth,d叮Lj!旦JLLJi之10/1%th22花thdayin2000.解法二__in1Int;,dB田6,nLday—[abLU]=40,31,28,H,30,31,30,3l,31,30,31,30,31pHntf”Inlutylsrmonth,day”;scsnf”%d,%d,%dJ,&dsta烟r,&da亿删nth,6Lhte.day6days=06forP1li4d3LLmonth6门1d印s十=dsy—[abLil;da阳十=da[fday;ifdateyMr%4—=OL&date.Wr%I00moHth>=3days十=1511.2写一个函数days,实现上面的计算由主函数将年、月、日传递给days函数,计算后将臼数传回主函数输出解函数da邢的程序结构基本与11.1题相同解法一;11.3编写一个函数办nt,打印一个学生的成绩数组,该数组中有5个学生的数据记录.每个记录包括num、name、scoreL32,用主函数输入这些记录,用pr nt函数输出这些记录11.4在上题的基础上,编写一个函数iP皿,用来输入5个学生的数据记录解吨ut函数的程序结构类似于11.3题中主函数的相应部分11.5有10个学生,每个学生的数据包括学号、姓名、3r1课的成绩,从键盘输入10个学生的数据,要求打印出3r1课的总平均成绩,以及最高分的学生的数据包括学号、姓名、3r1课成绩、平均分数函数声明输入所求各函数定积分的上下限。