注册 登录
编程论坛 C++教室

帮我看看错在哪?第三个调用函数有问题?

优游子 发布于 2008-01-12 14:50, 1277 次点击
#include<iostream.h>
#include<stdio.h>
#include<string.h>
#include<iomanip.h>
void input_data(char name[3][20],float score[3][5]);
void max_min(float Score[3][5]);
void sort(float end_score[3],char name[3][20]);
void main()
{
    char name[3][20];
    float score[3][5],end_score[3];
    input_data(name,score);
    max_min(score);
    sort(end_score,name);
}

void input_data(char name[3][20],float score[3][5])//输入5位评委给3位选手的评分.
{
    int i,j;
    for(i=0;i<3;i++)
    {
        cout<<"请输入第"<<i+1<<"位选手的姓名:"<<endl;
        gets(name[i]);
        cout<<"请输入第"<<i+1<<"位选手的各个评委给分:"<<endl;    
        for(j=0;j<5;j++)
        {
            cin>>score[i][j];
        }
    }
}

void max_min(float Score[3][5])//找出每位选手的最高分,最低分,最后得分.
{
    int i,j;
    float a=0,b=10,c=0;
    float max[3],min[3],sum[3],end_score[3];
    for(i=0;i<3;i++)
    {
        for(j=0;j<5;j++)
        {
            if(a<Score[i][j])
                a=Score[i][j];
            if(b>Score[i][j])
                b=Score[i][j];
            c+=Score[i][j];
        }
        max[i]=a;
        min[i]=b;
        sum[i]=c;//第i+1号选手的总分.
        end_score[i]=((sum[i]-max[i]-min[i])/3);//第i+1号选手的最后得分(除去最高,最低的平均数).
        a=0;
        b=10;
        c=0;
    }
    cout<<"各选手比赛的基本情况如下:"<<endl;
    cout<<" ______________________________________________________________________"<<endl;//打印表格
    for(i=0;i<3;i++)
    {
        cout<<"|  "<<i+1<<"号选手:  |  最高得分: "<<setiosflags(ios::fixed)<<setprecision(2)<<max[i]<<"  |  最低得分: "<<setiosflags(ios::fixed)<<setprecision(2)<<min[i]<<"  |  最后得分: "<<setiosflags(ios::fixed)<<setprecision(2)<<end_score[i]<<"   |"<<endl;
        cout<<"|______________________________________________________________________|"<<endl;
    }    
    cout<<endl;
}
void sort(float end_score[3],char name[3][20])//由高到低显示最后得分排序(显示名次,姓名,最后得分)
{
    int i,j;
    float t;
    char c[1][20]={0};
    for(j=0;j<2;j++)//起泡
    {
        for(i=0;i<=3-j;i++)
        {
            if(end_score[i]<end_score[i+1])
            {
                t=end_score[i];
                end_score[i]=end_score[i+1];
                end_score[i+1]=t;
                strcpy(c[0],name[i]);
                strcpy(name[i],name[i+1]);
                strcpy(name[i+1],c[0]);
            }
        }
    }
    cout<<"最后排名情况如下:"<<endl;
    cout<<"________________________________________________"<<endl;
    for(i=0;i<3;i++)
    {
        cout<<"|  第"<<i+1<<"名  |  姓名: "<<setiosflags(ios::left)<<setw(8)<<name[i]<<"  |  最后得分:"<<setiosflags(ios::fixed)<<setprecision(2)<<end_score[i]<<"  |"<<endl;
        cout<<"|_______________________________________________|"<<endl;
    }
    cout<<endl;
}
15 回复
#2
优游子2008-01-12 14:56
我是初学C++的,看了几天了,都不知改哪,所以才请教各位。我用的编译器是Microsoft Visual C++ 6.0
#3
way32008-01-12 16:06
b=10;这个赋值错误.应试赋值为Score[i]才对.
还有一个错误,自己检查.
#4
优游子2008-01-12 18:15
我上面的两个函数都可正确运行啊,就是第三个sort不能正确运行!b=10有问题,每二个函数应该不能正确运行才对啊!
#5
忘记喧嚣2008-01-12 18:29
那个10是对的哈.

 strcpy(c[0],name[i]);
                strcpy(name[i],name[i+1]);
                strcpy(name[i+1],c[0]);
            }
没看明白  请教下楼主

[[italic] 本帖最后由 忘记喧嚣 于 2008-1-12 18:32 编辑 [/italic]]
#6
优游子2008-01-12 18:36
名字随最后成绩的排列而排列啊。
#7
way32008-01-12 19:52
#include<iostream.h>
#include<stdio.h>
#include<string.h>
#include<iomanip.h>
void input_data(char name[3][20],float score[3][5]);
void max_min(float Score[3][5]);
void sort(float end_score[3],char name[3][20]);
 float end_score[3] ;
void main()
{
    char name[3][20];
    float score[3][5];
    input_data(name,score);
    max_min(score);
    sort(end_score,name);
}

void input_data(char name[3][20],float score[3][5])//输入5位评委给3位选手的评分.
{
    int i,j;
    for(i=0;i<3;i++)
    {
        cout<<"请输入第"<<i+1<<"位选手的姓名:"<<endl;
        gets(name[i]);
        cout<<"请输入第"<<i+1<<"位选手的各个评委给分:"<<endl;
        for(j=0;j<5;j++)
        {
            cin>>score[i][j];
        }
    }
}

