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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
MyEclipse+Tomcat 问题 麻烦各位帮忙看一下
Tomcat启动之后我的MyEclipse上面Console框里这些信息的颜色是红色的啊?我也没有设置颜色、可是运行工程的时候又不报错啊。很是纠结啊! 麻烦高手来看一看!  详细的信息如下: 2010-5-21 22:33:07 org.apache.catalina.core.AprLifecycleListener init信息: The APR based Apa
新人问题 路过的帮忙看一下
我是新手 下了个jsp写的网上选课 文件夹里包括 check.jsp ConDB.java ConDB.CLASS course.mdb login.htm select.jsp updata.jsp 文件夹没有子文件夹 我已经安装了jdk和tomcat 我想问问怎样才能运行这个网上选课 * 书上说jsp文件下应该还有web_inf,classes,lib
C语言:输出整数各位数字。
#include &amp;lt;stdio.h&amp;gt;/*本题要求编写程序,对输入的一个整数,从高位开始逐位分割并输出它的各位数字。*/ int main(int argc, char *argv[]) { long x,x1; int i=1,m; scanf(&quot;%ld&quot;,&amp;amp;x); x1=x;  if(x&amp;lt;10){  printf(&quot;%ld&quot;,x); } else{  while(x&amp;g...
输出整数的位数、顺序输出整数各位数字、逆序输出整数各位数字
一、输出整数的位数  运用“去尾法”获取整数n的位数。“去尾法”是将整数n/10后重新赋值给n,可将整数n的最后一位数去掉。每次去掉一位,计数器+1,直到整数n被赋值为0时,计数器停止计数,此时计数器的数字为整数n的位数。考虑当整数n取0时,运用do-while循环语句可以进入循环。源代码:int GetFigures(int n) { int count=0; //计数器 do ...
C语言中关于取三位数的各各位数的单个数字问题
在BCB下 1=9 了|||367除以100 =3367除以10取10余=6367取10余=7 3 1=8 2 1)就是6 a[j]); }}|||位置是固定的 只需要判断/0的位置就可以|||#include main(){ int a[3]; int i =0; int j; int num
实验9 问题 E: 编写函数:各位数字之和 (Append Code)
题目描述 给定一个正整数,求它的各位数字之和,直到这个和只有一位数为止。 例如,给出整数1236,那么计算 1+2+3+6=12 因为12是一个两位数,所以继续求和 1+2=3 得到结果为:3。 ----------------------------------------------------------------------------- 编写一个函数digit_su
C语言之基本算法30—数组的灵活应用(一个正整数的各位数字平方和)
//数组的灵活应用! /* ===================================================== 题目:求任意输入一个正整数各位数字的平方和,显示如下: 如输入1234,则显示 1*1+2*2+3*3+4*4=30 ===================================================== */
阿里的新人破冰问题
阿里的新人破冰问题:初次访问发生在几点几分? 完全打开首页花费多少时间? 是否浏览完整个首页后再去找login入口? 找login入口花了多少时间? 是否在服务器提示下找到入口? 在找到真正login页面之前,是否误入后台login页面? 是否使用XX助手找到入口? 输错了几次密码后成功登陆? 在第一次成功登陆的时候,是否使用https(安全连接)? 登陆之前购买了多少份https
求助各位高手,帮忙做下,谢谢了
由计算机“想”一个四位数,请人猜出这个四位数是多少。人输入四位数字后,计算机首先判断这四位数字有几位是猜对了,并且在对的数字中又有几位位置也是对的,将结果显示出来,给人以提示,请人再猜,直到人猜出计算机所想的四位数是多少时为止。 
C语言解决读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。
/* 读入一个自然数n,计算其各位数字之和,用汉语拼音写出和的每一位数字。 输入格式:每个测试输入包含1个测试用例,即给出自然数n的值。这里保证n小于10100。 输出格式:在一行内输出n的各位数字之和的每一位,拼音数字间有1 空格,但一行中最后一个拼音数字后没有空格。 输入样例: 1234567890987654321123456789 输出样例: yi s