上传代码

master
shine56 6 years ago
parent 2425d66151
commit f31c8199c4

523
main.c

@ -0,0 +1,523 @@
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <windows.h>
#define _X 35 //光标x
#define _Y 5 //光标y
//定义记录结构体
typedef struct AbRecord{
int Y; //缺课日期,年
int M; //月
int D; //日
char LNum[20]; //缺课节数
char LName[50]; //课程名称
char StuName[25]; //学生姓名
int Type; //缺课类型:迟到,早退,旷课,请假
struct AbRecord *next; //指向下一个节点的指针
}Record;
int LEN = sizeof(struct AbRecord); //结构体大小
void AddStu(Record *head); //录入学生缺课信息
void ChangeStu(Record *head); //修改学生缺课信息
void LookupStu(Record *head); //查找某个学生缺课记录
void CountStuRecord(Record suit[100], int m); //统计某段时间旷课的学生
void CountClassRecord(Record suit[100], int m); //统计某段时间有学生旷课的课程
void gotoxy(int x, int y); //设置光标
void ShowRecord(Record *p); //显示记录
Record* Fread(); //将文件信息写进链表
void Fwrite(Record* head); //将链表写入文件
void SuitTime(Record *head, char ch); //符合条件时间段的记录
int main()
{
//创建相关文件
FILE *fp;
if((fp = fopen("record.txt", "a")) == NULL)
printf("创建文件失败");
fclose(fp);
while(1)
{
system("cls");
system("color F0");
printf("\n\n\n\n");
printf("\t\t\t\t\t■------欢-------迎------使------用------■\n\n");
printf("\t\t\t\t\t --------【1】录入缺课信息-----------\n\n");
printf("\t\t\t\t\t --------【2】修改缺课信息-----------\n\n");
printf("\t\t\t\t\t --------【3】查询缺课记录-----------\n\n");
printf("\t\t\t\t\t --------【4】学生缺课情况-----------\n\n");
printf("\t\t\t\t\t --------【5】课程缺课情况-----------\n\n");
printf("\t\t\t\t\t --------【0】退出系统----------------\n\n");
printf("\t\t\t\t\t■--------考--勤--管--理--系--统---------■\n\n\n");
printf("\t\t\t\t\t\t\t【 】");
//获取用户选择
gotoxy(_X+24, _Y+16);
fflush(stdin);
char ch = getch();
Record *head = Fread(); //获取表头
switch(ch)
{
case '0':
return 0;
case '1' :
AddStu(head);
break;
case '2' :
ChangeStu(head);
break;
case '3' :
LookupStu(head);
break;
case '4':
SuitTime(head, ch);
break;
case '5':
SuitTime(head, ch);
break;
}
}
return 0;
}
void gotoxy(int x, int y) //设置光标
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(handle, pos);
}
//录入学生缺课记录
void AddStu(Record *head)
{
while(1)
{
char ch1; //确认是否继续循环
system("cls");
printf("\n\t\t\t\t\t\t录入学生缺课信息");
printf("\n\n\n\t\t\t\t学生姓名:");
printf("\n\t\t\t\t\t  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄");
printf("\n\n\t\t\t\t缺课日期: 年 月 日 ");
printf("\n\t\t\t\t\t  ̄ ̄ ̄  ̄ ̄ ̄  ̄ ̄ ̄");
printf("\n\n\t\t\t\t缺课节次: (如:第七八节)");
printf("\n\t\t\t\t\t  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄");
printf("\n\n\t\t\t\t科目名称: (如:包装教育) ");
printf("\n\t\t\t\t\t  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄");
printf("\n\n\t\t\t\t缺课类型: 【 】");
printf("\n\t\t\t\t\t  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄");
printf("\n\n\t\t\t\t【1】迟到 【2】早退 【3】旷课 【4】请假");
printf("\n\n\t\t\t\t 【 】");
printf("\n\n\t\t\t\t【0】取消录入返回菜单 【其他键】确认录入");
//输入缺课信息
Record *p = (Record*)malloc(LEN), *q = head; //增加一个新节点
gotoxy(_X+7, _Y-1); scanf("%s", p->StuName);
gotoxy(_X+7, _Y+2); scanf("%d", &p->Y);
gotoxy(_X+16, _Y+2); scanf("%d", &p->M);
gotoxy(_X+24, _Y+2); scanf("%d", &p->D);
gotoxy(_X+7, _Y+5); scanf("%s", p->LNum);
gotoxy(_X+7, _Y+8); scanf("%s", p->LName);
while(1)
{
gotoxy(_X+14, _Y+11); char typee = getch(); //选择缺课类型
gotoxy(_X+14, _Y+11); printf("%c", typee);
p->Type = typee - '0';
if(p->Type>0 && p->Type<5)
break;
else
printf("\n\t\t\t\t选择错误,请重新选择");
}
p->next = NULL;
gotoxy(_X+18, _Y+16); char ch=getch(); //确认是否录入
if(ch!='0')
{
if(head == NULL)
head = p;
else{
while(q->next) //找到链尾
{
q = q->next;
}
q->next = p;
q=p; //接上新节点
q->next = NULL;
}
Fwrite(head);
system("cls");
ShowRecord(p);
printf("\n\t\t\t\t信息录入成功........【1】继续录入信息 任意键返回菜单");
gotoxy(_X+18, _Y+16); ch1 = getch();
}
if(ch1 != '1')
return;
}
}
//修改学生缺课记录
void ChangeStu(Record *head)
{
char ch1; //确认是否修改
char stuName[25];
system("cls");
printf("\n\t\t\t\t\t\t修改学生缺课信息");
printf("\n\n\t\t\t\t输入学生姓名:");
printf("\n\t\t\t\t\t  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄");
gotoxy(_X+11, _Y-2); scanf("%s", stuName);
Record *q;
int num=0, count=0; //该学生缺课记录有多少条
for(q=head; q; q=q->next)
if(strcmp(q->StuName, stuName) == 0)
{
num++;
printf("\n\t\t\t\t******************第%d条******************", num);
ShowRecord(q);
}
if(num>0)
{
printf("\n\t\t\t\t输入您要修改该学生缺课条次:");
char No = getch();
for(q=head; q; q = q->next) //查找目标人名
{
if(strcmp(q->StuName, stuName) == 0)
{
count++;
if(count == No-'0')
{
system("cls");
printf("\n\t\t\t\t该学生信息如下:");
ShowRecord(q);
printf("\n\t\t\t\t选择要修改的信息 【 】");
printf("\n\n\t【1】学生姓名 【2】缺课日期 【3】缺课节次 【4】科目名称 【5】缺课类型 【0】返回菜单");
gotoxy(_X+18, _Y+13); char ch = getch(); //选择修改的项目
gotoxy(_X+18, _Y+13); printf("%c", ch);
//输入修改的信息
switch(ch)
{
case '0':
return;
case '1' :
printf("\n\n\n\n\t\t\t\t输入学生姓名:");
printf("\n\t\t\t\t\t  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄");
gotoxy(_X+10, _Y+17); scanf("%s", q->StuName);
break;
case '2' :
printf("\n\n\n\n\t\t\t\t缺课日期: 年 月 日 ");
printf("\n\t\t\t\t\t  ̄ ̄ ̄  ̄ ̄ ̄  ̄ ̄ ̄");
gotoxy(_X+7, _Y+17); scanf("%d", &q->Y);
gotoxy(_X+15, _Y+17); scanf("%d", &q->M);
gotoxy(_X+23, _Y+17); scanf("%d", &q->D);
break;
case '3' :
printf("\n\n\n\n\t\t\t\t缺课节次: (如:第七八节)");
printf("\n\t\t\t\t\t  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄");
gotoxy(_X+6, _Y+17); scanf("%s", q->LNum);
break;
case '4' :
printf("\n\n\n\n\t\t\t\t缺课名称: (如:包装教育) ");
printf("\n\t\t\t\t\t  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄");
gotoxy(_X+6, _Y+17); scanf("%s", q->LName);
break;
case '5' :
printf("\n\n\n\n\t\t\t\t缺课类型: 【 】");
printf("\n\n\t\t\t\t【1】迟到 【2】早退 【3】旷课 【4】请假");
while(1)
{
gotoxy(_X+14, _Y+17); char typee = getch(); //选择缺课情况
gotoxy(_X+14, _Y+17); printf("%c", typee);
q->Type = typee - '0';
if(q->Type>0 && q->Type<5)
break;
else
printf("\n\t\t\t\t选择错误,请重新选择");
}
}
system("cls");
printf("\n\n\t\t\t\t修改后信息如下:");
ShowRecord(q);
printf("\n\n\t\t\t\t【任意键】确认 【0】取消并返回菜单........ ");
gotoxy(_X+38, _Y+15); ch1 = getch(); //确认修改
break;
}
}
}
}
else{
printf("该学生有%d条缺课记录", num);
printf("\n\n\t\t\t\t【任意键】并返回菜单........ ");
getch();
}
if(ch1 != '0')
{
Fwrite(head);
}
return;
}
//显示记录
void ShowRecord(Record *p)
{
printf("\n\n\n\t\t\t\t学生姓名:%s", p->StuName);
printf("\n\t\t\t\t\t  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄");
printf("\n\n\t\t\t\t缺课日期:%d 年 %d 月 %d 日 ", p->Y, p->M, p->D);
printf("\n\t\t\t\t\t  ̄ ̄ ̄  ̄ ̄ ̄  ̄ ̄ ̄");
printf("\n\n\t\t\t\t缺课节次:%s ", p->LNum);
printf("\n\t\t\t\t\t  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄");
printf("\n\n\t\t\t\t缺课名称:%s ", p->LName);
printf("\n\t\t\t\t\t  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄");
char *s;
if(p->Type == 1)
s = "迟到";
if(p->Type == 2)
s = "早退";
if(p->Type == 3)
s = "旷课";
if(p->Type == 4)
s = "请假";
printf("\n\n\t\t\t\t缺课类型:%s", s);
printf("\n\t\t\t\t\t  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄");
return;
}
//将文件数据写入链表
Record* Fread()
{
Record *head =NULL, *last, *p;
FILE *fa;
if((fa = fopen("record.txt", "r")) == NULL)
printf("创建文件失败");
while(!feof(fa))
{
if((p = (Record*)malloc(LEN)) == NULL)
printf("申请内存出错!");
if(fread(p, LEN, 1, fa) == 1)
{
if(head == NULL)
{
head = p;
last = p;
}
else{
last->next = p;
last = p;
last->next = NULL;
}
}
}
fclose(fa);
return head;
}
//数据存盘
void Fwrite(Record* head)
{
Record *p;
FILE *fb;
if((fb = fopen("record.txt", "w")) == NULL)
printf("创建文件失败");
for(p=head; p; p=p->next)
{
if(fwrite(p, LEN, 1, fb) != 1)
printf("写入文件错误!");
}
fclose(fb);
}
//查询学生记录
void LookupStu(Record *head)
{
while(1)
{
char stuName[25];
system("cls");
printf("\n\t\t\t\t\t\t修改学生缺课信息");
printf("\n\n\t\t\t\t输入学生姓名:");
printf("\n\t\t\t\t\t  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄");
gotoxy(_X+11, _Y-2); scanf("%s", stuName);
int key =0 ; //检查有无此人
Record *q;
for(q=head; q; q = q->next) //查找目标人名
{
if(strcmp(q->StuName, stuName) == 0)
{
key =1;
printf("\n\t\t\t\t*********************************************************************");
ShowRecord(q);
}
}
printf("\n\t\t\t\t*********************************************************************");
if(key == 0)
printf("\n\t\t\t\t找不到此学生缺课记录");
printf("\n\n\t\t\t\t【任意键】继续查询 【0】返回菜单");
printf("\n\n\t\t\t\t........");
char ch = getch();
if(ch == '0')
return;
}
}
//统计某段时间旷课的学生,
void SuitTime(Record *head, char ch)
{
//输入查找区间
int y1, y2, m1, m2, d1, d2;
system("cls");
printf("\n请输入查找区间");
printf("\n\n 年 月 日->");
printf("\n ̄ ̄ ̄  ̄ ̄ ̄  ̄ ̄ ̄");
printf("\n 年 月 日");
printf("\n ̄ ̄ ̄  ̄ ̄ ̄  ̄ ̄ ̄");
gotoxy(_X-34, _Y-2); scanf("%d", &y1);
gotoxy(_X-24, _Y-2); scanf("%d", &m1);
gotoxy(_X-16, _Y-2); scanf("%d", &d1);
gotoxy(_X-34, _Y); scanf("%d", &y2);
gotoxy(_X-24, _Y); scanf("%d", &m2);
gotoxy(_X-16, _Y); scanf("%d", &d2);
//查找符合条件的节点并将存好
Record *p, suit[100];
int m = 0;
for(p=head; p; p=p->next)
{
if(p->Type == 3) //旷课的学生
{
if(p->Y < y1 || p->Y>y2) //不符合年份区分
continue;
else{
if( (p->M<m1 && p->Y==y1) || (p->M>y2 && p->Y==y2)) //不符合月份区间
continue;
else{
if( (p->M==m1 && p->Y==y1 && p->D<d1)|| (p->M==y2 && p->Y==y2 && p->D>d2)) //同年同月日分不符合
continue;
else{
suit[m].Y=p->Y; suit[m].M=p->M; suit[m].D=p->D;
strcpy(suit[m].StuName, p->StuName);
strcpy(suit[m].LName, p->LName);
strcpy(suit[m].LNum, p->LNum);
suit[m].Type=p->Type;
m++;
// printf("***%s", suit[0].StuName);
}
}
}
}
}
if(ch == '4')
CountStuRecord(suit, m);
if(ch == '5')
CountClassRecord(suit, m);
}
//按照学生旷课次数排序
void CountStuRecord(Record suit[100], int m)
{
int i, j, a[100]={0}, sum;
for(i=0; i<m; i++)
{
sum=1;
if(suit[i].Type != 0) //未被统计过的名字
{
for(j=i+1; j<m; j++) //统计名字出现的次数
if(strcmp(suit[i].StuName, suit[j].StuName) == 0)
{
sum++;
suit[j].Type = 0;
}
a[i] = sum;
}
}
int t; Record tt;
for(i=0; i<m; i++)
{
if(a[i]!=0)
{
for(j=i+1; j<m; j++)
{
if(a[i]<a[j])
{
t = a[i];
a[i] = a[j];
a[j] = t;
tt = suit[i];
suit[i] = suit[j];
suit[j] = tt;
}
}
}
}
gotoxy(0, 0);
printf("\n\t\t\t\t\t**********************************");
printf("\n\t\t\t\t\t* 姓名 旷课次数 *");
printf("\n\t\t\t\t\t**********************************");
for(i=0; i<m; i++)
{
if(a[i]!=0)
{
printf("\n\n\t\t\t %-15s %-5d", suit[i].StuName, a[i]);
printf("\n\t\t\t\t\t**********************************");
}
}
printf("\n\n\t\t\t\t任意键返回菜单..........");
getch();
}
//按照科目旷课人次排序
void CountClassRecord(Record suit[100], int m)
{
int i, j, a[100]={0}, sum;
for(i=0; i<m; i++)
{
sum=1;
if(suit[i].Type != 0) //未被统计过的科目
{
for(j=i+1; j<m; j++) //统计科目出现的次数
if(strcmp(suit[i].LName, suit[j].LName) == 0)
{
sum++;
suit[j].Type = 0;
}
a[i] = sum;
}
}
int t; Record tt;
for(i=0; i<m; i++)
{
if(a[i]!=0)
{
for(j=i+1; j<m; j++)
{
if(a[i]<a[j])
{
t = a[i];
a[i] = a[j];
a[j] = t;
tt = suit[i];
suit[i] = suit[j];
suit[j] = tt;
}
}
}
}
gotoxy(0, 0);
printf("\n\t\t\t\t\t **********************************");
printf("\n\t\t\t\t\t * 科目 旷课人数 *");
printf("\n\t\t\t\t\t **********************************");
for(i=0; i<m; i++)
{
if(a[i]!=0)
{
printf("\n\n\t\t\t %-15s %-5d", suit[i].LName, a[i]);
printf("\n\t\t\t\t\t **********************************");
}
}
printf("\n\n\t\t\t\t\t\t任意键返回菜单..........");
getch();
}