void max_min(float Score[3][5])//找出每位选手的最高分,最低分,最后得分.
{
    int i,j;
    float a=0,b=10,c=0;
    float max[3],min[3],sum[3];
    for(i=0;i<3;i++)
    {   a=0;

        c=0;
        for(j=0;j<5;j++)
        {
            b=Score[i][0];
            if(a<Score[i][j])
                a=Score[i][j];
            if(b>Score[i][j])
                b=Score[i][j];
            c+=Score[i][j];
        }
        max[i]=a;
        min[i]=b;
        sum[i]=c;//第i+1号选手的总分.
        end_score[i]=((sum[i]-max[i]-min[i])/3);//第i+1号选手的最后得分(除去最高,最低的平均数).

    }
    cout<<"各选手比赛的基本情况如下:"<<endl;
    cout<<" ______________________________________________________________________"<<endl;//打印表格
    for(i=0;i<3;i++)
    {
        cout<<"|  "<<i+1<<"号选手:  |  最高得分: "<<setiosflags(ios::fixed)<<setprecision(2)<<max[i]<<"  |  最低得分: "<<setiosflags(ios::fixed)<<setprecision(2)<<min[i]<<"  |  最后得分: "<<setiosflags(ios::fixed)<<setprecision(2)<<end_score[i]<<"   |"<<endl;
        cout<<"|______________________________________________________________________|"<<endl;
    }
    cout<<endl;
}
void sort(float end_score[3],char name[3][20])//由高到低显示最后得分排序(显示名次,姓名,最后得分)
{
    int i,j;
    float t;
    char c[1][20]={0};
    for(j=0;j<3;j++)//起泡
    {
        for(i=2;i>j;i--)
        {
            if(end_score[i]<end_score[i-1])
            {
                t=end_score[i];
                end_score[i]=end_score[i-1];
                end_score[i-1]=t;
                strcpy(c[0],name[i]);
                strcpy(name[i],name[i-1]);
                strcpy(name[i-1],c[0]);
            }
        }
    }
    cout<<"最后排名情况如下:"<<endl;
    cout<<"________________________________________________"<<endl;
    for(i=0;i<3;i++)
    {
        cout<<"|  第"<<i+1<<"名  |  姓名: "<<setiosflags(ios::left)<<setw(8)<<name[i]<<"  |  最后得分:"<<setiosflags(ios::fixed)<<setprecision(2)<<end_score[i]<<"  |"<<endl;
        cout<<"|_______________________________________________|"<<endl;
    }
    cout<<endl;
}


看来你还没有想出来呀,你自己好好想一下,你哪里错了?
提醒,函数与函数之间的关系你要好好研究一下.
 在c-free3.5中运行成功.

[[italic] 本帖最后由 way3 于 2008-1-12 20:00 编辑 [/italic]]
#8
优游子2008-01-12 20:12
在void main()前加了
ifloat end_score[3] ;

f(end_score[i]<end_score[i-1])
也要改
if(end_score[i]>end_score[i-1])
的确可以了!
我还是想不明,第三个调用函数怎么用不了main()里定义的end_score[3]呢?
要在main()再定义呢?
#9
优游子2008-01-12 20:34
这个
for(j=0;j<3;j++)
    {
        for(i=2;i>j;i--)
        {
            if(end_score[i]>end_score[i-1])
            {
                t=end_score[i];
                end_score[i]=end_score[i-1];
                end_score[i-1]=t;
                strcpy(c[0],name[i]);
                strcpy(name[i],name[i-1]);
                strcpy(name[i-1],c[0]);
            }
        }
    }
为何要倒过来排序呢?我原来的哪错了呢?我再将我原来的改下,看是否不可以。
#10
way32008-01-12 21:10
你原来哪个算法错误呀, 根本就行不通,排不来了.
我都是按你原来样式修改了一下,没想到你大多数看出来了.
 还有二个细节了,不然的话,也会排不出来的.
参数之间的传递会想你想象的哪些得出结果吗?
  我定义了一个全局变量才会达到这样的效果.
你基础差,不要急,慢慢来.
#11
优游子2008-01-12 21:55
嗯,
多谢了,我的确基础很差,平时学这方面用的时间很少。
看来要改变下才行,呵呵!
#12
sunkaidong2008-01-12 23:15
用结构体和类做啊,会看起来更清楚啊.这样有点很乱的感觉
#13
优游子2008-01-13 00:00
结构体和类那些还没有学啊
#14
优游子2008-01-13 00:17
不知可不可以不用全局变量呢?那又该如何?
#15
忘记喧嚣2008-01-13 02:23
都说了别急了 我基础也差 努力就可以和他们一样牛了
#16
优游子2008-01-13 09:54
10楼的:
你原来哪个算法错误呀, 根本就行不通,排不来了.
我都是按你原来样式修改了一下,没想到你大多数看出来了.
还有二个细节了,不然的话,也会排不出来的.
参数之间的传递会想你想象的哪些得出结果吗?
  我定义了一个全局变量才会达到这样的效果.

我将char name[3][20]也定义全局变量,结果这个
char c[1][20];
    for(j=0;j<2;j++)
    {
        for(i=0;i<3-j;i++)
        {
            if(end_score[i]<end_score[i+1])
            {
                t=end_score[i];
                end_score[i]=end_score[i+1];
                end_score[i+1]=t;
                strcpy(c[0],name[i]);
                strcpy(name[i],name[i+1]);
                strcpy(name[i+1],c[0]);
            }
        }
    }
也没有问题啊,也就是说我原来(上面)的排序算法没有错啊?
1