high=mid-1;
/************found************/
elseIf(m>a[mid])
low=mid+1;
/************found************/
else{k=mid;continue;}}
if(k>=0)printf("m=%d,index=%d\n",m,k);
elseprintf("Notbefound!
\n");}
Key:
第一个错误:
elseIf(m>a[mid])应改为:
elseif(m>a[mid])因C语言关键字必须小写。
第二个错误:
else{k=mid;continue;}应改为:
else{k=mid;break;}因找到就可终止循环。
4.有一个3*4矩阵,找出每行中最大的元素并与第1列元素交换。
具体要求如下:
(1)使用二维数组存放该3*4矩阵。
(2)定义并初始化该二维数组。
(3)输出原矩阵和处理后的矩阵进行比较。
【程序源代码】
#include"stdio.h"
main()
{inti,j,k,temp;
intdata[3][4]={{12,15,7,11},{14,6,10,21},{25,7,16,45}};
printf("theoriginalmatrix:
\n");
for(i=0;i<=2;i++)
{for(j=0;j<=3;j++)
printf("%d\t",data[i][j]);
printf("\n");/*打印原矩阵*/
}
for(i=0;i<=2;i++)
{
k=0;
for(j=1;j<=3;j++)
if(data[i][j]>data[i][k])
k=j;
temp=data[i][0];
data[i][0]=data[i][k];
data[i][k]=temp;
}/*求每行最大数并与第1列上的元素交换*/
printf("\nthehandledmatrix:
\n");
for(i=0;i<=2;i++)
{
for(j=0;j<=3;j++)
printf("%d\t",data[i][j]);
printf("\n");
}/*打印处理后矩阵,此时第1列上的元素为每行的最大数*/
}
5.猴子选大王问题:
n个人围坐一圈,并顺序编号1~n,从1号开始数,每数到m个就让其出局,重复...。
求最后出局者的编号。
当n=50,m=3时,答案为11
具体要求如下:
(1)使用一维数组存放每个人的编号,每数到m个数就让其出局,出局者编号为0。
(2)使用for循环嵌套实现。
【程序源代码】
#include"stdio.h"
main()
{inta[51],i,j,m=0,n;
for(i=1;i<=50;i++)a[i]=i;/*为了符合习惯,数组下标从1开始,下标就是编号*/
for(j=1;j<=50/3;j++)/*外层循环最多循环50/3次*/
for(i=1;i<=50;i++)
{if(a[i]!
=0)m++;/*对未出局者计数*/
if(m==3)a[i]=0,n=i,m=0;/*对出局者编号为0,并保存原编号,计数从0开始*/
}
printf("last:
%d\n",n);}/*最后出局者的编号*/
实验7函数及其应用
3.排错题:
下列给定程序中函数fun的功能是:
用递归算法求形参a的平方根。
请改正
程序中的错误,使它能计算出正确的结果。
注意:
源程序不得增行或删行,也不得更改程序
的结构!
例如,a为2时,平方根值为:
1.414214。
#include
#include
/**********found**********/
voidfun(doublea,doublex0)
{doublex1,y;
x1=(x0+a/x0)/2.0;
/**********found**********/
if(fabs(x1-x0)<=0.00001)
y=fun(a,x1);
elsey=x1;
returny;
}
main()
{doublex;
printf("Enterx:
");scanf("%lf",&x);
printf("Thesquarerootof%lfis%lf\n",x,fun(x,1.0));
}
Key:
第一个错误:
voidfun(doublea,doublex0)应改为:
doublefun(doublea,doublex0)因根据题意,需通过调用fun()函数返回a的平方根,故必须将void改为double,否则不能用带值的return语句。
自增。
第二个错误:
if(fabs(x1-x0)<=0.00001)应改为:
if(fabs(x1-x0)>=0.00001)因只有fabs(x1-x0)>=0.00001才须递归。
4.设计一个程序,判断一个整数n是否是素数。
具体要求如下:
(1)编制一个函数intprime(number),判断整数number是否是素数。
(2)编制主函数,由键盘输入整数number,调用
(1)中的函数,若返回值为真则是素
数,否则不是素数。
(3)分别用以下数据运行该程序:
103,117。
【程序源代码】
#include"stdio.h"
main()
{intnumber;
printf("请输入一个正整数:
\n");
scanf("%d",&number);
if(prime(number))
printf("\n%d是素数.",number);
else
printf("\n%d不是素数.",number);
}
intprime(number)
intnumber;
{intflag=1,n;
for(n=2;nif(number%n==0)
flag=0;
return(flag);}
5.编写程序,通过两个自定义函数分别求两个正数的最大公约数和最小公倍数,用主函数调用这两个函数并输出结果。
两个正数由键盘输入。
具体要求如下:
(1)用辗转相除法实现。
(2)输出要有文字说明,输出形式为:
最大公约数=具体值,最小公倍数=具体值
(3)分别用以下数据运行该程序:
8和26,64和258
(4)辗转相除法:
对于两个数m和n,将大数放在m中,小数放在n中,用n去除m,
若余数为0,则n为最大公约数,否则将n作为m,余数作为n,再用n去除m,
直到余数为0,则n为最大公约数。
【程序源代码】
#include"stdio.h"
hcf(u,v)
intu,v;
{inta,b,t,r;
a=u;
b=v;
while((r=b%a)!
=0)
{b=a;a=r;}
return(a);}
lcd(u,v,h)
intu,v,h;
{return(u*v/h);}
main()
{intu,v,h,l;
scanf("%d,%d",&u,&v);
h=hcf(u,v);
printf("H.C.F=%d\n",h);
l=lcd(u,v,h);
printf("L.C.D=%d\n",l);}
6.请编写函数fun,函数的功能是:
求出二维数组周边元素之和,作为函数值返回。
二维
数组中的值在主函数中赋予。
例如,若二维数组中的值为
13579
29994
69998
13570
则函数值为61。
【程序源代码】
#include
#defineM4
#defineN5
intfun(inta[M][N])
{inti,j,s=0;
for(i=0;ifor(j=0;jif(i==0||j==0||i==M-1||j==N-1)
s+=a[i][j];;
returns;}
voidmain()
{intaa[M][N]={{1,3,5,7,9},{2,9,9,9,4},{6,9,9,9,8},{1,3,5,7,0}};inti,j,y;
printf("Theoriginaldatais:
\n");
for(i=0;i{for(j=0;jy=fun(aa);printf("\nThesun:
%d\n",y);printf("\n");}
实验8作用域和存储类型应用
3.排错题:
下列程序的输出结果应为61515。
通过调试程序,改正程序中不恰当的地方以便能够得到要求的结果。
#include"stdio.h"
intt=1;
intfun(intp)
{
/**********found**********/
intt=5;
t+=p;
printf("%d",t);
/**********found**********/
return;
}
main()
{
inta=3;
printf("%d\n",fun(a+fun(t)));
}
Key:
第一个错误:
intt=5;应改为:
staticintt=5;因根据题意,fun()函数中的t应是静态变量。
第二个错误:
return;应改为:
returnt;因fun()函数调用是作为printf()函数的输出项。
4.程序设计。
函数的递归调用Hanoi(汉诺)塔问题的程序参考源代码如下。
分析程序中函数的定义和调用以及程序运行的输出结果,并要求进一步改进:
通过全局变量的使用使程序的运行能输出移动指定数目盘子时的总步骤数。
【程序参考源代码】
#include"stdio.h"
voidmove(chargetone,charputone)
{
printf("%c——>%c\n",getone,putone);
}
voidhanoi(intn,charone,chartwo,charthree)
{
if(n==1)move(one,three);
else
{hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
main()
{
intn;
printf("Inputthenumberofdisks:
");
scanf("%d",&n);
printf("Thesteptomoving%3ddisks:
\n",n);
hanoi(n,'A','B','C');
}
【程序改进源代码】
#include"stdio.h"
intn=0;
voidmove(chargetone,charputone)
{n++;
printf("step%d:
%c——>%c\n",n,getone,putone);
}
voidhanoi(intn,charone,chartwo,charthree)
{
if(n==1)move(one,three);
else
{hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
main()
{
intn;
printf("Inputthenumberofdisks:
");
scanf("%d",&n);
printf("Thesteptomoving%3ddisks:
\n",n);
hanoi(n,'A','B','C');
}
实验9指针及其应用
1.以下函数调用Reverse()函数按逆序重新放置数组A中的元素,请补全程序。
#include"stdio.h"
#defineN10
voidReverse(int*p,inta,intb)
{intc;
while(________)
{c=*(p+a);
*(p+a)=________;
*(p+b)=c;
________;}}
intmain()
{intA[N],i;
for(i=0;iscanf("%d",________);
Reverse(A,0,N-1);
for(i=0;iprintf("%-4d",________);
printf("\n");
return0;}
Key:
第一空应填:
a
第二空应填:
*(p+b)或p[b]/*用指针方法或用下标方法*/
第三空应填:
a++,b++或++a/a+=1/a=a+1,++b/b+=1/b=b+1
第四空应填:
&A[i]或A+i/*用数组元素的地址或数组的首地址加偏移量的方法*/
第五空应填:
*(A+i)或A[i]/*用指针方法或用下标方法*/
2.记录以下程序的运行结果,并进行分析。
#include"stdio.h"
intmain()
{inta=10,b=0,*pa,*pb;
pa=&a,pb=&b;
printf("%d,%d,",a,b);
printf("%d,%d\n",*pa,*pb);
a=20,b=30;
*pa=a++,*pb=b++;
printf("%d,%d,",a,b);
printf("%d,%d\n",*pa,*pb);
(*pa)++;(*pb)++;
printf("%d,%d,",a,b);
printf("%d,%d\n",*pa,*pb);
return0;
}
分析程序运行:
________
Key:
运行结果:
10,0,10,0
21,31,21,31
22,32,22,32
分析:
因为pa=&a;pb+&b;所以*pa和a是同一个变量,占据内存同一存储单元。
注意该程序与下面程序的区别:
#include"stdio.h"
intmain()
{inta=10,b=0,c=a,d=b;
printf("%d,%d,",a,b);
printf("%d,%d\n",c,d);
a=20,b=30;
c=a++,d=b++;
printf("%d,%d,",a,b);
printf("%d,%d\n",c,d);
c++;d++;
printf("%d,%d,",a,b);
printf("%d,%d\n",c,d);
return0;
}
Key:
运行结果:
10,0,10,0
21,31,20,30
21,31,21,31
分析:
因为c=a++;相当于c=a;a++;而a和c是两个不同的变量,所以c++不影响a的值。
3.设计一个程序,统计字符串中大写字母的个数。
具体要求如下:
(1)字符串的长度从键盘输入,并以此分配存储空间。
(2)使用指针变量遍历字符串。
【程序源代码1:
用数组存放字符串】
#defineN80
#include
intcapital(char*p)
{intcount=0;
while(*p)
{if(*p>='A'&&*p<='Z')
count++;
p++;}
returncount;}
main()
{charc[N],n;
printf("Inputastring:
");
gets(c);
printf("Outputthestring:
");
puts(c);
n=capital(c);
printf("Thereare%duppercasealphasin%s\n",n,c);}
【程序源代码2:
用指针指向字符串(此法可能更合出题者的意图)】
#include
#include
intcapital(char*p)
{intcount=0;
while(*p)
{if(*p>='A'&&*p<='Z')
count++;
p++;}
returncount;}
main()
{char*c,n;
printf("Inputthelengthofastring:
");
scanf("%d",&n);
getchar();
c=malloc(n+1);
printf("Inputastring:
");
gets(c);
printf("Outputthestring:
");
puts(c);
n=capital(c);
printf("Thereare%duppercasealphasin%s\n",n,c);
free(c);}
指针用法的总结:
指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。
要搞清一个指针需要搞清指针的四方面的内容:
指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。
实验10结构体与共用体
2.程序设计
(1)有5个学生,每个学生的数据包括学号、姓名、3门课的成绩,从键盘输入5个学
生数据,要求输出3门课总平均成绩,以及最高分的学生的数据(包括学号、姓名、3门课
的成绩、平均分数)。
要求:
用一个input函数输入5个学生数据;用一个output函数输出5个学生数据;用
一个average函数求总平均分;用max函数找出最高分学生数据;总平均分和最高分的学生
的数据都在主函数中输出。
【程序框架】
#include"stdio.h"
structstudent
{intnum;
charname[20];
floatscore[3];
floatavg;
};
/**********函数声明**********/
voidinput(s