2 gudong1996 gudong1996 于 2016.04.21 22:57 提问

新人问一个c语言问题,麻烦各位帮忙看一下

一个小型成绩管理系统:
#include
#include
#define N 40
int Readscore(int score[],long id[]);
int Linsearch(long id[],long m,int n);
void Linsort(int score[],long id[],int n);
void Selectsort(int score[],long id[],int n);
int Binsearch(long id[],long m,int n);
void Printf(int score[],long id[],int n);

int main()
{
int score[N];//记录学生成绩
long id[N];//记录学生学号
int num;//接收 READscore的返还值,即学生人数
long x,x1;
int a,a1;//接收返回学号的值

//记录学生成绩
num=Readscore(score,id);

//输出成绩和学号
Printf(score,id,num);


// 顺序查找法
printf("输入你要查找的学生的学号:");
scanf("%ld",&x);
a=Linsearch(id,x,num);
printf("%d %ld\n",score[a],id[a]);

//线性排序法
Linsort(score,id,num);

//输出成绩和学号
Printf(score,id,num);

//选择排序法
Selectsort(score,id,num);

//输出成绩和学号
Printf(score,id,num);

//折半查找法
printf("输入你要查找的学生的学号:");
scanf("%ld\n",&x1);
a1=Binsearch(id,x1,num);
if(a1 != -1)
{
    printf("%d %ld\n",score[a1],id[a1]);
}
else
{
    printf("大兄弟,没这个人啊!");
}


//输出成绩和学号
Printf(score,id,num);


return 0;

}

//录入学生成绩 和学号
int Readscore(int score[],long id[])
{
int i=-1;
do
{
i++;
printf("input score and id:");
scanf("%d %ld",&score[i],&id[i]);
}while((score[i] >= 0)&&(id[i] >=0));
return i;
}
//顺序查找
int Linsearch(long id[],long m,int n)
{
int i;

for(i=0;i<n;i++)
{
    if(m == id[i])
    {
        return i;
    }
}
return -1;

}
//线性排序,升序排
void Linsort(int score[],long id[],int n)
{
int i,j;
int temp1,temp2;

for(i=0;i<n-1;i++)
{

    for(j=i+1;j<n;j++)
    {
        if(score[i]>score[j])
        {
            //交换成绩
            temp1=score[j];
            score[j]=score[i];
            score[i]=temp1;
            //交换学号
            temp2=id[j];
            id[j]=id[i];
            id[i]=temp2;
        }
    }
}

}
//选择排序法,降序排
void Selectsort(int score[],long id[],int n)
{
int i,j,k;
int temp1;
long temp2;

for(i=0;i<n-1;i++)
{
    k=i;
    for(j=n+1;j<n;j++)
    {
        if(score[j] > score[k])
        {
            k=j;
        }
    }
    if(k != i)
    {
        //交换成绩
        temp1 = score[k];
        score[k] = score[i];
        score[i] = temp1;

        //交换学号
        temp2 = id[k];
        id [k] =id[i];
        id[i] = temp2;
    }
}

}

//折半查找法
int Binsearch(long id[],long m,int n)
{
int high = n-1;
int low = 0;
int mid;

    while(low <= high)
    {
        mid = (high+low)/2;
        if(m < id[mid])
        {
            high = mid-1;
        }
        else if(m > id[mid])
        {
            low = mid+1;
        }
        else
        {
            return mid;
        }
    }
    return -1;
}

//输出函数
void Printf(int score[],long id[],int n)
{
int i;
printf("=============================\n");
for(i=0;i < n;i++)
{

    printf("%d %ld\n",score[i],id[i]);

}

}
为什么选择排序法升序没有实现?
还有,为什么折半查找法用不了?就是输进去学号之后程序不继续往下执行。
我实在找不出错在哪了。

3个回答

qq423399099
qq423399099   Ds   Rxr 2016.04.22 13:38
已采纳

选择排序法的的降序排列没有实现是因为内层循环有个地方写错了
for(j=n+1;j<n;j++)应该改为for(j=i+1;j<n;j++)
折半查找法这里不是用不了,是你的scanf里面多写了\n
scanf("%ld\n",&x1);应该是scanf("%ld",&x1);

 #include <stdio.h>
