首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

急求!希望这题做了能给明日考试一些帮助 (C语言写)

2014-01-12 
急求!希望这题做了能给明天考试一些帮助 (C语言写)要求:读入一系列两元组数据姓名,成绩,生成一个排序的

急求!希望这题做了能给明天考试一些帮助 (C语言写)
要求:读入一系列两元组数据<姓名,成绩>,生成一个排序的五元组<姓名,总分,平均分,最低分,最高分>,并将排序结果按照姓名的降序生成到文件。

文件举例:
Input files: In_3.txt
<aaa,77>
<bbb,82>
<ccc.72>
<aaa,83>
<bbb,95>

Output files: [Your Student No.]_3_out.txt
<ccc,72,72,72,72>
<bbb,177,88.5.5,82,95>
<aaa,160,80,77,83>

[解决办法]
1. 读文件
2. 以姓名为key作查找和计算
3. 排序
4. 写文件

你是哪部分不会呢?
[解决办法]
while循环用fgets 读入一行line
sscanf(line,"%[^,],%[^,],%s",name,number,tmp); //tmp没用,防止坏数据溢出
然后数据就出来了,放到数组里处理输出就好了
[解决办法]

//读入一系列两元组数据<姓名,成绩>,生成一个排序的五元组<姓名,总分,平均分,最低分,最高分>,并将排序结果按照姓名的降序生成到文件。
//
//文件举例:
//Input files: In_3.txt
//<aaa,77>
//<bbb,82>
//<ccc,72>
//<aaa,83>
//<bbb,95>
//
//Output files: [Your Student No.]_3_out.txt
//<ccc,72,72,72,72>
//<bbb,177,88.5,82,95>
//<aaa,160,80,77,83>
#include <stdio.h>
#include <string.h>
#define MYNO "0001"
#define MAXL 1000
static struct S {
    char nam[20];
    double tsc;
    double asc;
    double lsc;
    double hsc;
    int num;
} s[MAXL],t;
char ln[80];
char nam[20];
double sco;
FILE *f;
int n,i,h,j;
char c;
int main() {
    f=fopen("In_3.txt","r");
    if (f==NULL) {
        printf("Can not open file In_3.txt\n");
        return 1;
    }
    n=0;
    h=0;
    while (1) {
        if (NULL==fgets(ln,80,f)) break;
        h++;
        if (3==sscanf(ln,"<%19[^,],%lf%c",nam,&sco,&c)) {
            if (c!='>') printf("line %d formar error:%s",h,ln);
            else {
                for (i=0;i<n;i++) {
                    if (0==strcmp(nam,s[i].nam)) break;
                }
                if (i<n) {
                    s[i].tsc+=sco;
                    if (s[i].lsc>sco) s[i].lsc=sco;
                    if (s[i].hsc<sco) s[i].hsc=sco;
                    s[i].num++;
                } else {
                    strcpy(s[n].nam,nam);
                    s[n].tsc=sco;
                    s[n].lsc=sco;
                    s[n].hsc=sco;
                    s[n].num=1;
                    n++;
                    if (n>=MAXL) {
                        printf("Too many students(>%d)!\n",MAXL);


                        fclose(f);
                        return 2;
                    }
                }
            }
        } else {
            printf("line %d formar error:%s",h,ln);
        }
    }
    fclose(f);
    for (i=0;i<n;i++) {
        s[i].asc=s[i].tsc/s[i].num;
    }
    for (i=0;i<n-1;i++) {
        for (j=i+1;j<n;j++) {
            if (strcmp(s[i].nam,s[j].nam)<0) {
                t=s[i];s[i]=s[j];s[j]=t;
            }
        }
    }
    f=fopen("["MYNO"]_3_out.txt","w");
    for (i=0;i<n;i++) {
        fprintf(f,"<%s,%lg,%lg,%lg,%lg>\n",s[i].nam,s[i].tsc,s[i].asc,s[i].lsc,s[i].hsc);
    }
    fclose(f);
    return 0;
}
//type [0001]_3_out.txt
//<ccc,72,72,72,72>
//<bbb,177,88.5,82,95>
//<aaa,160,80,77,83>
//


[解决办法]
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试是程序员必须掌握的技能之一。
查MSDN是Windows程序员必须掌握的技能之一。

热点排行