📄 main.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 + -