#include <stdlib.h>
#define N 20
int Readscore(int  score[],long id[]);
int Linsearch(long id[],long m,int n);
void Linsort(int score[],long id[],int n);
void Selectsort(int score[],long id[],int n);
int Binsearch(long id[],long m,int n);
void Printf(int score[],long id[],int n);

int main()
{
    int score[N];//记录学生成绩
    long id[N];//记录学生学号
    int num;//接收 READscore的返还值,即学生人数
    long x,x1;
    int a,a1;//接收返回学号的值

    //记录学生成绩
    num=Readscore(score,id);

    //输出成绩和学号
    Printf(score,id,num);


    // 顺序查找法
    printf("输入你要查找的学生的学号:");
    scanf("%ld",&x);
    a=Linsearch(id,x,num);
    printf("%d %ld\n",score[a],id[a]);

    //线性排序法
    Linsort(score,id,num);

    //输出成绩和学号
    Printf(score,id,num);

    //选择排序法
    Selectsort(score,id,num);

    //输出成绩和学号
    Printf(score,id,num);

    //折半查找法
    printf("输入你要查找的学生的学号:");
    scanf("%ld",&x1);
    a1=Binsearch(id,x1,num);
    if(a1 != -1)
    {
        printf("%d %ld\n",score[a1],id[a1]);
    }
    else
    {
        printf("大兄弟,没这个人啊!");
    }


    //输出成绩和学号
    Printf(score,id,num);


    return 0;
}

//录入学生成绩 和学号
int Readscore(int score[],long id[])
{
    int i=-1;
    do
    {
        i++;
        printf("input score and id:");
        scanf("%d %ld",&score[i],&id[i]);
    }while((score[i] >= 0)&&(id[i] >=0));
    return i;
}
//顺序查找
int Linsearch(long id[],long m,int n)
{
    int i;

    for(i=0;i<n;i++)
    {
        if(m == id[i])
        {
            return i;
        }
    }
    return -1;
}
//线性排序,升序排
void Linsort(int score[],long id[],int n)
{
    int i,j;
    int temp1,temp2;

    for(i=0;i<n-1;i++)
    {

        for(j=i+1;j<n;j++)
        {
            if(score[i]>score[j])
            {
                //交换成绩
                temp1=score[j];
                score[j]=score[i];
                score[i]=temp1;
                //交换学号
                temp2=id[j];
                id[j]=id[i];
                id[i]=temp2;
            }
        }
    }
}
//选择排序法,降序排
void Selectsort(int score[],long id[],int n)
{
    int i,j,k;
    int temp1;
    long temp2;

    for(i=0;i<n-1;i++)
    {
        k=i;
        for(j=i+1;j<n;j++)
        {
            if(score[j] > score[k])
            {
                k=j;
            }
        }
        if(k != i)
        {
            //交换成绩
            temp1 = score[k];
            score[k] = score[i];
            score[i] = temp1;

            //交换学号
            temp2 = id[k];
            id [k] =id[i];
            id[i] = temp2;
        }
    }
}

//折半查找法
int Binsearch(long id[],long m,int n)
{
    int high = n-1;
    int low = 0;
    int mid;

    while(low <= high)
    {
        mid = (high+low)/2;
        if(m < id[mid])
        {
            high = mid-1;
        }
        else if(m > id[mid])
        {
            low = mid+1;
        }
        else
        {
            return mid;
        }
    }
    return -1;
}
//输出函数
void Printf(int score[],long id[],int n)
{
    int i;
    printf("=============================\n");
    for(i=0;i < n;i++)
    {

        printf("%d %ld\n",score[i],id[i]);

    }
}

图片说明

caozhy
caozhy   Ds   Rxr 2016.04.21 23:08

你的思路根本都不对,比如说有成绩
4 65
1 80
2 75
3 70
你怎么能分开排序,变成
1 65
2 70
3 75
4 80
呢?
这样1号学生明明是80分,一排序成65了,人家干啊?
你必须把成绩和学号视作整体,只对成绩或者学号排序。

接下来,折半查找的前提是,数据必须是有序的,如果你用学号查询,还得对学号排序。

u012155923
u012155923   2016.04.22 08:31

用结构体,最好再加一个函数指针,你这样写太乱,还容易出错的说

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!