2024年2月3日发(作者:)
大学c_c++语言程序设计实验教程答案-阳小华-电子工业出版社
实验1 基本程序示例
任务1 熟悉C语言程序的编辑、编译、连接和运行过程【上机内容】
1.输入并运行下面程序,写出运行结果。
#include "stdio.h"
main()
{
char c1,c2;
c1=97;c2=98;
printf("%c,%c", c1, c2);
}
在此基础上,完成以下3项任务:
(1)在c1=97;c2=98;语句后加入如下语句,并运行。
printf("%d, %d", c1, c2 );
运行结果:
a,b97,98
(2)将char c1,c2;改为如下语句,再运行。
int c1, c2;
运行结果:
a,b
(3)将c1=97;c2=98;改为如下语句,再运行,并分析其运行结果。
c1=300; c2=400;
运行结果:
,,怭(或,,?)
2.分析下面程序,写出运行结果,再输入计算机中运行,将得到的结果与分析得到的结果比较对照。
#include "stdio.h"
main()
{
char c1='a',c2='b',c3='c',c4='101',c5='116';
printf("a%c b%ctabc%c n",c1,c2,c3);
printf("tb%c %c",c4,c5);
}
运行结果:
aa bb abcc
A N
3.分析下面程序,写出运行结果,再输入计算机中运行,将得到的结果与分析得到的结果比较对照。
#include "stdio.h"
main()
{
int i , j , m , n ;
i=8; j=10;
m=++i; n=j++;
printf("%d,%d,%d,%d",i,j,m,n);
}
运行结果:
9,11,9,10
分别进行以下改动后,先分析结果,再运行对照。
(1)将m=++i; n=j++;改为如下:
m=i++; n= ++ j;
运行结果:
9,11,8,11
(2)程序改为如下:
#include "stdio.h"
main()
{
int i , j ;
i=8; j=10;
printf("%d,%d", i++, j++);
}
运行结果:
8,10
(3)程序改为如下:
#include "stdio.h"
main()
{
int i , j ;
i=8; j=10;
printf("%d,%d", ++ i, ++ j);
}
运行结果:
9,11
(4)程序改为如下:
#include "stdio.h"
main()
{
int i , j ;
i=8; j=10;
printf("%d,%d,%d,%d",i,j,i++,j++);
}
运行结果:
8,10,8,10
(5)程序改为如下:
#include "stdio.h"
main()
{
int i , j , m=0 , n=0 ;
i=8; j=10;
m+= i ++; n-= --j;
printf("i=%d,j=%d,m=%d,n=%d",i,j,m,n);
}
运行结果:
i=9,j=9,m=8,n=-9
任务2 简单的C语言程序设计
1.按格式要求输入、输出数据。
程序请单如下:
#include "stdio.h"
main()
{
in a,b;
float x,y;
char c1,c2;
scanf("a%d,b=%d",&a,&b);
scanf("%f, %e",&x,&y);
scanf("%c %c",&c1,&c2); /*录入时%c与%c之间有个空格*/
printf("a=%d,b=%d,x=%f,y=%f,c1=%c,c2=%cn",a,b,x,y,c1,c2);
}
运行该程序,必须按如下方式在键盘上输入数据:
a=3,b=7 ↙
8.5,71.82a A↙ (注解:a与A之间输入一个空格,且a紧跟71.82后写,不要空格) 请写出输出结果。
运行结果:
a=7,b=3,x=8.500000,y=71.820000,c1=a,c2=A
2.输入三角形的三条边长,求三角形面积。
程序清单如下:
#include "stdio.h"
#include "math.h"
main()
{
float a,b,c,s,area;
scanf("%f ,%f,%f",&a,&b,&c);
s=1.0/2*(a+b+c);
area=sqrt(s*(s-a)*(s-b)*(s-c));
printf("area=%f",area);
}
运行结果:(具体情况根据自己输入的数据而定)
如在键盘上输入:3,4,5↙
则运行结果为:
area=6.000000
3.已知圆半径、圆柱高、求圆周长、圆柱体积。
程序清单如下:
#include "stdio.h"
main()
{
float r,h,l,v,pi;
pi=3.1415926;
scanf("%f,%f",&r,&h);
l=2*pi*r;
v=pi*r*r*h;
printf("圆周长为:%6.2fn",l);
printf("%圆柱体积为:6.2f",v);
}
运行结果:(具体情况根据自己输入的数据而定)
如在键盘上输入:5,6↙
则运行结果为:
圆周长为:31.42
圆柱体积为:471.24
4.输入一个摄氏温度,要求输出华氏温度,公式为f = 5/9·c+32。
程序清单如下:
#include "stdio.h"
main()
{
float c,f;
scanf("%f",&c);
f=5.0/9*c+32;
printf("%5.2fn",c);
}
运行结果:(具体情况根据自己输入的数据而定)
如在键盘上输入:37↙
则运行结果为:
52.56
实验2选择结构
任务1 if语句程序设计
1.修改下列程序,使之满足输入10时输出“= =”,否则输出“!=”的条件。
#include"stdio.h"
main()
{int x;
scanf("%d",&x);
if(x==10)printf("==n");
else printf("!=n");
}
2.修改下列程序,使之实现以下功能:①当a==b并且b==c时,输出“a==b==c”;②当a!=b时,输出“a!=b”。
#include “stdio.h”
main( )
{ int a,b,c;
scanf(“%d%d%d”,&a,&b,&c);
if (a==b)
{if(b==c)
printf(“a==b==c”);
}
else
printf(“a!=b”);
}
3.程序填空。从键盘输入任意一个大写字母,将其转换成相应小写字母输出。
#include
main()
{ char c;
scanf("%c",&c);
if (c>='A'&&c<='Z')或(c>=65&&c<=90)
c=c+32;
printf("n%c",c);
}
4.有以下程序,执行后输出结果为_______4_______。
#include “stdio.h”
main( )
{ int a=1,b=2,c=3,d=4;
if(a
else if((c-b)==a) printf(“%dn”,2*d);
else printf(“%dn”,4*d);
}
5.有以下程序,执行后输出结果为______9 7 0_____。
#include "stdio.h"
main( )
{ int a=8,b=7,c=9,t=0;
if(a
if(a
if(b
printf("%5d%5d%5dn",a,b,c);
}
6.有以下程序,执行后输出结果为_____9 8 7_____。
#include "stdio.h"
main( )
{ int a=8,b=7,c=9,t=0;
if(a
if(a
if(b
printf("%5d%5d%5dn",a,b,c);
}
7. x、y有如下函数关系,编写程序输入x,输出y值。
x (x<1)
y = 2x–1 (1≤x<10)
3x–11 (x≥10)
参考答案:
#include "stdio.h"
main()
{ double x,y;
scanf ("%lf",&x);
if (x<1)
y=x;
else if(x<10)
y=2*x-1;
else
y=3*x-11;
printf ("y=%lf",y);
}
8.输入一个百分制分数,要求输出对应的成绩等级:90~100为‘A’,80~89为‘B’,70~79为‘C’,60~69为‘D’,不及格为‘E’。
参考答案:
#include
main( )
{ float score;
printf("input socre:");
scanf("%f", &score);
if(score>=90)
printf("An");
else if(score>=80)
printf("Bn");
else if(score>=70)
printf("Cn");
else if(score>=60)
printf("Dn");
else
printf("En");
}
9.给一个不多于3位的正整数,编写程序完成以下要求:
(1)求出它是几位数;
(2)分别输出每一位数字;
(3)按逆序输出各位数字,例如,原数为321,应输出123。
参考答案:
#include "stdio.h"
void main()
{int a,b,c,x,n;
scanf("%d",&x);
a=x/100;
b=(x-a*100)/10;
c=x%10;
if(a!=0)
printf("%delse if(b!=0)
printf("%d为2位数,原数为%d,逆序数为%dn",x,x,c*10+b);
else
printf("%d为1位数,原数为%d,逆序数为%dn",x,x,c);
}
任务2 switch语句程序设计
1.有如下程序,执行后输出结果为______14______。
#include “stdio.h”
main ( )
{ int i=5;
switch(i)
{ case 4:i+=1;
case 5:i+=2;
case 6:i+=3;
default:i+=4;
}
printf("%dn",i);
}
2.有如下程序段,若grade的值为'C',则输出结果是_____
Medium!____
Pass!______ 。
为3位数,原数为%d,逆序数为%dn",x,x,c*100+b*10+a);
switch(grade)
{ case 'A':printf("Excellent!n");
case 'B':printf("Fine!n");break;
case 'C':printf("Medium!n");
case 'D':printf("Pass!n");break;
default:printf("Fail!n");
}
3.有以下程序,执行后输出结果为_______a=3,b=5__________
#include "stdio.h"
main( )
{ int x=0,y=1,a=2,b=3;
switch(x)
{ case 0:
switch(y)
{ case 0: a++;
case 1: b++; break;
}
case 1: a++;b++; break;
case 2: a++;b++;
}
printf("na=%d,b=%d",a,b);
}
4.将下列的程序段改用switch语句来实现,使它完成相同的功能。
if(x>=0&&x<10) y=x;
else if(x<20) y=x+3;
else if(x<40) y=-0.5*x+10;
else y=2*x-5;
参考答案:
#include "stdio.h"
main()
{ float x1,x2;
float y;
scanf("%f",&x1);
x2=x1;
switch(x1>0)
{ case 0 :y=0; break;
case 1 : switch((int)x2/10)
{ case 0: y=x2; break;
case 1: y=x2+3;break;
case 2:
case 3: y=-0.5*x2+10;break;
default: y=2*x2-5;break;
}
}
printf("x=%f,y=%f",x1,y);
}
5.以下程序计算某年某月有几天,闰年与平年的二月份天数不同。判别闰年的条件是:能被4整除但不能被100整除的年是闰年,或者能被400整除的年也是闰年。请分析程序填空。
#include "stdio.h"
#include "stdio.h"
main()
{ int yy,mm,days;
printf("input year and month:");
scanf("%d %d",&yy,&mm);
switch(mm)
{ case 1: case 3: case 5: case 7:case 8:
case 10:case 12: days=31 ;break;
case 4: case 6: case 9: case 11:days=30;break;
case 2:if(yy%4==0&&yy%100!=0||yy%400==0) days=29 ;
else days=28;
break;
default:printf("input error");break;
}
printf("the days of %d %d is %dn",yy,mm,days);
}
6.假设奖金税率如下(ma代表奖金,tr代表税率), 利用switch语句编写程序对输入的一个奖金数,输出税率和应交税款以及实得奖金数(扣除奖金税后),
① ma<1000时, tr=0%;
② 1000≤ma<2000时, tr=5%;
③ 2000≤ma<4000时, tr=8%;
④ 4000≤ma时, tr=10%。
参考答案:
#include "stdio.h"
main()
{ float ma, tr,ma_tr;
scanf("%f",&ma);
printf("奖金数为%8.2f",ma);
switch(ma>=1000)
{ case 0 :tr=0; break;
case 1 : switch((int)ma/1000)
{ case 1: tr=0.05;break;
case 2:
case 3: tr=0.08;break;
default: tr=0.1;break;
}
}
printf("税率为=%.2f,应交税款为=%.2f,实得奖金数为=%.2fn",tr,ma*tr,ma*(1-tr));
}
实验3循环结构实验(1)
任务1 while语句程序设计
1.分析并修改下面的程序,使该程序能正常结束运行。
#include
main()
{ int x,y;
x=2; y=0;
while (!y--)
printf (“%d,%dn”,x, y);
}
2.下列程序中,while循环的循环次数为___6次___。
#include
main()
{ int i=0;
while(i<10)
{ if(i==5) break;
i++;
}
printf (“%dn”,i);
}
3.下面是一个计算e的近似值(使误差小于给定的数值)的程序。
#include
main()
{ double e=1.0,x=1.0,y,detax;
int i=1;
printf("please input enter :n");
scanf("%lf",&detax);
y=1/x;
while(y>=detax)
{
x=x*i;
y=1/x;
e=e+y;
++i;
}
printf("%12.10f",e);
}
参考答案:
实验要求:
(1)阅读上面的程序,写出程序所依据的计算公式。
e=1+1/1!+1/2!+1/3!+....+1/n!
(2)当输入的detax各是什么值时,能分别使程序按下面的要求运行:
a.不进入循环;detax>1.0
b.只循环两次;detax>0.5&&detax<=1.0
c.进入死循环(程序将永远循环下去)。<=0
(3)原程序中while语句中的y>=detax,分别换成
y>detax,y=detax,y
4.编写程序。对输入的任意的一个正整数按反序输出。例如,输入147,输出741。参考答案:
#include "stdio.h"
void main()
{
int x,i;
scanf("%d",&x);
while(x!=0)
{ i=x%10;
x=x/10;
printf("%d",i);
}
}
任务2 do-while语句程序设计
1.分析并修改下面的程序,使该程序能正常结束运行。
#include
main()
{ int x=0;
do{
x++;
}while(x==2);
printf (“%dn”,x);
}
2.有以下两段程序,比较输出结果并分析原因。
(一)
main()
{ int x=0;
while(x<0) x++;
printf (“%dn”,x);
}
结果为:0
(二)
main()
{ int x=0;
do{ x++;
}while(x<0);
printf (“%dn”,x);
}
结果为:1
两段程序结果不同,是因为x的初始值为0,从而使循环条件不成立。当循环条件不成立一次都不成立时,do……while循环会比while循环多执行一次循环体。
3.下列程序中,do_while循环的循环次数为__ 无限次____。
#include
main()
{ int i=0;
do{ if(i==6) continue;
i=i+2;
}while(i<10);
printf ("%dn",i);
}
4.运行下列程序,输出结果为_______sum=4000_______。
#include "stdio.h"
#define N 100
main( )
{ int x=0,sum=0;
do{ if(x==(x/5*5))
continue;
sum=sum+x;
}while(++x
printf("sum=%dn",sum);
}
5.求 1!+2!+3!+4!+5!+6!+7!+8!+9!+10!
请填空将下面的程序补充完整:
答案:4037913
#include
main( )
{ int j,m,p,s;
s=0;
m=1 ;
do
{ p=1;
j=1 ;
while(j<=m)
{ p*=j;
j++;
}
s=s+p;
m++;
} while(m<=10);
printf("s=%dn",s);
}
6. 编写程序。每个苹果0.8元,第一天买2个苹果,第二天开始,每天买前一天的2倍,直至购买的苹果总个数到不超过100的最大值,求每天平均花多少钱? 答案:9.92
参考答案:
#include "stdio.h"
void main()
{
int x,sum,day;
double ave=0;
x=2;
day=1;
sum=2;
do
{x=2*x;
sum=sum+x;
day++;
}while(sum<=100);
ave=(sum-x)*0.8/(day-1);
printf("%lf",ave);
}
实验4循环结构实验(2)
任务1 for语句程序设计
1.分析并修改下面的程序,使该程序能正常结束运行。
#include
main()
{ int i;
for(i=1;i<10;i++)
printf ("%dn",i);
}
2.分析并修改下面的程序,使sum的值为1+2+……+10的和。
#include
main( )
{ int i=1,sum=0;
for(;i<=10;i++)
sum=sum+i;
printf ("sum=%dn",sum);
}
3.运行下列程序,输出结果为_________sum=15________。
#include
main()
{ int i,sum=0;
for(i=0;i<=10;i++)
{ sum=sum+i;
if(i==5) break;
}
printf ("sum=%dn",sum);
}
4.运行下列程序,输出结果为_______sum=4000________。
#include
main()
{ int i,sum=0;
for(i=0;i<=100;i++)
{ if((i%5)==0)
continue;
sum=sum+i;
}
printf ("sum=%dn",sum);
}
5.运行下列程序,输出结果为_______ sum=60________。
#include
main()
{ int i,j,sum=0;
for(i=0;i<=3;i++)
for(j=0;j<=5;j++)
sum=sum+j;
printf ("sum=%dn",sum);
}
6.程序填空。求出1000以内能被13整除的最大数。
#include "stdio.h"
main()
{ int i;
for( i=1000 ; i>0 ;i--)
if( i%13==0 )
break;
printf("n%d",i);
}
7.程序填空。求如下Fibonacci 数列1,1,2,3,5,8,…… 的
前40个数,要求每一行输出8个数。
F11(n 1)F21
(n 2)Fn Fn 1Fn 2(n 3)==??==??=-+-?
≥ 参考答案:
#include
main( )
{ long f1,f2;
int i;
f1=1; f2=1;
for(i=1; i<=20; i++ )
{ printf("%10ld%10ld",f1,f2);
if( i%4==0 ) printf("n");
f1=f1+f2;
f2=f2+f1;
}
}
8.程序填空。从键盘输入10个不为0的整型数,统计其中负数的个数并求出所有正数的平均值。
参考答案:
#include
main( )
{ int i,x,count=0;
float ave=0;
for(i=0;i<10;i++)
{ scanf("%d",&x);
if(x>0)
ave+= x ;
else
count++ ;
}
if(count!=10)
ave/= 10-count ;
printf("count:%d,Average:%fn",count,ave);
}
9.帕多瓦数列:1,1,1,2,2,3,4,5,7,9,12,16,21,…求出这个数列的前20项之和。参考答案:
方法1《一次一项》
#include "stdio.h"
main()
{ int f1=1,f2=1,f3=1,f,sum=3,i;
printf("%d %d %d",f1,f2,f3);
for(i=4;i<=20;i++)
{ f=f1+f2;
printf(" %d",f);
sum=sum+f;
f1=f2;
f2=f3;
f3=f;
}
printf("nsum=%d",sum);
}
方法2《一次3项》
#include "stdio.h"
main()
{ int f1=1,f2=1,f3=1,sum=0,i;
for(i=1;i<=7;i++)
{ printf("%4d%4d%4d",f1,f2,f3);
sum=sum+f1+f2+f3;
f1=f1+f2;
f2=f2+f3;
f3=f3+f1;
}
printf("nsum=%d",sum-f3+f1);
}
10.统计能被4整除而且个位数为6的4位数的个数及和。
参考答案:
#include "stdio.h"
main()
{ int i,sum=0,count=0;
for(i=1000;i<=9999;i++)
if(i%10==6&&i%4==0)
{ count++;
sum=sum+i;
}
printf("个数为:%8d,总和为:%8dn",count,sum);
}
11.求1~100之间所有素数的个数及和。
参考答案:
#include
#include
main()
{ int m,n,i,j,k,sum=0;
n=0;
for(m=2;m<=100;m++)
{ k=(int)sqrt(m);
i=2;
while(m%i!=0&&i<=k)
i++;
if(i==k+1)
{n++;sum=sum+m; }
}
printf("共有%8d个素数,总和为%8dn",n,sum);
}
12.(1)编写程序输出下面的数字金字塔。
1
121
12321
1234321
123454321
参考答案:
#include
main()
{
int n=5, i,j;
for(i=1;i<=5;i++)
{
for(j=1;j<=5-i;j++)
printf(" " );
for(j=1;j<=i;j++)
printf("%d",j );
for(j=i-1;j>=1;j--)
printf("%d",j );
printf("n");
}
}
12.(2)编写程序输出下面的数字金字塔。
1
222
33333
4444444
555555555
参考答案:
#include
main()
{
int n=5, i,j;
for(i=1;i<=5;i++)
{
for(j=1;j<=5-i;j++)
printf(" " );
for(j=1;j<=2*i-1;j++)
printf("%d",i );
printf("n");
}
}
实验5 函数定义、声明与调用
任务1 函数的定义和声明
1.预测下面程序的输出,并上机运行验证结果。(结果:#include
func(int a,int b)
{
int c;
c=a+b;
return c;
}
main()
{
int x=6,y=7,z=8,r;
r=func((x--,y++,x+y),z--);
printf("%dn",r);
21)
}
2.分析推测下面程序的输出,并上机运行验证结果。(结果:12)#include
unsigned fun26(unsigned num)
{
unsigned k=1;
do
{ k*=num%10;num/=10; }
while(num);
return k;
}
main()
{
unsigned n=26;
printf("%dn",fun26(n));
}
3.求出以下程序的运行结果,并描述程序所完成的功能。
(结果:s=16。功能是:求x的n次幂即2的4次幂。)
#include
main()
{
int power(int x,int n);
int x=2,n=4;
printf("ns=%d",power( x,n));
}
int power(int x,int n)
{
int i,p=1;
for(i=1;i<=n;i++)
p=p*x;
return(p);
}
4.上机调试下面计算两个整数之和的程序,记录系统给出的出错信息,指出出错原因并予以改正。
正确代码为:
#include
int sum( int a,int b) //函数不能嵌套定义,所以将sun函数拉到main函数外,同
{ 时形参的每个参数前都必须要有类型
{
return (a+b);
}
main()
{
int x,y;
scanf("%d,%d",&x,&y);
printf("%dn",sum(x,y)); //形参与实参的个数要一致,所以将加号改成逗号。
}
5.上机调试下面判断n是否是素数的程序,函数fun中有逻辑错误,调试并改正。
正确代码为:
#include
fun(int n)
{
int k,yes=1;
for(k=2;k<=n/2;k++)
if(n%k==0) {yes=0; break;} //反证法证明,找到一个就跳出,否则会被后面覆盖
else yes=1;
return yes;
}
main()
{
int n;
scanf("%d",&n);
if(fun(n)) //将main函数中的函数调用fun()改成fun(n),因为实参的个数应与形参对应
printf("%d:yes!n",n);
else
printf("%d:no!n",n);
}
6.下面程序中,函数fun的功能是根据形参m计算公式T=1/1!+1/2!+1/3!+…+1/m!的值,上机调试,请改正程序中的错误。当从键盘输入10时,给出程序运行的正确结果(按四舍五入保留10位小数)。
正确代码为:(输入10时的结果:1.7182818011)
#include
main()
{double fun(int m); //先调用再定义,且不是能缺省的int型,请加上函数说明。
int m;
printf("n input m:");
scanf("%d",&m);
printf("n t=%12.10lf n",fun(m));
}
double fun(int m)
{
double fac,t=0.0;
int i=1,j;
for(i=1;i<=m;i++)
{
fac=1.0;
for(j=1;j<=i;j++) fac=fac*j; //逻辑有误,改为:for(j=1;j<=i;j++) fac=fac*j;这样才表示求i!,原程序行是求i的m次方。
t+=1.0/fac;
}
return t;
}
任务2 函数的嵌套调用
1.跟踪调试下面程序,注意函数调用的过程中形参、实参的关系。记录并分析结果;将形参a,b对应改为x,y,使之与实参变量同名,记录并分析结果。
#include
main()
{
int t,x=2,y=5;
int swap(int,int);
printf("(1) in main: x=%d,y=%dn",x,y);
swap(x,y);
printf("(4) in main: x=%d,y=%dn",x,y);
}
swap(int a,int b)
{
int t;
printf("(2) in swap: a=%d,b=%dn",a,b);
t=a;
a=b;
b=t;
printf("(3) in swap: a=%d,b=%dn",a,b);
}
结果:
(1) in main: x=2,y=5
(2) in swap: a=2,b=5
(3) in swap: a=5,b=2
(4) in main: x=2,y=5
将形参a,b对应改为x,y 结果:
(1) in main: x=2,y=5
(2) in swap: x=2,y=5
(3) in swap: x=5,y=2
(4) in main: x=2,y=5
结论:无论实参、形参是否同名,交换的只是子函数(swap)中两个变量的值。主函数中的x,y的值没有变。
2.若输入2、3,求以下程序的运行结果,分析函数嵌套调用的执行过程。
#include
long sum(int a,int b);
long factorial(int n);
main()
{
int n1,n2;
long a;
scanf("%d,%d",&n1,&n2);
a=sum(n1,n2);
printf("a=%ld",a);
}
long sum(int a,int b)
{
long c1,c2;
c1=factorial(a);
c2=factorial(b);
return(c1+c2);
}
long factorial(int n)
{
long rtn=1;
int i;
for(i=1;i<=n;i++)
rtn*=i;
return(rtn);
}
(结果为:a=8。程序功能:求n1!+n2! 即:2!+3!)
3.运行下面程序,写出运行结果。
#include "stdio.h"
main()
{
int i=5;
void palin(int n);
printf("please input 5 characters: ");
palin(i);
printf("n");
}
void palin(int n)
{
char next;
if(n<=1)
{
next=getchar();
printf("n0: ");
本文发布于:2024-02-03 11:05:32,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170692953250192.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |