要求:
1)在主函数中定义二维整型数组,用于存放10个学生的编号和两门课程成绩;
2)编写一个函数input实现二维数组数据的输入;
3)编写一个函数sort按照学生编号由小到大顺序排列二维数组,两门课程成绩顺序也随之调整;
4)编写一个函数find实现用折半查找法查找给定学生编号对应的两门课程成绩,编号的输入和成绩的输出("%4d")在主函数中完成。
注:折半搜索,也称二分查找算法、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。具体方法为:
A. 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;
B. 如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。
C. 如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
运行参考示例:
输入2:
1008 56 78
1023 66 58
1004 87 77
1007 91 83
1002 71 68
1009 61 54
1003 86 63
1015 43 62
1006 67 73
1010 81 92
1020
输出2:
Can't find
输入3:
1008 56 78
1023 66 58
1004 87 77
1007 91 83
1002 71 68
1009 61 54
1003 86 63
1015 43 62
1006 67 73
1010 81 92
1007
输出3:
score: 91 83
#include<stdio.h>
int main()
{
int a[10][3];
int m,t;
void input(int b[10][3]);
//void output(int c[10][3]);
void sort(int d[10][3]);
int find(int f[10][3],int k);
input(a);
printf("\n");
sort(a);
scanf("%d",&m);
printf("\n");
t=find(a,m);
if(t>=0)
printf("score:%4d%4d\n",a[t][1],a[t][2]);
else
printf("Can't find\n");
return 0;
}
void input(int b[10][3])
{
int i,j;
for(i=0; i<10; i++)
{
for(j=0; j<3; j++)
{
scanf("%d",&b[i][j]);
}
}
printf("\n");
}
/*void output(int c[10][3])
{
int i,j;
for(i=0; i<10; i++)
{
for(j=0; j<3; j++)
{
printf("%d ",c[i][j]);
}
printf("\n");
printf("\n");
}
}
*/
void sort(int d[10][3])
{
int i,j,k,m,t,f;
for(i=0; i<9; i++)
{
m=i;
for(j=i+1; j<10; j++)
{
if(d[m][0]>d[j][0])
{
m=j;
}
}
if(m!=i)
{
for(k=0; k<3; k++)
{
f=d[i][k];
d[i][k]=d[m][k];
d[m][k]=f;
}
}
}
}
int find(int f[10][3],int k)//k是所要查找的学生编号
{
int high,low,mid;
high=9;
low=0;
while(low<=high)
{
mid=(low+high)/2;//每次循环都初始化mid的值
if(k<f[mid][0])
high=mid-1;//修改查找的上限
else if(k>f[mid][0])
low=mid+1; //修改查找的下限
else
return mid;
}
return -1;
}