如有问题请发我短信。
错误判断与处理占用行比较多,其实可以做个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]]