任务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 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 { 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 printf (“%d,%d\\n”,x, y); } 2.下列程序中,while循环的循环次数为___6次___。 #include { if(i==5) break; i++; } printf (“%d\\n”,i); } 3.下面是一个计算e的近似值(使误差小于给定的数值)的程序。 #include { 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 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 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(++x 5.求 1!+2!+3!+4!+5!+6!+7!+8!+9!+10! 请填空将下面的程序补充完整: 答案:4037913 #include { 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 for(i=1;i<10;i++) printf (\"%d\\n\} 2.分析并修改下面的程序,使sum的值为1+2+„„+10的和。 #include { int i=1,sum=0; for(;i<=10;i++) sum=sum+i; printf (\"sum=%d\\n\} 3.运行下列程序,输出结果为_________sum=15________。 #include { 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 { 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 { 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个数。 (n1)F11(n2) F21FnFn1Fn2(n≥3)参考答案: #include { 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 { 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 { 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 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 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 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 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 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 { 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 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 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) m z=c(x-1,y-1)+c(x-1,y) 4.程序代码如下: #include } 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] 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 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 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 int *p,m; scanf(\"%d\ p=&m; printf(\"%d\同*/ } 如从键盘上输入:5 则运行结果为:5 上述程序可修改为如下: #include int *p,m; p=&m; scanf(\"%d\ printf(\"%d\} 如从键盘上输入:5 则运行结果为:5 /*指针p指向变量m*/ /*p是对指针所指的变量的引用形式,与此m意义相 /*p是变量m的地址,可以替换&m*/ 任务2 使用指针访问一维数组 1.阅读分析下面程序,写出运行结果,理解指针与数组关系。 #include 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 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 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 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 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 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 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 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 2.调用子程序,实现求解一维数组中的最大元素。请填空,完成程序功能。 #include 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 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;p printf(\"平均分为:\\n\\n\"); for(p=stu;p 2.编写一函数,求一个字符串的长度。在main( )函数中输入字符串,并输出其长度。 参考程序如下: #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 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 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 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 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 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;p 运行结果为: 10101 Li Lin M 18 10102 Zhang Fun M 19 10104 Wang Min F 20 思考:printf(\"%d%s%c%d\\n\如用结构体数组元素的方式表示,该引用方式如何表示?