为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

2014版C++实验答案完整版

2017-10-16 50页 doc 131KB 471阅读

用户头像

is_266065

暂无简介

举报
2014版C++实验答案完整版2014版C++实验答案完整版 实验1 顺 序 结 构 任务1 熟悉C语言程序运行环境 【上机内容】 1(输入并运行以下程序,观察运行结果。 #include "stdio.h" main() { printf("*********************\n"); printf(" very good!\n"); printf("*********************\n"); } 运行结果: ********************* very good~ *****************...
2014版C++实验答案完整版
2014版C++实验完整版 实验1 顺 序 结 构 任务1 熟悉C语言程序运行环境 【上机】 1(输入并运行以下程序,观察运行结果。 #include "stdio.h" main() { printf("*********************\n"); printf(" very good!\n"); printf("*********************\n"); } 运行结果: ********************* very good~ ********************* 2(输入并运行以下程序,观察运行结果。 #include int main(void) { int num1, num2; num1=1; num2=2; printf("num1+num2=%d", num1+num2); } 运行结果: num1+num2=3 任务2 简单的C语言程序设计 【上机内容】 1(输入并运行以下程序,观察运行结果。 #include "stdio.h" main() { float x=10,y; printf("\n2.4*x-1/2=%f",2.4*x-1.0/2); printf("\nx%%2/5-x=%f",(int)(x)%2/5-x); printf("\n(x-=x*10,x/=10)=%d\n",(x-=x*10,x/=10)); return 0; } 运行结果: 2.4*x-1/2=23.500000 x%2/5-x=-10.000000 (x-=x*10,x/=10)=0 2(输入并运行以下程序,观察运行结果。 #include "stdio.h" main( ) { int a,x,y; x=(a=2,6*2); y=a=2.6 *a; printf("x=%d,y=%d\n",x,y); } 运行结果: x=12,y=5 3(输入并运行以下程序,观察运行结果。 #include "stdio.h" main() { char c1,c2; c1=97;c2=98; printf("%c,%c", c1, c2); } 运行结果: a, b 将c1=97;c2=98;改为如下语句,再运行,并其运行结果。 c1=300; c2=400; 运行结果: ,,怭(或,,?) (分析下面程序,写出运行结果,再输入计算机中运行,将得到的结果与分析得到的结果4 比较对照。 #include "stdio.h" main() { char c1='a',c2='b',c3='c',c4='\101',c5='\116'; printf("a%c b%c\tabc%c \n",c1,c2,c3); printf("\t\b%c %c",c4,c5); } 运行结果: aa bb abcc A N 5(分析下面程序,写出运行结果,再输入计算机中运行,将得到的结果与分析得到的结果 比较对照。 #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 任务3 各种类型数据的输入/输出 【上机内容】 1(按格式要求输入、输出数据。 程序请单如下: #include "stdio.h" main() { int a,b; flost 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=%c\n",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.2f\n",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.2f\n",c); } 运行结果:(具体情况根据自己输入的数据而定) 如在键盘上输入:37? 则运行结果为: 52.56 实验2 选 择 结 构 【上机内容】 1(修改程序如下: #include "stdio.h" main() { int x; scanf("%d",&x); if(x==10) printf("==\n"); else printf("!=\n"); } 2(修改程序如下: #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"); } 或者 #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 ; else printf("a!=b"); } 3程序填空如下:如果输入的数据c为大写英文字母,则将其转换成对应的小写字母输出, 否则以原值输出。 #include main() { char c; scanf("%c",&c); if(c>=?A?&&c<=?Z?) c=c+32; printf("\n%c",c); } 4(有以下程序,执行后输出结果为____4_____。 #include "stdio.h" main() { int a=1,b=2,c=3,d=4; if(a=1&&x<10) y=2*x-1; if(x>=10) y=3*x-11; printf("%f",y); } 8( 输入一个百分制分数,要求输出对应的成绩等级:90,100为‘A’,80,89为‘B’, 70,79为‘C’,60,69为‘D’,不及格为‘E’。 源程序如下: #include main() { float score; printf("请输入成绩:"); scanf("%f",&score); if (score>=90) printf("A\n"); else if(score>=80) printf("B\n"); else if (score>=70) printf("C\n"); else if (score>=60) printf("D\n"); else printf("E\n"); } 9(给一个不多于3位的正整数,编写程序完成以下要求: (1)求出它是几位数; (2)分别输出每一位数字; (3)按逆序输出各位数字,例如,原数为321,应输出123。 源程序如下: #include"stdio.h" main() {int a,b,c,x; scanf("%d",&x); a=x/100; b=(x%100)/10; c=x%10; if (a!=0) printf("三位数,%d,%d,%d,%d%d%d",a,b,c,c,b,a); else if(b!=0) printf("两位数,%d,%d,%d%d",b,c,c,b); else printf("一位数,%d,%d",c,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("%d\n",i); } 2(有以下程序段,若grade的值为'C',则输出结果是___ Medium!_ ___ Pass!___。 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*2+3; else if(x<40) y=-0.5*x+10; 源程序如下: #include "stdio.h" main() { float x,y; scanf("%f",&x); switch((int)x/10) { case 0:y=x;break; case 1:y=x*2+3;break; case 3:y=-0.5*x+10;break; } printf("y=%f",y); } 5(以下程序计算某年某月有几天,闰年与平年的2月天数不同。判别闰年的条件是:能被4整除但不能被100整除的年是闰年,或者能被400整除的年也是闰年。请分析程序填空。 #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 %d\n",yy,mm,days); } 6(假设奖金税率如下(ma代表税前奖金且ma>0,r代表税率),利用switch语句编写程序对输入的一个奖金数,输出税率和应交税款及实得奖金数(扣除奖金税后)。 ? 0?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,y,s; printf("请输入奖金"); scanf("%f",&ma); switch ((int)ma/1000) { case 0: tr=0;break; case 1:tr=0.05;break; case 2: case 3: tr=0.08;break; default:tr=0.1;break; } y=tr*ma ; s=ma-y; printf("税率:%.2f,税款:%.2f,实得奖金:%.2f",tr,y,s); } 实验3 循环结构(1) 任务1 while语句程序设计 【上机内容】 1(修改程序如下: #include main() { int x,y; x=2; y=0; while (!y--) printf ("%d,%d\n",x, y); } 2(下面程序中,while循环的循环次数为______6次______。 #include main() { int i=0; while(i<10) { if(i==5) break; i++; } printf ("%d\n",i); } 3(求1000以内奇数的和,请填空将下面的程序补充完整。 #include main() { int i=1,sum=0; while(i<=1000) { if(i%2!=0) ___sum=sum+i_______; i ++; } printf("1000以内奇数的和:%d\n",sum); } 4(编写程序。对输入的任意一个正整数按反序输出。例如,输入1247,输出7421。 源程序如下: #include"stdio.h" main() {int x; scanf("%d",&x); while(x!=0) {printf("%d",x%10); x=x/10; } } 5(编写程序。输入两个正整数m和n,求其最大公约数与最小公倍数。 源程序如下: #include"stdio.h" main() { int m,n,r,a,b,t,z; scanf("%d%d",&m,&n); a=m,b=n; r=m%n; while(r!=0) { m=n;n=r,r=m%n; } z=a*b/n; printf("最大公约数为:%d,最小公倍数为:%d\n",n,z); } 任务2 do„while语句程序设计 【上机内容】 1(修改序如下: #include main() { int x=0; do{ x++; }while(x==2); printf ("%d\n",x); } 2(有以下两段程序,比较其结果,并分析结果不同的原因。 (1) 结果为 0 #include main() { int x=0; while(x<0) x++; printf ("%d\n",x); } (2)结果为 1 #include main() { int x=0; do{ x++; }while(x<0); printf ("%d\n",x); } 3(运行下面程序,输出结果为_____105___________。 #include main( ) { int i=1,s=1; do{ if(i==9) break; s=s*i; i=i+2; }while(i<20); printf ("s=%d\n",s); } 4(运行下面程序,输出结果为__sum=4000_____。 #include main() { int x=0,sum=0; do{ if(x==(x/5*5)) continue; sum=sum+x; }while (++x<100); printf ("sum=%d\n",sum); } 5(求1!+2!+3!+4!+5!+6!+7!+8!+9!+10!,请填空将下面的程序补充完整。 #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=%d\n", s ) ; } 6(输入任意一个正整数n,将n各位上为奇数的数取出,按原来从高位往低位相反的顺序 组成新的数并输出。比如:输入一个整数:17465238,输出:3571。 源程序如下: #include"stdio.h" main() {int n,t,x=0; scanf("%d",&n); do{ t=n%10; if(t%2!=0) x=x*10+t; n=n/10; }while(n>0); printf("%d\n",x); } 7(编写程序求出从100,999之间(含100和999)所有整数中各位上数字之和为x(x为 一个正整数,要求从键盘上输入)的整数的个数,比如:输入x=5时,满足条件的整数个 数为15,输入x=20时,满足条件的整数个数为36。 源程序如下: #include"stdio.h" main() { int x,n,s1,s2,s3,t; scanf("%d",&x); t=100; n=0; do{ s3=t%10; s2=(t/10)%10; s1=t/100; if(s1+s2+s3==x) n++; t++; }while(t<=999); printf("%d\n",n); } 实验4 循环结构(2) 任务1 for语句程序设计 【上机内容】 1(修改程序如下: #include main() { int i; for(i=1;i<10;i++) printf ("%d\n",i); } 2((修改程序如下:使sum的值为1+2+„+10的和。 #include main() { int i=1,sum=0; for(;i<=10;i++) sum=sum+i; printf ("sum=%d\n",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=%d\n",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=%d\n",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=%d\n",sum); } 6(程序填空。求出1000以内能被13整除的最大数。 #include 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个数。 fn,,1(1),1, fn,,1(2),2,?fffn,,(3)nnn,,12, 程序清单如下: #include main( ) { long int 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 ; float ave ; for( i=0, ave=0, count=0; i< 10 ; i++ ) { scanf("%d", &x ) ; if( x>0 ) ave +=__x_____; else ___count++_____________; } if( count != 10 ) ave /= _10-count______; printf("count:%d,Average:%f\n",count,ave ) ; } 9(统计能被4整除且个位数为6的4位数的个数及和。 源程序如下: #include main() {int i,sum=0,count; count=0; for(i=1000;i<10000;i++) if(i%4==0&&i%10==6) {sum=sum+i; count++;} printf("count:%d,sum:%d\n",count,sum); } 23n10(输入数据n和x,计算级数和s=1+x+x/2!+x/3!+„+x/n!。 源程序如下: #include main() {float j,i,t=1,m=1,n;float s=1,x; scanf("%f%f",&n,&x); for(i=1;i<=n;i++) {t=t*x;m=m*i; j=t/m; s=s+j;} printf("s:%f",s); } 11(求2,100之间所有素数的个数及和。 源程序如下: #include main() { int x,i,c=0,s=0; for(x=2;x<=100;x++) { i=2; while (x%i!=0&&i<=x-1) i++; if(i==x) {c++;s=s+x;} } printf("个数为:%d,和为:%d\n",c,s); } 12(编写程序输出下面的数字金字塔。 1 222 33333 4444444 555555555 源程序如下: # include main() {int i,j; for(i=1;i<=5;i++) {for (j=1;j<=2*i-1;j++) printf("%d",i); printf("\n");} } 实验5 函数(1) 任务1 函数的定义和声明 1(预测下面程序的输出,并上机运行验证结果。(结果:12) #include unsigned fun(unsigned num) { unsigned k=1; do { k*=num%10;num/=10; } while(num); return k; } main() { unsigned n=26; printf("%d\n",fun(n)); } 2(分析推测下面程序的输出,并上机运行验证结果。(结果:21) #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("%d\n",r); } 3(若输入7654321,求以下程序的运行结果,并描述程序所完成的功能。 (结果:The result is:642。功能是:从低位开始取出长整形变量s中偶数位上的数,依次构成 一个新数放在t中,高位仍在高位,低位仍在低位。) #include long fun (long s) {long t,sl=10; s /= 10; t = s % 10; while (s > 0) { s = s/100; t = s%10*sl + t; sl = sl * 10; } return t; } main() { long s,t; scanf("%ld", &s); t=fun(s); printf("The result is: %ld\n", t); } 4(上机调试下面计算两个整数之和的程序,记录系统给出的出错信息,指出出错原因并予 以改正。 正确代码为: #include /************found************/ int fun(int x, int y, int z) //函数名前要有类型(国二考试时函数类型是int也不能省),同时形参 的每个参数前都必须要有类型 {int j,t ,n ,m; j = 1 ; t=j%x; m=j%y ; n=j%z; while(t!=0||m!=0||n!=0) {j = j+1; t=j%x; m=j%y; n=j%z; } /************found************/ return j; //注意变量的名称及含义 } main() { int x1,x2,x3,j ; printf("Input x1 x2 x3: "); scanf("%d%d%d", &x1,&x2,&x3); printf("x1=%d, x2=%d, x3=%d \n",x1,x2,x3); j=fun(x1,x2,x3); printf("The minimal common multiple is : %d\n",j); } 5(上机调试下面判断n是否是素数的程序,函数fun中有逻辑错误,调试并改正。 正确代码为: #include fun(int n) { int k,yes=1; for(k=2;k<=n/2;k++) /************found************/ if(n%k==0) {yes=0; break;} //反证法证明,找到一个就跳出,否则会被后面覆盖 else yes=1; return yes; } main() { int n; scanf("%d",&n); /************found************/ 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 /************found************/ double fun(int m); //先调用再定义,且不是能缺省的int型,请加上函数说明。 main() { 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; /************found************/ 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 x=2,y=5; void swap(int,int); printf("(1) in main: x=%d,y=%d\n",x,y); swap(x,y); printf("(4) in main: x=%d,y=%d\n",x,y); } void swap(int a,int b) { int t; printf("(2) in swap: a=%d,b=%d\n",a,b); t=a; a=b; b=t; printf("(3) in swap: a=%d,b=%d\n",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" int abc(int u,int v); main () { int a=24,b=16,c; c=abc(a,b); printf("%d\n",c); } int abc(int u,int v) { int w; while(v) { w=u%v; u=v; v=w;} return u; } (程序功能:求两数的最大公约数即24,16的最大公约数。结果:8) 4(给定程序中,函数fun的功能是根据形参i的值返回某个函数的值。当调用正确时,程 序输出:x1=5.000000, x2=3.000000, x1*x1+x1*x2=40.000000。请在下划线处填入正确的内容, 使程序得出正确的结果。 #include double f1(double x) {return x*x;} double f2(double x, double y) {return x*y;} /**********found**********/ double fun(int i, double x, double y) //函数的类型与返回值的类型一致,所以为double。 {if (i==1) /**********found**********/ return f1(x); //只有一个实际参数,所以为f1。 else /**********found**********/ return f2(x, y); //有两个实际参数,所以为f2。 } main() {double x1=5, x2=3, r; r = fun(1, x1, x2); r += fun(2, x1, x2); printf("\nx1=%f, x2=%f, x1*x1+x1*x2=%f\n\n",x1, x2, r); } 实验6 函数(2) 任务1 函数的递归调用 1(fact(j-1)*j 2(gcd(n,m%n) m int fun (int n) {int c; if(n==1) c = 10 ; else c= fun(n-1)+2; return(c); } main() { int n; printf("Enter n : "); scanf("%d",&n); printf("The result : %d\n", fun(n)); } 任务2 变量的存储类型与编译预处理 1(t1=4,t2=12,b=100 a=2,b=4 2((1):1 (2):2 (3):11 (4):3 (5):2 3(7 8 9 4(Y=7 5(Y=3 6(#define FU(m,n) ((m)/(n)) return(value); 7(程序代码如下: #include "stdio.h" #define MAX(A,B) (A)>(B)?(A):(B) #define ZMAX(A,B,C) MAX(MAX(A,B),C) main() { int a,b,c,t; printf("input a,b,c:"); scanf("%d,%d,%d",&a,&b,&c); t=ZMAX(a,b,c); printf("max of a,b,c:%d\n",t); } 实验7 数组(1) 任务1 数组的基本定义与应用 1(14 2(6,4,3,2, 3(a=a+arr[i][j] j=2 j-- i+j==2 输出为:a=13,b=14 4(i=1 x[i-1] 5(m<1000或m<=999 m/10%10或m/10-x*10 a[j]=m i=j;i— a[i+1]=a[i] 3(t=i i 0或„\0? 4(int i, j=0; for(i=0; i方法
1(阅读分析下面程序,写出运行结果,理解指针概念及“*”与“&”的含义。 #include main() { int a,b; int *p1,*p2; a=100; b=10; p1=&a; p2=&b; printf("a=%d,b+2= %d\n",a ,b+2); printf("*p1=%d,*p2+2= %d\n",*p1,*p2+2 ); } 运行结果为: a=100,b+2= 12 *p1=100,*p2+2= 12 2(上机验证下列程序的运行结果。 #include void main( ) { int a,b,*p1,*p2; p1=&a; p2=&b; a=5; b=7; printf("\na=%d,b=%d,p1=%dp2=%d",a,b,p1,p2); printf("\n&a=%d,*&a=%d,&b=%d,*&b=%d\n",&a,*&a,&b,*&b); } 运行结果如下: a=5,b=7,p1=1245052,p2=1245048 &a=1245052, *&a=5,&b=1245048, *&b=7 思考:在本题中,可不可用&*a来代替*&a, 不能代替,上机验证通不过。所以*号只能写在地址或指针变量的前面,不能写在普通变量的前面。 3(分析下面程序,并运行,理解用指针变量进行输入、输出。 #include main( ) { int *p,m; scanf("%d",&m); p=&m; /*指针p指向变量m*/ printf("%d",*p); /*p是对指针所指的变量的引用形式,与此m意义相同 */ } 如从键盘上输入:5 则运行结果为:5 上述程序可修改为如下: #include main( ) { int *p,m; p=&m; scanf("%d",p) ; /*p是变量m的地址,可以替换&m*/ printf("%d",m); } 如从键盘上输入:5 则运行结果为:5 请比较上述两个程序的异同,以理解指针与地址的概念。 4(编写程序,从键盘输入两个数,输出时从大到小排列(利用指针概念)。 参考程序一: #include main() { int *p1,*p2,*p,a,b; scanf(",d,,d",&a,&b); p1=&a; p2=&b; if(a swap(int *p1,int *p2) { int temp; temp=*p1; *p1=*p2; *p2=temp; } main() { int a ,b; int *pa,*pb; scanf(",d,,d",&a,&b); pa=&a;pb=&b; if(a main( ) { int a[]={1,2,3,4,5,6,7,8,9}; int *p=a,b,c,s=0; for(b=0;b<3;b++) for(c=0;c<3;c++) if(b==c) { p++; s+=*p; } printf("s=%d",s); } 运行结果为:s=9 2(阅读下面程序,理解指针、数组的多种表示法 #include main( ) { int a[]={1,2,3}; int *p,k; p=a; for(k=0;k<3;k++) { printf("a[%d]=%d\n",k,a[k]); printf("p[%d]=%d\n",k,p[k]); printf("*(p+%d)=%d\n",k,*(p+k)); printf("*(a+%d)=%d\n",k,*(a+k)); } } 运行结果为: a[0]=1 p[0]=1 *(p+0)=1 *(a+0)=1 a[1]=2 p[1]=2 *(p+1)=2 *(a+1)=2 a[2]=3 p[2]=3 *(p+2)=3 *(a+2)=3 3(在空格中填上语句,以实现字符串复制的功能。 #include main( ) { char *ps="C language"; char str[15]; char *p1,*p2; p1=ps; p2=str; while(*p1!='\0') { *p2=*p1 ; p1++ ; (注:这个空的答案和下个空的答案可调换位置) p2++ ; } *p2='\0'; printf("ps=%s\n",ps); printf("str=%s\n",str); } 运行结果为: ps=C language str=C language 4(下面程序完成从键盘输入两个字符串a和b,再将a和b的对应位置字符中的较大者存 放在数组c中,当一个字符串结束时停止比较,此时将另一个字符串剩下的字符直接放在数 组c的后面,填空完成该程序。 #include #include void main( ) { int k=0; char a[80],b[80],c[80]={'\0'},*p,*q; p=a;q=b; gets(a); gets(b); while( *p&&*q或*p!= '\0'&&*q!= '\0' 或*p!=0&&*q!=0 ) { if( *p>*q或 *p>=*q ) c[k]=*p; else c[k]=*q; p++; q++ ; k++; } if(*p!= '\0') strcat(c,p); else strcat(c,q); puts(c ); } 5(指出下面程序的问题所在(输出a数组的10个元素),理解指针与数组下标的关系及指 针变化情况。 void main( ) { int a[10]; int *p,k; p=a; for(k=0;k<10;k++) { *p=k; p++; } for(k=0;k<10;k++,p++) printf("%d,",*p); } 运行结果为:输出10个随机数,原因是当第一个for循环结束后,指针已经指到最后 一个元素的下一个地址,此时再输出,已经输出的不是原来存储的数据了。 6(编程实现从键盘输入10个整数,然后求出其中最小值(采用指针实现)。 参考程序如下: #include main( ) { int a[10],min; int *p,k; p=a; for(k=0;k<10;k++) { scanf("%d",p);p++; } p=a; min=a[0]; for(k=0;k<10;k++,p++) if(min>*p)min=*p; printf("%d",min); } 实验10 指针(2) 任务1 使用指针访问二维数组 1(阅读并运行下列程序,理解访问二维数组元素的多种方法。 #include void main( ) { int a[3][4]; int i,j; for(i=0;i<3;i++) for(j=0;j<4;j++) scanf("%d",&a[i][j]); /*数组元素下标表示法*/ for(i=0;i<3;i++) { for(j=0;j<4;j++) printf("%4d",*(*(a+i)+j)); /*数组元素指针表示法*/ printf("\n"); } printf("\n"); for(i=0;i<3;i++) { for(j=0;j<4;j++) printf("%4d",*(a[i]+j)); /*数组元素下标+指针表示法*/ printf("\n"); } printf("\n"); } 如果从键盘上输入:1 2 3 4 5 6 7 8 9 10 11 12 则运行结果为: 1 2 3 4 5 6 7 8 9 10 11 12 1 2 3 4 5 6 7 8 9 10 11 12 2(分析下面程序的输出结果,理解指针与二维数组以及数组指针的概念。 #include void f(int (*b)[3]); void main( ) { static int a[2][3]={{1,2,3},{4,5,6}}; f(a); } void f(int (*b)[3]) { printf("\n%d %d %d\n",b[0][0],b[0][1],b[0][2]); } 运行结果为: 1 2 3 思考:如将int(*b)[3]改为int(*b)[2],结果会如何, 运行结果一样。 任务2 熟练掌握指针与函数的关系 1(下面程序完成截取字符串s中从第m个位置开始的n个字符,返回所截字符串的首地址 (即指针型函数),认真阅读分析程序,写出运行结果。 #include static char sub[20]; void main( ) { static char s[]="CLanguageProgram"; char *cut(char *s,int m,int n),*p; p=cut(s,3,4); printf("%s\n",p); } char *cut(char *s,int m,int n) { int i; for(i=0;i main( ) { int sub_max(int b[],int i); int n,a[10],*ptr=a; /*定义变量,并使指针指向数组*/ int max,i=10; for(n=0;n<=i-1;n++) scanf("%d",&a[n]); max= sub_max(a,i) ; /*函数调用,其实参是指针*/ printf("max=%d\n",max); } int sub_max(int b[],int i) /*函数定义,其形参为数组*/ { int temp,j; temp=b[0] ; for(j=1;j #include main( ) { int i; static char c[][16]={"c language","fox","computer","home page"}; static char *cp[]={c[0],c[1],c[2],c[3]}; static char **cpp; /*指向字符指针的指针变量*/ cpp=cp; /*将指针数组的首地址传递给指向字符指针的指针变量*/ for(i=0;i<4;i++) /*按行输出字符串*/ printf("%s\n",*cpp++); printf("-----------\n"); for(i=0;i<4;i++) { cpp=&cp[i]; printf("%s\n",*cpp); } } 运行结果如下: c language fox computer home page ---------- c language fox computer home page 实验11 指针(3) 任务 使用指针编写综合应用程序 1(某班有M个学生,开设三门课程(高数、英语、计算机)的成绩,编程输入学生的学号 及三门课程的成绩,求各人的平均分,并显示。 参考程序如下: #include "stdio.h" #define M 5 struct student { int num; int score[3]; float average; }stu[M]; main( ) { struct student *p; for(p=stu;pnum),&(p->score[0]),&(p->score[1]),&(p->score[2])); p->average=(p->score[0]+p->score[1]+p->score[2])/3.0; } printf("平均分为:\n\n"); for(p=stu;pnum,p->score[0],p->score[1],p->score[2],p->average); } } 2(编写一函数,求一个字符串的长度。在main()函数中输入字符串,并输出其长度。 参考程序如下: #include #include int len(char *s) { int k=0; for(;*s!='\0';s++) k++; return k; } main( ) { char str1[80],*p=str1; scanf("%s",str1); printf("\nlength of the string is:%d",len(str1)); } 3(从键盘输入一行文字,找出其中大写字母、小字字母、数字及其他字符各有多少, 参考程序如下: #include main( ) { int i,j,k,m; char *p,a[100]; p=a; i=j=k=m=0; scanf("%s",p); for(;*p!='\0';p++) { if(*p>=97&&*p<=122 ) i++; else if(*p>=65&&*p<=90) j++; else if(*p>=48&&*p<57) k++; else m++; } printf("Lower case char:%d,Up case cahr:%d,number char:%d,other char:%d",i,j,k,m); } 4(利用指针编写程序,实现对数组进行从小到大的排序(冒泡法)。 参考程序如下: #include main( ) { int a[10]; int *p,t,k,i,j; p=a; for(i=0;i<10;i++) { scanf("%d",p);p++; } p=a; for(i=0;i<9;i++) { k=i; for(j=i+1;j<10;j++) if(p[k]>p[j])k=j; if(k!=i) { t=p[k];p[k]=p[i];p[i]=t;} } for(i=0;i<10;i++) printf("%5d",p[i]); } 5(100人围成一圈,从第1个人开始,每数到3的人出圈,问最后一个出圈的人是哪个, 参考程序如下: #include void main( ) { int a[100],i,n,k,*p; p=a; for(i=0;i<100;i++) *(p+i)=i+1; n=100; i=k=0; while(n>1) { if(*(p+i)!=0) k++; if(k==3) {*(p+i)=0;k=0;n--;} i++; if(i==100) i=0; } while(*p==0) p++; printf("the last is %d\n",*p); } 实验12 结构体、共用体与枚举 任务1 结构体、共用体与枚举构造数据类型的定义与使用 1(运行下面程序,熟悉结构体变量及指向结构体变量指针的使用。 #include void main( ) { struct xs { int num; char name[20]; float score; }stu1={001,"Zhang san",90.5}; struct xs stu2,*p; stu2=stu1; printf("%d %s %f\n",stu2.num,stu2.name,stu2.score); p=&stu2; printf("%d %s %f\n",p->num,p->name,p->score); } 运行结果为: 1 Zhang san 90.500000 1 Zhang san 90.500000 2(运行下面程序,并分析指向结构体数组的指针变量的使用,理解指针与结构体数组的关 系及结构体成员的引用方式。 #include struct xs { int num; char name[20]; char sex; int age; }stu[3]={{10101,"Li Lin",'M',18}, {10102,"Zhang Fun",'M',19}, {10104,"Wang Min",'F',20}}; main( ) { struct xs *p; for(p=stu;pnum,p->name,p->sex,p->age); } 运行结果为: 10101 Li Lin M 18 10102 Zhang Fun M 19 10104 Wang Min F 20 思考:printf("%d%s%c%d\n",p->num,p->name,p->sex,p->age);如用结构体数组元素的方式表 示,该引用方式如何表示, 代码修改如下: #include struct xs { int num; char name[20]; char sex; int age; }stu[3]={{10101,"Li Lin",'M',18}, {10102,"Zhang Fun",'M',19}, {10104,"Wang Min",'F',20}}; main( ) { struct xs *p; int i; for(i=0;i<3;i++) printf("%d %s %c %d\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].age); } 3(将以下程序补充完整。 学生的记录由学号和成绩组成,N名学生的数据已在主函数中放入结构体数组s中,请 编写函数fun,它的功能是:把分数最高的学生数据放在h所指的数组中,注意:分数最高 的学生可能不止一个,函数返回分数最高的学生的人数。 #include #define N 16 typedef struct char num[10]; { int s; } STREC; int fun(STREC *a, STREC *b) { int i, max=a[0].s, n=0; for(i=1; i #include struct student { long sno; char name[10]; float score[3]; }; void fun(struct student a[], int n) { /**********found**********/ struct student t; int i, j; /**********found**********/ for (i=0; i< n-1 ; i++) for (j=i+1; j 0) { t = a[i]; a[i] = a[j]; a[j] = t; } } void main( ) { struct student s[4]={{10001,"ZhangSan", 95, 80, 88},{10002,"LiSi", 85, 70, 78},{10003,"CaoKai", 75, 60, 88}, {10004,"FangFang", 90, 82, 87}}; int i, j; printf("\n\nThe original data :\n\n"); for (j=0; j<4; j++) { printf("\nNo: %ld Name: %-8s Scores: ",s[j].sno, s[j].name); for (i=0; i<3; i++) printf("%6.2f ", s[j].score[i]); printf("\n"); } fun(s, 4); printf("\n\nThe data after sorting :\n\n"); for (j=0; j<4; j++) { printf("\nNo: %ld Name: %-8s Scores: ",s[j].sno, s[j].name); for (i=0; i<3; i++) printf("%6.2f ", s[j].score[i]); printf("\n"); } } 5(下面程序通过对学生学号、姓名、出生年月信息的输入与输出,分析并理解指向结构体 类型变量的正确使用方法,以及结构体嵌套定义。 #include #include /*使用malloc( )需要包括该头文件*/ struct data /*定义结构体*/ { int day,month,year; }; struct stu /*定义结构体*/ { char name[20]; long num; struct data birth; /*嵌套的结构体类型成员*/ } ; void main( ) /*定义main( ) 函数*/ { struct stu *xs; /*定义结构体类型指针*/ xs=(struct stu *)malloc(sizeof(struct stu)); /*为指针变量分配安全的地址*/ printf("Input name,number,year,month,day:\n"); scanf("%s",xs->name); /*输入学生姓名、学号、出生年月日*/ scanf("%ld", &xs->num); scanf("%d %d %d", &xs->birth.year,&xs->birth.month,&xs->birth.day); printf("\nOutput name,number,year,month,day\n" ); /*打印输出各成员项的值*/ printf("%s%ld %5d// %d// %d\n",xs->name,xs->num,xs->birth.year, xs->birth.month,xs->birth.day); } 运行结果如下: Input name,number,year,month,day: HanTingyu 22 1985 11 1 HanTingyu22 1985//11//1(书上多空了很多的空格) 6(验证下面程序,熟悉共用体变量的使用。 #include union ab{ int a; char b[2]; }; void main( ) { union ab t; t.a=0x1234; printf("t.a=%x\nt.b[1]=%x\nt.b[0]=%x\n",t.a,t.b[1],t.b[0]); } 程序输出结果如下: t.a=1234 t.b[1]=12 t.b[0]=34 任务2 链表的定义与使用 给定程序中,函数fun()的功能是将带头节点的单向链表结点数据域中的数据从小到大排序。 即若原链表结点数据域从头至尾的数据为10、4、2、8、6,排序后链表结点数据域从头至尾的数据为2、4、6、8、10。 请在程序的下划线处填入正确的内容并将下划线删除, 使程序得出正确的结果。 #include #include #define N 6 typedef struct node { int data; struct node *next; } NODE; void fun(NODE *h) { NODE *p, *q; int t; /**********found**********/ p = h->next ; while (p) { /**********found**********/ q = p->next ; while (q) { /**********found**********/ if (p->data > q->data) { t = p->data; p->data = q->data; q->data = t; } q = q->next; } p = p->next; } } NODE *creatlist(int a[]) { NODE *h,*p,*q; int i; h = (NODE *)malloc(sizeof(NODE)); h->next = NULL; for(i=0; idata=a[i]; q->next = NULL; if (h->next == NULL) h->next = p = q; else { p->next = q; p = q; } } return h; } void outlist(NODE *h) { NODE *p; p = h->next; if (p==NULL) printf("The list is NULL!\n"); else { printf("\nHead "); do { printf("->%d", p->data); p=p->next; } while(p!=NULL); printf("->End\n"); } } main( ) { NODE *head; int a[N]= {0, 10, 4, 2, 8, 6 }; head=creatlist(a); printf("\nThe original list:\n"); outlist(head); fun(head); printf("\nThe list after sorting :\n"); outlist(head); } 实验13 文件 1(从键盘输入一个以“#”为结束标志的字符串,将它存入指定的文件中,填空完成下面程序。 #include main ( ) { FILE *fp; char ch, fn[10]; printf ("\nInput the file name: "); scanf (",s", fn); if( (___fp=fopen(fn,"w")____)==NULL) { printf ("\nCannot create file"); exit (1 ); } ch = getchar( ); while (____ch!= '#'______) { fputc ( ch , fp); ch = getchar( ); } //注:红色标记和代码为漏写的,请做实验时加上。 fclose ( fp ); } 2(填空完成下面程序。 给定程序的功能是:从键盘输入若干行文本(每行不超过80个字符),写到文件myfile4.txt中,用,1作为字符串输入结束的标志。然后将文件的内容读出显示在屏幕上。文件的读写分别由自定义函数ReadText和WriteText实现。 #include #include #include void WriteText(FILE *); void ReadText(FILE *); main() {FILE *fp; if((fp=fopen("myfile4.txt","w"))==NULL) {printf(" open fail!!\n"); exit(0);} WriteText(fp); fclose(fp); if((fp=fopen("myfile4.txt","r"))==NULL) {printf(" open fail!!\n"); exit(0);} ReadText(fp); fclose(fp); } void WriteText(FILE *fw ) {char str[81]; printf("\nEnter string with -1 to end :\n"); gets(str); while(strcmp(str,"-1")!=0) { fputs( str ,fw); fputs("\n",fw); gets(str); } } void ReadText(FILE *fr) {char str[81]; printf("\nRead file and output to screen :\n"); fgets(str,81,fr); while(!feof(fr)) { printf("%s",str); fgets( str ,81,fr); } } 3(填空完成下面程序。 以下程序的功能是:调用函数file_copy将指定源文件中的内容复制到指定的目标文件中, 复制成功时函数返回值为1,失败时返回值为0。在复制的过程中,把复制的内容输出到显 示器。主函数中源文件名放在变量sfname中,目标文件名放在tfname中。 #include #include int file_copy (char *source, char *target) { FILE *fs,*ft; char ch; if((fs=fopen(source, "r" ))==NULL) return 0; if((ft=fopen(target, "w"))==NULL) return 0; printf("\nThe data in file :\n"); fscanf( fs ,"%c",&ch); while(!feof(fs)) { putchar(ch); fprintf(ft,"%c",ch); fscanf(fs,"%c",&ch); } fclose(fs); fclose(ft); printf("\n\n"); return 1; } main() { char sfname[20] ="myfile1",tfname[20]="myfile2"; FILE *myf; int i; char c; myf=fopen(sfname,"w"); printf("\nThe original data :\n"); for(i=1; i<30; i++) { c='A'+rand()%25; fprintf(myf, "%c",c); printf("%c",c); } fclose(myf);printf("\n\n"); if (file_copy (sfname, tfname ) ) printf("Succeed!\n"); else printf("Fail!\n"); } 4(以下程序中定义了函数fun,其功能是将自然数1,10以及它们的平方根写到名为file1.txt 的文本文件中,然后再顺序读出显示在屏幕上,请将程序补充完整。 #include #include int fun(char *fname) {FILE *fp; int i,n; float x; if((fp=fopen(fname, "w"))==NULL) return 0; for(i=1;i<=10;i++) fprintf( fp ,"%d %f\n",i,sqrt((double)i)); printf("\nSucceed!~\n"); fclose( fp ); printf("\nThe data in file :\n"); if((fp=fopen( fname ,"r"))==NULL) return 0; fscanf(fp,"%d%f",&n,&x); while(!feof(fp)) {printf("%d %f\n",n,x); fscanf(fp,"%d%f", &n,&x);} fclose(fp); return 1; } main() { char fname[]="file1.txt"; fun(fname); }
/
本文档为【2014版C++实验答案完整版】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索