参赛选手成绩统分表

#include "stdafx.h"
#include "textdb.h"
#include "dsptdef.h"
#include <stdio.h>
#include <string.h>
#define MAXSIZE 100

struct MAN
{
    int name;
    int score[MAXSIZE];//n个评委的分数
    int max;
    int min;
    int sum;
    int smax;
    int smin;//最值的数量
    float aver;
};


typedef struct Node//结点
{
    struct MAN data;//数据域
 
    struct Node *pNext;//指针域
}NODE, *PNODE;


void OnScoreManByRule1(const char* pszTextTblName)
{

    TDB_HANDEL* handle = TDB_Open("C:\\Users\\11856\\Desktop\\优秀的C语言\\DSPT-S\\Data\\score.txt");
    
    TDB_MoveFirstRow(handle); //找最小值
    int a[MAXSIZE];
    int i=0;
    while (TDB_MoveNextRow(handle))//换行
    {   
        a[i]=TDB_ColumnValInt(handle, 1);
        for (int c = 2; c < TDB_GetColumnNum(handle); c++)//循环比较每一行的所有元素
        {
            if(a[i] > TDB_ColumnValInt(handle, c))//将最小值存入a[maxsize]
            {
                a[i]= TDB_ColumnValInt(handle, c);
            }
        }
        i++;
    }
    TDB_MoveFirstRow(handle);
    PNODE pHead = (PNODE)malloc(sizeof(NODE));//定义一个头结点并且为头结点分配内存
    
    PNODE pTail = pHead;//定义一个指向头结点的指针
    pTail->pNext = NULL;//清空指针域
    NODE man;//学生结构

    int r=1;

    while (TDB_MoveNextRow(handle))//循环存入
    {

        man.data.name=r;//序号
        man.data.sum=0;
        for (int c = 1; c < TDB_GetColumnNum(handle); c++)
        {            
            man.data.score[c-1] = TDB_ColumnValInt(handle, c);
            man.data.min=a[r-1];
            man.data.sum=man.data.sum+TDB_ColumnValInt(handle, c);//求和
        }
        r++;
        PNODE pNew = (PNODE)malloc(sizeof(NODE));//为新节点分配内存
        //初始化结点的数据域
        pNew->data = man.data;
        
        //将新结点挂到老结点后
        pTail->pNext = pNew;
        
        //清空新结点的指针域
        pNew->pNext = NULL;
        
        //将pTail移到新结点上
        pTail = pNew;
    }
    
    TDB_MoveFirstRow(handle);//找最大值
    PNODE s = pHead->pNext;
    s->data.max=s->data.score[0];
       while (s!=NULL)
       {
           for (int c = 1; c < TDB_GetColumnNum(handle); c++)
           {
              if(s->data.max < s->data.score[c])
              {
                 s->data.max=s->data.score[c];               
              }    
           }
           s = s->pNext;           
       }

    TDB_MoveFirstRow(handle);
    float L=0;//行长度;
    for (int c = 1; c < TDB_GetColumnNum(handle); c++)
    {
        L++;
    }
    s = pHead->pNext;
       while (s!=NULL)
       {
           for (int c = 1; c < TDB_GetColumnNum(handle); c++)
           {          
                 s->data.aver=(s->data.sum - s->data.max - s->data.min)/(L-2);    //求去掉最值后的平均分               
                  
           }
           s = s->pNext;       
       }

    NODE temp;
    for(PNODE m=pHead->pNext; NULL != m; m=m->pNext)
    {
        for(PNODE n=m->pNext; NULL !=n; n=n->pNext)
        {
            if(m->data.aver < n->data.aver)
            {            
                temp.data  = m->data;
                m->data =  n->data;
                n->data = temp.data;
            }
        }
    }

TDB_MoveFirstRow(handle);//输出部分
PNODE p = pHead->pNext;
ShowMsg("名次\t 选手  \t\t综合成绩\n");
r=1;
while (TDB_MoveNextRow(handle))
{
        
        ShowMsg("  %-3d\t ",r);
        ShowMsg("选手%-3d",p->data.name);
        ShowMsg("\t%3.3f ",p->data.aver);
        //ShowMsg("sum=%d\t",p->data.sum);
        //ShowMsg("max=%d\t",p->data.max);
        //ShowMsg("min=%d\t",p->data.min);
        /*
        for (int c = 1; c < TDB_GetColumnNum(handle); c++)
        {
            ShowMsg("%d\t",p->data.score[c-1]);
        }
        */
        ShowMsg("\r\n");
        p = p->pNext;
        r++;
}
    ShowMsg("\n");
    


    TDB_Close(handle); /* 此语句必需 */
}


