需掌握的编程题.docx
《需掌握的编程题.docx》由会员分享,可在线阅读,更多相关《需掌握的编程题.docx(24页珍藏版)》请在冰点文库上搜索。
![需掌握的编程题.docx](https://file1.bingdoc.com/fileroot1/2023-6/17/9af60755-43a0-4a95-ba97-e25119458b4d/9af60755-43a0-4a95-ba97-e25119458b4d1.gif)
需掌握的编程题
需掌握的编程题
一、选择结构
1.输入整数a和b,如果a2+b2大于100,则输出a+b的值,否则输出a–b的值。
#include
voidmain()
{
inta,b;
scanf("%d%d",&a,&b);
if(a*a+b*b>100)
printf("%d\n",a+b);
else
printf("%d\n",a-b);
}
打印输出语句可以写成:
printf("%d",(a*a+b*b>100?
a+b:
a-b));
2.输入整数n,如果n既是5又是7的整倍数,则输出yes,否则输出no。
#include
voidmain()
{
intn;
scanf("%d",&n);
if(n%5==0&&n%7==0)//同时满足两个条件
printf("yes\n");
else
printf("no\n");
}
3.输入三个整数,要求按由小到大的顺序输出。
#include
voidmain()
{
inta,b,c,t;
scanf("%d%d%d",&a,&b,&c);
if(a>b)
{t=a;a=b;b=t;}//两两比较
if(a>c)
{t=a;a=c;c=t;}
if(b>c)
{t=b;b=c;c=t;}
printf("%d,%d,%d\n",a,b,c);
}
4.某商场为促销实行打折销售商品,具体办法是假定购买某种商品的数量为x件,折扣如下:
商品数量
折扣
x<5
没有折扣
5≤x<10
1%折扣
10≤x<21
2%折扣
21≤x<30
4%折扣
30≤x
6%折扣
假定商品价格为p元,编程计算某顾客购买x件商品的应付金额。
计算公式如下:
sum=p*x*(1-d)
其中,sum为应付金额,d为折扣数,用if-else-if语句实现。
#include
voidmain()
{intx;
floatp,d,sum;
scanf("%d,%f",&x,&p);
if(x<5)
d=0.0;
elseif(x<10)
d=0.01;
elseif(x<21)
d=0.02;
elseif(x<30)
d=0.04;
else
d=0.06;
sum=p*x*(1-d);
printf("sum=%.2f\n",sum);
}
考虑一下如果用case语句怎么实现?
5.在屏幕上显示一张如下所示的时间表:
*****Time*****
1morning
2afternoon
3night
Pleaseinputyourchoice:
操作人员根据提示进行选择,程序根据输入的时间序号显示相应的问候信息,选择1时显示“Goodmorning”,选择2时显示“Goodafternoon”,选择3时显示“Goodnight”,对于其他的选择显示“Selectionerror!
”,用switch语句编程实现。
#include
voidmain()
{intn;
printf("*****Time*****\n");
printf("1morning\n");
printf("2afternoon\n");
printf("3night\n");
printf("Pleaseinputyourchoice:
");
scanf("%d",&n);
switch(n)
{
case1:
printf("Goodmorning\n");
break;
case2:
printf("Goodafternoon\n");
break;
case3:
printf("Goodnight\n");
break;
default:
printf("Selectionerror!
\n");
}
}
6.输入两个实数和一个算术运算符(+,-,*,/),根据运算符执行相应的运算并输出运算结果。
#include
voidmain()
{floatf1,f2,result;
charop;
scanf("%c%f%f",&op,&f1,&f2);//先输入算符,然后再输入两个实数
switch(op)
{
case'+':
result=f1+f2;
break;
case'-':
result=f1-f2;
break;
case'*':
result=f1*f2;
break;//千万别忘记需要加上break语句
case'/':
result=f1/f2;
break;
}
printf("%f%c%f=%f\n",f1,op,f2,result);
}
二、循环结构
【例5-11】输出100以内的素数。
分析:
素数是指除了能被1和它本身整除外,不能被其它任何整数整除的数。
例如,17就是一个素数,除了1和17之外,它不能被2~16之间的任何整数整除。
根据素数的这个定义,可得到判断素数的方法:
把n作为被除数,把i=2~(m-1)依次作为除数,判断被除数m与除数i相除的结果,若都除不尽,即余数都不为0,则说明n是素数,反之,只要有一次能除尽(余数为0),则说明n存在一个1和它本身以外的另一个因子,它不是素数。
因此可以使用穷举法来解决。
程序清单如下:
#include
voidmain()
{
intn,i;
for(n=2;n<=100;n++)
{
for(i=2;iif(n%i==0)break;//余数为零则不是素数,跳出内循环
if(i>=n)printf("\t%d",n);
}
}
1
12
123
1234
12345
123456
1234567
12345678
123456789
1.编写程序,生成以下的图案。
解:
由图案分析知道,每行输出的数字的个数和行数相等,那么在外循环i表示行数,内循环j表示每行输出的数字,数字的具体数值就是从1到i。
程序如下所示:
#include
voidmain()
{inti,j,lines;
printf("pleaseinputlines=");
scanf("%d",&lines);
for(i=1;i<=lines;i++)//外循环控制行数
{for(j=1;j<=i;j++)//内循环打印数字
printf("%d",j);
printf("\n");
}
}
2.打印所有水仙花数。
水仙花数指的是一个三位正整数,它的三个数字的立方和等于该数本身,例:
153=13+53+33
解:
首先,水仙花数只能是一个三位数,即在100~999之间,然后将这个三位整数的个位、十位和百位分离出来,进行判断即可。
程序如下所示:
#include
voidmain(void)
{inti,j,k,n;
printf("resultis:
");
for(n=100;n<1000;n++)
{i=n/100;//分出百位,记住整数相除是整数
j=(n-i*100)/10;//分出十位
k=n%10;//分出个位
if(n==i*i*i+j*j*j+k*k*k)
printf("%d",n);
}
printf("\n");
}
3.pi的近似值可用以下公式求得:
若n取值10000,则最后一项的值约为10-4,认为可达到精度要求。
请编写程序求pi的近似值。
解:
这是一个累加和的例子,但是判断循环的条件有所不同,当每次的累加项大于10-4时,就进入循环,继续累加,否则就停止循环。
程序如下:
#include
#include//sqrt函数需引用
voidmain()
{floati=1.0,e=1.0;floats=0;
while(e>0.0001)//精度要求
{s+=1/(i*i);
i++;e=1/(i*i);//每次的累加项指的是e=1/(i*i)
}
s=sqrt(s*6);
printf("%.4f\n",s);
}
4.编写程序:
接收两个整数num1和num2,找出这两个数之间所有奇数的和。
解:
本题要求用户输入两个整数,先要判断出两个数的大小,然后,在两个数之间进行循环,遇到奇数就累加。
程序如下:
#include
voidmain()
{inta,b,temp,i,s=0;
printf("pleaseinput2interge=");
scanf("%d%d",&a,&b);
if(a>b)
temp=a,a=b,b=temp;//将小数赋给a,大数赋给b
for(i=a;i<=b;i++)
if(i%2!
=0)
s+=i;
printf("thesumofoddbetween%dand%dis%d\n",a,b,s);
}
5.编写程序计算如下和数的程序:
解:
本题可以使用双重循环,内层循环实现阶乘,外层循环实现累加和。
程序如下:
#include
#defineN20
voidmain()
{
doublea=1,b=0,i,j;//定义为double类型是考虑到结果是个很大的数
for(i=1;i<=N;i++)
{a=1;
for(j=1;j<=i;j++)
a=a*j;
b=b+a;
}
printf("%lf\n",b);
}
7.试输出以下图案:
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
*
解:
可以先分段考虑,将图案分做两下两个部分,上半部分每一行需要输出的空格数3、2、1、0,每一行需求输出的*的数量是1、3、5、7,下半部分类似。
程序如下:
#include
voidmain()
{inta,b,c;
for(a=1;a<=4;a++)//外循环控制行
{for(b=1;b<=4-a;b++)printf("");//输出空格
for(c=1;c<=2*a-1;c++)printf("*");//输出*号,
printf("\n");
}
for(a=4-1;a>=1;a--)//外循环控制行
{for(b=1;b<=4-a;b++)printf("");
for(c=1;c<=2*a-1;c++)printf("*");
printf("\n");
}
}
下面为指定正三角形高度的算法程序(具有通用性)
#include
voidmain()
{
inti,j,h;
printf("输入高度-》");
scanf("%d",&h);
for(i=1;i<=h;i++)
{
for(j=1;j<=(h-i);j++)
{
printf("");
}
for(j=1;j<=(i*2-1);j++)
{
printf("*");
}
printf("\n");
}
for(i=h-1;i>=1;i--)
{
for(j=1;j<=(h-i);j++)
{
printf("");
}
for(j=1;j<=(i*2-1);j++)
{
printf("*");
}
printf("\n");
}
}
三.函数与编译预处理
例6-8:
利用函数完成求50以内的全部素数,并按每行5个数输出。
#include//使用平方根函数,需要包含数学库
#include
intprime(intx)//函数判断x是否素数,若x是素数则返回1;否则返回0
{inti,r=1;
for(i=2;i<=sqrt(x);i++)
if(x%i==0)
{r=0;break;}
returnr;
}
voidoutput(intx,intn)//x接收了main函数中m的值,是要输出的素数
{//n是输出素数的个数,其值从main函数中n传过来
printf("%6d",x);
if(n%5==0)printf("\n");//每输出10个素数产生一次换行
}
voidmain()
{intm,n=0;
for(m=2;m<=50;m++)
if(prime(m))//作为表达式调用prime函数,根据其函数值判断m是否素数
{n++;//若是素数,则计数1次
output(m,n);//作为一条独立语句调用output函数
}
}
例6-11:
编写交换两个变量值的函数swap()。
分析:
交换两个变量值需要借助于第三个变量。
函数swap()并不作具体计算,只是完成一段功能,不需要返回明确结果值,因此函数类型定义为void。
#include
voidswap(intx,inty);
voidmain()
{inta=5,b=2;
swap(a,b);//a和b是实参,将其值分别复制给形参x和y
printf("a=%d,b=%d\n",a,b);
}
voidswap(intx,inty)//x和y是形参,需要分配存储单元,所以要有类型符
{intt;
t=x;x=y;y=t;
printf("x=%d,y=%d\n",x,y);
}
1.两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数,并输出结果,两个整数由键盘输入。
解:
设两个整数为m和n,用辗转相除法求最大公约数,最小公倍数=m*n/最大公约数。
算法:
求最大公约数。
1)判断m若m2)判断(r=u%v)!
=0?
若满足m=n,n=r;循环
3)最小公倍数=m*n/最大公约数。
include
inthcf(intm,intn)
{intt,r;
if(mt=m,m=n,n=t;
while((r=m%n)!
=0)m=n,n=r;
return(n);
}
intlcd(intm,intn,inth)
{
return(m*n/h);
}
voidmain()
{
intm,n,h,l;
scanf("%d%d",&m,&n);
h=hcf(m,n);
printf("最大公约数=%d\n",h);
l=lcd(m,n,h);
printf("最小公倍数=%d\n",l);
}
4.编写函数用以求表达式x2-5x*4,x作为参数传送给函数,调用此函数求
yl=22-5*2十4;
y2=(x+15)2-5*(x十15)十4;若x=3
y3=sin2x—5*sinx十4;若x=300
解:
1)sin(x)的x为弧度值,若求度要进行转换。
2)要将数学函数头文件math.h包括进来。
程序如下:
#include
#include
doublefun(doublex);
voidmain()
{doublex;
printf("y1=%.3lf\n",fun
(2));
scanf("%lf",&x);
printf("y2=%.3lf\n",fun(x+15));
scanf("%lf",&x);
printf("y3=%.3lf\n",fun(sin(x*180/3.1516)));
}
doublefun(doublex)
{return(x*x+5*x+4);
}
7.所谓“同构数”是指这样的数,它出现在其平方数的右边。
例如:
输入整数5,52=25,5是25中右侧的数,所以5是同构数。
x的值由主函数从键盘读入,要求x≤100。
100以内1,5,6,25,76这几个数是所谓的同构数
解:
由“同构数”的定义可得:
只要求出平方数或平方数的最后一位或平方数的最后两位,然后与x进行判断即可,分别求余后即得出平方数的右边。
程序如下:
#include
intfun(intx)
{intt;
t=x*x;
if(t==x||t%10==x||t%100==x)
return1;
else
return0;
}
voidmain()
{intx;
printf("Enterx:
");scanf("%d",&x);
if(x>100)
{printf("Dataeror!
");gotoend;}//end是标号
if(fun(x))
printf("%dYes!
\n",x);
else
printf("%dNo!
\n",x);
end:
;//标号语句后是空语句
}
10.根据以下公式,编写pi函数求的
值,且返回的
值满足精度∈≤10-8。
解:
先求出表达式右边的和,然后将和*2,求出
。
程序如下:
#include
doublepi(doubleeps);
voidmain()
{doubleeps=0.00000001;
printf("pi=%.7lf\n",pi(eps));
}
doublepi(doubleeps)
{doubles=1.0,t=1.0;intn;
for(n=1;t>eps;n++)
{t=n*t/(2*n+1);s+=t;}
return(2.0*s);
}
和前面一个题目类似,只不过换成函数实现
四、数组
【例7-3】对数组中的数据进行排序。
分析:
排序指的是将数组中的各个元素按照数值的大小由升序(或者降序)的形式重新排列。
程序清单如下:
#include
voidmain()
{inti,j,p,q,s,a[10];
printf("\ninput10numbers:
\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);//由用户输入了10个任意的整数作为数组的10个元素
for(i=0;i<10;i++)
{p=i;q=a[i];//外循环记下第i个数组元素的位置和数组元素的值
for(j=i+1;j<10;j++)//内循环取第i个数组元素后一个开始
if(q{p=j;q=a[j];}//记录下大的数组元素的位置和值直到最大哪个元素
if(i!
=p)//如果这个最大的元素不是第i个元素
{s=a[i];a[i]=a[p];a[p]=s;}//和第i个元素交换
}//每次循环将最大的元素交换到a[i]中
printf("从大到小排序完成:
\n");
for(i=0;i<10;i++)
printf("%d\t",a[i]);
}
重点关注下面的冒泡法排序
#include
voidmain()
{inta[10];
inti,j,t;
printf("input10numbers:
\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
for(i=0;i<9;i++)
for(j=0;j<9-i;j++)
if(a[j]>a[j+1])
{t=a[j];a[j]=a[j+1];a[j+1]=t;}
printf("\nthesortednumbers:
");
for(i=0;i<10;i++)
printf("%d,",a[i]);
}
【例7-9】有一个3×4矩阵,要求编写C语言程序秋初其中的最大值,以及其所在的行号和列号。
分析:
首先将数组中的第一个元素认为是最大值,然后将数组中的其他元素与之相比较,出现更大的数的时候,最大值就换成当前数据,并记住相应的行号和列号,一直比较到最后一个元素,就能够得到最大的数据和它所在的行号和列号了。
程序清单如下:
#include
voidmain()
{inti,j,r=0,l=0,max,a[3][4];//r和l记录初始行号和列号
for(i=0;i<3;i++)
for(j=0;j<4;j++)
scanf("%d",&a[i][j]);
max=a[0][0];
for(i=0;i<3;i++)
for(j=0;j<4;j++)
{if(max{max=a[i][j];r=i;l=j;}
}
printf("最大数a[%d][%d]=%d\n",r,l,max);
}
3.编写程序,进行字符串的截取,即从键盘上输入一个字符串str1,将此字符串中从第m个字符开始的n个字符形成另一个字符串str2。
例如:
str1=”computer”,m=2,n=5,这样,str2=”omput”。
解:
先定义两个字符型的一维数组str1,str2,再要求用户分别输入字符串1,和字符的定位m以及需要截取的字符的个数n。
这时就需要判断m和n的值是否有效,然后再进行字符串的截取。
程序如下:
#include
#include
voidmain()
{
charstr1[10],str2[10];
intm,n,i;
printf(