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

📄 main.cpp

📁 学生成绩管理系统。实现学生的添加 删除和各科成绩管理。
💻 CPP
字号:
#include "main.h"
#include <time.h>

#define ADD_STUDENT_KEY	20
#define ADD_COURSE_KEY	3
#define SWITCH_KEY		23
#define SAVE_KEY		19
#define DOS_KEY			4

ScoreSheet s;

int sortbase=-2;	//-2:number -1:name 0-...:course
bool sorttype=true;	//true:ascending; false:descending
bool showscore=true; //true:show score; false:show point
int *filtersort=NULL, filterstucnt=0;

extern bool saved;

//================= CallDos ====================
void calldos()
{
	showheader();
	cout<<"临时命令行模式:\n\n键入任何命令并回车即可执行它。\n输入 q 并回车可返回主界面。\n\n";
	char s[512];
	while (1)
	{
		cout<<">";
		cin.getline(s,512);
		if (s[1]==0 && (s[0]=='q' || s[0]=='Q')) break;
		cout<<endl;
		system(s);
		cout<<endl;
	}
}

//================= Esc ====================
FuncRunResult esc()
{
	showheader();

	if (saved)	cout<<"\n\n\n\n\n\n                                 真的要退出吗?\n";
	else		cout<<"\n\n\n\n\n\n                          尚未保存更改,真的要退出吗?\n";

	cout<<"\n\n                                   Yes / No";

	int ch;
	ch=scankey(0,0,KEY_ESC,'Y','y','N','n',0);
	if (ch=='y') return FRR_SUCCEED; else return FRR_SKIP;
}

