📄 学生信息管理系统.c
字号:
#include<stdio.h>
#include<string.h>
#include<conio.h>
#include<malloc.h>
#include<windows.h>
//函数声明
void Menu();
int menu_select();
void CreatFile();
void init();
void insert();
void Delete();
void print();
void sort();
void search();
int findnum();
void findname();
void findmath();
void findprogram();
void findscore();
void Fn();
typedef struct link_node
{
long id;
char name[15];
int MathGrade;
int ChinGrade;
int EnglGrade;
int score;
struct link_node *next;
}node;
node *head; //头结点
int i;
void main()
{
Menu();
}
void Menu()
{
for(;;)
{
switch(menu_select()) /*调用主菜单函数,返回值整数作开关语句的条件,值不同,执行的函数不同*/
{ case 1:CreatFile();break; /*新建数据档案,并初始化,然后输入档案*/
case 2:insert();break; /*添加数据*/
case 3:Delete();break; /*删除数据*/
case 4:sort();break; /*排序*/
case 5:search();break; /*检索*/
case 6:print();break; /*显示全部记录*/
case 7:exit(0); /*如菜单返回值为8程序结束*/
}
printf("\n\n\n\n\n\n\n\t\t\t完成!\n\t\t\t按任何键回到主菜单!");
getch();
}
}
int menu_select()
{
char *menu[]={"******************************MENU******************************",
" 1. 新建数据档案", /*新建数据档案*/
" 2. 添加一个学生档案", /*添加数据*/
" 3. 删除一个学生档案", /*删除数据*/
" 4. 按总分排序", /*排序*/
" 5. 查找", /*查找*/
" 6. 打印所有学生档案 ", /*输出档案*/
" 7. 退出", /*退出*/
"****************************************************************"};
int c,j;
system("cls");
printf("\n\t\t\t 欢迎使用学生信息管理系统 \n\n");
printf("\t\t\t\t 作者 : 孙柳林 \n\t\t\t\t 学号 : 0308060220\n");
for(j=0;j<=8;j++) /*输出主菜单数组*/
printf("\n\t%s\n",menu[j]);
do{
printf("\nEnter you choice(1---7):[ ]\b\b"); /*在菜单窗口外显示提示信息*/
scanf("%d",&c); /*输入选择项*/
}while(c<1||c>7); /*选择项不在1~7之间重输*/
return c; /*返回选择项,主程序根据该数调用相应的函数*/
}
void CreatFile()
{ //序号
long a; //如果学号为 0,则退出新建档案
node *p=NULL;
system("cls");
init();
i=1;
printf("\n创建新档案\n\n ");
printf("\n请按以下格式输入!\n");
printf("eg:\n 学号 姓名 数学 语文 英语\n");
printf(" 0308060225 李宁 90 85 96 \n");
do{
printf("%-5d",i);
scanf("%ld",&a);
if(a)
{
p=(node*)malloc(sizeof(node)); //为使不为退出的0学号分配一个空间
p->next=NULL;
while(findnum(a)) //查找是否己经存在这个学号 此功能尚未完成!
{
printf("这个学号己经存在! 请重新输入\n");
printf("%-5d",i);
scanf("%ld",&a);
}
p->id=a;
scanf("%s %d %d %d",p->name,&p->MathGrade,&p->ChinGrade,&p->EnglGrade);
p->score=p->MathGrade+p->ChinGrade+p->EnglGrade;
p->next=head->next;
head->next=p;
i++;
}
}while(a);
}
void init()
{
head=(node*)malloc(sizeof(node));
head->next=NULL;
}
void insert() //退出的两种途径, 一.不按Y, 二.学号输入0
{
long a;
node *p;
char c; // 是否继续输入
system("cls");
if(!head) //如果用户没有创建新档案,则补充
{
init();
i++;
}
printf("\n添加一个学生的档案\n\n");
printf("\n请按以下格式输入!\n");
printf("eg:\n 学号 姓名 数学 语文 英语\n");
printf(" 0308060225 李宁 90 85 96 \n");
do{
printf("%-5d",i);
scanf("%ld",&a);
if(a)
{
p=(node*)malloc(sizeof(node)); //为使不为退出的0学号分配一个空间
p->next=NULL;
while(findnum(a)) //查找是否己经存在这个学号 此功能尚未完成!
{
printf("这个学号己经存在! 请重新输入\n");
printf("%-5d",i);
scanf("%ld",&a);
}
p->id=a;
scanf("%s %d %d %d",p->name,&p->MathGrade,&p->ChinGrade,&p->EnglGrade);
p->score=p->MathGrade+p->ChinGrade+p->EnglGrade;
p->next=head->next;
head->next=p;
i++;
}
printf("\n继续插入,请输入: y 或 Y \n");
getchar();
c=getchar();
if(c!='y'&&c!='Y') //c==y 或 c==Y 的反面
break;
}while(a);
}
void Delete()
{
node *pre=head,*p;
long a;
int k;
system("cls");
printf("\n\t\t************** 删除一个学生信息 ******************\n");
if(head)
{
p=head->next;
printf("请输入你要删除的学生的学号: ");
scanf("%d",&a);
if(!findnum(a))
printf("\n这个学生的信息不存在!\n");
else
{
while(p&&p->id!=a)
{
pre=p;
p=p->next;
}
printf("\n这个学生的信息: \n");
for(k=1;k<80;k++)
printf("*");
printf("\n学号\t 姓名\t 数学 语文 英语 总分\n");
printf("%-10ld%-15s%-3d\t %-2d \t%-3d \t%6d\n",p->id,p->name,p->MathGrade,p->ChinGrade,p->EnglGrade,p->score);
for(k=1;k<80;k++)
printf("*");
pre->next=p->next;
free(p);
i--;
printf("\n删除成功\n");
}
}
else
printf("\n请先创建一个档案!\n");
}
void print()
{
int j;
node *p=head; //不用 p=head->next,是防止用户没建立档案就用此功能
system("cls");
for(j=1;j<80;j++)
printf("*");
printf("\n学号\t 姓名\t 数学 语文 英语 总分\n");
while(p&&p->next) //此技术好啊,防止最后一个结点,到下一个,则是空,
{
p=p->next;
printf("%-10ld%-15s%-3d\t %-2d \t%-3d \t%6d\n",p->id,p->name,p->MathGrade,p->ChinGrade,p->EnglGrade,p->score);
}
for(j=1;j<80;j++)
printf("*");
printf("\n");
}
void sort()
{
node *p=head,*pre,*q;
system("cls");
printf("\n\t\t************** 按总分对所有学生排序 ******************\n");
if(!p)
printf("\n请先创建一个档案!\n");
else
{
p=p->next;
if(!p)
printf("\n这档案没有任何学生信息!\n");
else
while(p)
{
pre=p;
q=p->next;
while(q)
{
if(p->score<q->score)
{
pre->next=q->next;
p=q;
q=pre->next;
p->next=head->next;
head->next=p;
}
q=q->next;
}
p=p->next;
}
}
}
void search()
{
int f;
system("cls");
printf("\n\t\t*************** 查找 ******************\n");
printf("\n\t 请选择查找方式!");
printf("\n\n\t\t 1.按学号查找\n\n\t\t 2.按姓名查找\n\n\t\t 3.回到主菜单\n\n");
do {
printf("\n\t\t You choice is[1--6]:__\b\b ");
scanf("%d",&f);
}while((f<1)||(f>3));
switch(f)
{case 1:Fn(); break;
case 2:findname(); break;
case 3:Menu(); break;
default :printf("ERROR");
}
}
void Fn()
{
long a;
system("cls");
printf("\nEnter the NUM of the student you want to search for:\n");
scanf("%d",&a);
findnum(a);
}
int findnum(long a)
{
node *p=head;
while(p&&p->next)
{
p=p->next;
if(p->id==a)
return 1;
}
return 0;
}
void findname()
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -