如何找到Min&来自.text文件的最大值

时间:2014-08-28 02:28:53

标签: c text average

我一直致力于这个程序,它取名人和他们在quizes上获得的分数,并列出平均值,最小值和最大值。到目前为止,我可以让程序读取文件,并找到平均值,但它只是找到它的姓氏和分数。我想知道是否有人可以帮助我至少弄清楚如何让程序读取所有数字而不是最后一行,如果可能的话,如何在文本文件中找到每列的最小值和最大值...谢谢一吨给你的帮助!我完全迷失在这里。 :(这是我的代码到目前为止再次感谢!

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

int main()
{
FILE *file;
char text[1000];
char fName[20];
char lName[20];
char *token;
int q1, q2, q3, q4, mid, mid2, final, finalgrade;
double ave, num = 0, min = 0, max = 0;


file=fopen("Input.txt","r");
while (fgets(text, sizeof(text), file) != NULL)
{
    token = strtok(text, " ");
    strcpy(fName, token);
    token = strtok(NULL, ",");
    strcpy(lName, token);
    token = strtok(NULL, ",");
    q1 = atoi(token);
    token = strtok(NULL, ",");
    q2 = atoi(token);
    token = strtok(NULL, ",");
    q3 = atoi(token);
    token = strtok(NULL, ",");
    q4 = atoi(token);
    token = strtok(NULL, ",");
    mid = atoi(token);
    token = strtok(NULL, ",");
    mid2 = atoi(token);
    token = strtok(NULL, ",");
    final = atoi(token);
    printf("%s %s, %d, %d, %d, %d, %d, %d, %d\n", fName, lName, q1, q2, q3, q4, mid, mid2, final);
}

ave=(q1+q2+q3+q4+mid+mid2+final)/7;
finalgrade=(q1*.10 + q2*.10 + q3*.10 + q4*.10 + mid*.20 + mid2*.20 + final*.25);

printf("\nHere are the class averages:\n");
printf("\t\t Q1\t Q2\t Q3\t Q4\t Mid1\t Mid2\t Final\n");
printf("Average:\t%.2lf\n", ave);
printf("Minimum:\t \n");
printf("Maximum:\t \n");
printf("\n");
fclose(file);
}

2 个答案:

答案 0 :(得分:1)

每次迭代while循环时,都会覆盖所有变量(q1q4fNamelName等等,但是你他们没有做任何事。在循环结束时,您仍然拥有上一次迭代的值,因此您只对最后一行进行计算。

如果每个人的所有数据都在一行上,您可以简单地将这些行从while循环后剪切并粘贴到while循环的底部:

ave=(q1+q2+q3+q4+mid+mid2+final)/7;
finalgrade=(q1*.10 + q2*.10 + q3*.10 + q4*.10 + mid*.20 + mid2*.20 + final*.25);
printf("Average:\t%.2lf\n", ave);

如果要获取每列的最小值/最大值,可以使用q1maxq1min等变量。阅读q1的新值后,将其与目前找到的q1的最小值和最大值进行比较,并在需要时进行修复。你可以这样做:

if (q1 > q1max)
    q1max = q1;

q1min的类似内容。请记住,在while循环之前,您应该将q1min设置为某人可以为q1获取的最大值,并将q1max设置为最小值价值。这将允许这些值在您找到时调整为该列的最小值和最大值。然后对所有其他变量做同样的事情。

以下是应该用于查找q1的代码。您需要根据需要复制和更改其他测试的q1代码。这不会做漂亮的列输出 - 你必须自己做。但希望这将说明正确的方法。

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

int main()
{
FILE *file;
char text[1000];
char fName[20];
char lName[20];
char *token;
int q1, q2, q3, q4, mid, mid2, final, finalgrade;

int q1max = 0, q1min = 100;
// Do the same for the others...

double ave, num = 0, min = 0, max = 0;


file=fopen("Input.txt","r");
while (fgets(text, sizeof(text), file) != NULL)
{
    token = strtok(text, " ");
    strcpy(fName, token);
    token = strtok(NULL, ",");
    strcpy(lName, token);
    token = strtok(NULL, ",");
    q1 = atoi(token);
    token = strtok(NULL, ",");
    q2 = atoi(token);
    token = strtok(NULL, ",");
    q3 = atoi(token);
    token = strtok(NULL, ",");
    q4 = atoi(token);
    token = strtok(NULL, ",");
    mid = atoi(token);
    token = strtok(NULL, ",");
    mid2 = atoi(token);
    token = strtok(NULL, ",");
    final = atoi(token);

    if (q1 > q1max)
        q1max = q1;
    if (q1 < q1min)
        q1min = q1;

    // Do the same for the others...

    printf("%s %s, %d, %d, %d, %d, %d, %d, %d\n", fName, lName, q1, q2, q3, q4, mid, mid2, final);

    ave=(q1+q2+q3+q4+mid+mid2+final)/7;
    finalgrade=(q1*.10 + q2*.10 + q3*.10 + q4*.10 + mid*.20 + mid2*.20 + final*.25);

    printf("Average:\t%.2lf\n", ave);
}

printf("Minimum for q1:\t %d\n", q1min);
printf("Maximum for q1:\t %d\n", q1max);

// Do the same for the others...

printf("\n");
fclose(file);
}

答案 1 :(得分:-1)

看看这段代码。

int main()
{
    FILE* fp = fopen("Input.txt", "r");
    unsigned short _min = 0, _max = 0;
    char curLine[512];

    while(fgets(curLine, 512, fp))
    {
        sscanf(curLine, ",%i", &_min); // dont know how do you format the info
        printf("\nMinimum: %i\n", _min); // use same for max, apply the format.
    }
    fclose(fp);
    return 1;
}

如果要将所有数据保存到缓冲区中,请改为使用此功能模板:

int main()
{
    FILE* fp = fopen("Input.txt", "r");

    unsigned short _min[512] = {0}, _max[512] = {0};
    unsigned short i = 0;
    char curLine[512];

    while(fgets(curLine, 512, fp))
    {
        i++;
        sscanf(curLine, ",%i", &_min[i]); // dont know how do you format the info
        printf("\nMinimum: %i\n", _min[i]); // use same for max, apply the format.
    }
    fclose(fp);
    return 1;
}

使用动态分配清理功能:

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

int main()
{
    FILE* fp = fopen("loader.txt", "r");

    unsigned short *_min = malloc(1), *_max = malloc(1);
    unsigned short i = 0;
    char curLine[512];

    while(fgets(curLine, 512, fp))
    {
        int scanned = sscanf(curLine, ",%i", &_min[i]);
        printf("\nMinimum: %i\n", _min[i]); i++;
        realloc(_min, scanned);
    }

    fclose(fp); free(_min); free(_max); return 1;
}