求看一个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
...全文
162 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
  • 打赏
  • 举报
回复
真长呀,自己调试下吧
含冰蓄冷空调的冷热电联供型微网多时间尺度优化调度(Matlab代码实现)内容概要:本文介绍了基于Matlab代码实现的含冰蓄冷空调的冷热电联供型微网多时间尺度优化调度方法,重点研究了在多时间尺度下综合能源系统的协调优化问题。通过引入冰蓄冷空调系统,提升微网对冷、热、电多种能源的综合利用效率,并结合储能特性与负荷需求响应,实现系统在不同时间尺度(如日前、日内、实时)下的经济性与低碳性优化调度。文中提供了完整的Matlab仿真代码与模型,涵盖系统建模、优化算法设计及多目标求解过程,适用于复杂微网系统的运行优化研究。; 适合人群:具备一定电力系统、能源系统背景知识的研究生、科研人员及从事综合能源系统优化工作的工程技术人员,熟悉Matlab编程与基本优化算法者更佳。; 使用场景及目标:①用于冷热电联供型微网系统的多时间尺度调度策略研究;②支撑含储能与需求响应的综合能源系统优化建模与仿真;③为学术论文复现、课题研究或工程项目提供算法支持与代码参考。; 阅读建议:建议结合文中提供的Matlab代码逐模块学习,重点关注优化模型构建与求解流程,推荐使用YALMIP+CPLEX等工具进行求解器配置,同时可参照文档中其他相关案例进行对比分析与功能拓展。
【一次调频】考虑储能电池参与一次调频技术经济模型的容量配置方法(Matlab代码实现)内容概要:本文提出了一种考虑储能电池参与一次调频的技术经济模型,并基于该模型研究了储能容量的优化配置方法。通过建立一次调频过程中储能系统与电网频率动态响应的关系,结合技术性能约束与经济性目标,构建了以最小化综合成本为目标的优化模型。采用Matlab进行仿真分析,验证了所提方法在提升频率调节能力、延长储能寿命及降低运营成本方面的有效性。研究涵盖了调频需求分析、储能充放电策略设计、寿命衰减模型以及经济性评估等关键环节。; 适合人群:具备电力系统基础知识和Matlab编程能力,从事新能源、储能系统或电网调度相关研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于含高比例可再生能源的电力系统中储能参与一次调频的规划与运行;②为储能项目的投资决策提供技术经济性分析工具,实现容量合理配置与效益最大化; 阅读建议:建议结合Matlab代码深入理解模型实现细节,重点关注目标函数构建、约束条件设置及参数敏感性分析部分,可进一步扩展至多时间尺度协调优化或与其他辅助服务联合调度的研究。

70,036

社区成员

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

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