C语言 编写函数实现输入、排序和折半查找信息

要求:

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值