C语言题目//求改错

时间:2022-01-16 14:10:59
/*
    比赛7个人比赛结束,按照选手的出场顺序宣布最后得分和
    最后名次,获得相同分数的选手具有相同的名次。
    选手序号:1,2,3,4,5,6,7
    选手得分:5,3,4,7,3,5,6
    则输出名次为:3,1,2,5,1,3,4
*/
#include <stdio.h>
#define NUM 7 //人数

void Groups()
{
    int array[NUM+1]={0,5,3,4,7,3,5,6};//选手成绩
    int array_t[NUM+1]={0},array_tt[NUM+1]={0};
    //array_t是已编名次的标记数组,array_tt是记录同名次元素的下标
    int i,n,smallest,num,k,j;
    num=1;//名次
    for(i=1;i<=num;i++)//每次处理一个名次
        if(array_t[i]==0)//找到第一个未处理的元素
        {
            smallest=array[i];//取第一个未处理元素当最小值
            k=1;//数组array_tt下标,同名次人数
            array_tt[k]=i;//记录分值为smallest的同名次元素的下标
            for(j=i+1;j<=NUM;j++)//对余下的进行处理
                if(array_t[j]==0)
                if(array[j]<smallest)
                {
                    smallest=array[j];//重新设置当前最小值
                    k=0;//重新设置同名次人数
                    array_tt[++k]=j;
                }
                else if(array[j]==smallest)
                    array_tt[++k]=j;
                for(j=1;j<=k;j++)
                    array_t[array_tt[j]]=num;
                num++;
                i=0;
        }
        printf("player-NO Score Rank\n");
        for(j=1;j<=NUM;j++)
        printf("%3d %4d %4d\n",j,array[j],array_t[j]);
}

int main()
{
    Groups();
}

14 个解决方案

#1


该回复于2012-03-13 11:11:48被版主删除

#2


for(i=1;i<=num;i++)//每次处理一个名次
   if(array_t[i]==0)//找到第一个未处理的元素
   {
   smallest=array[i];//取第一个未处理元素当最小值
   k=1;//数组array_tt下标,同名次人数
   array_tt[k]=i;//记录分值为smallest的同名次元素的下标
   for(j=i+1;j<=NUM;j++)//对余下的进行处理
   if(array_t[j]==0)
   if(array[j]<smallest)
   {
   smallest=array[j];//重新设置当前最小值
   k=0;//重新设置同名次人数
   array_tt[++k]=j;
   }
   else if(array[j]==smallest)
   array_tt[++k]=j;
   for(j=1;j<=k;j++)
   array_t[array_tt[j]]=num;
   num++;
   i=0;
   }
你这个循环,是个死循环,num++;i=0;这两句破坏了你的循环判断,i永远小于num

#3


