1、C语言编程竞赛训练试题参考答案C/C+语言编程竞赛训练题(部分)1.编辑工具一般都具有字符串“查找”功能,试编程实现字符串的查找并统计匹配的次数。要求如下:(1) 查找字符串以逗号为分隔符,若遇逗号,则从逗号后的字符重新开始查找;(2) 区分字母大小写;(3) 能支持通配符?和*查找,其中?可表示任意1个字符(为含空字符),*代表任意N个字符(N0)。输入描述:首先输入要查找的字符串个数M,接着输入M个要查找的字符串,每个字符串占一行,最后是被查找的文本。输出描述:要求分行输出每个字符串在文中出现的次数。运行后若输入:3ADaD,abb,DccABV,AAAAABB,accc,Dabc则结果输
2、出为:432参考答案:#include iostream.h#include string.hchar* Strstr(char s,const char sub)/自定义/s串中查找是否有sub子串内容,找到返回其起始位置,sub允许含?通配符,不允许含*char *p;int i=0,j=0,k=0;/abbbcdefbcde bb?f/abbbcdefbcde ?fvrif(strlen(sub)strlen(s)return NULL;/若子串更长则退出while(subi=?)i+,k+;/跳过子串前导? if(subi=0)return s;/若已经匹配返回其位置if(p=strc
3、hr(s+k,subi)=NULL)return NULL;/若不含子串字符则退出while(pj=subi|subi=?)&subi&pj)j+,i+;/有效字符开始匹配if(subi=0)return p-k;/若匹配返回其位置else return Strstr(p-k+1,sub);/否则从其下一位置查找是否有匹配位置int Search(const char s,const char sub)/在s串中查找sub子串出现次数 char *p,t80,s080;int n=0; strcpy(t,s);strcpy(s0,sub);/备份文本,abbbcdefbcde bb*fvr?
4、if(p=strstr(s0,*)!=NULL)/含*情况(不考虑同时含?) *p=0;return strstr(t,s0)!=NULL;/含或不含?情况 while(p=Strstr(t,s0)!=NULL)n+;strcpy(t,p+strlen(s0); return n;int Sch(const char s,const char sub)/abcde0defg,abcde bcdchar *p,t80;strcpy(t,s);/备份文本到tif(p=strstr(t,)!=NULL)/判断文本中含逗号,若有则以此分界,*p=0;p+;return Search(t,sub)+Sc
5、h(p,sub);/逗号前部分匹配次数+逗号后部分匹配次数else return Search(t,sub);/不含逗号直接返回匹配次数void main()int n,i;char s80;char *p;cinn;cin.getline(s,80);p=new char*n;for(i=0;in;i+)cin.getline(s,80);pi=new charstrlen(s)+1;strcpy(pi,s);cin.getline(s,80);/读被查找的文本for(i=0;in;i+)coutSch(s,pi)endl;2.平面上任取n个点,可以确定一个多边形。在计算机中单击鼠标即可获得
6、点的,并以此确定多边形。现要求通过输入三个点坐标值来确定一个三角形,并求这三个点所围成的三角形的面积(若这三个点不能确定一个三角形,则输出“No exist”)。输入描述:先输入一个整数,表示后面有几组三角形坐标值;接着每行两个数,分别代表一个点的横坐标和纵坐标,三行一组。输出描述:先要输出三角形的序号,再输出面积。运行后若输入:20 00 52 21 11 41 8则结果输出为:5No exist请在/*【*/和/*】*/之间编写程序。注意:不要删除或增加/*【*/和/*】*/。/*源程序*/*【*/*】*/20 00 52 21 11 41 8;5No exist;10;100;0,;10
7、;030;35;10;042;37;10;017;null;10;0;10;5;10;0求三角形面积参考答案:#include stdio.h#include math.hdouble Dis(double x1,double y1,double x2,double y2)return sqrt( (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2) );void sjx()float x1,y1,x2,y2,x3,y3;float a,b,c,p,s;scanf(%f %f %f %f %f %f,&x1,&y1,&x2,&y2,&x3,&y3);a=Dis(x1,y1,x2,y2
8、);b=Dis(x1,y1,x3,y3);c=Dis(x2,y2,x3,y3);p=(a+b+c)/2;s=sqrt(p*(p-a)*(p-b)*(p-c);if(fabs(s)1e-6)printf(No existn);else printf(%gn,s);void main()int n,i;scanf(%d,&n);for(i=1;i=n;i+)sjx();求四边形面积参考答案:#include stdio.h#include math.hdouble Dis(double x1,double y1,double x2,double y2)return sqrt( (x1-x2)*(x
9、1-x2)+(y1-y2)*(y1-y2) );float sjx(double x1,double y1,double x2,double y2,double x3,double y3)float a,b,c,p,s;a=Dis(x1,y1,x2,y2);b=Dis(x1,y1,x3,y3);c=Dis(x2,y2,x3,y3);p=(a+b+c)/2;s=sqrt(p*(p-a)*(p-b)*(p-c);return s;void sbx()float x1,y1,x2,y2,x3,y3,x4,y4,s1,s2,s3,s4;scanf(%f %f %f %f %f %f %f %f,&x1
10、,&y1,&x2,&y2,&x3,&y3,&x4,&y4);s1=sjx(x1,y1,x2,y2,x3,y3);s2=sjx(x1,y1,x3,y3,x4,y4);s3=sjx(x1,y1,x2,y2,x4,y4);s4=sjx(x2,y2,x3,y3,x4,y4);if(fabs(s1)1e-6|fabs(s2)1e-6|fabs(s3)1e-6|fabs(s4)1e-6)printf(No existn);elseprintf(%gn,s1+s2=s3+s4?s1+s2:s3+s4);void main()int n,i;scanf(%d,&n);for(i=1;i=n;i+)sbx();
11、3.某研究所研发了一种除草药水,但其药效会随使用次数降低。经统计,若每次使用M剂量(M为整数),则第一次使用能除M棵草,第二次使用只能除M/2棵草,第三次使用只能除M/3棵草,第N次使用只能除M/N棵草。现要统计M剂量药、使用N次共能除多少棵草。例如,若剂量为5,使用6次,则可除草棵数为:5/1+5/2+5/3+5/4+5/5+5/6=10输入描述:先输入若干行测试数据,每行包含两个整数M N,分别代表剂量和使用次数,直到输入0 0表示结束。输出描述:输出每组测试数据可除草棵数。运行后若输入:25 66 2则结果输出为:109请在/*【*/和/*】*/之间编写程序。注意:不要删除或增加/*【*
12、/和/*】*/。/*源程序*/*【*/*】*/5 66 20 0;109;10;100;0,;10;030;35;10;042;37;10;017;null;10;0;10;5;10;0参考答案:#include stdio.h#include math.hdouble f(long m,long n)int i,k,j;double s=0;k=sqrt(m);for(i=1;in) return s;s+=m/i;j=k;for(i=k-1;i0;i-) if (j+m/i-m/(i+1)n) s+=i*(m/i-m/(i+1);j+=m/i-m/(i+1); else s+=i*(n-j
13、);return s;return s;void main()long m,n,i;double s=0;scanf(%d %d,&m,&n);while(m&n)s=f(m,n); /效率高/for(s=0,i=1;i=n;i+)s+=m/i;/效率低printf(%gn,s);scanf(%d %d,&m,&n);4.小明在处理一张图像,他把图像中的点写成(x,y,1),然后乘上矩阵,于是图像向右、向下分别移动了20、30个像素。接着他把图像中的每一个点(x,y,1)都乘上矩阵,结果图像又旋转了30弧度。小明发现了矩阵的神奇,他准备计算矩阵斜下线元素的积(如果斜下线到右边,则继续从左边的下
14、一行的第一个元素开始)。如,有三条斜下线,积分别为1*4*3、3*6*7、-2*5*0。输入描述:输入的第一个数n代表矩阵的阶,接着n行,每行n个数;接着输入另一个n矩阵的信息,直到输入0阶表示结束。输出描述:要先输出序号。运行后若输入:31 3 -24 4 64 0 320 2-1 40则结果输出为:12,72,0,0,-2,请在/*【*/和/*】*/之间编写程序。注意:不要删除或增加/*【*/和/*】*/。/*源程序*/*【*/*】*/31 3 -24 4 64 0 320 2-1 40;12,72,0,0,-2,;10;100;0,;10;030;35;10;042;37;10;017;
15、null;10;0;10;5;10;0参考答案:#include stdio.hint JZ()int n,i,j,jj;int a100100,s100,ss=0;scanf(%d,&n);for(i=0;in;i+) for(j=0;jn;j+)scanf(%d,&aij);for(j=0;jn;j+)sj=1;jj=j;/jj=(jj+1)%n;为斜线乘积,jj=(jj-1+n)%n;为反斜线乘积for(i=0;i1输出n,然后再计新字符 cout1)coutn;n=1;c=si;while(si+);/比完0后结束coutn;cin.getline(s,80);for(i=0;in;i
16、+)cin.getline(s,80);YS(s);6.军训中甲班n位同学已经按从低到高排好队,现有乙班m位同学(未排好序)要插入一起集训。请编程实现将乙班同学插入甲班后使队伍仍为从低到高排好的队列。输入描述:先输入两个整数n m,分别代表甲班和乙班的人数,然后输入甲班n个同学的身高,接着输入乙班m个同学的身高;接着输入另两个班的信息,直到输入班级人数0表示结束。输出描述:输出每组排好的m+n个身高。运行后若输入:5 3150 152 158 160 168159 159 1532 4159 165 154 167 166 1630 0则结果输出为:150,152,153,158,159,15
17、9,160,168,154,159,163,165,166,167,请在/*【*/和/*】*/之间编写程序。注意:不要删除或增加/*【*/和/*】*/。/*源程序*/*【*/*】*/5 3150 152 158 160 168159 159 1532 4159 165 154 167 166 1630 0;150,152,153,158,159,159,160,168,154,159,163,165,166,167,;10;100;0,;10;030;35;10;042;37;10;017;null;10;0;10;5;10;0参考答案(C+):#include #include LinkLi
18、st2.hvoid BInsA(int n,int m)LinkList A;int i,j,x;for(i=1;ix;A.InsElem(i,x);/输入表元素for(j=1;jx;for(i=1;ix)A.InsElem(i,x);n+;break;if(in)A.InsElem(i,x);n+;A.DispList();/显示表void main()int n,m;cinnm;while(n&m)BInsA(n,m);cinnm;7.某电视台有一娱乐节目,主持人让观众猜商品的价格,若观众能在规定的时间内猜中商品的价格即可获得该商品。例如,有一精美的水壶(假设实际价格为282元,事先观众不
19、知道),观众只知道在市面上可能的价格范围为100到400元。此时若观众猜的价格为300元,主持人会告诉观众“大了”;若观众猜的价格为200元,主持人会告诉观众“小了”;直到在规定的时间内观众猜中了商品的价格。现请你编程模拟猜商品价格的过程,要求在最少的次数内猜中商品的价格(精确到整数)。输入描述:先输入一个整数,表示要猜商品价格的次数,然后每行输入三个整数B E R,B和E表示观众估计的商品价格范围,R表示实际商品价格。输出描述:输出每种商品你所猜的价格。运行后若输入:2100 400 2821 20 15则结果输出为:250,325,287,268,277,282,10,15,请在/*【*/
20、和/*】*/之间编写程序。注意:不要删除或增加/*【*/和/*】*/。/*源程序*/*【*/*】*/2100 400 2821 20 15;250,325,287,268,277,282,10,15,;10;101 2 4 3 7 2 8 5 0 9 ABabcdCeDF;2,4,2,8,0,1,3,7,5,9,A,B,C,D,F,a,b,c,d,e,;10;030;35;10;042;37;10;017;null;10;0;10;5;10;0参考答案(C+):#include iostream.hvoid CJ(int B,int E,int R)int m;while(BE)/起止 m=(
21、B+E)/2;coutm,; if(R=m)break;/猜对退出 else/实价比中间数m小,则用m-1止点,否则用m+1作起点 if(Rm)E=m-1;else B=m+1;coutn;for(i=0;iBER;CJ(B,E,R);8.一群小朋友外出郊游,并分组做游戏。要求每组人数一致。现有n个小朋友,有几种分法。输入描述:输入正整数,代表小朋友的人数n,以0结束。输出描述:先要输出序号,然后输出分成几组,每组多少人,有多少种情况都要输出。运行后若输入:560则结果输出为:5能被分成5组、每组包含1人6能被分成6组、每组包含1人6能被分成3组、每组包含2人6能被分成2组、每组包含3人请在/
22、*【*/和/*】*/之间编写程序。注意:不要删除或增加/*【*/和/*】*/。/*源程序*/*【*/*】*/560;5能被分成5组、每组包含1人6能被分成6组、每组包含1人6能被分成3组、每组包含2人6能被分成2组、每组包含3人;10;100;0;10;030;35;10;042;37;10;017;null;10;0;10;5;10;0参考答案(C):#include stdio.hvoid WS(int x)int i;for(i=x;i1;i-) if(x%i=0)printf(%d能被分成%d组、每组包含%d人n,x,i,x/i);void main()int x;scanf(%d,&
23、x);while(x)WS(x);scanf(%d,&x);9. 编写程序判断算术表达式的括号(大括号、方括号、圆括号三种)是否匹配。 输入描述:先输入一个整数N,表示要判断的表达式个数,然后N行表达式。输出描述:输出每种商品你所猜的价格。运行后若输入:2(3+2)f/k(dk)fkk则结果输出为:匹配不匹配请在/*【*/和/*】*/之间编写程序。注意:不要删除或增加/*【*/和/*】*/。/*源程序*/*【*/*】*/1(dk)fkk;匹配;10;21a(ddsdsd);匹配;10;41sd);不匹配;10;442;37;10;017;null;10;0;10;5;10;0参考答案(C+):
24、#include #include sqStack2.hint Match(char *str)int i=0;char c;sqStack S;while(c=stri+) switch(c) case:case:case(:S.Push(c);break; case:if(S.GetTop()=)S.Pop();else return 0;break; case:if(S.GetTop()=)S.Pop();else return 0;break; case):if(S.GetTop()=()S.Pop();else return 0; return S.Empty();void main
25、()int i,n;char s80;cinn;for(i=0;is;if(Match(s)cout匹配;else cout不匹配;10.编程实现过滤器功能,例如,若是整数,通过此过滤器分离出偶数和奇数,若是字母,通过此过滤器分离出大写和小写字母等。要求分离后两部分的顺序不变。运行后若输入:1 2 3 4 5 6 7 8 9 0aABbCcDEde则结果输出为:2,4,6,8,0,1,3,5,7,9,A,B,C,D,E,a,b,c,d,e,请在/*【*/和/*】*/之间的空白处填入适当语句或式子。注意:不要删除或增加/*【*/和/*】*/。/*源程序*/*【*/*】*/1 2 3 4 5 6 7 8 9 0 aABbCcDEde;2,4,6,8,0,1,3,5,7,9,A,B,C,D,E,a,b,c,d,e,;10;31 2 4 3 7 2 8 5 0 9 ABabcdCeDF;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1