📄 clsscoresheet.cpp
字号:
#include "clsScoreSheet.h"
#include <cstring>
#include <strstrea.h>
#include <cstdlib>
inline bool ScoreSheet::isbetween(int judge, int lower, int upper)
{
return (lower<=judge && judge<upper);
}
inline int ScoreSheet::fixmultiple(int origin, int multiple)
{
return ( ( (int) (origin/ ((double)multiple+0.01) ) )*multiple+multiple );
}
bool ScoreSheet::stuavailable(int sid, bool ssorted, int& sid2)
{
if (!isbetween(sid,0,scnt)) return false;
if (ssorted)
{
sid2=ss[sid];
if (!isbetween(sid2,0,scnt)) return false;
}
else
{
sid2=sid;
}
return true;
}
bool ScoreSheet::couravailable(int cid, bool csorted, int& cid2)
{
if (csorted)
{
if (!isbetween(cid,0,ccnt+1)) return false;
cid2=sc[cid];
if (!isbetween(cid2,0,ccnt+1)) return false;
}
else
{
if (!isbetween(cid,1,ccnt+1)) return false;
cid2=cid;
}
return true;
}
ScoreSheet::ScoreSheet()
{
s=NULL; ss=NULL; c=NULL; sc=NULL;
scnt=0; smax=0; ccnt=-1; cmax=0;
numwidth=7; namewidth=7;
AddCourse(NULL,0);
c[0].name=new char[strlen("平均")+1];
strcpy(c[0].name,"平均");
}
ScoreSheet::~ScoreSheet()
{
int i;
for (i=0; i<scnt; i++)
{
delete []s[i]->num; s[i]->num=NULL;
delete []s[i]->name; s[i]->name=NULL;
free(s[i]->score); s[i]->score=NULL;
delete s[i]; s[i]=NULL;
}
for (i=0; i<ccnt+1; i++)
{
delete []c[i].name; c[i].name=NULL;
}
free(s); s=NULL;
free(ss); ss=NULL;
free(c); c=NULL;
//free(sc); sc=NULL;
}
ScoreSheet::ScoreSheet(ScoreSheet& copy)
{;}
int ScoreSheet::GetColumnWidth(int id, bool sorted)
{
if (isbetween(id,-2,ccnt+1)==false) return -1;
if (id==-2) return numwidth;
else if (id==-1) return namewidth;
else
{
if (sorted) return __max(strlen(c[sc[id]].name)+1,8); else return __max(strlen(c[id].name)+1,8);
}
}
int ScoreSheet::AddStudent()
{
scnt++;
if (smax<scnt)
{
smax=fixmultiple(scnt,50);
s=(student**)realloc(s, sizeof(student)*smax);
ss=(int*)realloc(ss, sizeof(int)*smax);
}
s[scnt-1]=new student;
student* st=s[scnt-1];
char tt[20]={0},ttt[20]={0};
ostrstream oss(tt,20), oss2(ttt,20);
oss<<"(学号"<<scnt<<')'<<flush;
oss2<<"(姓名"<<scnt<<')'<<flush;
st->num=NULL;
st->name=NULL;
SetStuNum(scnt-1,tt);
SetStuName(scnt-1,ttt);
st->score=new scoretype[fixmultiple(ccnt+1,10)];
for (int i=0; i<=ccnt; i++)
{
st->score[i].score=NOT_CHOOSE_THIS_COURSE * 100;
st->score[i].point=NOT_CHOOSE_THIS_COURSE * 10;
strcpy(st->score[i].scorestr," ");
strcpy(st->score[i].pointstr," ");
}
ss[scnt-1]=scnt-1;
return scnt-1;
}
void ScoreSheet::DelStudent(int id, bool sorted)
{
int id2,i;
if (sorted)
{
id2=id;
if (!stuavailable(id2,true,id)) return;
}
else
{
if (!stuavailable(id,false,id2)) return;
for (i=0; i<scnt; i++)
{
if (ss[i]==id) { id2=i; break; }
}
}
student* st=s[id];
int len;
bool numrelen=false, namerelen=false;
len=strlen(st->num);
if (numwidth==len+1) numrelen=true;
len=strlen(st->name);
if (namewidth==len+1) namerelen=true;
delete []st->score; st->score=NULL;
delete []st->name; st->name=NULL;
delete []st->num; st->num=NULL;
st=NULL;
delete s[id]; s[id]=NULL;
for (i=id; i<scnt-1; ++i) s[i]=s[i+1];
s[scnt-1]=NULL;
for (i=id2; i<scnt-1; ++i) ss[i]=ss[i+1];
ss[scnt-1]=0;
for (i=0; i<scnt-1; i++)
{ if (ss[i]>id) --ss[i]; }
--scnt;
if (numrelen)
{
for (numwidth=7, i=0; i<scnt; i++)
{
len=strlen(s[i]->num)+1;
if (numwidth<len) numwidth=len;
}
}
if (namerelen)
{
for (namewidth=7, i=0; i<scnt; i++)
{
len=strlen(s[i]->name)+1;
if (namewidth<len) namewidth=len;
}
}
}
void ScoreSheet::SetStuNum(int id, const char* nn, bool sorted)
{
int id2,i;
if (!stuavailable(id,sorted,id2)) return;
student* st=s[id2];
delete []st->num; st->num=NULL;
int len=strlen(nn)+1;
st->num=new char[len];
strcpy(st->num,nn);
if (len>numwidth) numwidth=len;
else if (len==numwidth)
{
for (numwidth=7, i=0; i<scnt; i++)
{
len=strlen(s[i]->num)+1;
if (numwidth<len) numwidth=len;
}
}
}
void ScoreSheet::SetStuName(int id, const char* nn, bool sorted)
{
int id2,i;
if (!stuavailable(id,sorted,id2)) return;
student* st=s[id2];
delete []st->name; st->name=NULL;
int len=strlen(nn)+1;
st->name=new char[len];
strcpy(st->name,nn);
if (len>namewidth) namewidth=len;
else if (len==namewidth)
{
for (namewidth=7, i=0; i<scnt; i++)
{
len=strlen(s[i]->name)+1;
if (namewidth<len) namewidth=len;
}
}
}
void ScoreSheet::SetScoreInt(int sid, int cid, int ns, bool ssorted, bool csorted, bool calc)
{
int sid2,cid2;
if (!stuavailable(sid,ssorted,sid2)) return;
if (!couravailable(cid,csorted,cid2)) return;
if ( !(ns>=0 && ns<=99999) || ns==NOT_EXAMINED*100 || ns==NOT_CHOOSE_THIS_COURSE*100) return;
scoretype* co=&(s[sid2]->score[cid2]);
co->score=ns;
int point;
if (ns>=9000) point=40;
else if(ns>=8500) point=37;
else if(ns>=8200) point=33;
else if(ns>=7800) point=30;
else if(ns>=7500) point=27;
else if(ns>=7200) point=23;
else if(ns>=6800) point=20;
else if(ns>=6400) point=15;
else if(ns>=6000) point=10;
else if(ns>=0 || ns==NOT_EXAMINED*100) point=0;
else if(ns==NOT_CHOOSE_THIS_COURSE*100) point=NOT_CHOOSE_THIS_COURSE*10;
else ;
co->point=point;
char* sstr=co->scorestr;
if (ns>=0)
{
int i, j, lenbuf;
bool zero=true;
for (i=0; i<6; i++) sstr[i]=32;
char buf[8];
itoa(ns,buf,10);
lenbuf=strlen(buf);
for (i=lenbuf-1, j=5; j>=4; i--, j--)
{
if (!zero || buf[i]!='0')
{
sstr[j]=buf[i];
zero=false;
}
}
if (!zero) sstr[3]='.';
for (j=2; i>=0; i--, j--) sstr[j]=buf[i];
}
else if (ns==NOT_EXAMINED*100)
strcpy(sstr," -1 ");
else if (ns==NOT_CHOOSE_THIS_COURSE*100)
strcpy(sstr," ");
else;
sstr=co->pointstr;
if (point>=0)
{
sstr[0]=int(point/10)+48;
sstr[1]='.';
sstr[2]=point%10+48;
sstr[3]=32; sstr[4]=32; sstr[5]=0;
}
else
{
strcpy(sstr," ");
}
Calculate(sid2,ssorted);
}
void ScoreSheet::Calculate(int id, bool sorted)
{
int id2, forstart, forend;
if (!(id==-1 || stuavailable(id,sorted,id2))) return;
if (id==-1) { forstart=0; forend=scnt-1; } else { forstart=id2; forend=id2; }
int i,j,k, lenbuf, tmp, sumpoint=0, sumscore=0;
student* st;
char *sstr, buf[8];
bool zero;
for (i=forstart; i<=forend; i++)
{
st=s[i]; sumscore=0; sumpoint=0;
for (j=1; j<=ccnt; j++)
{
tmp=st->score[j].score;
if (tmp>=0) sumscore+=tmp;
tmp=st->score[j].point;
if (tmp>=0) sumpoint+=(tmp*c[j].coefficient);
}
//====
if (ccnt==0)
{
st->score[0].score=NOT_CHOOSE_THIS_COURSE * 100;
strcpy(st->score[0].scorestr," ");
}
else
{
tmp=(int)((double)sumscore/ccnt+0.5);
st->score[0].score=tmp;
sstr=st->score[0].scorestr;
zero=true;
for (j=0; j<6; j++) sstr[j]=32;
itoa(tmp,buf,10);
lenbuf=strlen(buf);
for (j=lenbuf-1, k=5; k>=4; j--, k--)
{
if (!zero || buf[j]!='0')
{
sstr[k]=buf[j];
zero=false;
}
}
if (!zero) sstr[3]='.';
for (k=2; j>=0; j--, k--) sstr[k]=buf[j];
}
//====
if (c[0].coefficient==0)
{
st->score[0].point=NOT_CHOOSE_THIS_COURSE * 10;
strcpy(st->score[0].pointstr," ");
}
else
{
tmp=(int)((double)sumpoint/c[0].coefficient*100+0.5);
st->score[0].point=tmp;
sstr=st->score[0].pointstr;
sstr[5]=0;
for (j=4; j>=1; j--) { sstr[j]=tmp%10+48; tmp/=10; }
sstr[0]=sstr[1]; sstr[1]='.';
}
}
}
student* ScoreSheet::Stu(int id, bool sorted)
{
int id2;
if (!stuavailable(id,sorted,id2)) return NULL; else return s[id2];
}
char* ScoreSheet::GetStuNum(int id, bool sorted)
{
int id2;
if (!stuavailable(id,sorted,id2)) return NULL; else return s[id2]->num;
}
char* ScoreSheet::GetStuName(int id, bool sorted)
{
int id2;
if (!stuavailable(id,sorted,id2)) return NULL; else return s[id2]->name;
}
int ScoreSheet::GetScoreInt(int sid, int cid, bool ssorted, bool csorted)
{
int sid2,cid2;
if (!stuavailable(sid,ssorted,sid2)) return ERROR_RETURN_VALUE*100;
if (!couravailable(cid,csorted,cid2)) return ERROR_RETURN_VALUE*100;
return s[sid2]->score[cid2].score;
}
char* ScoreSheet::GetScoreStr(int sid, int cid, bool ssorted, bool csorted)
{
int sid2,cid2;
if (!stuavailable(sid,ssorted,sid2)) return NULL;
if (!couravailable(cid,csorted,cid2)) return NULL;
return s[sid2]->score[cid2].scorestr;
}
char* ScoreSheet::GetPointStr(int sid, int cid, bool ssorted, bool csorted)
{
int sid2,cid2;
if (!stuavailable(sid,ssorted,sid2)) return NULL;
if (!couravailable(cid,csorted,cid2)) return NULL;
return s[sid2]->score[cid2].pointstr;
}
int ScoreSheet::GetPointInt(int sid, int cid, bool ssorted, bool csorted)
{
int sid2,cid2;
if (!stuavailable(sid,ssorted,sid2)) return NULL;
if (!couravailable(cid,csorted,cid2)) return NULL;
return s[sid2]->score[cid2].point;
}
int ScoreSheet::AddCourse(const char* name, int coefficient)
{
int i;
ccnt++;
if (cmax<ccnt+1)
{
cmax=fixmultiple(ccnt+1,10);
c=(course*)realloc(c,sizeof(course)*cmax);
sc=(int*)realloc(sc,sizeof(int)*cmax);
for (i=0; i<scnt; i++)
{
s[i]->score=(scoretype*)realloc(s[i]->score,sizeof(scoretype)*cmax);
}
}
c[ccnt].name=NULL;
c[0].coefficient+=coefficient;
c[ccnt].coefficient=coefficient;
sc[ccnt-1]=ccnt;
sc[ccnt]=0;
if (name==NULL)
{
char t[20]={0},tt[8]={0};
ostrstream oss(t,20);
oss<<"(课"<<ccnt<<')'<<flush;
SetCourseName(ccnt-1,t,true);
}
else
{
SetCourseName(ccnt-1,name,true);
}
scoretype* co;
for (i=0; i<scnt; i++)
{
co=&(s[i]->score[ccnt]);
co->score=NOT_CHOOSE_THIS_COURSE*100;
co->point=NOT_CHOOSE_THIS_COURSE*10;
strcpy(co->scorestr," ");
strcpy(co->pointstr," ");
}
return ccnt-1;
}
void ScoreSheet::DelCourse(int id, bool sorted)
{
int id2,i,j;
if (sorted)
{
id2=id;
if (!couravailable(id2,true,id)) return;
}
else
{
if (!couravailable(id,false,id2)) return;
for (i=0; i<ccnt; i++)
{
if (sc[i]==id) { id2=i; break; }
}
}
c[0].coefficient-=c[id].coefficient;
delete []c[id].name; c[id].name=NULL;
for (i=id; i<ccnt; ++i) c[i]=c[i+1];
c[ccnt].name=NULL;
c[ccnt].coefficient=0;
scoretype* co;
for (j=0; j<scnt; ++j)
{
co=s[j]->score;
for (i=id; i<ccnt; ++i) co[i]=co[i+1];
co[ccnt].score=0; strcpy(co[ccnt].scorestr," ");
co[ccnt].point=0; strcpy(co[ccnt].pointstr," ");
}
for (i=id2; i<ccnt; ++i) sc[i]=sc[i+1];
sc[ccnt]=0;
for (i=0; i<ccnt; ++i)
{ if (sc[i]>id) --sc[i]; }
ccnt--;
Calculate(-1);
}
void ScoreSheet::SetCourseName(int id, const char* nn, bool sorted)
{
int id2;
if (!couravailable(id,sorted,id2)) return;
course* co;
co=&(c[id2]);
delete []co->name; co->name=NULL;
co->name=new char[strlen(nn)+1];
strcpy(co->name,nn);
}
void ScoreSheet::SetCourseCoefficient(int id, int nc, bool sorted)
{
int id2;
if (!couravailable(id,sorted,id2)) return;
if (c[id2].coefficient==nc) return;
c[0].coefficient=c[0].coefficient-c[id2].coefficient+nc;
c[id2].coefficient=nc;
Calculate(-1);
}
course* ScoreSheet::Cour(int id, bool sorted)
{
int id2;
if (!couravailable(id,sorted,id2)) return NULL;
return &(c[id2]);
}
char* ScoreSheet::GetCourseName(int id, bool sorted)
{
int id2;
if (!couravailable(id,sorted,id2)) return NULL;
return c[id2].name;
}
double ScoreSheet::GetCourseCoefficient(int id, bool sorted)
{
int id2;
if (!couravailable(id,sorted,id2)) return ERROR_RETURN_VALUE;
return c[id2].coefficient;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -