您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 数据通信与网络 > C语言编程题_经典40题(附解答) (1)
1、定义一个带参的宏,使两个参数的值互换,并写出程序,输入两个数作为使用宏时的参数。输出已交换后的两个值。#defineEXCHANGE(A,B,X)X=A;A=B;B=Xmain(){inta,b,x;printf(“inputaandb:”);scanf(“%d,%d”,&a,&b);EXCHANGE(a,b,x);printf(“a=%d\nb=%d\n”,a,b);}2、编写程序,输入两个整数,求它们相除的余数。用带参的宏来实现。#defineR(A,B)A%Bmain(){inta,b;printf(“inputaandb:”);scanf(“%d,%d”,&a,&b);printf(“%dmod%d=%d\n”,a,b,R(a,b));}3、分别用函数和带参的宏,从3个数中找出最大值。intmax(inta,intb,intc){intx;x=(ab)?a:b;x=(xc)?x:c;return(x);}main(){intx,y,z,m;printf(“inputx,y,z”);scanf(“%d,%d,%d”,&x,&y,&z);printf(“MAX=%d\n\n”,MAX(x,y,z,m));printf(“max=%d\n”,max(x,y,z));}宏展开为:(m=xy?x:y)z?m:z#defineMAX(A,B,C,M)(M=AB?A:B)C?M:C4、求和:S=1-(1/2)+(1/3)-(1/4)+……+(1/n),其中n=10。方法1:voidmain(){inti,n=10;floats=0;for(i=1;i=n;i++)s=s+((i%2==1)?(1.0/i):(-1)*(1.0/i);printf(“s=%f\n”,s);}方法2:求s=1-(1/2)+(1/3)-(1/4)+……+(1/n)其中n=10voidmain(){inti,n=10,f=-1;floats=0;for(i=1;i=n;i++){f=-f;s+=f*(1.0/i);}printf(“s=%f\n”,s);}5、编写程序,求sum=1-3+5-7+……-99+101方法1:voidmain(){inti;floatsum=0;for(i=1;i=101;i+=4)sum+=i;for(i=3;i=99;i+=4)sum-=i;printf(“sum=%f\n”,sum);}方法2:求sum=1-3+5-7+……-99+101voidmain(){inti,f=-1;floatsum=0;for(i=1;i=101;i+=2){f=-f;sum+=f*i;}printf(“sum=%f\n”,sum);}6、打印如下数字三角形:1121123211234321………………12345678987654321voidmain(){inti,j;for(i=1;i10;i++){for(j=1;j10-i;j++)printf(“”);/*输出9-i个空格*/for(j=1;j=i;j++)printf(“%d”,j);for(j=i-1;j0;j--)printf(“%d”,j);printf(“\n”);}7、编写程序,输出左下三角的九九口诀表。1*1=11*2=22*2=41*3=32*3=63*3=91*4=42*4=83*4=124*4=161*5=52*5=103*5=154*5=205*5=251*6=62*6=123*6=184*6=245*6=306*6=361*7=72*7=143*7=214*7=285*7=356*7=427*7=491*8=82*8=163*8=244*8=325*8=406*8=487*8=568*8=641*9=92*9=183*9=274*9=365*9=456*9=547*9=638*9=729*9=81输出左下三角的九九口诀表的程序如下:voidmain(){inti,j;for(i=1;i=9;i++){for(j=1;j=i;j++)printf(“%4d*%d=%2d”,i,j,i*j);printf(“\n”);}}8、铁路托运行李规定:行李重不超过50公斤的,托运费按每公斤0.15元计费;如超过50公斤,超过部分每公斤加收0.10元。编一程序实现自动计费功能。doublemoney(doublew){if(w=50)return0.15*w;elsereturn0.75+0.1*(w-50);}voidmain(){intw;doublef;do{printf(“请输入行李重量:”);scanf(“%d”,&w);if(w0){f=money(w);printf(“\nweight=%d,freight=%f”,w,f);}}while(w==0);}9、编写函数,将两个递增有序的表,合并成一个递增有序的表。#defineN50#defineSeqListstructseqlistSeqList{intdata[N];intlength;};合并函数如下:SeqList*mergelist(a,b)SeqLista,b;{SeqListc;inti=0,j=0,k=0;while((ia.length)&&(jb.length))if(a.data[i])=b.data[j])c.data[k++]=a.data[i++]);elsec.data[k++]=b.data[j++]);while(ia.length)c.data[k++]=a.data[i++]);while(jb.length)c.data[k++]=b.data[j++]);c.length=k;returnc;}10、冒泡排序(BubbleSorting)李丽娟教材p156题7.37两两比较相邻元素,若反序则交换,直到无反序的记录为止。(1)冒泡排序的基本思想在冒泡排序的过程中,各元素不断接近自己的位置。如果一趟比较下来没有进行过交换,就说明记录序列已经有序,不需继续排序下去。因此设置一个标志变量exchange,在每趟排序开始前,首先假设该趟不会有数据交换,置exchange为0;以后一旦发生数据交换,就对exchange置1。若一趟排序结束,exchange仍然为0,则说明该趟排序过程中已无反序记录。因此,没有必要再进行下一趟排序。例如,n=6,数组R的6个关键字分别为:14,20,25,17,3,9冒泡排序算法的执行过程如下图所示。四三二一9172520172525201714201725201491435432193172520140ij(2)冒泡排序算法voidBubblesort(intR[],intn)/*对数组R[0..n-1]按递增序进行冒泡排序*/{inti,j,temp,exchange;for(i=0;in-1;i++)/*i表示趟数,最多n-1趟*/{exchange=0;/*假设这一趟不会有数据交换*/for(j=n-1;ji;j--)if(R[j]R[j-1])/*若反序则交换,将较小的元素往上调*/{temp=R[j];R[j]=R[j-1];R[j-1]=temp;exchange=1;}if(exchange==0)return;/*本趟排序未发生数据交换,提前返回*/}}11、将一个数插入到有序的数列中去,要求插入后,仍然保持数列的有序性。李丽娟教材p156题7.381、方法与步骤(1)读入n个数到数组a[N]中(要求Nn)。(2)对a[n]按递增序进行排序。(3)输出插入前的有序序列。(4)读入要插入的数x。(5)设置游标i从表尾开始搜索插入位置,若a[i]大于x则将a[i]移到a[i+1]位置。(6)一旦出现a[i]小于x,则将x插入到i+1位置。(7)输出插入后的有序序列。(3)完整的程序如下#include“stdio.h”#defineN10main(){inti,j,x,n,a[N];/*数字a的最大容量为N*/printf(“请输入数组的实际元素个数n:\n”);scanf(“%d”,&n);/*要求实际元素个数n小于N*/printf(“请输入%d个整数:\n”,n);for(i=0;in;i++)scanf(“%d”,&a[i]);selectsort(a,n);/*排序*/output(a,n);/*输出插入前的序列*/scanf(“%d”,&x);/*读入要插入的元素x*/i=n-1;/*从表尾往表头方向搜索插入位置*/while((i=0)&&(xa[i])){a[i+1]=a[i];i--;}/*元素后移*/a[i+1]=x;/*插入元素x*/output(a,n);/*输出插入后的序列*/}直接选择排序函数如下:voidselectsort(intb[],intn){inti,j,k,temp;for(i=0;i=n-2;i++){k=i;/*假设i位置上就是最小的*/for(j=i+1;j=n-1;j++)if(b[j]b[k])k=j;if(k!=i){temp=b[i];b[i]=b[k];b[k]=temp;}}}输出一维数组的函数如下:voidoutput(intb[],intn){inti;printf(“\n”);for(i=0;in;i++)printf(“%5d”,b[i]);printf(“\n”);}12、猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上,将剩下的桃子吃掉一半又多吃了一个;以后每天早上都吃了前一天剩下的一半零一个;到第10天早上就只剩下一个桃子了。编写程序,求第一天共摘了多少个桃子?分析:设第一天的桃子数为x1,第二天的桃子数为x2;则有:x2=x1-x1/2-1即:x1=2*(x2+1)亦即:前一天的桃子数是后一天桃子数加1后的2倍。由此得知,第9天的桃子数是第10天桃子数加1后的2倍。第8天的桃子数是第9天桃子数加1后的2倍。…………第1天的桃子数是第2天桃子数加1后的2倍。程序如下:voidmain(){intday,x1,x2;day=9;x2=1;while(day0){x1=(x2+1)*2;x2=x1;day--;}printf(“第一天的桃子数为:”,x1);}13、分别用递归和非递归的方法将一个整数转换成字符串。李丽娟教材p126题6.46:非递归方法的基本思想对于给定的整数n,从低位向高位逐位截取每一位上的数字,并保存到数组a的从0号位置开始的相应位置上。然后,从数组a中反向逐位取出相应位置上的数字并转换为相应的字符输出。#includestdio.hvoidconvert(intn){inti,j,a[5];i=0;while(n!=0){a[i++]=n%10;/*截取n的最低位上的数字保存到a[i]位置上*/n=n/10;/*将n缩小10倍*/}非递归函数:1234n1234aj=i-1;while(j=0){putchar(a[j]+’0’);/*将a[j]位置上的数字转换为对应的字符*/j=j-1;}}#includestdio.h①voidconvert(intn){intk;②if((k=n/10)!=0)③convert(k);/*截取n的最低位上的数字保存到栈中,并使n缩小10倍*/④putchar(n%10+’0’);/*逐次弹出栈顶数字,并将其转换为对应的字符输出*/⑤}递归函数:voidmain(){intnum;printf(“inputaintegernumber:”);scanf(“%d”,&num);printf(“\noutput:”);if(num0){putchar(“-”);num=-num;}convert(num);printf(“\n”);}主函数:14、用递归的方法求1+2+3+…+n。李丽娟教材p126题6.43:假设输入5→n3.执行过程:main(){…y=add(5);…}add(
本文标题:C语言编程题_经典40题(附解答) (1)
链接地址:https://www.777doc.com/doc-6280019 .html