求看一个C程序, 排序有问题.

sasgsc 2010-11-28 05:12:09
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<fcntl.h>
#include"student_grade.h"

//sort linked list by final grade score in descending order
student *sort_finalGrade(student *head){
student *left = NULL;
student *miniNode = NULL;
student *end = head;
student *tmp = NULL;
int sorted;

do{
end = head;
while(end!=miniNode){
left = end->next;
if(left != NULL){
if(end->stu_final_aver < left->stu_final_aver){
tmp = left->next;
left->next = end;
end->next = tmp;
}
}// end outer if
end = end->next;
}// end while
miniNode = end;
head = left;
}while(head != miniNode);
return head;
}

//print the sorted list to the output file
void write_OutPut(student *head,FILE *fout){
//head = sort_finalGrade(head);
student *p=head;
char tmp[1024]={0};
while (p!=NULL){
sprintf(tmp,"%s %d\nWeighted percentile score:%3.0lf\nFinal grade:%0.1lf\n\n",
p->student_name,p->student_id,
p->stu_final_aver,p->student_final
);
fwrite(tmp,1,strlen(tmp),fout);
p=p->next;
}// end while
}



这里用了个冒泡排序. 但是好像有问题. 请高手指正.

结构体:
#define TYPE_LEN 20

double final_score(double weight);
double score_weight(int p1,int p2,int p3,int l1,int l2,int l3,int e1,int e2,int e3);
int *studentScore(int s1, int s2, int s3, int num);
char *studentName(char firstName[TYPE_LEN], char lastName[TYPE_LEN]);

typedef struct {
char *student_name;
int student_id;
int *stu_program;
int *stu_lab;
int *stu_exam;
double stu_final_aver;
double student_final;
struct student *next;
}student;// student now is a type

char program[TYPE_LEN];
char lab[TYPE_LEN];
char exam[TYPE_LEN];
int program_num, lab_num, exam_num;
float program_wei, lab_wei, exam_wei;
double finalGrade, p, l, e, weighted;
char firstName[TYPE_LEN];
char lastName[TYPE_LEN];
char type[TYPE_LEN];
int id,p1,p2,p3,l1,l2,l3,e1,e2,e3;


计算:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<fcntl.h>
#include"student_grade.h"

student *read_input(FILE *fin){
student *head=NULL, *p=NULL, a, b ,c;
int ret = fscanf(fin,"%s%d%f%s%d%f%s%d%f",program,&program_num,&program_wei,lab,&lab_num,&lab_wei,exam,&exam_num,&exam_wei);
if(ret>0){
p=head=(student*)malloc(sizeof(student));
p->next=NULL;
}
if(ret < 0)
exit(4);
while(p !=NULL){
ret = fscanf(fin,"%s%s%d", firstName, lastName, &id);
p->student_name = studentName(firstName, lastName);
p->student_id = id;
ret = fscanf(fin,"%s%d%d%d",type,&p1,&p2,&p3);
p->stu_program = studentScore(p1,p2,p3,program_num);
ret = fscanf(fin,"%s%d%d%d",type,&l1,&l2,&l3);
p->stu_lab = studentScore(l1,l2,l3,lab_num);
ret = fscanf(fin,"%s%d%d%d",type,&e1,&e2,&e3);
p->stu_exam = studentScore(e1,e2,e3,exam_num);
p->stu_final_aver = score_weight(p1,p2,p3,l1,l2,l3,e1,e2,e3);
p->student_final = final_score(p->stu_final_aver);

if(ret > 0){
p->next = (student*)malloc(sizeof(student));
p=p->next;

}
else {
p->next=NULL;
break;
}
}// end while
return head;
}


char *studentName(char *firstName, char *lastName){
char *name = (char *)malloc((strlen(firstName) + strlen(lastName) + 2)*sizeof(char));
strcpy(name, firstName);
strcat(name, " ");
strcat(name, lastName);
return name;
}

int *studentScore(int s1, int s2, int s3, int num){
int *score = calloc(num, sizeof(int));
int i;
score[0] = s1;
score[1] = s2;
score[2] = s3;
return score;
}

double score_weight(int p1,int p2,int p3,int l1,int l2,int l3,int e1,int e2,int e3){
p = (double)(p1 + p2 + p3) / 3 * 0.4;
l = (double)(l1 + l2 + l3) / 3 * 0.1;
e = (double)(e1 + e2 + e3) / 3 * 0.5;
weighted = p + l + e;
return weighted;
}

double final_score(double weight){
double finalGrade = 4.2-((100 - weight) / 12);
if(finalGrade > 4.0)
finalGrade = 4.0;
return finalGrade;
}

读取:
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include"student_grade.h"

void main(int argc, char **argv){
FILE *fin, *fout;

if(argc != 3){
fprintf(stderr, "Not enough arguements\n");
exit(1);
}

fin = fopen(argv[1], "r");
if(fin == NULL){
fprintf(stderr, "Could not open file: %s\n", argv[1]);
exit(2);
}

fout = fopen(argv[2], "w");
if(fout < 0){
fprintf(stderr, "Could not open file: %s\n", argv[2]);
exit(3);
}

write_OutPut(sort_finalGrade(read_input(fin)),fout);

fclose(fin);
fclose(fout);
// fflush(FILE*);
}// end main

输入:
PROGRAMS 3 0.4
LABS 3 0.1
EXAMS 3 0.5

Steiner Stu 8555
PROGRAMS 90 85 88
LABS 89 95 85
EXAMS 56 85 95

Clark Bill 9999
PROGRAMS 95 90 98
LABS 92 85 90
EXAMS 55 90 95

Anystudent Erasmus 6789
PROGRAMS 75 60 88
LABS 82 75 90
EXAMS 50 80 75
...全文
141 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
libinfei8848 2010-11-28
  • 打赏
  • 举报
回复

if(end->stu_final_aver < left->stu_final_aver){
tmp = left->next;
left->next = end;
end->next = tmp;
}



粗略的看了一下,感觉这里很怪异
cap77 2010-11-28
  • 打赏
  • 举报
回复

if(end->stu_final_aver < left->stu_final_aver){
tmp = left->next;
left->next = end;
end->next = tmp;
}


我是新手,希望没有误导楼主。
交换节点前,要保存end前一个节点的信息吧。
照楼主的意思,交换后left的前一个节点不是交换前end的前一个节点。
sasgsc 2010-11-28
  • 打赏
  • 举报
回复
其实就第一个部分, 冒泡排序的问题
luciferisnotsatan 2010-11-28
  • 打赏
  • 举报
回复
真长呀,自己调试下吧

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