📄 chencong.c
字号:
#include <dos.h> /* 取函数 */
#include <bios.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define TRUE 1
#define FALSE 0 /* 学生人数 */
#define NUMOFSTU 5
#define NUMOFCOURSE 6 /* 课程数 */
struct student /* 定义学生结构类型 */
{
int number; /* 名次 */
char sn[15]; /* 学号 */
char name[10]; /* 姓名 */
char sex[6]; /* 性别 */
int age; /* 年龄 */
char room[20]; /* 所在寝室号 */
char phone[15]; /* 宿舍电话 */
int ususcore[NUMOFCOURSE]; /* 每门课的平时成绩 */
int textscore[NUMOFCOURSE]; /* 每门课的考试成绩 */
float score[NUMOFCOURSE]; /* 每门课的总成绩 */
float sum; /* 所有课的成绩总和 */
float average; /* 所有课的平均成绩 */
int stscore; /* 总学分 */
struct student *next; /* 与该同学相连的下一个同学(指针) */
};
typedef struct student STU; /* 简写 */
STU *firsthead; /* 定义头指针,STU类型 */
int textx,texty; /*光标坐标,x行,y列*/
int i,j; /*常用变量*/
char c[4096]; /*清屏专用空间*/
void savedatas(STU *head) /* 保存一班的数据 */
{STU *p;
FILE *fp; /* 遍历指针 */
int i;
fp=fopen("I:\\class1.txt","w"); /* 打开C:\class1.txt文件,以写的方式 */
for(p=head->next;p!=NULL;p=p->next) /* 将内存中的数据写入文件 */
{
fprintf(fp,"\nNumber:%-4d",p->number);
fprintf(fp,"\nStudynumber:%-15s",p->sn);
fprintf(fp,"\nName:%-20s",p->name);
fprintf(fp,"\nSex:%-6s",p->sex);
fprintf(fp,"\nAge:%-8d",p->age);
fprintf(fp,"\nRoomnumber:%-20s",p->room);
fprintf(fp,"\nTelephone:%-15s",p->phone);
for(i=0;i<6;i++)
{
fprintf(fp,"\nNO.%d\'s Usualscore:%-5d",i,p->ususcore[i]);
fprintf(fp,"\nNO.%d\'s Textscore:%-5d",i,p->textscore[i]);
fprintf(fp,"\nNO.%d\'s Score:%-8.2f",i,p->score[i]);
}
fprintf(fp,"\nSumscore:%-10.2f",p->sum);
fprintf(fp,"\nAveragescore:%-15.2f",p->average);
fprintf(fp,"\nStudyscore:%-10d",p->stscore);
}
fclose(fp); /* 关闭文件 */
}
void savedata(STU *head) /* 保存二班的数据 */
{STU *p;
FILE *fp; /* 遍历指针 */
int i;
fp=fopen("I:\\class2.txt","w"); /* 打开C:\class1.txt文件,以写的方式 */
for(p=head->next;p!=NULL;p=p->next) /* 将内存中的数据写入文件 */
{
fprintf(fp,"\nNumber:%-4d",p->number);
fprintf(fp,"\nStudynumber:%-15s",p->sn);
fprintf(fp,"\nName:%-20s",p->name);
fprintf(fp,"\nSex:%-6s",p->sex);
fprintf(fp,"\nAge:%-8d",p->age);
fprintf(fp,"\nRoomnumber:%-20s",p->room);
fprintf(fp,"\nTelephone:%-15s",p->phone);
for(i=0;i<6;i++)
{
fprintf(fp,"\nNO.%d\'s Usualscore:%-5d",i,p->ususcore[i]);
fprintf(fp,"\nNO.%d\'s Textscore:%-5d",i,p->textscore[i]);
fprintf(fp,"\nNO.%d\'s Score:%-8.2f",i,p->score[i]);
}
fprintf(fp,"\nSumscore:%-10.2f",p->sum);
fprintf(fp,"\nAveragescore:%-15.2f",p->average);
fprintf(fp,"\nStudyscore:%-10d",p->stscore);
}
fclose(fp);
}
void savedatase(STU *head) /* 保存三班的数据 */
{STU *p;
FILE *fp; /* 遍历指针 */
int i;
fp=fopen("I:\\class3.txt","w"); /* 打开C:\class1.txt文件,以写的方式 */
for(p=head->next;p!=NULL;p=p->next) /* 将内存中的数据写入文件 */
{
fprintf(fp,"\nNumber:%-4d",p->number);
fprintf(fp,"\nStudynumber:%-15s",p->sn);
fprintf(fp,"\nName:%-20s",p->name);
fprintf(fp,"\nSex:%-6s",p->sex);
fprintf(fp,"\nAge:%-8d",p->age);
fprintf(fp,"\nRoomnumber:%-20s",p->room);
fprintf(fp,"\nTelephone:%-15s",p->phone);
for(i=0;i<6;i++)
{
fprintf(fp,"\nNO.%d\'s Usualscore:%-5d",i,p->ususcore[i]);
fprintf(fp,"\nNO.%d\'s Textscore:%-5d",i,p->textscore[i]);
fprintf(fp,"\nNO.%d\'s Score:%-8.2f",i,p->score[i]);
}
fprintf(fp,"\nSumscore:%-10.2f",p->sum);
fprintf(fp,"\nAveragescore:%-15.2f",p->average);
fprintf(fp,"\nStudyscore:%-10d",p->stscore);
}
fclose(fp); /* 关闭文件 */
}
STU * loaddata(void) /* 将磁盘数据读入内存 */
{
FILE *fp; /* 遍历指针 */
STU *p;
int i;
int stscore; /* 学分 */
fp = fopen("I:\\class.txt", "r"); /* 打开文件 */
if (fp == NULL) return; /* 文件为空时返回 */
while(!feof(fp)) /* 当文件没有出错时 */
{
p = (STU *)malloc(sizeof(STU)); /* 分配内存空间给P */
if (p == NULL) exit(-1);
p->next = NULL;
fscanf(fp,"%d",&p->number); /* 读入数据 */
fscanf(fp,"%s",p->sn);
fscanf(fp,"%s",p->name);
fscanf(fp,"%s",p->sex);
fscanf(fp,"%d",&p->age);
fscanf(fp,"%s",p->room);
fscanf(fp,"%s",p->phone);
for(i=0;i<NUMOFCOURSE;i++)
{
fscanf(fp,"%d",&p->ususcore[i]);
fscanf(fp,"%d",&p->textscore[i]);
}
for(i=0;i<NUMOFCOURSE;i++)
{
fscanf(fp,"%f",&p->score[i]);
}
fscanf(fp,"%f",&p->sum);
fscanf(fp,"%f",&p->average);
fscanf(fp,"%d",&p->stscore);
}
fclose(fp); /* 关闭文件 */
}
void Menu1()
{ int a;
system("cls"); /*调用系统的清屏命令*/
textbackground(BLUE); /*将背景设置为蓝色*/
window(1,1,25,80);
clrscr();
textx=3; /*光标初始化位置*/
texty=2;
gotoxy(1,2);
printf("%c",218); /*画左上角*/
for(i=0;i<78;i++)
printf("%c",196); /*画水平直线*/
printf("%c",191); /*画右上角*/
for(i=3;i<=23;i++)
{
gotoxy(1,i);
printf("%c",179); /*画垂直线*/
gotoxy(80,i);
printf("%c",179);
}
printf("%c",192); /*画左下角*/
for(i=0;i<78;i++)
printf("%c",196);
printf("%c",217); /*画右下角*/
gotoxy(1,1);
textcolor(7); /*设置灰色*/
for(i=0;i<80;i++)
cprintf("%c",219); /*用符号实现画主菜单的灰色背景区*/ /********************************************************************/
gettext(2,3,78,23,c); /*保存当前文本区域*/
}
void listfail(STU *head); /* 打印挂科情况 */
void allsumaverage(STU *head); /* 每门课的平均成绩和总成绩 */
void omain1(void); /* 一班的信息菜单函数 */
void omain2(void); /* 二班的信息菜单函数 */
void omain3(void); /* 三班的信息菜单函数 */
char Mainmenu(void); /* 初始总菜单 */
char Menu(void); /* 班级菜单 */
void List(STU *head); /* 列表所有同学成绩 */
void AppendNode(STU *head); /* 添加节点 */
void DeleteNode(STU *head); /* 删除节点 */
void ChangeNode(STU *head); /* 更改节点 */
void SearchNode(STU *head); /* 搜索节点并打印该节点 */
void Exit(); /* 返回到DOS */
int OkOrNot(char *name); /* 选择是与否 */
int GetNodeNumber(STU *head); /* 获得节点数目 */
void SumAverage(STU *head); /* 求一个学生的总分和平均分 */
void Score(STU *head); /* 综合平时成绩和考试成绩求最终成绩 */
void Studyscore(STU *head); /* 求学分 */
STU *InputNewRecord(STU *node); /* 输入新的数据,返回数据地址 */
STU *FindOneNode(STU *head,char *name); /* 找一个节点,返回节点地址 */
STU *FindNextNode(STU *head); /* 寻找下一个节点,返回节点地址 */
void Sort(STU *head); /* 按平均分从高到低排序 */
STU *FindPreNode(STU *head); /* 寻找前一个节点,返回节点地址 */
void main() /* 主函数 */
{
char c;
STU *head;
Menu1(); /*初始化界面*/
head=(STU *)malloc(sizeof(STU)); /* 为head分配初始地址 */
head->next=NULL;
firsthead=head;
while(1) /* 一级菜单循环 */
{
c=Mainmenu();
switch(c)
{
case'1':omain1(); /* 进入一班的信息管理 */
break;
case'2':omain2(); /* 进入二班的信息管理 */
break;
case'3':omain3(); /* 进入三班的信息管理 */
break;
case'4':Exit(); /* 返回到DOS */
break;
default:break; /* 中止本次循环 */
}
}
}
void omain1() /* 一班菜单程序 */
{
char c;
STU *head;
head=(STU *)malloc(sizeof(STU)); /* 为head分配空间 */
head->next=NULL;
firsthead=head;
loaddata(); /* 将磁盘中的数据读入内存 */
while(1)
{
printf("\nPlease choose what you want to do about Class1 as follow:");
c=Menu();
switch(c)
{
case'1':List(head); /* 将内存中的数据列表打印 */
break;
case'2':AppendNode(head); /* 添加一个节点 */
break;
case'3':DeleteNode(head); /* 删除一个节点 */
break;
case'4':ChangeNode(head); /* 修改一个节点 */
break;
case'5':SearchNode(head); /* 搜索一个节点 */
break;
case'6':Sort(head); /* 按平均分从大到小排序 */
break;
case'7':allsumaverage(head); /* 求该学生的平均分和总分 */
break;
case'8':listfail(head); /* 打印挂科情况 */
break;
case'9':savedatas(head); /* 保存数据到I:\class1.txt */
break;
case'0':return; /* 返回到上一级目录 */
default:break; /* 中断本次循环 */
}
printf("\nPress anykey to last menu.");
getch(); /* 读入字符 */
}
}
void omain2() /* 二班菜单程序 */
{
char c;
STU *head;
head=(STU *)malloc(sizeof(STU)); /* 为head分配空间 */
head->next=NULL;
firsthead=head;
loaddata(); /* 将磁盘中的数据读入内存 */
while(1)
{
printf("Please choose what you want to do about Class2 as follow:");
c=Menu();
switch(c)
{
case'1':List(head); /* 将内存中的数据列表打印 */
break;
case'2':AppendNode(head); /* 添加一个节点 */
break;
case'3':DeleteNode(head); /* 删除一个节点 */
break;
case'4':ChangeNode(head); /* 修改一个节点 */
break;
case'5':SearchNode(head); /* 搜索一个节点 */
break;
case'6':Sort(head); /* 按平均分从大到小排序 */
break;
case'7':allsumaverage(head); /* 求该学生的平均分和总分 */
break;
case'8':listfail(head); /* 打印挂科情况 */
break;
case'9':savedata(head); /* 保存数据到I:\class2.txt */
break;
case'0':return; /* 返回到上一级目录 */
default:break; /* 中断本次循环 */
}
printf("\nPress anykey to last menu.");
getch();}
} /* 读入字符 */
void omain3() /* 三班菜单程序 */
{
char c;
STU *head;
head=(STU *)malloc(sizeof(STU)); /* 为head分配空间 */
head->next=NULL;
firsthead=head;
loaddata(); /* 将磁盘中的数据读入内存 */
while(1)
{
printf("Please choose what you want to do about Class3 as follow:");
c=Menu();
switch(c)
{
case'1':List(head); /* 将内存中的数据列表打印 */
break;
case'2':AppendNode(head); /* 添加一个节点 */
break;
case'3':DeleteNode(head); /* 删除一个节点 */
break;
case'4':ChangeNode(head); /* 修改一个节点 */
break;
case'5':SearchNode(head); /* 搜索一个节点 */
break;
case'6':Sort(head); /* 按平均分从大到小排序 */
break;
case'7':allsumaverage(head); /* 按平均分从大到小排序 */
break;
case'8':listfail(head); /* 打印挂科情况 */
break;
case'9':savedatase(head); /* 保存数据到I:\class3.txt */
break;
case'0':return; /* 返回到上一级目录 */
default:break; /* 中断本次循环 */
}
printf("\nPress anykey to last menu.");
getch();} /* 读入字符 */
}
int GetNodeNumber(STU *head) /* 获得节点数目 */
{
STU *p;
int size=1;
p=head->next;
while(p!=NULL)
{
p=p->next;
size++;
}
return size; /* 返回数目 */
}
char Menu(void) /* 班级目录打印函数 */
{ printf("\n****************CLASS's INFOMATION******************************");
printf("\n\t[1]. List record \n");
printf("\t[2]. Append record \n");
printf("\t[3]. Delete record \n");
printf("\t[4]. Change record \n");
printf("\t[5]. Search record \n");
printf("\t[6]. Sort record according to average \n");
printf("\t[7]. The sumscore and averagescore of every couse \n");
printf("\t[8]. List the failed information\n");
printf("\t[9]. Save the data \n");
printf("\t[0]. Return to the last menu \n");
printf("*****************************************************************\n");
return getch(); /* 返回读入的字符 */
}
char Mainmenu(void) /* 第一级目录打印函数 */
{ printf("\n\t***************STUDYING MANAGEMENT*****************\n");
printf("\t\t[1].The information of Class One \n\n");
printf("\t\t[2].The information of Class Two \n\n");
printf("\t\t[3].The information of Class Three \n\n");
printf("\t\t[4].Exit to DOS\n");
printf("****************************************************************\n");
return getch(); /* 返回读入的字符 */
}
void List(STU *head) /* 打印输出数据 */
{
STU *p;
int i;
p=head->next;
if(p==NULL)
{
printf("\nThe Record is empty!");
}
else
{
while(p!=NULL) /* 循环输出数据 */
{ printf("\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
printf("\nStudent score as follow:");
printf("\nNumber:%-4d",p->number);
printf("\nStudynumber:%-15s",p->sn);
printf("\nName:%-20s",p->name);
printf("\nSex:%-6s",p->sex);
printf("\nAge:%-8d",p->age);
printf("\nRoomnumber:%-20s",p->room);
printf("\nTelephone:%-15s",p->phone);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -