搜索
您的当前位置:首页正文

大学c_c++语言程序设计实验教程答案-阳小华-电子工业出版社

来源:星星旅游
实验1 基本程序示例

任务1 熟悉C语言程序的编辑、编译、连接和运行过程

【上机内容】

1.输入并运行下面程序,写出运行结果。

#include \"stdio.h\" main( ) {

char c1,c2; c1=97;c2=98;

printf(\"%c,%c\}

在此基础上,完成以下3项任务:

(1)在c1=97;c2=98;语句后加入如下语句,并运行。

printf(\"%d, %d\运行结果: 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%c\abc%c \\n\printf(\"\\\b%c %c\}

运行结果: 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\}

运行结果:

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\}

运行结果:

8,10

(3)程序改为如下:

#include \"stdio.h\" main( ) {

int i , j ; i=8; j=10;

printf(\"%d,%d\}

运行结果:

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=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\ scanf(\"%f, %e\

scanf(\"%c %c\录入时%c与%c之间有个空格*/ printf(\"a=%d,b=%d,x=%f,y=%f,c1=%c,c2=%c\\n\}

运行该程序,必须按如下方式在键盘上输入数据: 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\s=1.0/2*(a+b+c);

area=sqrt(s*(s-a)*(s-b)*(s-c)); printf(\"area=%f\}

运行结果:(具体情况根据自己输入的数据而定)

如在键盘上输入:3,4,5↙ 则运行结果为: area=6.000000

3.已知圆半径、圆柱高、求圆周长、圆柱体积。 程序清单如下:

#include \"stdio.h\" main( ) {

float r,h,l,v,pi; pi=3.1415926;

scanf(\"%f,%f\l=2*pi*r; v=pi*r*r*h;

printf(\"圆周长为:%6.2f\\n\printf(\"%圆柱体积为:6.2f\}

运行结果:(具体情况根据自己输入的数据而定)

如在键盘上输入:5,6↙ 则运行结果为: 圆周长为:31.42 圆柱体积为:471.24

4.输入一个摄氏温度,要求输出华氏温度,公式为f = 5/9·c+32。 程序清单如下:

#include \"stdio.h\" main( ) {

float c,f;

scanf(\"%f\f=5.0/9*c+32;

printf(\"%5.2f\\n\}

运行结果:(具体情况根据自己输入的数据而定)

如在键盘上输入:37↙ 则运行结果为: 52.56

实验2 选择结构 任务1 if语句程序设计

1.修改下列程序,使之满足输入10时输出“= =”,否则输出“!=”的条件。 #include\"stdio.h\" main() {int x;

scanf(\"%d\

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\

if (c>='A'&&c<='Z')或(c>=65&&c<=90) c=c+32;

printf(\"\\n%c\ } 4.有以下程序,执行后输出结果为_______4_______。 #include “stdio.h” main( )

{ int a=1,b=2,c=3,d=4;

if(aelse if((c-b)==a) printf(“%d\\n”,2*d); else printf(“%d\\n”,4*d); }

5.有以下程序,执行后输出结果为______9 7 0_____。

#include \"stdio.h\" main( ) { int a=8,b=7,c=9,t=0; if(aprintf(\"%5d%5d%5d\\n\ }

6.有以下程序,执行后输出结果为_____9 8 7_____。

#include \"stdio.h\" main( )

{ int a=8,b=7,c=9,t=0; if(ax (x<1) y = 2x–1 (1≤x<10) 3x–11 (x≥10) 参考答案:

#include \"stdio.h\" main()

{ double x,y;

scanf (\"%lf\ if (x<1)

y=x;

else if(x<10) y=2*x-1; else

y=3*x-11;

printf (\"y=%lf\}

8. 输入一个百分制分数,要求输出对应的成绩等级:90~100为‘A’,80~89为

‘B’,70~79为‘C’,60~69为‘D’,不及格为‘E’。

参考答案:

#include main( )

{ float score;

printf(\"input socre:\"); scanf(\"%f\ 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\" void main() {int a,b,c,x,n; scanf(\"%d\a=x/100;

b=(x-a*100)/10; c=x%10; if(a!=0)

printf(\"%d为3位数,原数为%d,逆序数为%d\\n\else if(b!=0)

printf(\"%d为2位数,原数为%d,逆序数为%d\\n\ else

printf(\"%d为1位数,原数为%d,逆序数为%d\\n\}

任务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\}

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\} 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\ 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\}

5.以下程序计算某年某月有几天,闰年与平年的二月份天数不同。判别闰年的条件是:能被4整除但不能被100整除的年是闰年,或者能被400整除的年也是闰年。请分析程序填空。

#include \"stdio.h\" #include \"stdio.h\" main()

{ int yy,mm,days;

printf(\"input year and month:\"); scanf(\"%d %d\ 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\}

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\

printf(\"奖金数为%8.2f\ 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,实得奖金数为=%.2f\\n\}

实验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.下面是一个计算e的近似值(使误差小于给定的数值)的程序。

#include main()

{ double e=1.0,x=1.0,y,detax; int i=1;

printf(\"please input enter :\\n\"); scanf(\"%lf\ y=1/x;

while(y>=detax) { x=x*i; y=1/x; e=e+y; ++i; }

printf(\"%12.10f\}

参考答案:

实验要求:

(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参考答案:

#include \"stdio.h\" void main() {

int x,i;

scanf(\"%d\ while(x!=0) { i=x%10; x=x/10;

printf(\"%d\ } }

任务2 do-while语句程序设计

1.分析并修改下面的程序,使该程序能正常结束运行。 #include main() { int x=0; do{

x++;

}while(x==2);

printf (“%d\\n”,x); }

2.有以下两段程序,比较输出结果并分析原因。 (一) main() { int x=0;

while(x<0) x++;

printf (“%d\\n”,x); } 结果为:0 (二) main() { int x=0; do{ x++;

}while(x<0);

printf (“%d\\n”,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 (\"%d\\n\} 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(++xprintf(\"sum=%d\\n\}

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=%d\\n\}

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\}

实验4 循环结构实验(2)

任务1 for语句程序设计

1.分析并修改下面的程序,使该程序能正常结束运行。

#include main() { int i;

for(i=1;i<10;i++) printf (\"%d\\n\} 2.分析并修改下面的程序,使sum的值为1+2+„„+10的和。

#include main( )

{ int i=1,sum=0; for(;i<=10;i++) sum=sum+i;

printf (\"sum=%d\\n\} 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\} 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\}

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\}

6.程序填空。求出1000以内能被13整除的最大数。

#include \"stdio.h\" main() { int i;

for( i=1000 ; i>0 ;i--) if( i%13==0 ) break;

printf(\"\\n%d\}

7.程序填空。求如下Fibonacci 数列1,1,2,3,5,8,…… 的前40个数,要求每一行输出8个数。

(n1)F11(n2) F21FnFn1Fn2(n≥3)参考答案:

#include main( )

{ long f1,f2; int i;

f1=1; f2=1;

for(i=1; i<=20; i++ )

{ printf(\"%10ld%10ld\ 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\ if(x>0)

ave+= x ; else

count++ ; }

if(count!=10)

ave/= 10-count ;

printf(\"count:%d,Average:%f\\n\}

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\ for(i=4;i<=20;i++) { f=f1+f2;

printf(\" %d\ sum=sum+f; f1=f2; f2=f3; f3=f; }

printf(\"\\nsum=%d\}

方法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\ sum=sum+f1+f2+f3; f1=f1+f2; f2=f2+f3; f3=f3+f1; }

printf(\"\\nsum=%d\}

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,总和为:%8d\\n\}

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个素数,总和为%8d\\n\}

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\ for(j=i-1;j>=1;j--) printf(\"%d\ 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\ printf(\"\\n\"); } }

实验5 函数定义、声明与调用 任务1 函数的定义和声明

1.预测下面程序的输出,并上机运行验证结果。(结果: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\}

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(\"%d\\n\}

3.求出以下程序的运行结果,并描述程序所完成的功能。 (结果:s=16。功能是:求x的n次幂即2的4次幂。)

#include main( ) {

int power(int x,int n); int x=2,n=4;

printf(\"\\ns=%d\; }

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\

printf(\"%d\\n\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\

if(fun(n )) //将main函数中的函数调用fun()改成fun(n),因为实参的个数应与形参对应 printf(\"%d:yes!\\n\ else

printf(\"%d:no!\\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\

printf(\"\\n t=%12.10lf \\n\}

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=%d\\n\ swap(x,y);

printf(\"(4) in main: x=%d,y=%d\\n\}

swap(int a,int b) { int t;

printf(\"(2) in swap: a=%d,b=%d\\n\ t=a; a=b; b=t;

printf(\"(3) in swap: a=%d,b=%d\\n\}

结果:

(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\ a=sum(n1,n2); printf(\"a=%ld\}

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(\"\\n\\0: \");

putchar(next); } else {

next=getchar( ); palin(n-1); putchar(next); } }

(程序功能:实现将从键盘输入的5个字符逆序输出。如输入:abcde.输出:edcba)

4.写出下面程序的输出结果。

#include \"stdio.h\" int abc(int u,int v); main ( ) {

int a=24,b=16,c; c=abc(a,b); printf(\"%d\\n\}

int abc(int u,int v) { int w; while(v)

{ w=u%v; u=v; v=w;} return u; }

(程序功能:求两数的最大公约数即24,16的最大公约数。结果:8)

实验6 函数递归调用、变量的存储类型及编译预处理 任务1 函数的递归调用

1.fact(j-1)*j 2.gcd(n,m%n) m3.//for(j=0;j<=n-i;j++) // printf(\"\");//删除这两行,因为顶格输出,不要空行了。 y==1||y==x

z=c(x-1,y-1)+c(x-1,y) 4.程序代码如下:

#include fib(int n) { int f; if(n==1||n==2) f=1;

}

main() { int n,i,s=0; printf(\"Input n=\"); scanf(\"%d\ for(i=1;i<=n;i++) s=s+fib(i);

printf(\"n=%d,s=%d\\n\ }

else f=fib(n-1)+fib(n-2);

return(f);

任务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.12 7

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\ t=ZMAX(a,b,c);

printf(\"max of a,b,c:%d\\n\}

实验7 一维数组、二维数组及字符串数组 任务1 数组的基本定义与应用

1.4 3 3 2 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[i]=m

m输出结果为:153 370 371 407 6. a a sum/n x[i]任务2 字符数组

1.„\\0‟

str1[i]-str2[i] 2.c[k]=a[i++]; c[k]=b[j++];

a[i]== „\\0‟或b[j]!= „\\0‟ 3.xWHOwho

4.c1!= „ ‟&&c2==„ ‟

实验8 数组与函数

任务1 数组与函数的综合应用

1. n%2+„0‟

bin[i]= „\\0‟ 2.float a[10],x; i<10或i<=9 i<10或i<=9

j<9或j<=8或j<10-i或j<=9-i a[j]>a[j+1] a[j]=a[j+1] i<10或i<=9 i%5==0

3.i=strlen(a)-1;i>=j;i— a[i+1]=a[i] 4.m[i]=a%10 t=t*10 k==n*n 5.0 || 1 6.k-1 N-1 temp

7.程序代码如下:

#include

void fun(char *a) { int i=0; char *p=a;

while(*p&&*p=='*') {a[i]=*p; i++; p++; }

while(*p) {

if(*p!='*') {a[i]=*p; i++; } p++; }

a[i]='\\0'; }

main()

{ char s[81];

printf(\"Enter a string:\\n\"); gets(s); fun(s);

printf(\"The string after deleted:\\n\"); puts(s); }

实验9 指针概念及指针与一维数组的关系 任务1 理解指针及其使用方法

1.阅读分析下面程序,写出运行结果,理解指针概念及“*”与“&”的含义。

#include main() {

int a,b;

int *p1,*p2; a=100; b=10; p1=&a; p2=&b;

printf(\"a=%d,b+2= %d\\n\

printf(\"*p1=%d,*p2+2= %d\\n\}

运行结果为: 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\

printf(\"\\n&a=%d,*&a=%d,&b=%d,*&b=%d\\n\}

运行结果如下:(下面红色标记的字,是漏写了的)

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\ p=&m; printf(\"%d\同*/ }

如从键盘上输入:5 则运行结果为:5 上述程序可修改为如下: #include main( ) {

int *p,m; p=&m;

scanf(\"%d\ printf(\"%d\}

如从键盘上输入:5 则运行结果为:5

/*指针p指向变量m*/ /*p是对指针所指的变量的引用形式,与此m意义相

/*p是变量m的地址,可以替换&m*/

任务2 使用指针访问一维数组

1.阅读分析下面程序,写出运行结果,理解指针与数组关系。

#include 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=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\ printf(\"p[%d]=%d\\n\

printf(\"*(p+%d)=%d\\n\ printf(\"*(a+%d)=%d\\n\ } }

运行结果为: 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\ printf(\"str=%s\\n\}

运行结果为: 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 ) {

if( *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,\}

运行结果为:输出10个随机数,原因是当第一个for循环结束后,指针已经指到最后一个元素的下一个地址,此时再输出,已经输出的不是原来存储的数据了。 6.编程实现从键盘输入10个整数,然后求出其中最小值(采用指针实现)。

参考程序如下: #include main( ) {

int a[10],min; int *p,k; p=a;

for(k=0;k<10;k++) { scanf(\"%d\ p=a; min=a[0];

for(k=0;k<10;k++,p++) if(min>*p)min=*p; printf(\"%d\}

实验10 指针与二维数组、函数的关系

任务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\/*数组元素下标表示法*/ for(i=0;i<3;i++) {

for(j=0;j<4;j++)

printf(\"%4d\ /*数组元素指针表示法*/ printf(\"\\n\"); }

printf(\"\\n\"); for(i=0;i<3;i++) {

for(j=0;j<4;j++)

printf(\"%4d\ /*数组元素下标+指针表示法*/ 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\}

运行结果为: 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\}

char *cut(char *s,int m,int n) {

int i;

for(i=0;i运行结果为: angu

2.调用子程序,实现求解一维数组中的最大元素。请填空,完成程序功能。

#include 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\

max= sub_max(a,i) ; /*函数调用,其实参是指针*/ printf(\"max=%d\\n\}

int sub_max(int b[],int i) /*函数定义,其形参为数组*/ {

int temp,j; temp=b[0] ; for(j=1;jif(temp此题无空可填,已经是一个完整的程序,它的功能是求从键盘输入10数中最大的那个数。故自己选一个地方加了蓝色和下划线,让学生理解这个地方。 3.阅读下面程序,理解利用指向指针的指针变量对二维字符数组的访问方式。

#include #include main( ) {

int i;

static char c[][16]={\"c language\ 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\ printf(\"-----------\\n\"); for(i=0;i<4;i++) {

cpp=&cp[i];

printf(\"%s\\n\ } }

运行结果如下:

c language fox

computer home page ---------- c language fox

computer home page

实验11 指针综合实验

任务 使用指针编写综合应用程序

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;pscanf(\"%d %d %d %d\ p->average=(p->score[0]+p->score[1]+p->score[2])/3.0; }

printf(\"平均分为:\\n\\n\"); for(p=stu;pscore[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\

printf(\"\\nlength of the string is:%d\}

3.从键盘输入一行文字,找出其中大写字母、小字字母、数字及其他字符各有多少? 参考程序如下:

#include main( ) {

int i,j,k,m; char *p,a[100]; p=a;

i=j=k=m=0; scanf(\"%s\ 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\}

4.利用指针编写程序,实现对数组进行从小到大的排序(冒泡法)。

参考程序如下: #include main( ) {

int a[10]; int *p,t,k,i,j; p=a;

for(i=0;i<10;i++)

{ scanf(\"%d\ 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\}

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\}

实验12 结构体、共用体与枚举

任务1 结构体、共用体与枚举构造数据类型的定义与使用

1.运行下面程序,熟悉结构体变量及指向结构体变量指针的使用。

#include void main( ) {

struct xs { int num;

char name[20]; float score;

}stu1={001,\"Zhang san\ struct xs stu2,*p; stu2=stu1;

printf(\"%d %s %f\\n\ p=&stu2;

printf(\"%d %s %f\\n\}

运行结果为:

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\ {10102,\"Zhang Fun\ {10104,\"Wang Min\

main( ) {

struct xs *p;

for(p=stu;pprintf(\"%d %s %c %d\\n\}

运行结果为: 10101 Li Lin M 18 10102 Zhang Fun M 19 10104 Wang Min F 20

思考:printf(\"%d%s%c%d\\n\如用结构体数组元素的方式表示,该引用方式如何表示?

代码修改如下: #include struct xs { int num;

char name[20]; char sex; int age;

}stu[3]={{10101,\"Li Lin\ {10102,\"Zhang Fun\ {10104,\"Wang Min\main( ) {

struct xs *p; int i;

for(i=0;i<3;i++)

printf(\"%d %s %c %d\\n\}

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; iif(maxif(max==a[i].s) b[n++]= a[i] ; /* 找相等的最高成绩并存入数组b中 */

return n; /* 返回符合条件的人数 */ }

main()

{ STREC s[N]={{\"GA05\ {\"GA02\ {\"GA07\ {\"GA015\ {\"GA014\ {\"GA018\ STREC h[N]; int i,n; n=fun(s,h);

printf(\"The %d highest score :\\n\ for(i=0;iprintf(\"%s %4d\\n\ printf(\"\\n\"); }

4.以下程序通过定义学生结构体数组,存储了若干名学生的学号、姓名和3门课的成绩。函数fun( )的功能是将存放学生数据的结构体数组,按照姓名的字典序(从小到大)排序。 请在程序的下划线处填入正确的内容并把下划线删除, 使程序得出正确的结果。

#include #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/**********found**********/

if (strcmp(a[i].name,a[j].name) > 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\ int i, j;

printf(\"\\n\\nThe original data :\\n\\n\"); for (j=0; j<4; j++)

{ printf(\"\\nNo: %ld Name: %-8s Scores: \ for (i=0; i<3; i++) printf(\"%6.2f \ 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: \ for (i=0; i<3; i++) printf(\"%6.2f \ 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\/*输入学生姓名、学号、出生年月日*/ scanf(\"%ld\

scanf(\"%d %d %d\

printf(\"\\nOutput name,number,year,month,day\\n\" ); /*打印输出各成员项的值*/ printf(\"%s%ld %5d// %d// %d\\n\ 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=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; i{ q=(NODE *)malloc(sizeof(NODE)); q->data=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\ 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 文件的读、写操作

1.建立一个名为abc的文件,并将从键盘输入的字符存入该文件,当键盘输入结束时关闭该文件,填空完成下面程序。

#include main( )

{ FILE *fp; char ch;

fp= fopen (\"abc\ \"w\" ); do {

ch=getchar ( ); fputc ( ch, fp); } while ( ch!= EOF); fclose (fp); }

2.从键盘输入一个以“#”为结束标志的字符串,将它存入指定的文件中,填空完成下面程序。

#include main( ) {

FILE *fp; char ch,fn[10];

printf(\"\\nInput the file name: \"); scanf(\"%s\

if( ( fp=fopen(fn,\"w\") )==NULL) { printf(\"\\nCannot create file\"); exit(1); } ch=getchar( );

while ( (ch=getchar())!='#' ) fputc(ch, fp); close(fp); } 3.文件复制,文件名来自main( )函数,填空完成下面程序。

#include

void file_copy(FILE *fout, FILE *fin) { char k;

do{

k=fgetc( fin ); if(feof(fin)) break; fputc( k,fout ); }while( 1 ); }

void main(int argc, char *argv[ ]) { FILE *fp1, *fp2; if( argc !=3) return;

if((fp1=fopen(argv[2], \"rb\"))==NULL) return; fp2= fopen(argv[1],\"wb\") ; file_copy (fp2,fp1); fclose(fp1); fclose(fp2); }

任务2 文件综合程序设计

设计创建原始成绩表b1.txt,从文件b1.txt中取出成绩,排序后,按降序存放b2.TXT中,并输出前五名成绩报表。 参考代码如下:

#include \"stdio.h\" #define N 10 struct student {

int num;

char name[20]; int score[3]; float average; };

void sort(struct student stu[]);

void print(FILE *fp, struct student stu[]);

void printtopfive(FILE *fp, struct student stu[]); void main( ) {

struct student s[N]; int i;

FILE *fp1,*fp2; char ch;

if((fp1=fopen(\"c:\\\\b1.txt\ {

printf(\"不能打开文件c:\\\\b1.txt\"); exit(1); }

if((fp2=fopen(\"c:\\\\b2.txt\ {

printf(\"不能打开文件c:\\\\b2.txt\"); exit(1); }

for(i=0;ifscanf(fp1,\"%d%s%d%d%d\

&s[i].score[1],&s[i].score[2]);

s[i].average=(s[i].score[0]+s[i].score[1]+s[i].score[2])/3.0; }

fprintf(fp2,\"原始成绩报表\\n\"); print(fp2,s); sort(s);

fprintf(fp2,\"排序之后的成绩报表\\n\"); print(fp2,s);

fprintf(fp2,\"前五名成绩报表\\n\"); printtopfive(fp2,s); }

void sort(struct student stu[]) { int i,k,j;

struct student t; for(i=0;ifor(j=i+1;j{ if(stu[k].averaget=stu[i];

stu[i]=stu[k]; stu[k]=t; } } }

void print(FILE *fp, struct student stu[]) {

int i;

fprintf(fp,\"StudentID StudentName Score1 Score2 Score3 Average\\n\"); for(i=0;ifprintf(fp,\"%-10d%-12s%8d%8d%8d%8.1f\\n\ stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].average); }

void printtopfive(FILE *fp, struct student stu[]) {

int i;

fprintf(fp,\"StudentName Average\\n\"); for(i=0;i<5;i++)

fprintf(fp,\"%-12s%8.1f\\n\}

因篇幅问题不能全部显示,请点此查看更多更全内容

Top