当前位置: 代码迷 >> C语言 >> 跪求大侠们的帮助,关于一道编程题,这里有一群菜鸟巴望着(难度高,比较复 ...
  详细解决方案

跪求大侠们的帮助,关于一道编程题,这里有一群菜鸟巴望着(难度高,比较复 ...

热度:308   发布时间:2008-06-20 22:56:03.0
你这个题目没有什么一题多解的必要


[color=white]
----------------解决方案--------------------------------------------------------
这样吗?
事实上,这种题不可能一题多解。我提醒你,这是一个工程性很强的题目,有确定性的解决方法,优劣只是由代码的健壮性和风格来区分的。
----------------解决方案--------------------------------------------------------
哈哈,原来是这样吗,看来可以把那些个同学提出的无聊解决模式剔除了
----------------解决方案--------------------------------------------------------
结构吧,数组变态


------------------
那个公式我看不懂

[[it] 本帖最后由 cosdos 于 2008-6-21 01:55 编辑 [/it]]
----------------解决方案--------------------------------------------------------
“跪求”看多了

看到什么“高手”、“跪求”等就知道....(省略)

    不过我从来都不建议给人代码,反正他们只是应付作业什么的,"我只是做题目而已"。
----------------解决方案--------------------------------------------------------

如有问题请发我短信。

    错误判断与处理占用行比较多,其实可以做个Error()函数的,代码的重用性可以改进,其实对这个程序意义不大。


//========================================================//
//  实现方法提示中没有说评委编号的情况,那我就顺序编号,  //
//                 而且没有使用编号数组                   //
//========================================================//

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

int EnterInt(char * str);
int EnterDou(char * str);
int OnlyIntAr(int * ar, int n);       // 验证数组中数据的唯一性
double MaxDouAr(double * ar, int n);
double MinDouAr(double * ar, int n);
void SetPf(double * pf, double * f , double * sf, int n, int m);
int RetMaxIndexDouAr(double * ar, int n);     // 返回数组中最大数的索引


//========================================================//
// Main
//

int main(void)
{
    int * sh;
    double * sf;
    // int * ph;  // 评委编号 提示中没有说明,所以不写
    double * f;   // 我比较喜欢这样使用,C很灵活
    double * pf;
   
    int i;
    int j;
    int temp;
    double lfTemp;
   
    int m,    // 评委数
        n;    // 选手数
   
   
    //------- cosdos --------
    system("cls");
    system("color 1e & echo 2008-06-21 cosdos. & echo.");  
   
     
    n = EnterInt("输入选手数量(n > 0): ");
    putchar('\n');
    m = EnterInt("输入评委数量(n > 0): ");
    putchar('\n');
   
    sh = (int *)malloc(sizeof(int) * n);
    sf = (double *)malloc(sizeof(double) * n);
    // ph = (int *)malloc(sizeof(int) * n);
    f  = (double *)malloc(sizeof(double) * n * m);
    pf = (double *)malloc(sizeof(double) * n);
   
    if(sh == NULL || sf == NULL || pf == NULL)   // ||  ph == NULL
    {
        system("cls");
        printf("\a\a[!]内存分配失败!\n");
        getchar();
        exit(1);
    }
   
   
    for(i = 0; i < n; i++)
    {
        system("cls");
        printf("-> 选手 %d 人, 评委 %d 人\n", n, m);
        printf("-> 第%d位选手出场\n\n", i + 1);  
        // 增强功能:验证选手编号的唯一性
        do {
            printf("确认第%d位出场选手的号码: ", i + 1);
            sh[i] = EnterInt("");
            if(!OnlyIntAr(sh, i + 1))
                printf("\a\n[!]选手编号不得重复,需重新输入!\n");
            else
                break;
        }while(1);
        
        // 实现方法提示中居然说从1变化到m (即j = 1; j <= m)
        // 用j = 0; j < m 最合适
        for(j = 0, sf[i] = 0.0; j < m; j++)
        {
            printf("输入 评委%d 给出的得分: ", j + 1);
            sf[i] += (f[m * i + j] = EnterDou(""));
        }
        
        if(m > 2)
            sf[i] = ( sf[i]
                      - MaxDouAr(&f[m * i], m)
                      - MinDouAr(&f[m * i], m)
                    ) / (m - 2);
        else
            sf[i] = sf[i] / m;
    }
   
    system("cls");
   
    // Sort 数组排序
    for(i = 0; i < n; i++)
    {
        j = RetMaxIndexDouAr(&sf[i], n);

        temp      = sh[i];
        sh[i]     = sh[i + j];
        sh[i + j] = temp;

        lfTemp    = sf[i];
        sf[i]     = sf[i + j];
        sf[i + j] = lfTemp;

        for(temp = 0; temp < m; temp++)
        {
            lfTemp   = f[m * i + temp];
            f[m * i + temp]   = f[m * (i + j) + temp];
            f[m * (i + j) + temp] = lfTemp;
        }

        printf("\n%d号: %lf分\n", sh[i], sf[i]);
    }

    putchar('\n');
    system("Pause");
    system("cls");
     
    SetPf(pf, f , sf, n, m);
   
    for(i = 0; i < m; i++)
    {
        printf("评委%d : %lf\n", i + 1, pf[i]);
    }
   
    putchar('\n');
    system("Pause");
    return 0;
}


//========================================================//
// Function
//

int EnterDou(char * str)
{
    double n;
    int o = 1;
    do {
        o ? (int)NULL : printf("\a您上次输入有错误,请重新输入!\n");
        printf("%s", str);
        o = scanf("%lf", &n);
        while(getchar() != '\n');
    }while(o != 1);
    return n;
}

int EnterInt(char * str)
{
    int n, o = 1;
    do {
        o ? (int)NULL : printf("\a您上次输入有错误,请重新输入!\n");
        printf("%s", str);
        o = scanf("%d", &n);
        while(getchar() != '\n');
    }while(o != 1);
    return n;
}

int OnlyIntAr(int * ar, int n)     // 验证数组中数据的唯一性
{
    int i, j;
    if(ar == NULL || !n)
    {
        system("cls");
        printf("\a\a严重错误, 函数参数错误!\n");
        getchar();
        exit(1);
    }

    for(i = 0; i < n - 1; i++)
        for(j = i + 1; j < n; j++)
            if(ar[i] == ar[j])
                return 0;

    return 1;
}

double MaxDouAr(double * ar, int n)
{
    int i;
    double max;

    if(ar == NULL || !n)
    {
        system("cls");
        printf("\a\a严重错误, 函数参数错误!\n");
        getchar();
        exit(1);
    }

    for(i = 0; i < n; i++)
        if(ar[i] > max)
            max = ar[i];

    return max;
}

double MinDouAr(double * ar, int n)
{
    int i;
    double min;

    if(ar == NULL || !n)
    {
        system("cls");
        printf("\a\a严重错误, 函数参数错误!\n");
        getchar();
        exit(1);
    }

    for(i = 0; i < n; i++)
        if(ar[i] < min)
            min = ar[i];

    return min;
}

int RetMaxIndexDouAr(double * ar, int n)     // 返回数组中最大数的索引
{
    int i, max, IndexMax;
    if(ar == NULL || !n)
    {
        system("cls");
        printf("\a\a严重错误, 函数参数错误!\n");
        getchar();
        exit(1);
    }

    max = ar[0];

    for(i = IndexMax = 0; i < n; i++)
    {
        if(ar[i] > max)
        {
            max = ar[i];
            IndexMax = i;
        }
    }
    return IndexMax;
}

// 这个函数抄袭34楼, 因为我那个表达式看不懂
void SetPf(double * pf, double * f , double * sf, int n, int m)
{
    double count = 0.0;
    int i, j;

    for (i = 0; i < m; i++)
    {
        for (j = 0; j < n; j++)
            count += (f[m * j + i] - sf[j]) * (f[m * j + i] - sf[j]);
        count = sqrt(count / (double)n);

        pf[i] = 10 - count;
    }
}

//========================================================//
// End C File
//


忘写 free()了,不过算了。
分配的内存,从分配到程序结束都需要访问。
不过写上free()是个良好的习惯。

[[it] 本帖最后由 cosdos 于 2008-6-21 05:57 编辑 [/it]]

[[it] 本帖最后由 cosdos 于 2008-6-21 11:08 编辑 [/it]]
----------------解决方案--------------------------------------------------------
代码风格不错,赞一个
某人用来交作业估计能得优,嘿嘿~~~
----------------解决方案--------------------------------------------------------
  相关解决方案