求看一个C程序, 排序有问题.
#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