//================= Main ====================
int main(int argc, char* argv[])
{
	system("cls");
	system("mode con lines=25");
	system("title 成绩管理系统 1.0  (by YoungCat)");
	system("color 0f");

	int ch=0;
	int spe[]={ADD_STUDENT_KEY, ADD_COURSE_KEY, SWITCH_KEY, SAVE_KEY, DOS_KEY, KEY_ESC, KEY_HOME, KEY_UP, KEY_PAGEUP, KEY_LEFT, KEY_RIGHT, KEY_END, KEY_DOWN, KEY_PAGEDOWN};

	bool relist=true, escape=false, arrow=false;
	int x=0, y=0, ox=0, oy=0, xnarrow=-10, ynarrow=-10, xmax=0, ymax=0, newindex=0, scnt=0;

	FuncRunResult frr;
	if (argc>=2) frr=loaddata(argv[1]); else frr=loaddata();
	if (frr==FRR_STOP) goto quitter;
	
	while(!escape)
	{
		//重新绘制表格
		if (relist)
		{
			showlist(x,y,xnarrow,ynarrow,&xmax,&ymax);
			scnt=(filterstucnt==0?s.GetStudentCount():filterstucnt);
			relist=false;
			
			if (xnarrow==-10)

				if (ynarrow==-10)

					if (filterstucnt==0) cout<<"\n"
						<<"           我想...\n"
						<<"                上下左右翻页  Up,Down,Left,Right,PgUp,PgDn\n"
						<<"                增加一个学生  Ctrl+T  |  选择一行      A-N\n"
						<<"                增加一门课程  Ctrl+C  |  选择一列      1-9\n"
						<<"                切换分数/绩点 Ctrl+W  |  临时命令行 Ctrl+D\n"
						<<"                保存...       Ctrl+S  |  退出...       Esc\n";
					else cout<<"\n"
						<<"           我想...\n"
						<<"                上下左右翻页  Up,Down,Left,Right,PgUp,PgDn\n"
						<<"                选择一行         A-N  |  选择一列      1-9\n"
						<<"                切换分数/绩点 Ctrl+W  |  临时命令行 Ctrl+D\n"
						<<"                保存...       Ctrl+S  |  离开筛选模式  Esc\n";

				else cout<<'\n'
					<<"          我想...\n"
					<<"                选择一个元素  0-9\n"
					<<"                返回          Esc\n";

			else cout<<'\n'
					<<"          我想...\n"
					<<"                选择一个元素  A-N\n"
					<<"                返回          Esc\n";

		} else ;
		
		//读取键盘
		ch=scankey(true,true,spe,sizeof(spe)/sizeof(spe[0]));

		//如果是箭头
		if (xnarrow==-10 && ynarrow==-10)
		{
			ox=x; oy=y;

			switch (ch)
			{
			case KEY_UP:		y--;	break;
			case KEY_DOWN:		y++;	break;
			case KEY_LEFT:		x--;	break;
			case KEY_PAGEUP:	y-=13;	break;
			case KEY_RIGHT:		x++;	break;
			case KEY_PAGEDOWN:	y+=13;	break;
			case KEY_HOME:		x=0;y=0;break;
			case KEY_END:		y=scnt-13; break;
			}
		}

		x=__max(x,0);
		y=__max(y,0);
		x=__min(x,scnt);
		y=__min(y,scnt-1);
		y=__max(y,0);
		relist=(ox!=x || oy!=y);
		
		//如果不是箭头
		switch (ch)
		{
		//----------
		case ADD_STUDENT_KEY:
			if (filterstucnt==0)
			{
				newindex=s.AddStudent();
				saved=false;
				if (ymax<newindex) y=newindex-12;
				relist=true;
			}
			break;
		
		//----------
		case ADD_COURSE_KEY:
			if (filterstucnt==0)
			{
				newindex=s.AddCourse();
				saved=false;
				if (xmax<newindex) x=newindex-1;
				relist=true;
			}
			break;
		//----------
		case SWITCH_KEY:
			showscore=!showscore;
			relist=true;
			break;
		//----------
		case SAVE_KEY:
			choosesave();
			relist=true;
			break;

		//----------
		case DOS_KEY:
			calldos();
			relist=true;
			break;

		//----------
		case KEY_ESC:
			if (xnarrow!=-10 || ynarrow!=-10)
			{
				xnarrow=-10; ynarrow=-10;
				relist=true;
			}
			else if (filterstucnt!=0)
			{
				filterstucnt=0;
				delete []filtersort; filtersort=NULL;
				relist=true;
			}
			else
			{
				escape=(esc()==FRR_SUCCEED);
				relist=true;
			}
			break;

		//----------
		default:
			if (ch>='a' && ch<='n' && y+ch-96-2<scnt)
			{
				if (xnarrow==-10)
				{
					if (ynarrow==-10)
					{	if (ch=='a') ynarrow=-1; else ynarrow=y+ch-96-2;
						relist=true;
					}
				}
				else
				{
					if (ch=='a') ynarrow=-1; else ynarrow=y+ch-96-2;
					choose(x,y,xnarrow,ynarrow,x,y);
					xnarrow=-10; ynarrow=-10;
					relist=true;
				}
			}
			else if (ch>='1' && ch<='9' && x+ch-48-3<=xmax && x+ch-48-3<=s.GetCourseCount())
			{
				if (ynarrow==-10)
				{
					if (xnarrow==-10)
					{	if (ch<='2') xnarrow=ch-48-3; else xnarrow=x+ch-48-3;
						relist=true;
					}
				}
				else
				{
					if (ch<='2') xnarrow=ch-48-3; else xnarrow=x+ch-48-3;
					choose(x,y,xnarrow,ynarrow,x,y);
					xnarrow=-10; ynarrow=-10;
					relist=true;
				}
			}
			else;
		//----------
		}
	}
	
quitter:
	system("cls");
	system("color 07");
	system("title cmd.exe");
	return 0;
}

//================= RTrim ====================
char* rtrim(char* string)
{
	int len=strlen(string);
	while (1)
	{
		--len;
		switch (string[len])
		{
		case 32: case 13: case 10: case 9:
			string[len]=0;
			if (len==0) return string;
			break;
		default:
			return string;
		}
	}
}

//================= ShowHeader ====================
void showheader()
{
	system("cls");
	cout<<"YoungCat系列软件 ========== 成绩管理系统 1.0 (内测版) =========================\n\n";

}

