功能模块概要说明:
1.输入函数:
char* uscanf(int,int,int) //图形模式下输入函数,大小写26个字母0-9数字外加空格键为有效输入,可以使用BACKSPACE。
2.开始界面,退出界面和主界面:
void starting() //开始界面
void end() //结束界面
char* index() //主选择界面函数,返回选择信息(字符串);
3.数据输入、创建链表模块
char* tinkey(char*,int,int) //输入切换处理
char* recourse(char*,int,int) //课程输入
int wdetect(struct person*,char*) //课程输入检测,检测课表一星期同一天同一时间段内课程安排是否重复,如果重复给出修改提示信息
char* infuse(char*,char*,int) //课表输入
struct course *ccreat(char*) //创建课程单向链表
struct person* pcreat(char *) //创建个人课表节点
char *infcreat(char**,struct person**,struct person**,char*)
//创建课表双向链表
4.课表输出
char *print(char*) //课表输出背景界面
char *pkey() //课表输出按纽界面及处理
int table(int,int,struct person*) //在指定区域一表格形式输出一个人的课表
int forebox(struct person*) //初略显示下三个人的课表提示
5.文件存储和装载
char* save(char *,struct person *) //保存为磁盘文件,在图形模式下进行文件读写操作之后,程序出现莫名其妙的异常显示情形
6.课表查询:
struct person *pdemand(struct person *,char *) //按人名字查询其课表安排。
struct person* wddemand(struct person*,int) //按星期几查询课程安排情况。
struct person *cdemand(struct person *,char *) //按课程查询老师或学生课程安排情况。
char *demand(struct person *) // 查询切换,并显示查询结果,按名字查询一次只能一个。按星期几和课程查询可以查询到多个,如查询到多个接果,按任意键可依次输出。
7.排序。
struct course *csort(struct course *) //按课程编号排序课表节点中课程链表
struct person *psort(struct person *) //按人学号或老师编号排序课表链表
char sort(struct person*) //排序切换,并提示排序结果
8.插入。
char *insert(char *,struct person **,struct person **)
//擦入课表节点
9.删除。
char *delete(struct person **,char *)
//按人名删除其课表节点
操作说明:
1. Infuse:选定这个键后按Enter进入学生输入菜单,你可以输入学生的学号,姓名,学生在一学期内的所学课程的课程名,课程号,学时,以及在一周内上课的地址。如果当输入某课程上课地址有重复时,系统自动发出报警信息,并提示出错的地方,以便修改,
当选定couse时,表明此学生所学的该课程的信息输入完成再输入另外所学课程的信息,如上所写照样输入,
当选定finish时,并按回车键后,表明此学生在这一学期内所学的课程信息输入完成。如要继续输入学生的信息如前所述。
当选定back时,并按下回车键后,返回TIME TABLE主菜单,选择主菜单里的功能对所输入的信息进行处理。
当选定exit时,并按下回车键后,返回程序。结束程序。
2.SAVE/LOAD 选定此并按回车。此键作用对所输入的信息进行格式输出/载入。输入你要保存信息的文件名,文件格式系统自动生成。利用键盘上的方向键和TAB键进行控制。
3.DEMAND:按ENTER键开始输入,按反向键进行查询切换。当按星期几和课程查询时候,如遇到查询到多个结果,按任意键可依次输出直到完。
4.INSERT:按ENTER键开始输入,按反向键进行查询切换。输入同INFURE项。
5. DELETE: 按ENTER键显示输入框开始输入。其他同上。
6.SORT:当提示框中SORT变为红色时候,表示被选中,按ENTER键开始插入,如成功给出提示信息。
7.PRINT:依次输出链表,如果输出链表为空则不进仍输出页面。NEXT为下一个,PRO为上一个。下面FORENOTICE 框显示后三个节点。
8.EXIT:退出系统。效果同按ESC。
六:源程序清单:(见附件)
七:测试结果:
1:在图形模式下,关于文件的读写操作影响整个程序的显示。
2:关于指针数组的初始化,有时候出现莫名其妙的没有初始化的现象。改成逐个赋值处理,现象消息。
3:关于返回字符串指针的函数所返回的指针输出,出现叠加的现象。
4:图形模式下函数的不稳定和相互制约的现象。
如:sprintf()与strcpy();
。。。。。。
//源程序代码
/*
功能:排课系统
作者:周志明
日期:28/8/2004
*/
/*****************************************************************/
/* 课表排课系统 */
/*****************************************************************/
/*头文件*/
#include
#include
#include
#include
/*宏定义*/
#define NULL 0
#define OK 1
#define ERROR -1
#define ESC 0x011b
#define TAB 0x0f09
#define ENTER 0x1c0d
#define UP 0x4800
#define DOWN 0x5000
#define LEFT 0x4b00
#define RIGHT 0x4d00
#define BACKSPACE 0x0e08
#define SPACE 0x3920
/*结构体类型定义*/
struct weekday{
int wday;
char addr[5][10];
struct weekday *next;
};
struct course{
char cnumber[10];
char cname[10];
char period[10];
struct weekday *whead;
struct course *next;
};
struct person{
char pnumber[10];
char pname[10];
int pflag[7][5];
struct course *chead;
struct person *pro;
struct person *next;
};
/*****************************INPUT FUNCTION ****************************/
char* uscanf(sx,sy,max) /*图形模式下输入函数*/
int sx,sy,max;
{
int bsx=sx,bsy=sy,n;
int key,keylow;
char *p,*ch;
ch=p=(char*)malloc(sizeof(char)*100);
n=0;
do{
setcolor(RED);
line(sx,sy+15,sx+8,sy+15);
key=bioskey(0);
keylow=key & 0xff;
if(key==BACKSPACE && sx>bsx){ /*退格纠错处理*/
if(n!=max) sx-=8; p--;
setfillstyle(1,7);setcolor(7);
if(n==max) bar(sx,sy+3,sx+8,sy+16);
else bar(sx,sy+3,sx+16,sy+16);
n-=1;
}
else if(keylow>=48 && keylow<=57 || keylow>=65 && keylow<=90
|| keylow>=97 && keylow<=122 || key==SPACE) /*输入字符控制*/
if(n
sprintf(p,"%c",keylow);
setfillstyle(1,7);setcolor(7);
bar(sx,sy+3,sx+8,sy+16);
setcolor(RED);
moveto(sx,sy+5); outtext(p);
n+=1;
p++;
sx+=8;
if(n==max) sx-=8;
}
}while(key!=ENTER && key!=TAB);
*p='/0';
setfillstyle(1,8); setcolor(8);
bar(bsx-1,bsy+1,bsx+68,bsy+17);
setcolor(7);
outtextxy(bsx,bsy+5,ch);
return(ch);
}/*uscanf*/
/******************************Function1***********************************/
void SETGRAPH(){ /*图形模式初始化*/
int driver,mode;
detectgraph(&driver,&mode);
initgraph(&driver,&mode,"");
}
void starting(){ /*开始界面*/
int i,times;
char ch='a';
char p[]={'W','/0','e','/0','l','/0','c','/0',
'o','/0','m','/0','e','/0','!','/0'};
setbkcolor(1);
setfillstyle(6,4);
floodfill(12,12,GREEN);
settextstyle(0,0,3); setcolor(14);
outtextxy(50,210,"Program Design Practise");
outtextxy(200,250,"Starting...");
setcolor(8); setlinestyle(1,0,THICK_WIDTH);
ellipse(320,240,0,360,318,239);
setfillstyle(1,8); delay(50000);
for(i=0;i<=360;i+=6){
delay(100);
sector(320,240,0,i,308,229);
}
setfillstyle(1,1); setcolor(2);
for(i=100;i<=350;i+=5){
delay(500);
bar3d(100,100,540,i,15,1);
}
settextstyle(0,0,4); setcolor(6);
outtextxy(150,130,"TIME-TABLE");
settextstyle(0,0,1); setcolor(12);
outtextxy(200,180,"time-table practice ver 1.0");
outtextxy(400,300,"DESIGNER:zzm");
times=0;
do{
settextstyle(0,0,3);
for(i=0;i<8;i++){
delay(3000);
setcolor(2+i+times%8);
outtextxy(220+i*25,220,&p[2*i]);
}
settextstyle(0,0,1);
outtextxy(300,260,"");
times++;
if(times>2) ch=getch();
}while(ch!=0xd);
}/*starting*/
void end(){ /*退出界面*/
int i,times;
char p[]={'T','/0','H','/0','A','/0','N','/0',
'K','/0','-','/0','Y','/0','O','/0','U','/0'};
cleardevice();
setbkcolor(0);
setfillstyle(1,8); setcolor(1);
for(i=0;i<640;i+=5){
delay(100);
bar3d(0,100,i,350,0,1);
}
settextstyle(0,0,5); setcolor(YELLOW);
outtextxy(250,200,"END");
setfillstyle(1,1);
for(i=100;i<540;i+=4){
delay(200);
bar3d(100,100,i,350,0,1);
}
settextstyle(0,0,2); setcolor(6);
outtextxy(250,150,"TIME-TABLE");
settextstyle(0,0,1); setcolor(12);
outtextxy(220,180,"time-table practice ver 1.0");
outtextxy(280,300,"DESIGNER: ZhouZhiming");
times=0;
settextstyle(0,0,6);
do{
for(i=0;i<9;i++){
delay(3000);
setcolor(2+i+times%9);
outtextxy(125+i*45,220,&p[2*i]);
}
times++;
}while(times<2);
setfillstyle(1,0);setcolor(0);
for(i=0;i<640;i+=5){
delay(500);
bar3d(0,100,639,100+i,0,1);
bar3d(0,350-i,639,350,0,1);
}
closegraph();
exit(0);
}/*END*/
void box(sx,sy,ex,ey,depth,size,linecolor,fillcolor,fontcolor,p)
int sx,sy,ex,ey,linecolor,fillcolor;
char *p;
{ settextstyle(0,0,size);
setfillstyle(1,fillcolor);setcolor(linecolor);
bar3d(sx,sy,ex,ey,depth,1);
setcolor(fontcolor);
outtextxy(sx+5,(sy+ey)/2-5,p);
}/*box*/
char* index(){ /*主选择页面*/
int i;
int key,sx,sy,ex,ey,xincre,yincre;
char **p;
char *sp[]={"Infuse","Load","Save","Demand","Insert","Delete","Sort","Print","Exit"};
char *temp;
setcolor(1);
setfillstyle(6,8);
for(i=0;i<=180;i+=5){
delay(10);
sector(320,240,0,i,500,242);
sector(320,240,180,180+i,320,242);
}
setfillstyle(1,8);
for(i=0;i<=90;i+=5){
delay(10);
sector(210,240,0,i,150,200);
sector(210,240,90,90+i,150,200);
sector(210,240,180,180+i,100,200);
sector(210,240,270,270+i,200,200);
sector(430,240,0,i,150,200);
sector(430,240,90,90+i,150,200);
sector(430,240,180,180+i,200,200);
sector(430,240,270,270+i,200,200);
}
setfillstyle(1,1);
for(i=10;i<=70;i+=5){
delay(500);
bar3d(190,20,450,i,5,1);
}
settextstyle(0,0,3); setcolor(6);
outtextxy(200,30,"TIME-TABLE");
settextstyle(0,0,1); setcolor(12);
outtextxy(195,60,"Couse Schedule Supervise System");
setfillstyle(1,1); setcolor(1);
for(i=100;i<=380;i+=10){
delay(100);
bar3d(120,100,300,i,15,1);
bar3d(340,100,520,i,15,1);
}
settextstyle(0,0,2); setcolor(6);
outtextxy(150,120,"STUDENT'S");
outtextxy(370,120,"TEACHER'S");
for(i=0;i<9;i++){
box(180,158+i*20,240,176+i*20,5,1,2,2,LIGHTGREEN,sp[i]);
box(400,158+i*20,460,176+i*20,5,1,2,2,LIGHTGREEN,sp[i]);
}
sx=180;sy=158;ex=240;ey=176; xincre=0;yincre=0;
p=sp;
do{
box(sx+xincre,sy+yincre,ex+xincre,ey+yincre,5,1,RED,RED,YELLOW,*p);
key=bioskey(0);
switch(key){
case LEFT: if(xincre){
box(sx+xincre,sy+yincre,ex+xincre,ey+yincre,5,1,CYAN,CYAN,LIGHTGREEN,*p);
xincre-=220;}
break;
case RIGHT: if(!xincre){
box(sx+xincre,sy+yincre,ex+xincre,ey+yincre,5,1,CYAN,CYAN,LIGHTGREEN,*p);
xincre+=220;}
break;
case UP: if(yincre){
box(sx+xincre,sy+yincre,ex+xincre,ey+yincre,5,1,CYAN,CYAN,LIGHTGREEN,*p);
p--;
yincre-=20;}
break;
case DOWN: if(yincre<160){
box(sx+xincre,sy+yincre,ex+xincre,ey+yincre,5,1,CYAN,CYAN,LIGHTGREEN,*p);
p++;
yincre+=20; }
break;
case TAB: if(!xincre){
box(sx+xincre,sy+yincre,ex+xincre,ey+yincre,5,1,CYAN,CYAN,LIGHTGREEN,*p);
xincre+=220;}
else if(yincre<160){
box(sx+xincre,sy+yincre,ex+xincre,ey+yincre,5,1,CYAN,CYAN,LIGHTGREEN,*p);
xincre-=220; yincre+=20;
p++; }
else{ box(sx+xincre,sy+yincre,ex+xincre,ey+yincre,5,1,CYAN,CYAN,LIGHTGREEN,*p);
xincre=0; yincre=0; p=sp;}
break;
case ESC: end();
}
}while(key!=ENTER);
/* if(xincre) *p=strcat("Teachers-",*p);
else *p=strcat("Students-",*p);
return *p;
*/ /*WHY???*/
/*用上面的语句来替换下面语句的功能时,出现莫名其妙串连接情况*/
if(xincre){ if(strcmp(*p,"Infuse")==0) return "Teachers-Infuse";
else if(strcmp(*p,"Load")==0) return "Teachers-Load";
else if(strcmp(*p,"Save")==0) return "Teachers-Save";
else if(strcmp(*p,"Demand")==0) return "Teachers-Demand";
else if(strcmp(*p,"Insert")==0) return "Teachers-Insert";
else if(strcmp(*p,"Delete")==0) return "Teachers-Delete";
else if(strcmp(*p,"Sort")==0) return "Teachers-Sort";
else if(strcmp(*p,"Print")==0) return "Teachers-Print";
else if(strcmp(*p,"Exit")==0) return "Teachers-Exit";
}
else { if(strcmp(*p,"Infuse")==0) return "Students-Infuse";