怎么改啊?
引用 2 楼 slsnake 的回复:
for(i=1;i<=num;i++)//每次处理一个名次
   if(array_t[i]==0)//找到第一个未处理的元素
   {
   smallest=array[i];//取第一个未处理元素当最小值
   k=1;//数组array_tt下标,同名次人数
   array_tt[k]=i;//记录分值为smallest的同名次元素的下标
   for(j=i+1;j<=N……

#4


用struct记录数据更好吧

#5


#include <stdio.h>
#include <math.h>
#include <conio.h>

void sort(int array[],int n) //从小到大排序

int i,j,k,t; 
for(i=0;i <n-1;i++) 
{
k = i;
for(j=i+1;j <n;j++)
{        
if(array[j] <array[k])
{
k = j;    //循环结束k总是数值最小的下标    
}     
}
//将数值最小的放到位置i
t=array[k];
array[k]=array[i];
array[i]=t;    




int main(void)
{
int record[2][7] = {{5,3,4,7,3,5,6},{0,0,0,0,0,0,0}};
int ptemp[7];
int num[7];
int i,j;

for(i = 0; i<7; i++)
{
ptemp[i] = record[0][i];
}

sort(ptemp,7);

num[0] = 1;
for(i = 1; i<7; i++)
{
if(ptemp[i] == ptemp[i-1])
{
num[i] = num[i-1];
}
else
{
num[i] = num[i-1]+1;
}
}

for(i = 0; i<7; i++)
{
for(j = 0;j<7;j++)
{
if(record[0][i] == ptemp[j])
{
record[1][i] = num[j];
}
}
}

for(i = 0; i<7; i++) printf("%d ",record[0][i]);
printf("\n");
for(i = 0; i<7; i++) printf("%d ",record[1][i]);
getch();
return 0;
}

用笨办法写了个程序,排是排出来了,效率不高

#6


该回复于2012-03-14 10:45:37被版主删除

#7


题目都没说好是分越低名次越高。。。

#8


用一个链表,里面放3个元素。一个是次序,一个是分数,一个是指针域,定义3个指针,一个是头指针不需要移动。一个p1指针指向当前的结点,一个是p2指针,不停的移动,与当前结点的分数进行比较,如果比当前结点的分数小,count变量+1.这样到链尾的时候查看count,该结点的名次就是count+1.最后还得把p2=head指针,以便p1指向下一个结点的时候。p2可以从开头开始进行对比。。。


大概思路就是这样。。实现起来不算困难。。

#9


用结构体  struct
{
     int xuhao;
     int defen ;
}根据得分排序,然后根据顺序打印xunhao   这样就足够了  不用那么长的程序

#10


写个看看?
引用 9 楼 qiedechenqian 的回复:
用结构体  struct
{
     int xuhao;
     int defen ;
}根据得分排序,然后根据顺序打印xunhao   这样就足够了  不用那么长的程序

#11


 for(i = 0; i<7; i++)
    {
        ptemp[i] = record[0][i];//这是啥意思?
    }
    
    sort(ptemp,7);

    num[0] = 1;
    for(i = 1; i<7; i++)
    {
        if(ptemp[i] == ptemp[i-1])//这是啥意思?
        {
            num[i] = num[i-1];
        }
        else
        {
            num[i] = num[i-1]+1;
        }
    }

    for(i = 0; i<7; i++)
    {
        for(j = 0;j<7;j++)
        {
            if(record[0][i] == ptemp[j])
            {
                record[1][i] = num[j];
            }
        }
    }
    
    for(i = 0; i<7; i++) printf("%d ",record[0][i]);
    printf("\n");
    for(i = 0; i<7; i++) printf("%d ",record[1][i]);
    getch();
    return 0;
}


引用 5 楼 slsnake 的回复:
C/C++ code
#include <stdio.h>
#include <math.h>
#include <conio.h>

void sort(int array[],int n) //从小到大排序

    int i,j,k,t; 
    for(i=0;i <n-1;i++) 
    {
        k = i;
        for(j=i+1;j <n;j+……

#12


C语言题目//求改错

#13


for(i = 0; i<7; i++)
    {
        ptemp[i] = record[0][i];
    }
最笨的数组赋值给另一个数组的方法.

if(ptemp[i] == ptemp[i-1])
        {
            num[i] = num[i-1];
        }
        else
        {
            num[i] = num[i-1]+1;
        }
判断当前值是否和前一个值相等,如果相等那名次相同,不等则名次值+1

#14


大哥能上代码吗,你说的都是空话
引用 8 楼 ccc43542876 的回复:
用一个链表,里面放3个元素。一个是次序,一个是分数,一个是指针域,定义3个指针,一个是头指针不需要移动。一个p1指针指向当前的结点,一个是p2指针,不停的移动,与当前结点的分数进行比较,如果比当前结点的分数小,count变量+1.这样到链尾的时候查看count,该结点的名次就是count+1.最后还得把p2=head指针,以便p1指向下一个结点的时候。p2可以从开头开始进行对比。。。


……

#1


该回复于2012-03-13 11:11:48被版主删除

#2


for(i=1;i<=num;i++)//每次处理一个名次
   if(array_t[i]==0)//找到第一个未处理的元素
   {
   smallest=array[i];//取第一个未处理元素当最小值
   k=1;//数组array_tt下标,同名次人数
   array_tt[k]=i;//记录分值为smallest的同名次元素的下标
   for(j=i+1;j<=NUM;j++)//对余下的进行处理
   if(array_t[j]==0)
   if(array[j]<smallest)
   {
   smallest=array[j];//重新设置当前最小值
   k=0;//重新设置同名次人数
   array_tt[++k]=j;
   }
   else if(array[j]==smallest)
   array_tt[++k]=j;
   for(j=1;j<=k;j++)
   array_t[array_tt[j]]=num;
   num++;
   i=0;
   }
你这个循环,是个死循环,num++;i=0;这两句破坏了你的循环判断,i永远小于num

#3


怎么改啊?
引用 2 楼 slsnake 的回复:
for(i=1;i<=num;i++)//每次处理一个名次
   if(array_t[i]==0)//找到第一个未处理的元素
   {
   smallest=array[i];//取第一个未处理元素当最小值
   k=1;//数组array_tt下标,同名次人数
   array_tt[k]=i;//记录分值为smallest的同名次元素的下标
   for(j=i+1;j<=N……

#4


用struct记录数据更好吧

#5


#include <stdio.h>
#include <math.h>
#include <conio.h>

void sort(int array[],int n) //从小到大排序

int i,j,k,t; 
for(i=0;i <n-1;i++) 
{
k = i;
for(j=i+1;j <n;j++)
{        
if(array[j] <array[k])
{
k = j;    //循环结束k总是数值最小的下标    
}     
}
//将数值最小的放到位置i
t=array[k];
array[k]=array[i];
array[i]=t;    




int main(void)
{
int record[2][7] = {{5,3,4,7,3,5,6},{0,0,0,0,0,0,0}};
int ptemp[7];
int num[7];
int i,j;

for(i = 0; i<7; i++)
{
ptemp[i] = record[0][i];
}

sort(ptemp,7);

num[0] = 1;
for(i = 1; i<7; i++)
{
if(ptemp[i] == ptemp[i-1])
{
num[i] = num[i-1];
}
else
{
num[i] = num[i-1]+1;
}
}

for(i = 0; i<7; i++)
{
for(j = 0;j<7;j++)
{
if(record[0][i] == ptemp[j])
{
record[1][i] = num[j];
}
}
}

for(i = 0; i<7; i++) printf("%d ",record[0][i]);
printf("\n");
for(i = 0; i<7; i++) printf("%d ",record[1][i]);
getch();
return 0;
}

用笨办法写了个程序,排是排出来了,效率不高

#6


该回复于2012-03-14 10:45:37被版主删除

#7


题目都没说好是分越低名次越高。。。

#8


用一个链表,里面放3个元素。一个是次序,一个是分数,一个是指针域,定义3个指针,一个是头指针不需要移动。一个p1指针指向当前的结点,一个是p2指针,不停的移动,与当前结点的分数进行比较,如果比当前结点的分数小,count变量+1.这样到链尾的时候查看count,该结点的名次就是count+1.最后还得把p2=head指针,以便p1指向下一个结点的时候。p2可以从开头开始进行对比。。。


大概思路就是这样。。实现起来不算困难。。

#9


用结构体  struct
{
     int xuhao;
     int defen ;
}根据得分排序,然后根据顺序打印xunhao   这样就足够了  不用那么长的程序

#10


写个看看?
引用 9 楼 qiedechenqian 的回复:
用结构体  struct
{
     int xuhao;
     int defen ;
}根据得分排序,然后根据顺序打印xunhao   这样就足够了  不用那么长的程序

#11


 for(i = 0; i<7; i++)
    {
        ptemp[i] = record[0][i];//这是啥意思?
    }
    
    sort(ptemp,7);

    num[0] = 1;
    for(i = 1; i<7; i++)
    {
        if(ptemp[i] == ptemp[i-1])//这是啥意思?
        {
            num[i] = num[i-1];
        }
        else
        {
            num[i] = num[i-1]+1;
        }
    }

    for(i = 0; i<7; i++)
    {
        for(j = 0;j<7;j++)
        {
            if(record[0][i] == ptemp[j])
            {
                record[1][i] = num[j];
            }
        }
    }
    
    for(i = 0; i<7; i++) printf("%d ",record[0][i]);
    printf("\n");
    for(i = 0; i<7; i++) printf("%d ",record[1][i]);
    getch();
    return 0;
}


引用 5 楼 slsnake 的回复:
C/C++ code
#include <stdio.h>
#include <math.h>
#include <conio.h>

void sort(int array[],int n) //从小到大排序

    int i,j,k,t; 
    for(i=0;i <n-1;i++) 
    {
        k = i;
        for(j=i+1;j <n;j+……

#12


C语言题目//求改错

#13


for(i = 0; i<7; i++)
    {
        ptemp[i] = record[0][i];
    }
最笨的数组赋值给另一个数组的方法.

if(ptemp[i] == ptemp[i-1])
        {
            num[i] = num[i-1];
        }
        else
        {
            num[i] = num[i-1]+1;
        }
判断当前值是否和前一个值相等,如果相等那名次相同,不等则名次值+1

#14


大哥能上代码吗,你说的都是空话
引用 8 楼 ccc43542876 的回复:
用一个链表,里面放3个元素。一个是次序,一个是分数,一个是指针域,定义3个指针,一个是头指针不需要移动。一个p1指针指向当前的结点,一个是p2指针,不停的移动,与当前结点的分数进行比较,如果比当前结点的分数小,count变量+1.这样到链尾的时候查看count,该结点的名次就是count+1.最后还得把p2=head指针,以便p1指向下一个结点的时候。p2可以从开头开始进行对比。。。


……