📄 adstd.c
字号:
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<stdlib.h>
#define PER 8 /*设定成绩记录每页显示的数目*/
/*bioskey(0)>>8 所得值宏命名*/
#define ESC 1
#define LEFT 75
#define RIGHT 77
#define TOP 72
#define DOWN 80
#define S 31
#define I 23
#define M 50
#define D 32
#define P 25
#define X 45
#define F4 62
#define F5 63
#define F6 64
#define F7 65
/*getch()所得值宏命名*/
#define CESC 1
#define CBACK 8
#define CSPACE 32
#define CENTER 13
#define CTAB 9
#define CSHIFT_P 80 /*shift+p之值*/
/*--------------------定义结构数据类型------------------------*/
typedef struct stdc{
char name[10]; /*学生姓名*/
int no; /*学生学号*/
int chs; /*语文的分数*/
int math;/* 数学的分数*/
int phy;/*物理*/
int che;/*化学*/
int eng;/*英语*/
int all;/*总分*/
int wtall;/* 加权总分*/
int que;/*名次*/
float aver;/*平均分*/
}stdscore;
typedef struct me1{
/*-------------------成绩数据基本参数结构数据类型,学分的设定------------------------*/
int chs; /*语文的学分*/
int math;/* 数学的学分*/
int phy;/*物理*/
int che;/*化学*/
int eng;/*英语*/
}me1;
/*--------------------定义结构数据类型结束------------------------*/
/*--------------------定义外部变量,便于函数与主函数以及各函数之间交流数据------------------------*/
char gword[20]; /*存放外部输入数据*/
FILE *fpme;
FILE *fpstd;
stdscore std[60]; /*为使程序简单起见,本程序默认班上只有六十个同学*/
int stdi=0;/*记录std数组的当前位置(下标)根据该值确定学生个数*/
int isfget=0;/*标记数据文件是否已连接*/
char gcmd='z';/*传递内部函数相关命令,默认为Z,表示未专递任何命令*/
char gstr[50];/*用以存放getstr()函数所获得的数据的外部变量,以便交流数据*/
/*--------------------定义外部变量结束------------------------*/
void box(int startx,int starty,int endx,int endy){
/*--------------------定义画边框函数------------------------*/
int i;
gotoxy(startx,starty);
putch(0xda);
for(i=startx+1;i<endx;i++){
putch(0xc4);
}
putch(0xbf);
for(i=starty+1;i<endy;i++){
gotoxy(startx,i);
putch(0xb3);
gotoxy(endx,i);
putch(0xb3);
}
gotoxy(startx,endy);
putch(0xc0);
for(i=startx+1;i<endx;i++)putch(0xc4);
putch(0xd9);
}
void windowbg(int starty,int endy,int cl){
/*---------将本窗口背景颜色初始化--------*/
int i;
textbackground(cl);
for(i=0;i<=endy-starty;i++)insline();
}
gstrinit(){
/*初始化gstr[50]*/
int i=0;
for(i=0;i<50;i++)gstr[i]='\0';
}
char *intos(int num){
char ax[50];
if(num==0){
ax[0]='\0';return ax;
}
return itoa(num,ax,10);
}
int getstr(int amax,int px,int py,char *p,int allow){
/*------从键盘获得数据并进行相应处理,不允许输入空格,可以勉强有效控制用户乱输入数据,因时间有限,可能有缺陷-------*/
/*---amax表示允许的最大字符数-------*/
/*---allow表示允许的输入的数据类型,如果其值为1表示整型,2表示字符串-------*/
/*---p给出初始数据-------*/
/*---px,py表示准备输入时之光标横纵坐标-------*/
/*---ny(返回值)表示输入完毕后光标纵坐标的的移动。其值为正负一-------*/
char ch;
int ny,i,minpx;
minpx=px;
for(i=px;i<px+amax;i++)cprintf(" ");/*----首先将px到px+amax位置全部用空格占掉-----*/
gotoxy(px,py);
strcpy(gstr,p);
for(i=0;gstr[i];i++){
cprintf("%c",gstr[i]);px++;
}
for(i=0;i<50;){
ch=getch();
if(allow==1&&ch>='0'&&ch<='9'&&i+1<=amax){
/*当输入整型数时*/
cprintf("%c",ch);
px++;
gstr[i]=ch;
i++;
}
if(ch==CBACK&&px>minpx){
/*当按下back space键时*/
px--;
gotoxy(px,py);
cprintf(" ");
gotoxy(px,py);i--;
gstr[i]='\0';
continue;
}
if(ch==CSPACE){
/*当按下空格键时*/
continue;
}
if(ch==CTAB){
/*当按下tab键时*/
ny=1;
return ny;
}
if(ch==CSHIFT_P||ch==CSHIFT_P+32){
/*当按下shift+p键时,执行shift+tab类似功能*/
ny=-1;
return ny;
}
if(ch==CENTER){
/*当按下回车时,初步提交数据*/
ny=0;
return ny;
}
if(allow==2&&i+1<=amax&&ch!=CBACK){
/*当输入字符串时*/
cprintf("%c",ch);
px++;
gstr[i]=ch;
i++;
}
}
}
mputc(char me,char *p,int cl){
/*----------将字符红色显示,并用()括起来。将颜色还原为cl------------*/
char kw='(';
textcolor(cl);
cprintf("%c",kw);
textcolor(4);
cprintf("%c",me);
textcolor(cl);
kw=')';
cprintf("%c",kw);
cprintf("%s",p);
}
init(){
/*全屏显示处理开始*/
int i;
int j;
window(1,1,80,25);
clrscr();
windowbg(1,25,1); /*全屏背景设计为蓝色*/
box(2,2,80,25);
box(3,5,60,21); /*主信息输出区边框*/
window(3,2,80,4);
gotoxy(25,1);
cprintf("03级计算机课程设计系列之--成绩管理系统");
gotoxy(2,2);
for(i=0;i<=74;i++)cprintf("=");
window(4,4,78,19); /*上主菜单栏目窗口区*/
gotoxy(3,1);
mputc('I',"插入 ",14);
mputc('M',"修改 ",14);
mputc('D',"删除 ",14);
mputc('X',"学分设置 ",14);
window(4,6,59,21); /*主信息输出窗口工作区初始化*/
gotoxy(10+5,3);cprintf("欢迎使用本成绩管理系统!");
gotoxy(10+5,5+1);cprintf("学生:陈欢");
gotoxy(10+5,6+1);cprintf("类型:课程设计");
gotoxy(10+5,7+1);cprintf("班级:03级计算机6班");
gotoxy(10,9+1);cprintf("当前为本程序主界面,请按相应快捷键进行操作");
window(3,22,80,23); /*下信息输出窗口工作区*/
gotoxy(2,1);
for(i=0;i<=74;i++)cprintf("=");
gotoxy(2,2);cprintf(" 学生:陈欢 类型:课程设计 班级:03级计算机6班");
window(62,6,78,21); /*右窗口工作区*/
i=1;
gotoxy(1,i++);cprintf("[F7] 连接数据");
gotoxy(1,i++);cprintf("[F4] 显示成绩");
gotoxy(1,i++);cprintf("[F6] 保存数据");
gotoxy(1,i++);cprintf("[F5] 全屏刷新");
gotoxy(1,i++);cprintf("[ESC]退出本系统");
gotoxy(1,i++);for(j=0;j<=16;j++)cprintf("*");
gotoxy(1,i++);cprintf("快捷键使用说明");i++;
gotoxy(1,i++);cprintf(" 快捷键为[]或");
gotoxy(1,i++);cprintf("()内的键名。");
gotoxy(1,i++);for(j=0;j<=16;j++)cprintf("*");
gotoxy(1,i++);cprintf("警告:数据输入不");
gotoxy(1,i++);cprintf("要乱输入数据,否");
gotoxy(1,i++);cprintf("则你不能正常使用");
gotoxy(1,i++);cprintf("本系统!");
/*全屏显示处理结束*/
}
getdata(){
/*从硬盘数据文件获取数据于内存std[stdi]数组中*/
if((fpstd=fopen("std.db","rb"))==NULL){
fclose(fpstd);
stdi=0;
if((fpstd=fopen("std.db","wb"))==NULL){
clrscr();
gotoxy(5,4);
cprintf("操作失败,相关数据连接失败");
return;
}
}
for(stdi=0;!feof(fpstd);stdi++)fread(&std[stdi],sizeof(stdscore),1,fpstd);
stdi--;
fclose(fpstd);
isfget=1;/*标记数据文件已经连接*/
window(4,6,59,21); /*主信息输出窗口工作区*/
clrscr();
gotoxy(10,8);
cprintf("数据已经成功连接");
}
dsave(){
int i;
char ch;
window(4,6,59,21); /*主信息输出窗口工作区*/
clrscr();
if((fpstd=fopen("std.db","wb"))==NULL){
clrscr();
gotoxy(10,4);
cprintf("操作失败,相关数据连接失败");
return;
}
for(i=0;i<stdi;i++)fwrite(&std[i],sizeof(stdscore),1,fpstd);
fclose(fpstd);
gotoxy(10,8);
cprintf("恭喜!数据库更新成功!");
return;
}
sysinit(){
/*学分初始设置*/
int k=0;
int j=0,isok;
char ch,ach;
me1 objsys;
int xf[5]={0,0,0,0,0};
window(4,6,59,21); /*主信息输出窗口工作区*/
clrscr();
gotoxy(12,5);cprintf(" 各科学分初始设置");
gotoxy(4,6);cprintf("[TAB]键移动填写下一项,[shift+p]键移动光标到第一项");
gotoxy(10,8);cprintf("语文:[ ]");
gotoxy(10,9);cprintf("数学:[ ]");
gotoxy(10,10);cprintf("物理:[ ]");
gotoxy(10,11);cprintf("化学:[ ]");
gotoxy(10,12);cprintf("英语:[ ]");
gotoxy(10+7,8);
j=0;
for(k=0;k<5;){
while(!gstr[0])isok=getstr(1,10+7,8+j,intos(xf[k]),1);
xf[k]=atoi(gstr);gstrinit();
if(isok==0)break;
if(isok==1){j++;k++;}
if(isok==-1){j=0;k=0;}
}
gotoxy(10+7,8+6);
cprintf(" [Y]确认 [N]取消");
for(;;){
ch=getch();
if(ch=='Y'||ch=='y'){
objsys.chs=xf[0];
objsys.math=xf[1];
objsys.phy=xf[2];
objsys.che=xf[3];
objsys.eng=xf[4];
if((fpme=fopen("me.db","wb"))==NULL){
cprintf("文件打开出错!");
return;
}
fwrite(&objsys,sizeof(me1),1,fpme);
fclose(fpme);
clrscr();
gotoxy(10+7,13);
cprintf("操作成功,按任意键回主界面");
while(!bioskey(1));
init(); return;
}
if(ch=='N'||ch=='n') {init();return;}
}
}
gque(int m){
/*将std[60]中的数据进行相关从小到大排序,m为1表示按学号排,m为2表示按名次排*/
stdscore tmt;
int i,j,f=0;
for(i=0;i<stdi;i++){
for(j=i+1;j<stdi;j++){
if(m==1)f=(std[i].no>std[j].no);
if(m==2)f=(std[i].que>std[j].que);
if(m==3)f=(std[i].wtall<std[j].wtall);/*学积分按降序排列*/
if(m==11)f=(std[i].chs>std[j].chs);
if(m==12)f=(std[i].math>std[j].math);
if(m==13)f=(std[i].phy>std[j].phy);
if(m==14)f=(std[i].che>std[j].che);
if(m==15)f=(std[i].eng>std[j].eng);
if(f){
tmt=std[i];
std[i]=std[j];
std[j]=tmt;
}
}
}
}
xuef(){
/*学分查看与设置*/
int j=0;
char cha;
me1 objsys;
window(4,6,59,21); /*主信息输出窗口工作区*/
clrscr();
gotoxy(10,5);cprintf(" 各科学分管理");
gotoxy(10,8);cprintf("语文:[ ]");
gotoxy(10,9);cprintf("数学:[ ]");
gotoxy(10,10);cprintf("物理:[ ]");
gotoxy(10,11);cprintf("化学:[ ]");
gotoxy(10,12);cprintf("英语:[ ]");
gotoxy(10+7,8);
if((fpme=fopen("me.db","rb"))==NULL){
gotoxy(10,6);cprintf("系统检测到你还没有设置各科学分!");
gotoxy(10,7);cprintf(" 是否立即设置[y/n]?");
cha=getch();
for(;;){
if(cha=='y'||cha=='Y') {sysinit();return;}
if(cha=='n'||cha=='N'){
clrscr();
gotoxy(15,8);
cprintf("操作已取消!");
return;
}
}
}
fread(&objsys,sizeof(me1),1,fpme);
gotoxy(10+7,8+j);j++;
cprintf("%d",objsys.chs);gotoxy(10+7,8+j);j++;
cprintf("%d",objsys.math);gotoxy(10+7,8+j);j++;
cprintf("%d",objsys.phy);gotoxy(10+7,8+j);j++;
cprintf("%d",objsys.che);gotoxy(10+7,8+j);j++;
cprintf("%d",objsys.eng);j++;
gotoxy(10+7,8+j);j=0;
cprintf(" [M]修改 [N]取消");
for(;;){
cha=getch();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -