资源描述
. . . .
本学期《程序设计基础》课程实行上机考核,现将考核有关事项通知如下:
(1) 考核时间:本学期最后一次上机时间为机试。
(2) 考核容:主要是算法设计与实现。考题来自本学期布置的作业、例题与一些补充的题目。
(3) 考试形式:机试前进入机房时,每人随机抽取一道题(同一个组的同学保证不抽到同一题),然后上机编程,调试通过后报告监考人员审核,审核通过后将源程序拷贝到监考人员U盘上,然后可以离开机房。源程序文件明必须是“学号.cpp”,如“2012216827王梓丞.cpp”。
(4) 考试要求:机试时考试规则同课堂考试一致,不允许带书、纸等。不能携带任何可用计算机处理的软件或数据(不允许任何私人携带的U盘、磁盘或计算器) ,不能携带任何类型的通讯工具,包括无线电接收器、移动。
(5) 考试成绩:本次机试成绩将在《程序设计基础》课程成绩中占25%的比重。
(6) 其它有关事项由主考教师和监考人员负责处理。
附:考试题集
1. 学校曾经组织一次“程序设计大奖赛”,规定本学期“程序设计”课程的成绩可以因为在大奖赛上获奖而加5分,总分不超过100分。编程序,输入某同学的考试成绩,回答是否在竞赛中获奖,计算并输出该某同学的程序设计课成绩。
#include<stdio.h>
void main(){
int m,n;
printf("请输入考试成绩:\n");
scanf("%d",&m);
printf("请选择获奖情况:1 获奖;2 未获奖\n");
scanf("%d",&n);
switch (n){
case 1: m=m+5;break;
case 2: m;
}
if(m>100)
m=100;
printf("你的最终成绩为:%d\n",m);
}
2. 编写一个程序,用户输入年份与月份两个数据,程序输出该月份的天数。(提示:对2月要考虑是否闰年,闰年年份要么能被4整除且不能被100整除,要么能被400整除,除此之外都不是闰年)。
#include<stdio.h>
int year,a;
void main(){
printf("请输入年份 月份:");
scanf("%d%d",&year,&a);
if(a==1||a==3||a==5||a==7||a==8||a==10||a==12)
printf("这个月有31天\n");
else{
if(a==2){
if((year%4==0)&&(year%100!=0)||(year%400==0))
printf("这个月有29天\n");
else
printf("这个月有28天\n");
}
else
printf("这个月有30天\n");
}
}
3. 求一元二次方程ax2+bx+c=0的根。(要考虑a、b、c三个系数不同的取值)
#include<stdio.h>
#include<math.h>
void main(){
float a,b,c,d;
printf("请输入一元二次方程的三个系数a,b,c:\n");
scanf("%f%f%f",&a,&b,&c);
if(a!=0){
d=b*b-4*a*c;
if(d>0)
printf("x1=%f,x2=%f",(-b+sqrt(d))/2*a,(-b-sqrt(d)/2*a));
else
if(d==0)
printf("x1=x2=%f",(-b)/2*a);
else
printf("x1=%f+%fi,x2=%f-%fi",-b/2*a,sqrt(-d)/2*a,-b/2*a,sqrt(-d)/2*a);
}
else
if(b!=0)
printf("x=%f\n",-c/b);
else
if(c==0)
printf("0=0!\n");
else
printf("%f=0矛盾\n",c);
}
4. 学校曾经组织一次“程序设计大奖赛”,规定本学期“程序设计”课程的成绩可以根据大奖赛的成绩适度加分。加分规则是:参赛者加5分,三等奖加15分,二等奖加20分,一等奖加30分,总分不超过100分。编程序,输入某同学的考试成绩,回答在竞赛中获奖等级,计算并输出该某同学的程序设计课成绩。
#include<stdio.h>
void main(){
int a,b;
printf("请输入你的考试成绩:\n");
scanf("%d",&a);
printf("请选择你程序设计情况:0 未参加 1 参赛 2 三等奖 3 二等奖 4 一等奖\n");
scanf("%d",&b);
switch(b){
case 0:break;
case 1:a=a+5;break;
case 2:a=a+15;break;
case 3:a=a+20;break;
case 4:a=a+30;}
if(a>100)
a=100;
printf("你的最终成绩为:%d",a);
}
5. 高速公路每公里的收费标准按不同种类汽车如下:
小汽车( car ) 0.50 元
卡车( truck ) 1.00 元
大客车( bus ) 1.50 元
编程序,为某高速公路收费站计算各种车辆的收费额。
#include<stdio.h>
void main(){
float a,c;
int b;
printf("请选择车辆类型:1 小汽车;2 卡车; 3 大客车\n");
scanf("%d",&b);
printf("请输入车辆行驶的公里数:\n");
scanf("%f",&a);\
switch(b){
case 1:c=0.5*a;break;
case 2:c=1.0*a;break;
case 3:c=1.5*a;
}
printf("收费额为:%3f元",c);
}
6. 设计一个模拟单步计算器的程序,设该计算器只能作加、减、乘、除运算。用户输入形如
m#n
的算式,其中m、n为运算数,#为运算符。(需考虑运算符不合法,与除数为0的情况)
#include<stdio.h>
void main(){
float m,n;
char ch;
printf("请输入运算式:m#n\n");
scanf("%f%c%f",&m,&ch,&n);
if((ch!='+')&&(ch!='-')&&(ch!='*')&&(ch!='/'))
printf("您输入的运算符不合法!\n");
else
{switch(ch){
case '+':printf("%2f",m+n);break;
case '-':printf("%2f",m-n);break;
case '*':printf("%2f",m*n);break;
case '/':{if(n!=0)
printf("%2f",m/n);
else
printf("分母为0无意义!\n");}}
}
}
7. 编写程序,输入一个4位自然数n,判断n是否是降序数。降序数是指对于n=d1d2…dk有:
d1≥d2≥…≥dk
#include<stdio.h>
void main(){
int n,a,b,c,d;
printf("请输入一个四位自然数:\n");
scanf("%d",&n);
a=n/1000;
b=n%1000/100;
c=n%100/10;
d=n%10;
if(a>b&&b>c&&c>d)
printf("该四位数为降序数!\n");
else
printf("该四位数不是降序数!\n");
}
8. 编写程序,输入一个5位自然数n,判断n是否对称数。对称数是指正序和反序读都相等的整数,如96769为对称数。
#include<stdio.h>
void main(){
int n,a,b,c,d,e;
printf("请输入一个五位数:\n");
scanf("%d",&n);\
a=n/10000;
b=n%10000/1000;
c=n%1000/100;
d=n%100/10;
e=n%10;
if((a==e)&&(b==d))
printf("该五位数为对称数");
else
printf("该五位数不是对称数");
}
9. 编写程序,判断给定的3位数是否为Armstrong数。Armstrong数是指其值等于它每位数字立方和的数,如153就是一个Armstrong数。
#include<stdio.h>
void main(){
int n,a,b,c;
printf("请输入一个三位数:\n");
scanf("%d",&n);
a=n/100;
b=n%100/10;
c=n%10;
if(n==a*a*a+b*b*b+c*c*c)
printf("该三位数为armstrong数");
else
printf("该三位数不是armstrong数");
}
10. 编写程序,输入一个整数,判断它能否被3、5、7整数,并输出如下信息。
(1) 能同时被3、5、7整数。
(2) 能同时被两个数整数,并指明是被哪两个数整除。
(3) 能被一个数整数,并指明这是哪个数。
(4) 不能被所有3个数整除。
#include<stdio.h>
void main(){
int x;
printf("请输入一个整数x:");
scanf("%d",&x);
if((x%3==0)&&(x%5==0)&&(x%7==0))
printf("%d能同时被3、5、7整数\n",x);
if((x%3!=0)&&(x%5==0)&&(x%7==0))
printf("%d能同时被5、7整数\n",x);
if((x%3==0)&&(x%5!=0)&&(x%7==0))
printf("%d能同时被3、7整数\n",x);
if((x%3==0)&&(x%5==0)&&(x%7!=0))
printf("%d能同时被3、5整数\n",x);
if((x%3!=0)&&(x%5!=0)&&(x%7==0))
printf("%d能被7整数\n",x);
if((x%3==0)&&(x%5!=0)&&(x%7!=0))
printf("%d能被3整数\n",x);
if((x%3!=0)&&(x%5==0)&&(x%7!=0))
printf("%d能被5整数\n",x);
if((x%3!=0)&&(x%5!=0)&&(x%7!=0))
printf("%d不能被3、5、7整除\n",x);
}
11. 邮局寄包裹的费用是根据包裹的重量来收取的。一个重量为2kg或低于2kg的包裹收取3.25元。高于2kg的包裹,超出部分每千克收取1.05元,超出部分不足1kg按1kg计算。因此如果发件人发送重达5.63kg的包裹,就需要缴纳7.45元。编写程序,输入包裹的重量,计算并输出发件人须缴纳的费用。(笔记本调试不成功)
#include<stdio.h>
void main(){
float m,n;
int a;
printf("请输入包裹的重量:\n");
scanf("%f",&m);
if(m<=2)
n=3.25;
else{
a=m/1;
if(m-a==0)
n=3.25+(a-2)*1.05;
else
n=3.25+(a-1)*1.05;
}
printf("您需缴纳的费用为:%f元",n);
}
12. 一个临时照顾孩子的人的收费标准是:18:00到21:30间每小时2元,21:30到午夜间每小时4元,18:00以前和午夜以后不照顾孩子。
编写程序,输入开始时间和完毕时间,计算并输出某一个雇工的薪酬。程序应检查无效的开始和完毕时间。
#include<stdio.h>
void main(){
float m,n,j;
printf("请输入工作的起止时间:\n");
scanf("%f%f",&m,&n);
if(n<=18||n>24||m<18||m>24)
printf("输入的时间无效!\n");
else{
if(m>=18&&n<=21.5)
j=(n-m)*2;
else
if(m<21.5&&n>21.5)
j=(21.5-m)*2+(n-21.5)*4;
else
j=(n-m)*4;
printf("您获得的钱数为%f元\n",j);
}
}
13. 编写程序,按下述公式求自然对数底e的近似值。
#include<stdio.h>
#define eps 1e-5
void main(){
int n;
float e,r;
e=1.0;
n=1;
r=1.0;
while(r>eps){
e=e+r;
n=n+1;
r=r/n;
}
printf("e=%f\n",e);
}
14. 编写程序,统计以100位完毕符的整数输入流中-1、0、1的出现次数并将其输出。
#include<stdio.h>
void main(){
int n,i,j,k;
i=0;
j=0;
k=0;
printf("请输入一个整数:\n");
scanf("%d",&n);
while (n!=100){
if(n==1) i++;
if(n==0) j++;
if(n==-1) k++;
printf("请输入一个整数:\n");
scanf("%d",&n);
}
printf("整数流中出现1 %d次\n",i);
printf("整数流中出现0 %d次\n",j);
printf("整数流中出现-1 %d次\n",k);
}
15. 编写程序,打印“99乘法表”
1 1
2 2 4
3 3 6 9
4 4 8 12 16
5 5 10 15 20 25
6 6 12 18 24 30 36
7 7 14 21 28 35 42 49
8 8 16 24 32 40 48 56 64
9 9 18 27 36 45 54 63 72 81
* 1 2 3 4 5 6 7 8 9
#include<stdio.h>
void main(){
int i,j;
for(i=1;i<10;i++){
printf("%4d",i);
for(j=1;j<=i;j++)
printf("%4d",i*j);
printf("\n");
}
printf("%4c",'*');
for(i=1;i<=9;i++)
printf("%4d",i);
}
16. 编写程序,打印200以的素数,要求每行输出10个数。
#include<stdio.h>
void main(){
int i,j,k=0;
bool flag;
for(i=2;i<200;i++){
flag=true;
for(j=i/2;j>=2;j--)
if(i%j==0)
flag=false;
if(flag)
{printf("% d",i);
k++;
}
if(k%10==0)
printf("\n");
}
}
17. 编写程序,输出如下序列的前50项,此序列的第一项为0;第二项为1;以后的奇数项为其前两项之和;偶数项为其前两项之差。要求每行输出10个数。
#include<stdio.h>
void main(){
int u,v,w,k;
u=0;
v=1;
printf("%5d%5d",u,v);
for(k=3;k<=50;k++){
if(k%2==0)
w=v-u;
else
w=u+v;
printf("%7d",w);
if(k%10==0)
printf("\n");
u=v;
v=w;
}
}
18. 编写程序,输入正整数N,计算r1!+r2!+…+rn!并输出。其中N=r1r2…rn。
#include<stdio.h>
void main(){
int n,s,p,u,r;
printf("请输入正整数:\n");
scanf("%d",&n);
s=0;
while(n!=0){
r=n%10;
n=n/10;
p=1;
u=1;
while(u<=r){
p=p*u;
u=u+1;
}
s=s+p;
}
printf("%d",s);
}
19. 完数问题:若有一数,其值等于它的因子之和,则该数称为完数。例如,6的因子为1、2、3,而6=1+2+3,故6是完数。编程输出1000之的所有完数与其因子。
#include<stdio.h>
void main(){
int i,j,k,l;
for(i=2;i<1000;i++){
k=0;
for(j=i/2;j>=1;j--)
if(i%j==0)
k=k+j;
if(k==i)
{printf(" %d",k);
printf("因子为:");
for(l=1;l<=k/2;l++)
if(k%l==0)
printf(" %d",l);
printf("\n");
}
}
}
20. 把一1元钞票换成1分、2分和5分的硬币,每种至少有1枚,问有多少种换法?
#include<stdio.h>
void main(){
int i,j,k,l=0;
for(i=1;i<=10;i++)
for(j=1;j<=5;j++)
for(k=1;k<=2;k++)
if(i+2*j+5*k==10)
l++;
printf("%d\n",l);
}
21. 斐波那契(Fibonacci)数列问题:Fibonacci数列递归定义为:
x0=0,
x1=1,
xi+1=xi+xi-1, i=2,3,…
即从第二项开始,数列中的每一个元素等于前面两个元素之和。编程输出前20项Fibonacci数。(提示可以用递归或迭代两种方式编程)
答案:
#include<stdio.h>
void main(){
int i,a[20];
printf(" 0");
printf(" 1");
for(i=2;i<=20;i++)
{ a[0]=0;
a[1]=1;
a[i]=a[i-2]+a[i-1];
printf("% d",a[i]);}
}
另解:
#include "stdio.h"
#include "math.h"
void main()
{
int f1,f2,f3,i;
f1=0,f2=1;
printf("%d\n",f1);
printf("%d\n",f2);
for(i=1;i<=18;i++)
{ f3=f1+f2;
f1=f2;
f2=f3;
printf("%d\n",f3);
}
printf("\n");
}
22. 公鸡5元1只,母鸡3元1只,小鸡1元3只,花了100元钱买100只鸡,问公鸡、母鸡、小鸡各多少只?
#include<stdio.h>
void main(){
int x,y,z;
for(x=1;x<=20;x++)
for(y=1;y<=33;y++)
for(z=3;z<=99;z=z+3)
if(x+y+z==100&&5*x+3*y+z/3==100)
printf("公鸡 %d ;母鸡 %d ;小鸡 %d\n",x,y,z);
}
23. 编写程序,用循环语句控制打印如下图的字符图形。
A B C D E F G H I
B C D E F G H I A
C D E F G H I A B
D E F G H I A B C
E F G H I A B C D
D E F G H I A B C
C D E F G H I A B
B C D E F G H I A
A B C D E F G H I
#include<stdio.h>
void main(){
char x,y;
for(x='A';x<='E';x++)
{for(y=x;y<='I';y++)
printf("% c",y);
for(y='A';y<=x-1;y++)
printf("% c",y);
printf("\n");
}
for(x='D';x>='A';x--){
for(y=x;y<='I';y++)
printf("% c",y);
for(y='A';y<=x-1;y++)
printf("% c",y);
printf("\n");
}
}
24. 编写程序,打印如以下图所示的图形
1
1 2 1
1 2 3 2 1
1 2 3 4 3 2 1
1 2 3 4 5 4 3 2 1
1 2 3 4 5 6 5 4 3 2 1
1 2 3 4 5 6 7 6 5 4 3 2 1
1 2 3 4 5 6 7 8 7 6 5 4 3 2 1
1 2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 1
1 2 3 4 5 6 7 8 9 0 9 8 7 6 5 4 3 2 1
#include<stdio.h>
void main(){
int i,j,k,l,m,n;
for(i=1;i<=9;i++)
{for(j=9;j>=i;j--)
printf(" ");
for(k=1;k<i;k++)
printf(" %d",k);
for(l=i;l>=1;l--)
printf(" %d",l);
printf("\n");
}
for(m=1;m<=9;m++)
printf(" %d",m);
printf(" 0");
for(n=9;n>=1;n--)
printf(" %d",n);
}
25. 验证哥德巴赫猜想:任意一个大偶数都可以分解为两个素数之和。用户输入一个大于6的偶数,程序计算并输出分解结果。
26. 编写一个程序解决爱因斯坦台阶问题:有人走以台阶,若以每步走2级则最后剩1级;若每步走3级则最后剩2级;若以每步走4级则最后剩3级;若以每步走5级则最后剩4级;若以每步走6级则最后剩5级;若以每步走7级则最后刚好不剩。问台阶共有几级?
27. 编写程序,输出所有小于100的可以被11整除的自然数,以与这些数之和。
#include<stdio.h>
void main(){
int n,m;
n=0;
for(m=1;m<100;m++)
{if(m%11==0)
{printf(" %d",m);
n=n+m;}
}
printf("和为:%d\n",n);
}
28. 一辆汽车装满油料可以行驶300km。从存放有n车油料的油库出发,通过在途中建立加油站的方法,它可以行驶
千米。编写程序,给定L以计算n。
29. 编写函数,判定它的4个整型参数中是否有两个数的值相等。主函数读入4个数,调用该函数,输出判定结果。
#include<stdio.h>
int y(int a,int b,int c,int d){
if(a==b||a==c||a==d||b==c||b==d||c==d)
printf("存在俩个参数相等\n");
else
printf("不存在俩个参数相等\n");
return 0;}
int main(){
int a,b,c,d;
printf("请输入四个参数:\n");
scanf("%d%d%d%d",&a,&b,&c,&d);
y(a,b,c,d);
}
30. 编写以一个函数reverse(int n),求任意4位整数的逆序数。如n=2637时,函数返回值是7362。主函数读入一个整数,判断其合法性,调用函数得到结果输出。
#include<stdio.h>
int reverse(int n){
int a,b,c,d,s;
a=n/1000;
b=n%1000/100;
c=n%100/10;
d=n%10;
s=d*1000+c*100+b*10+a;
return s;
}
void main(){
int i,j;
printf("请输入一个四位数:\n");
scanf("%d",&i);
if(i<1000||i>9999)
printf("您输入的数据有误!\n");
else{
j=reverse(i);
printf("逆序数为:%d",j);
}
}
31. 编写程序,输入m、n的值计算并输出
要求编写一函数f(int num)求正整数num的阶乘。
#include<stdio.h>
int f(int num){
int i,j;
j=1;
for(i=1;i<=num;i++)
j=j*i;
return j;
}
void main(){
int m,n,a,b,c,s;
printf("请输入m,n的值:\n");
scanf("%d%d",&m,&n);
a=f(m);
b=f(m-n);
c=f(n);
s=a/(b*c);
printf("%d\n",s);
}
32. 下面是一个有效的计算xn的方法。
初始化:answer=1; power=x; m=n;
当m!=0时,重复计算:
若m是奇数,则令
answer=answer*power;
m=m-1;
否则,令
power=power*power;
m=m/2;
重复计算至m=0
结果为answer
编写函数power(float x, int n)实现上述算法,主函数读入x和n,调用函数得到返回值输出。
#include<stdio.h>
float power(float x,int n){
float answer,power;
int m;
answer=1;
power=x;
m=n;
while(m!=0){
if(m%2!=0){
answer=answer*power;
m=m-1;
}
else
{power=power*power;
m=m/2; }
}
return answer;
}
void main(){
float a,s;
int b;
printf("请输入x,n:\n");
scanf("%f%d",&a,&b);
s=power(a,b);
printf("%f",s);
}
33. 编写函数,以两个正整数位参数,如果这两个数是友好的,返回true,否则返回false。如果这两个整数的约数之和(除了它本身之外)等于对方,就称这对数是友好的。例如,1184和1210
1184的约数之和为1+2+4+8+16+32+74+148+296+592=1210
1210的约束之和为1+5+10+11+22+55+110+121+242+605=1184
(答案不正确,需修改,问题可能出在true,false 上)
#include<stdio.h>
int f(int m,int n){
int i,j,k,q;
j=0;
k=0;
for(i=1;i<m/2;i++)
if(m%i==0)
j=j+i;
for(q=1;q<=n/2;q++)
if(n%q==0)
k=k+q;
if(j==n&&k==m)
return true;
else
return false;
}
void main(){
int a,b;
bool flag;
printf("请输入两个正整数:\n");
scanf("%d%d",&a,&b);
flag=f(a,b);
if(flag)
printf("这两个数是友好的");
else
printf("这两个数不是友好的");
}
34. 编写程序计算调和级数的前N项和。要求结果是一个准确的分数A/B形式。
#include<stdio.h>
int f(int n){
int a=1,b=1,c=0,i,e,f;
do{a=a*b;
c=c*b+a/b;
b++;
}while(b<=n);
e=c;
f=a;
while(i!=0){
i=e%f;
e=f;
f=i;
}
c=c/e;
a=a/e;
printf("%d/%d",c,a);
return 0;}
void main(){
int n;
printf("please input n:\n");
scanf("%d",&n);
f(n);
}
35. 编写程序,输入n个整数,用“主元排序”法,将其升序排序(从小到大)输出。
#include<stdio.h>
#define n 10
void main(){
int i,j,k,r,a[n];
printf("请输入十个数据:\n");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=0;i<9;i++){
j=i;
for(k=i+1;k<10;k++)
if(a[k]<a[j])
j=k;
r=a[i];
a[i]=a[j];
a[j]=r;
}
printf("answer:\n");
for(i=0;i<10;i++){
if(i%10==0)
printf("\n");
printf("%4d",a[i]);
}
}
36. 编写一个程序,输入全班同学某门课考试成绩,计算平均成绩并统计大于等于平均成绩的人数。(提示:批量数据通常不事先规定输入的数据数量,而是以一个特殊的标志作为输入完毕。程序根据完毕标志统计人数)
37. 打印辉三角形的前10行
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
……
#include<stdio.h>
#define n 10
#define w 6
void main(){
int a[11],i,j;
for(i=0;i<n;i++){
a[i]=1;
for(j=i-1;j>0;j--)
a[j]=a[j-1]+a[j];
for(j=0;j<=40-i*(w/2);j++)
printf("%c",' ');
for(j=0;j<=i;j++)
printf("%6d",a[j]);
printf("\n");
}
}
另解:
#include <stdio.h>
#define n 10
#define w 6
void main(){
int a[11],b[11],i,j;
for(i=0;i<n;i++){
for(j=1;j<i;j++)
a[j]=b[j-1]+b[j];
a[i]=1;
for(j=0;j<=i;j++)
b[j]=a[j];
for(j=0;j<=40-i*(w/2);j++)
printf("%c",' ');
for(j=0;j<=i;j++)
printf("%6d",a[j]);
printf("\n");
}
}
38. 编写程序,输入n个整数,用“冒泡排序”法,将其升序排序(从小到大)输出。
#include<stdio.h>
#define n 10
void main(){
int a[n];
int i,j,t;
printf("请输入全部数据:\n");
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(i=0;i<n-1;i++){
for(j=0;j<n-i-1;j++)
if(a[j]>a[j+1]){
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
printf("顺序为:\n");
for(i=0;i<n;i++)
printf(" %d",a[i]);
}
39. 编写程序,输入n个整数,用“逐步增加递增子序列”法(或称插入排序),将其升序排序(从小到大)输出。
#include<stdio.h>
void sort(int n,int a[]){
int i,j,k,r;
for (i=1;i<n;i++){
j=i-1;
while((a[j]>a[i])&&(j>=0))
j=j-1;
r=a[i];
for(k=i-1;k>=j+1;k--)
a[k+1]=a[k];
a[k+1]=r;
}
}
void main(){
int a[10],i;
for(i=0;i<10;i++)
scanf("%d",&(a[i]));
sort(10,a);
for(i=0;i<10;i++)
printf("%4d",a[i]);
}
40. 编程实现二分查找算法。设数组以按升序排序,“对半检索”亦称“两分法检索”。在检索过程中用到三个变量:
lower : 记录检索区间下界,初值是0 ;
upper : 记录检索区间上界,初值是n-1 ;
j: 标记当前检索位置。
检索思想令j=(lower+upper)/2
n key==a[j]: 找到,位置为j;函数search返回j
n key<a[j]: key在a[lower]与a[j]之间
检索区间缩小一半,upper=j-1
n key>a[j]: key在a[j]与a[upper]之间,
检索区间缩小一半,lower=j+1
重复上述过程。重复的终止条件为
upper-lower
展开阅读全文