@ -1,332 +0,0 @@
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#define H 30
#define K 59
int V=300; //默认速度
int score=0, ko=-6, foodsum=0; //分数 , ko控制score是n位数画n个空格 foodsum记录吃到的食物数量
int a[H][K];
void gamestart(int (*a)[K]); //游戏初始化
void show(int (*a)[K]); // 画面显示
void gameplay(int (*a)[K]); // 游戏操作
void Smove(char move, int (*a)[K]); //蛇的移动
void gotoxy(int x, int y); //坐标函数
void food(int (*a)[K]); //生成食物
void changevelocity(); //改变速度
void gameover(); //游戏结束
void show2(int m); //速度选择界面
int main()
{
char flag='s';
while(flag=='s')
{
gamestart(a);
changevelocity();
gameplay(a);
gameover();
flag = getch();
}
return 0;
}
void gotoxy(int x, int y)//位置函数
{
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(handle, pos);
}
void gamestart(int (*a)[K]) //初始化开始画面 与数据
{
score = 0;
ko=-6; foodsum=0; V=300;
int i, j, k;
for(i=0; i<H-2; i++)
{
for(j=0; j<K; j++)
{
if(i==0 ||i==H-3 || j==0 || j==K-1 ||j==10)//画边框
a[i][j]=-1;
else
a[i][j]=0;
}
}
for(i=5; i>0; i--)//画蛇
a[15][25-i]=i;
int fx, fy; //画食物
srand(time(NULL));
do{
fx=rand()%25 + 2;
fy=rand()%45 + 14;
}while(a[fx][fy]!=0);
a[fx][fy]=-2;
//画开始文字和分数, -5不画空格 -6画1空格 , 0画2空格
a[9][2]=-11;
for(k=3; k<7; k++)
a[9][k]=-5;
a[9][7]=-6;
a[11][2]=-9;
a[12][2]=-8;
for(k=3; k<7; k++)
{
a[11][k]=-5; a[12][k]=-5;
}
a[11][7]=-6; a[12][7]=-6;
a[24][2]=-10; a[24][3]=-5; a[24][4]=-5; a[24][5]=-6;
show(a);
}
void show(int (*a)[K])//游戏显示
{
gotoxy(0, 0);
int i, j;
system("color b0");
for(i=0; i<H-1; i++)
{
for(j=0; j<K; j++)
{
if(a[i][j]==0)
printf(" ");
if(a[i][j]==-6)
printf(" ");
if(a[i][j]==-1)
printf("");
if(a[i][j]>1)
printf("");
if(a[i][j]==1)
printf("");
if(a[i][j]==-2)
printf("");
if(a[i][j]==-20)
printf("");
if(a[i][j]==-9)
printf("[w]上 [s]下");
if(a[i][j]==-8)
printf("[a]左 [d]右");
if(a[i][j]==-10)
printf("得分:%d", score);
if(a[i][j]==-11)
printf("[j]选择速度");
}
printf("\n");
}
//getchar();
}
void show2(int m)
{
int i;
gotoxy(55, 7);
printf("");
for(i=0; i<m; i++)
{
printf("");
}
for(i=0; i<(8-m); i++)
printf(" ");
printf("");
gotoxy(58, 8);
printf("- 回车确认 +");
}
void gameplay(int (*a)[K]) //游戏中
{
char move, move1;
while(1)
{
move=getch();
if(move=='d' || move=='w' || move=='s')
break;
}
while(1)
{
if(a[0][0]==-3)
break;
if(kbhit())
move=getch();
if(move=='a'&&move1!='d'||move=='d'&&move1!='a'||
move=='w'&&move1!='s'||move=='s'&&move1!='w')
{
move1=move;
Smove(move1, a);
show(a);
Sleep(V);
}
if(move=='a'&&move1=='d'||move=='d'&&move1=='a'||
move=='w'&&move1=='s'||move=='s'&&move1=='w')
{
Smove(move1, a);
show(a);
Sleep(V);
}
}
}
void Smove(char move, int (*a)[K]) //控制蛇上下左右移动
{
int i, j, hx, hy, max=0, wx, wy;
for(i=1; i<H-1; i++)
{
for(j=1; j<K-1; j++)
{
if(a[i][j]>0)
{
a[i][j]++;
if(a[i][j]>max)
{
max=a[i][j];
wx=i; wy=j;
}
if(a[i][j]==2)
{
hx=i; hy=j;
}
}
}
}
int hx1, hy1;
if(move=='d')//右移
{
hx1=hx; hy1=hy+1;
}
if(move=='w')//上
{
hx1=hx-1; hy1=hy;
}
if(move=='s')//下
{
hx1=hx+1; hy1=hy;
}
if(move=='a')//左
{
hx1=hx; hy1=hy-1;
}
if(a[hx1][hy1]==-2 || a[hx1][hy1]==-20) //吃到食物
{
if(a[hx1][hy1]==-2)
{
foodsum++;
score+=10;
}
else
score+=100;
if(score>9 && score<100) a[24][5]=-5;
if(score>99) a[24][6]=-6;
if(score>999) a[24][6]=-5;
a[hx1][hy1]=0;
food(a);
}
else{
a[wx][wy]=0;
}
if(a[hx1][hy1]>1 || a[hx1][hy1]==-1) //吃自己或撞墙
{
a[0][0]=-3;
}
else
{
a[hx1][hy1]=1;
}
}
void food(int (*a)[K])//生成新的食物
{
int fx, fy;
srand(time(NULL));
do{
fx=rand()%25 + 2;
fy=rand()%45 + 14;
}while(a[fx][fy]!=0);
//printf("%d %d\n", fx, fy);
if(foodsum==5)
{
foodsum=0;
a[fx][fy]=-20;
}
else
a[fx][fy]=-2;
}
void changevelocity() //改变速度
{
int m=2;
char ve, ch;
while(1)
{
ch=getch();
if(ch=='j' || ch=='J')
break;
else
{
gotoxy(40, 4);
printf("请设置输入为英文状态且先选择速度!");
}
}
if(ch=='j' || ch=='J')
{
show2(m);
while(1)
{
int flag=1;
ve=getch();
if(ve=='=')
{
if(V<=0)
flag=0;
else
V-=50;
m++;
if(V<=350 && flag==1)
show2(m);
}
if(ve=='-')
{
if(V>=350)
flag=0;
else
V+=50;
m--;
if(V<=350 && flag==1)
show2(m);
}
if(ve==13)
{
system("cls");
show(a);
break;
}
}
}
}
void gameover() //游戏结束
{
//system("cls");
gotoxy(50, 12);
printf("GAME OVER!");
gotoxy(50, 13);
printf("你的得分:%d", score);
gotoxy(49, 15);
printf("【s】键再玩一局");
gotoxy(49, 17);
printf("其他键结束游戏");
}
Loading…
Cancel
Save