//================= ShowList ====================
void showlist(int x, int y, int xnarrow, int ynarrow, int* xmax, int* ymax)
{
	int nowx=0, wid=0, xto=0, i,j,index, *sort, scnt;
	student* st;
	showheader();
	char buf[7]={0};

	//首行
	cout<<"     " <<setiosflags(ios::left)
		<<setw(s.GetColumnWidth(-2))<<(xnarrow==-10||xnarrow==-2?"(1)":" ")
		<<setw(s.GetColumnWidth(-1)-2)<<(xnarrow==-10||xnarrow==-1?"(2)":" ")
		<<resetiosflags(ios::left);

	nowx=4+s.GetColumnWidth(-2)+s.GetColumnWidth(-1);

	for (j=x; j<s.GetCourseCount()+1; j++)
	{
		wid=s.GetColumnWidth(j,true);
		nowx+=wid;
		if (nowx>=79) break; else;
		if (xnarrow==-10||xnarrow==j) cout<<setw(wid-2)<<'('<<j-x+3<<')'; else cout<<setw(wid)<<' ';
	}

	if (xmax!=NULL) *xmax=(nowx<71?j:j-1);
	xto=j-1;
	cout<<'\n';

	//第二行
	cout<<(ynarrow==-10||ynarrow==-1?"(A)  ":"     ")
		<<setiosflags(ios::left)
		<<setw(s.GetColumnWidth(-2))<<"学号"
		<<setw(s.GetColumnWidth(-1)-1)<<"姓名"
		<<resetiosflags(ios::left);
	
	for (j=x; j<=xto; j++)
	{
		cout << setw(s.GetColumnWidth(j,true)) << s.GetCourseName(j,true);
	}
	cout<<'\n';

	//数据行
	scnt=(filterstucnt==0?s.GetStudentCount():filterstucnt);
	sort=s.CourseSort();
	for (i=2, index=y; i<=14; i++, index++)
	{
		if (index<scnt && (ynarrow==-10 || ynarrow==index))
		{
			if (filterstucnt==0) st=s.Stu(index,true); else st=s.Stu(filtersort[index],false);

			if (ynarrow==-10||ynarrow==index) cout << '(' << char(i+64) << ")  "; else cout<<"     ";

			cout << setiosflags(ios::left)
				<< setw(s.GetColumnWidth(-2)) << st->num
				<< setw(s.GetColumnWidth(-1)) << st->name
				<< resetiosflags(ios::left);

			for (j=x; j<=xto; j++)
			{
				cout<<setw(s.GetColumnWidth(j,true));
				if (xnarrow==-10 || xnarrow==j) cout<<(showscore?st->score[sort[j]].scorestr:st->score[sort[j]].pointstr); else cout<<' ';
			}
		}
		
		cout<<'\n';
	}

	if (ymax!=NULL) *ymax=y+12;

}

//================= Sleep ====================
void sleep(int ms)
{
	clock_t goal=ms+clock();
	while(goal>clock());
}

//================= SortStudents ====================
void sortstudents()
{
	qsort((void*)s.StudentSort(),s.GetStudentCount(),sizeof(int*),sortstudentsComp);
	if (filterstucnt!=0) qsort((void*)filtersort,filterstucnt,sizeof(int*),sortstudentsComp);
}

//================= SortStudentsComp ====================
int sortstudentsComp(const void* a, const void* b)
{
	bool neednum=0, needname=0;
	int result=0;

	if (sortbase>=0)
	{
		if (showscore)
			result=s.GetScoreInt(*(int*)a,sortbase,false,true)-s.GetScoreInt(*(const int*)b,sortbase,false,true);
		else
			result=s.GetPointInt(*(int*)a,sortbase,false,true)-s.GetPointInt(*(const int*)b,sortbase,false,true);

		if (result==0) neednum=true; else return (sorttype?result:-result);
	}

	if (sortbase==-2 || neednum)
	{
		result=strcmp(s.GetStuNum(*(int*)a,false),s.GetStuNum(*(int*)b,false));
		if (result==0) needname=true; else return (sorttype||neednum?result:-result);
	}

	result=strcmp(s.GetStuName(*(int*)a,false),s.GetStuName(*(int*)b,false));
	return (sorttype||needname?result:-result);
}




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -