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);
}