void OnScoreManByRule2(const char* pszTextTblName)
{
    TDB_HANDEL* handle = TDB_Open("C:\\Users\\11856\\Desktop\\优秀的C语言\\DSPT-S\\Data\\score.txt");
    
    TDB_MoveFirstRow(handle); //找最小值
    int a[MAXSIZE];
    int i=0;
    while (TDB_MoveNextRow(handle))//换行
    {   
        a[i]=TDB_ColumnValInt(handle, 1);
        for (int c = 2; c < TDB_GetColumnNum(handle); c++)//循环比较每一行的所有元素
        {
            if(a[i] > TDB_ColumnValInt(handle, c))//将最小值存入a[maxsize]
            {
                a[i]= TDB_ColumnValInt(handle, c);
            }
        }
        i++;
    }
    TDB_MoveFirstRow(handle);
    PNODE pHead = (PNODE)malloc(sizeof(NODE));//定义一个头结点并且为头结点分配内存
    
    PNODE pTail = pHead;//定义一个指向头结点的指针
    pTail->pNext = NULL;//清空指针域
    NODE man;//学生结构

    int r=1;

    while (TDB_MoveNextRow(handle))//循环存入
    {

        man.data.name=r;//序号
        man.data.sum=0;
        for (int c = 1; c < TDB_GetColumnNum(handle); c++)
        {            
            man.data.score[c-1] = TDB_ColumnValInt(handle, c);
            man.data.min=a[r-1];
            man.data.sum=man.data.sum+TDB_ColumnValInt(handle, c);//求和
        }
        r++;
        PNODE pNew = (PNODE)malloc(sizeof(NODE));//为新节点分配内存
        //初始化结点的数据域
        pNew->data = man.data;
        
        //将新结点挂到老结点后
        pTail->pNext = pNew;
        
        //清空新结点的指针域
        pNew->pNext = NULL;
        
        //将pTail移到新结点上
        pTail = pNew;
    }
    
    TDB_MoveFirstRow(handle);//找最大值
    PNODE s = pHead->pNext;
    s->data.max=s->data.score[0];
       while (s!=NULL)
       {
           for (int c = 1; c < TDB_GetColumnNum(handle); c++)
           {
              if(s->data.max < s->data.score[c])
              {
                 s->data.max=s->data.score[c];               
              }    
           }
           s = s->pNext;           
       }

       s = pHead->pNext;
       while (s!=NULL)//再次循环找出最值出现的次数
       {     
           s->data.smax=0;
           s->data.smin=0;
           for (int c = 0; c < TDB_GetColumnNum(handle); c++)
           {
              if(s->data.max == s->data.score[c])
              {    
                 s->data.smax++;               
              }
              if(s->data.min == s->data.score[c])
              {
                 s->data.smin++;               
              }
              
           }
           s = s->pNext;           
       }
           
    TDB_MoveFirstRow(handle);
    float L=0;//行长度;
    for (int c = 1; c < TDB_GetColumnNum(handle); c++)
    {
        L++;
    }
    s = pHead->pNext;
       while (s!=NULL)
       {
           for (int c = 1; c < TDB_GetColumnNum(handle); c++)
           {          
                 s->data.aver=(s->data.sum - s->data.max * s->data.smax - s->data.min * s->data.smin)/(L-2-s->data.smax + s->data.smin);    //求去掉最值后的平均分               
                  
           }
           s = s->pNext;       
       }

    NODE temp;
    for(PNODE m=pHead->pNext; NULL != m; m=m->pNext)
    {
        for(PNODE n=m->pNext; NULL !=n; n=n->pNext)
        {
            if(m->data.aver < n->data.aver)
            {            
                temp.data  = m->data;
                m->data =  n->data;
                n->data = temp.data;
            }
        }
    }


TDB_MoveFirstRow(handle);//输出部分
PNODE p = pHead->pNext;
ShowMsg("名次\t 选手  \t\t综合成绩\n");
r=1;
while (TDB_MoveNextRow(handle))
{
        
        ShowMsg("  %-3d\t ",r);
        ShowMsg("选手%-3d",p->data.name);
        ShowMsg("\t%3.3f ",p->data.aver);
        //ShowMsg("\t最大值有%d个",p->data.smax);
        //ShowMsg("\t最小值有%d个",p->data.smin);
        //ShowMsg("sum=%d\t",p->data.sum);
        //ShowMsg("max=%d\t",p->data.max);
        //ShowMsg("min=%d\t",p->data.min);
        /*
        for (int c = 1; c < TDB_GetColumnNum(handle); c++)
        {
            ShowMsg("%d\t",p->data.score[c-1]);
        }
        */
        ShowMsg("\r\n");
        p = p->pNext;
        r++;
        
}
    ShowMsg("\n");
    


    TDB_Close(handle); /* 此语句必需 */
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值