c语言上机实验题解析.docx
- 文档编号:27119446
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:61
- 大小:549.22KB
c语言上机实验题解析.docx
《c语言上机实验题解析.docx》由会员分享,可在线阅读,更多相关《c语言上机实验题解析.docx(61页珍藏版)》请在冰豆网上搜索。
c语言上机实验题解析
1.下列程序中,要求main函数实现如下功能:
从键盘上输入三个正整数,求出它们中的最大值。
请完善程序,并在程序最后用注释的方式给出你的测试数据及在这组测试数据下的运行结果。
#inelude
voidmain()
{inta,b,c,max;
printf("Enterthreeintegers:
");
scanf("%d%d%d",&a,&b,&c);
if(a>b)
max=a;
else
max=b
if(c>max)
max=c;
printf("maxofthethreenumbersis%d",max);
}/*1,2,5maxofthethreenumbersis5*/
2.请编程序,对从键盘上输入的x值,根据以下函数关系计算出相应的y值(设x,y均为整型量)。
x
y
x<0
0
0<=x<10
x
10<=x<20
10
20<=x<40
-5x+20
#include
main()
{
intx,y;
scanf("%d",&x);
if(x<0)
y=0;
else
if(x>=0&&x<=10)
y=x;
else
if(x>=10&&x<=20)y=10;
else
y=-5*x+20;printf("%d",y);
}
3.
写程序计算下列各表达式的值:
[22
13-(2.24-0.24)耳368
3)2恵:
;13e2
#include
#include
main(){
floata,b,c;
a=2.0/(4.0/5+3)+1;
b=sqrt((13-pow(2.24-pow(0.24,2),2))/3.68);
c=2*3.14159*sqrt(13+exp
(2));
printf("%f\n%f\n%f',a,b,c);
}
4.写程序计算5x2+2x+6的两个实根。
考虑用合适的方式输出。
(提示:
可先计算出判别式b2-4ac的值)
#include
#include
main()
{floata,b,c,x1,x2,p,q,disc;
printf("inputa,b,c:
");
scanf("%f%f%f",&a,&b,&c);
disc=b*b-4*a*c;
if(disc>=0)
{
p=-b/(2*a);
q=sqrt(disc)/(2*a);
x1=p+q;x2=p_q;
printf("%f\n%f\n",x1,x2);
}
else
printf("NoAnswer");
}
5.从键盘上任意输出一个年份year,判别该年是否为闰年,如是输出“yes”,否则输出
"no”。
提示:
如果变量year的值是闰年年份,那么这个值应该是4的部数但又不是100的
倍数,或者它是400的倍数。
#include
voidmain()
{
intyear;
scanf("%d",&year);
if(year%4==0&&year%100!
=0||year%400==0)
printf("yes");
else
printf("no");
}
6.从键盘上输入float型数,判断这三个数能否构成三角形,若能则求该三角形面积,否则输出不能构成三角形的信息。
#include
#include
voidmain()
{floata,b,c,p,area;
printf("inputthreeintegers:
");
scanf("%f%f%f",&a,&b,&c);
if(a+b>c&&a+c>b&&b+c>a)
{
p=(a+b+c)/2.0;
area=sqrt(p*(p-a)*(p-b)*(p-c));
printf("%f\n",area);
}
else
printf("inputsarewrong!
");
}
7.下列程序想求出满足如下条件的三位数n:
(1)n除以11(整数相除)所得到的商等于n
的各位数字的平方和;
(2)n中至少有二位数字相同。
如:
131除以11的商为11,131各位数字的平方和为11,131中有二位数字相同,故131是所要求出的三位数中的一个;又如550,也是满足条件的三位数。
源程序中有些错误,请你改正并最终使程序得到如下的运行结果:
131550900
含有错误的源程序】
8.请编程序,实现从键盘上输入任意一个整数n,求出n的各位数字之和。
例如,当n
为263时,各位数字之和为11。
下面是一个可以实现逐位数字累加功能的程序段,试理解后应用到自己的程序中。
#include"stdio.h"
voidmain()
{intn,k;
scanf("%d",&n);
k=0;
do{k+=n%10;
n/=10;
}while(n);
printf("%d",k);
getch();
}
9.试找出符合下列条件的正整数:
(1)该数是一个三位数;
(2)该数是37的倍数;(3)该数循环左移后得到的另两个数也是37的倍数。
例如148是37的倍数,481和814也是37的倍数。
#include"stdio.h"
voidmain()
{intn,a,b;
for(n=100;n<1000;n++)
if(n%37==0)
{a=n/10+n%10*100;
b=n/100+n%100*10;if(a%37==0&&b%37==0)printf("%5d",n);
}
getch();
}
10.请编辑调试下列程序,观察其运行结果,理解函数定义、函数调用的基本方法,并理解函数调用时形参和实参之间数据的传递方式。
(1)请将下列源程序进行调试,观察运行结果,尽量想明白为什么得到如此运行结果后再看题后的评注:
【源程序】
#include
voidmain()
{
inti=2,x=5,j=7;
fun(j,6);
printf(“i=%d,j=%d,x=%nd”,i,j,x);
}
intfun(inti,intj)
{intx=7;
printf(“i=%d,j=%d,x=%nd”,i,j,x);
}
(2)评注:
该题想要使大家明白,函数调用时是实参单向值传递给形参的,函数的形参是随着该函数被调用而分配空间,调用结束系统要回收空间;当执行main函数中的语句fun(j,6)时,其中的j是main函数中的量j,这次调用等价于fun(7,6),即将7和6分别传输给形参变量i和j;当执行fun函数时,fun有其自身的内部变量x,fun函数中的输出语句中,i,j,x的值分别为7,6,7;执行流程遇fun函数中的函数体闭封符“}”返回主函数,在主函数中输出时,i,j,x的值分别2,7,5。
2.(实验报告上的题2)请按如下步步骤设计程序:
(1)编辑并运行下列程序:
#include
voidmain()
{
chari;
floatx;
printf("enterx:
");
scanf("%f",&x);
printf("1.Tocalculateetothepowerx\n");
printf("2.Tocalculatelogxtothebase10\n");
printf("3.Tocalculatelnx\n");
printf("4.Tocalculatesquarerootofx\n");
printf("\n");
printf("enteryourchoice:
[1/2/3/4]");
scanf("%1s",&i);/*表示截取输入字符串中的1个字符,因为输入串中回车也算1个字符的*/switch(i)/*i必须视作字符量,这由它的类型及输入的数据所决定*/
{
case'1':
fexp();break;
case'2':
flog10();break;
case'3':
flog();break;
case'4':
fsqrt();break;
default:
printf("Sorry,can\'tdoforyou!
\n");break;
}
getch();
}
fexp()
{
}
flog10()
{
}
flog()
{
}
fsqrt()
{
}
评注:
这个程序既然能运行了,输入测试数据,试着走走所有的分支路径,看看能不能都走得通(当然有些是不可能有结果的,因为辅助功能函数都是空的),一定要走哟,并且弄清楚所走路径中分别执行什么语句,得到什么结果。
(2)试着将下面的功能函数的首部作修改(加上形参和返回值类型,一定要注意到哟)
#include
voidmain()
{
chari;
floatx;
printf("enterx:
");
scanf("%f",&x);
printf("1.Tocalculateetothepowerx\n");
printf("2.Tocalculatelogxtothebase10\n");
printf("3.Tocalculatelnx\n");
printf("4.Tocalculatesquarerootofx\n");
printf("\n");
printf("enteryourchoice:
[1/2/3/4]");
scanf("%1s",&i);
switch(i)
{
case'1':
fexp(x);break;
case'2':
flog10(x);break;
case'3':
flog(x);break;
case'4':
fsqrt(x);break;
default:
printf("Sorry,can\'tdoforyou!
\n");break;}
getch();
}
floatfexp(floatx)
{
}
floatflog10(floatx)
{
}
floatflog(floatx)
{
}floatfsqrt(floatx){
}
评注:
注意到了吗?
这个程序不能通过编译,错误的原因是“与’fexp'声明中的类型不匹配”
等类的错误,还记得我课堂上讲了3个重要的概念,它们分别是函数的定义(目的是为了描述具体的功能,但不实现)、函数的调用(目的是实现函数所定义的功能)和函数的声明(目的是为了使一个存在的函数允许被调用,原则上是不能违背先定义后使用的原则,但当被定义的函数返回值为int类型时,被调用函数可以放在调用函数的后面而在调用之前缺省声明,这也就是第一步中程序能运行的原因)。
这个程序中,辅助函数的返回值类型均改为了float型,函数声明就不可以再缺省,有两种方法可以处理好这一问题,一是将后面的几个函数搬到main函数的前面,编译预处理
命令的后面(自己试试吧);另一种办法是在编译预处理后面加函数的声明语句,如下列程序所示:
#include
floatfexp(float);/*函数声明*/
floatflog10(float);/*函数声明*/
floatflog(float);/*函数声明*/
floatfsqrt(float);/*函数声明*/
voidmain()
{
chari;floatx;printf("enterx:
");scanf("%f",&x);printf("1.Tocalculateetothepowerx\n");printf("2.Tocalculatelogxtothebase10\n");printf("3.Tocalculatelnx\n");printf("4.Tocalculatesquarerootofx\n");printf("\n");
printf("enteryourchoice:
[1/2/3/4]");
scanf("%1s",&i);
switch(i){case'1':
fexp(x);break;case'2':
flog10(x);break;case'3':
flog(x);break;case'4':
fsqrt(x);break;default:
printf("Sorry,can\'tdoforyou!
\n");break;
}
getch();
}
floatfexp(floatx)
{
}
floatflog10(floatx)
{
}
floatflog(floatx)
{
}
floatfsqrt(floatx)
{
}
评注:
很神奇(这是编译系统的功劳,你要记住哟),程序又能执行了,跟
(1)一样,可以走遍所有的路径了。
(3)下面我们试着将一些功能添加到函数中(当然,如果你有能力,可以添加足够复杂的功能,这也是我之希望:
例如,求素数、黑洞数、反素数……可逐一添加到你的程序中,你想要某一模块干啥就去干啥):
#include
floatfexp(float);/*函数声明*/
floatflog10(float);/*函数声明*/
floatflog(float);/*函数声明*/
floatfsqrt(float);/*函数声明*/
voidmain()
{
chari;
floatx;
printf("enterx:
");
scanf("%f",&x);
printf("1.Tocalculateetothepowerx\n");
printf("2.Tocalculatelogxtothebase10\n");
printf("3.Tocalculatelnx\n");
printf("4.Tocalculatesquarerootofx\n");
printf("\n");
printf("enteryourchoice:
[1/2/3/4]");
scanf("%1s",&i);
switch(i)
{
case'1':
fexp(x);break;
case'2':
flog10(x);break;
case'3':
flog(x);break;
case'4':
fsqrt(x);break;
default:
printf("Sorry,can\'tdoforyou!
\n");break;
}
getch();
}
floatfexp(floatx)
{
printf("exp(%f)=%e\n",x,exp(x));/*exp(x)表示求ex*/
}
floatflog10(floatx)
{
printf("log10(%f)=%e\n",x,log10(x));/*log10(x)表示求log10x*/
}
floatflog(floatx)
{
printf("log(%f)=%e\n",x,log(x));/*log10(x)表示求logex*/
}
floatfsqrt(floatx)
{
printf("sqrt(%f)=%e\n",x,sqrt(x));
}
评注:
注意上列源程序中的注释哟,帮助你了解更多的数学库函数。
调试上述程序输入测试数据(x为0,选择做操作1),这是什么结果?
这2个测试数据输入,应该求的是e啊,e的
值谁都知道啊,怎么就不是这个值呢?
这一点,我想请你自己想办法了……
11.水仙花数是指一个3位数,其各位数字的立方和等于该数本身。
完善函数intdaffodil(int
n),其功能是判断整数n是否为水仙花数,如是,则该函数返回值1,否则返回值0。
#include
intdaffodil(intn)
{inti,k,j;
i=n/100;
k=n/10%10;
j=n%10;
if(n==i*i*i+k*k*k+j*j*j)
return1;
else
return0;
}
main()
{intm,i=0;
for(m=100;m<1000;m++)
if(daffodil(m)==1)
{printf("%5d",m);
i++;
if(i%5==0)
printf("\n");
}
getch();
}
12.设no是一个给定的正整数。
对于i=0,1,2,…,定义:
若口是偶数,则ni+i=ni/2;若
ni是奇数,则ni+i=3ni+1;若ni是1,则序列结束。
用这种方法产生的数称为冰雹数。
请编写一个函数voidhailstones(intn),其功能是显示由n产生的所要求的序列,按每行6个数输出该数列中的所有数。
编写main函数,在main函数中定义一个整型变量n,从键盘上输入
值77赋给n,用n作为实参调用函数hailstones。
测试数据:
77/
输出结果:
Hailstones
generated
by
77:
77
232
116
58
29
88
44
22
11
34
17
52
26
13
40
20
10
5
16
8
4
2
1
Numberofhailstonesgenerated:
23
#include
voidhailstones(intn)
while(n!
=1)
{
if(i%6==0)
printf("\n");
printf("%5d",n);
if(n%2==0)
n=n/2;
else
n=3*n+1;
i++;
}
printf("%5d",n);
i++;
}
main()
{
intn;
scanf("%d",&n);
printf("Hailstonesgeneratedby%d\n",n);
hailstones(n);printf("\nNumberofhailstonesgenerated:
%d",i);
}
13.从键盘上输入一个正整数x,判断x是否为质数,如果是则输出“TURE”,否则输出
“FALSE”。
#include
#include
main()
{
intx,k,i;
scanf("%d",&x);
for(i=2;i<=(k=sqrt(x));i++)
if(x%i==0)
break;
if(i>k)
printf("TRUE");
else
printf("FALSE");
}
14.请按要求编写程序。
编程要求:
(1)编写函数inttwinborn(intm,intn),其功能是判断整数m和n是否为孪生质数对(相差为
2的两个质数称为孪生质数),如是,则函数返回值1,否则返回值0。
(2)编写main函数,求出[10,99]内的所有孪生质数对,使得程序的运行结果为:
11,13
17,19
29,31
41,43
59,61
71,73
#include
{
intn;
for(n=2;n<=sqrt(m);n++)if(m%n==0)return0;
return1;
}
inttwinborn(intm,intn)
{if(prime(m)+prime(n)==2)
return1;
else
return0;
main()
intm,n;
for(n=10;n<=97;n++)
{m=n+2;
if(twinborn(m,n)==1)
printf("%5d,%5d\n",n,m);
53.
请编写函数inttwinborn(inta[][2],intm,intn)
其功能是找出[m,n]中的所
有孪生质数对(相差为2的两个质数称为孪生质数),并依次将每对孪生质数写到a指向的二维数组的每一行中。
编写main函数,声明一个100X2的二维数组a,并从键盘上输入m
和n的值,用a、mn作为实在参数调用函数twinborn,将结果数组以行为单位输出至屏
幕。
例如,测试数据和运行结果如下:
inputtwonumbers:
10100
29,31
41,43
59,61
71,73
#include
#include
intprime(inti)
{intk;
for(k=2;k if(i%k==0) return0; return1; } inttwinborn(inta[][2],intm,intn) {intk=0,i; for(i=m;i<=n-2;i+=1)if(prime(i)&&prime(i+2))a[k][0]=i,a[k][1]=i+2,k++; returnk; } main() {inta[100][2],m,n,i; printf("inputtwonumbers: ");scanf("%d%d",&m,&n); m=twinborn(a,m,n); for(i=0;i printf("%5d,%5d\n",a[i][0],a[i][1]); getch(); } 15.以下程序欲实现从键盘输入一个较大的整数n(n>=6),然后验证6到n之间的所有偶 数都可以分解为两个质数之和。 但程序有些错误,请改正这些错误以达到要求的功能。 【含有错误的源程序】 #include"stdio.h" voidmain() { intk,j,n,limit; do printf("Inputanumber>=6: "); scanf("%d",&limit); while(limit<6); for(n=6;n<=limit;n+=2)for(k=3
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 上机 实验 题解
![提示](https://static.bdocx.com/images/bang_tan.gif)