#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); /* 此语句必需 */
}