⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clsscoresheet.cpp

📁 学生成绩管理系统。实现学生的添加 删除和各科成绩管理。
💻 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 + -