c语言学生管理系统链表(实现文件的读入读出功能)

大一期末作业终于告一段落

学生管理系统可以用来管理班级学生,能够对学生信息(包括姓名、性别、年龄、成绩等)进行增加、删除、更改、查询等操作。

该软件将学生信息保存在文件中,直接对文件中的数据进行增删改查操作,除了能够培养您的编程思维,还能让你深入了解文件操作。

废话不多说,下面贴代码(在VS2012环境下实测可以运行  在dev环境下测试可以运行)

#define LG (sizeof(struct student))
struct student
{
char name[10];//保存学生姓名
char sex[5];//保存学生的性别
long int num;//学号
int xuhao;//
int age;
float score[3];
float averange;
char DJ;//存放等级哦
struct student *next;

};//定义结构体变量保存 名字 性别 年龄 成绩] 结构体声明
int n;//存放学生人数
int man;//存放统计的男生数
int time=3000;//定义全局变量暂停时间
float JY(float a)//成绩校验函数
{
int n=0;
while(1)
{
if(a>100||a<0)
{
printf(" 输入成绩有误,范围应该0-100,请重新输入:");
scanf("%f",&a);
n=n+1;
}
else
{
return a;
}
}
}
struct student *creat(void)// 链表创建函数
{
struct student *head;//头指针 
struct student *p1,*p2,*p3;// 其他指针 
int mm=0;
int m=1;
n=0;
p1=p2=(struct student *)malloc(LG); // 开辟内存空间 
if(p1==NULL)
{
printf("开辟内存空间失败
");
}
//内存空间开辟后最后一定要释放
printf("请先输入学号(输入0退出录入)
");
printf(" ");
p1->xuhao=m;
m++;
scanf("%d",&p1->num);
if(p1->num!=0)
{
printf(" 请输入您的姓名
");
printf(" ");
scanf("%s",&p1->name);
printf(" 你好,%s!",p1->name);
printf("请输入您的性别male or female
");
//mm=sexJY((char*)p1->sex);//char **类型与char *类型不兼容 需要强制转换为char*类型
printf(" ");
scanf("%s",&p1->sex); 
mm=sexJY(p1->sex);
if(mm==1)
{ 
printf(" 请输入三科成绩,(语文成绩,数学成绩,外语成绩)
");
printf(" 第一科的成绩是:");
scanf("%f",&p1->score[0]); 
p1->score[0]=JY(p1->score[0]);//校验第一科的成绩	
printf(" 第二科的成绩是:");
scanf("%f",&p1->score[1]); 
p1->score[1]=JY(p1->score[1]);//校验第二科的成绩
printf(" 第三科的成绩是:");
scanf("%f",&p1->score[2]);
p1->score[2]=JY(p1->score[2]);//校验第三科的成绩
printf(" 录入完毕
");

_sleep(1000);
printf("-----------------------------------------------------------------------------------------------------------------
");

} 
} 

head=NULL;
while(1)
{
n=n+1;
if(n==1) 
{
head=p1; 
} 
else 
{
p3=(struct student *)malloc(LG);

printf("请先输入学号(输入0退出录入)
");
printf(" ");
p3->xuhao=m;
m++;
scanf("%d",&p3->num);

if(p3->num!=0)
{
printf(" 请输入您的姓名
");
printf(" ");
scanf("%s",&p3->name);
printf(" 你好,%s!",p3->name);
printf("请输入您的性别male or female
");
printf(" ");
scanf("%s",&p3->sex); 
mm=sexJY(p3->sex);//char **类型与char *类型不兼容 需要强制转换为char*类型
if(mm==1)
{

printf(" 请输入三科成绩,(语文成绩,数学成绩,外语成绩)
");
printf(" 第一科的成绩是:");
scanf("%f",&p3->score[0]); 
p3->score[0]=JY(p3->score[0]);//校验第一科的成绩	
printf(" 第二科的成绩是:");
scanf("%f",&p3->score[1]);
p3->score[1]=JY(p3->score[1]);//校验第二科的成绩
printf(" 第三科的成绩是:");
scanf("%f",&p3->score[2]);
p3->score[2]=JY(p3->score[2]);//校验第三科的成绩
printf(" 录入完毕
");
_sleep(1000);
printf("-----------------------------------------------------------------------------------------------------------------
");

p2->next=p3;
p2=p3;
printf("%d",n);
}
}
else
{
n--;
break;
}
}

}

p2->next=NULL;
return (head);
}////结构体链表创
void body()//界面设计
{ 
/*
char stCmd[128];
sprintf("mode con cols=%d lines=%d", height, width);
system(stCmd);动态设置窗体大小
*/
system("mode con cols=120 lines=40");
//system("color f4");
printf("
 ----------------------------------------------- 学生成绩管理系统-----------------------------------------------
"); 
printf("
");
printf("
");
printf(" ===========================
");
printf(" = 请先输入数据 =
");
printf(" ===========================
");
printf(" 请输入学生的信息,包含姓名、性别、年龄 、语文成绩、数学成绩、外语成绩。
 
 
");
printf(" ---------------------------------------------------------------------------------------------------------------
 "); 
printf("
");
}
void body2()//界面设计
{
printf("
 ----------------------------------------- 学生成绩管理系统-----------------------------------------------
"); 
printf("
");
printf("
");
printf(" ==========================
");
printf(" = 欢迎 =
");
printf(" 该系统共有%d个学生
",n);
printf(" ===========================
");
}
int showdata(struct student *head)//功能界面,
{
struct student *p;
int sexJY(char *sex);//性别校验函数
void *dell(struct student *head);//摧毁函数
struct student *del(struct student *head);
struct student *del2(struct student *head);//删除功能2
long int search(struct student *head);//查找功能
int showdata3(struct student *head);//系统设置
void print1(struct student *head);//打印功能1
void print2(struct student *head);//打印功能2
void print3(struct student *head);//打印功能3
void out1(struct student *head);//输出到文件功能
struct student *add(struct student *head);//添加功能
void cont(struct student *head);//计算功能1
void change1(struct student*head);//修改功能
struct student* input1();//外部导入功能
//void input1(struct student *head);//录入功能
//void change1(struct student*head, long int i)//修改功能 
struct student *add(struct student *head);//插入数据
struct student*nsert(struct student *head);
//	void destroy1(struct student *head);//摧毁链表
int TJ(struct student *head);//男生计算功能
int i;//存放学生编号 
int iii;//存放选择显示参数
int j;//存放选择参数 
int o;//选择颜色参数
long int ii;//存放需要修改的学生编号
long int jj;//存放需要查找的学生编号
char a;
p=head;

while(1)
{
body2();
printf("
");
printf("
");
printf("
---------- 学生成绩管理系统------------
"); 
printf("
");
printf(" 1 ======================
");
printf(" = 主菜单 =
");
printf(" ======================
");
printf("
");
printf(" 请根据需要选择操作
");
printf("
");
printf(" 选择查询的方式
");
printf(" (0) 输入0退出该系统
");
printf(" (1)增加一个同学信息 
");
printf(" (2)删除一个同学信息 
");
printf(" (3)修改一个学生信息 
");//完成
printf(" (4)计算学生的三科平均分并且给予等级 
");//完成
printf(" (5)显示所有学生的信息 
");//完成
//printf(" (6) 设置系统背景 
");//完成
printf(" (6) 数据存盘 
");//完成
printf(" (7) 查找一个学生的信息
");
printf(" (8) 统计男生的人数
");
printf(" (9) 局部显示学生的信息
");
printf(" (10) 系统设置
");
//printf(" (11) 选择显示时间
");
//printf(" (12) 删除所有学生的数据
");
//printf(" (13) 数据存盘
 ");
printf(" 请选择1-10
");

scanf("%d",&j);//选择不同的功能
if(j==0)
{
break;
}
if(j>=1&&j<=10)
{
switch(j)
{
case 1:
add(p);
_sleep(time);
system("cls");//清屏操作 
break;
case 2: 
del(p);
_sleep(time);
system("cls"); 
break;
case 3:
print3(p);
change1(p);
break;
// change1(p,ii);
system("cls"); 
break;
case 4:
cont(p);
//rank(stu);
_sleep(time);
system("cls"); 
break;
case 5:
print3(p);
_sleep(time);	
break;
case 6:
out1(p);
_sleep(time);
break;
/* case 6:
printf("请选择颜色
");
printf("(1)天蓝色");
printf("(2)红色");
printf(" (3) 白色 ");
printf(" (4) 亮白色 ");
printf(" (5)绿色 ");
scanf("%d",&o);
switch(o)
{
case 1:
system("color 0B");
break;
case 2:
system("color 0C");
break;
case 3:
system("color 07");
break;
case 4:
system("color 0F");
break;
case 5:
system("color 0A");
break;
default://其他值均为默认
system("color 07");
break;
}
break;*/
case 7:
printf("请输入要查找的学生学号");
search(p);
_sleep(time);
break;
case 8:
TJ(p);//计算男生人数
_sleep(time);
break;
case 9:
showdata2(p);
_sleep(time);
// _sleep(5000); 
break;
case 10://系统设置
showdata3(p);
_sleep(time);
break;

/* case 11:
printf("输入暂停时间(s),默认3s
");
scanf("%d",&time);
time=time*1000;
_sleep(time);
break;
*/
/*case 12:
printf("正在摧毁链表
");
dell(p);
time=time*1000;
_sleep(time);*/
/*case 13:
out1(p);
_sleep(time);
*/

}
}
else
{
printf("输入错误
");
_sleep(time);
system("cls");
}


}

}
int showdata2(struct student *head)
{

struct student *p;

int sexJY(char *sex);//性别校验函数
struct student *del(struct student *head);
struct student *del2(struct student *head);//删除功能2
//	long int search(struct student *head,long int i);//查找功能
void print1(struct student *head);//打印功能1
void print2(struct student *head);//打印功能2
void print3(struct student *head);//打印功能3
void cont(struct student *head);//计算功能1
void change1(struct student*head);
struct student *add(struct student *head);//插入数据
struct student*nsert(struct student *head);
int TJ(struct student *head);//男生计算功能
int iii;//存放学生的查询参数
p=head;
system("cls");//清屏
printf(" 1 ======================
");
printf(" = 副菜单 =
");
printf(" ======================
");
printf(" 选择查询的方式
");
printf("
 1.显示所有学生的成绩
");
printf("
 2.显示所有学生的学号性别
");
printf("
 3.显示所有学生的所有信息
");
printf(" 请选择1-3
");
scanf("%d",&iii);

switch (iii)
{
case 1:
print2(p);
_sleep(1000);
break;
case 2:
print1(p);
_sleep(1000);
break;
case 3:
print3(p);
_sleep(1000);
break;
default:
printf("输入错误,返回主菜单
");
break;
}

return 0;

}//二级菜单 
int showdata3(struct student *head)//系统设置选项
{
struct student *p;
int iii;
int o;
p=head;
system("cls");//清屏
printf(" 1 ======================
");
printf(" = 副菜单 =
");
printf(" ======================
");
printf(" 选择查询的方式
");
printf("
 (1). 设置系统背景 
");
printf("
 (2). 修改系统延时 
");
printf("
 (3). 删除链表所有数据并重新读入
");
printf(" 请选择1-2
");
scanf("%d",&iii);

switch (iii)
{
case 1:
printf("请选择颜色
");
printf("(1)天蓝色");
printf("(2)红色");
printf(" (3) 白色 ");
printf(" (4) 亮白色 ");
printf(" (5)绿色 ");
scanf("%d",&o);
switch(o)
{
case 1:
system("color 0B");
break;
case 2:
system("color 0C");
break;
case 3:
system("color 07");
break;
case 4:
system("color 0F");
break;
case 5:
system("color 0A");
break;
default://其他值均为默认
system("color 07");
break;
}
_sleep(1000);
break;
case 2:
printf("输入暂停时间(s),默认3s
");
scanf("%d",&time);
time=time*1000;
_sleep(time);
break;
case 3:
printf("正在摧毁链表
");
dell(p);
time=time*1000;
_sleep(1000);
break;
default:
printf("输入错误,返回主菜单
");
break;
}

return 0;

}
void print1(struct student *head)
{
struct student *p;
p=head;
if(head==NULL)
{
exit(0);
}
printf("------------------------------------------------------------------------------------------------------------------
");
do
{
printf("
 姓名:%s,学号%d,%s

",p->name,p->num,p->sex);//姓名,学号
p=p->next;
}while(p!=NULL);
}//不同显示数据的方式 第一种
void print2(struct student *head)//显示所有学生的成绩
{
struct student *p;
p=head;
if(head==NULL)
{
exit(0);
}
printf("------------------------------------------------------------------------------------------------------------------
");
do
{
printf("

 姓名%s,语文:%3.1f,数学:%3.1f,外语:%3.1f
",p->name,p->score[0],p->score[1],p->score[2]);
p=p->next;
}while(p!=NULL);
}//不同显示数据的方式 第二种
void print3(struct student *head)
{
float a;
struct student *p;
p=head;
if(head==NULL)
{
exit(0);
}

printf("------------------------------------------------------------------------------------------------------------------------------------------");
while(p!=NULL)
{
printf("

序号 %d 学号 %ld 姓名:%s 性别: %s 语文: %3.1f 数学:%3.1f 外语:%3.1f",p->xuhao,p->num,p->name,p->sex,p->score[0],p->score[1],p->score[2]);//姓名,性别
a=p->score[0]+p->score[1]+p->score[2];
printf(" 总分:%3.1f",a);
printf(" 等级%c
",p->DJ);
p=p->next;
}
}
int passwd(char *name, char *pwd) 
{
int u = 0;
if (strcmp(name, "root") == 0 && strcmp(pwd, "123456") == 0)
{
u =1;
return u;
}
else if (strcmp(name, "1") == 0 && strcmp(pwd, "1") == 0)
{
u = 1;
return u;
}
return 0;
}//密码校验函数 传递两个字符数组,一个账号,一个密码。
void change1(struct student*head)
{
long int i;
struct student *p;
p=head;//定义指针
if(head==NULL)
{
exit(0);
}
printf("输入想要修改的学生的学号:
");
scanf("%ld",&i);
do
{	
//printf("test1");
if(p->num==i)//当结点跳转到该学生时修改成绩
{

printf("开始修改信息
");
printf("请先输入学号
");
printf(" ");

scanf("%ld",&p->num);
if(p->num!=0)
{
printf(" 请输入您的姓名
");
printf(" ");
scanf("%s",&p->name);
printf(" 你好,%s!",p->name);
printf("请输入您的性别male or female
");

printf(" ");
scanf("%s",&p->sex); 
printf(" 请输入三科成绩,(语文成绩,数学成绩,外语成绩)
");
printf(" 第一科的成绩是:");
scanf("%f",&p->score[0]); 
p->score[0]=JY(p->score[0]);//校验第一科的成绩	
printf(" 第二科的成绩是:");
scanf("%f",&p->score[1]); 
p->score[1]=JY(p->score[1]);//校验第二科的成绩
printf(" 第三科的成绩是:");
scanf("%f",&p->score[2]);
p->score[2]=JY(p->score[2]);//校验第三科的成绩
printf(" 录入完毕
");
printf("-----------------------------------------------------------------------------------------------------------------
");
break; 
} 
p=p->next;//需要把下一个结点赋值给p

}


} while(p->next!=NULL);

 

 

 

}
void cont(struct student *head)//计算学生等级函数
{
struct student *p;
int i=0;
p=head;
if(head==NULL)
{
exit(0);
}
printf("------------------------------------------------------------------------------------------------------------------
");
printf("----------------------------------------计算中----------------------------------------
");
do{
p->averange=((p->score[0])+(p->score[1])+(p->score[2]))/3.0;
printf("第%d同学的成绩为%3.1f",i+1,p->averange);

if(p->averange>=90&&p->averange<=100)
{ 

printf(" 等级为A
",i+1);
p->DJ='A';
}
if(p->averange>=60&&p->averange<=89)
{

printf(" 等级为B
",i+1);
p->DJ='B';
}
if(p->averange>=0&&p->averange<=60)
{

printf(" 等级为C
",i+1);
p->DJ='C';
}
if(p->averange>100||p->averange<0)
{

printf(" incorrect
");
}
i=i+1;
p=p->next;



}while(p!=NULL);


}
long int search(struct student *head)//通过学号来查找学生的信息
{
struct student *p;
long jj;

scanf("%ld",&jj);
p=head;
if(head==NULL)
{
exit(0);
}
do{
if(jj==p->num)
{
printf("

学号 %ld 姓名:%s 性别: %s 语文: %3.1f 数学:%3.1f 外语:%3.1f 等级%c
",p->num,p->name,p->sex,p->score[0],p->score[1],p->score[2],p->DJ);
return 0;
}


p=p->next;
}while(p->next!=NULL);
//遍历链表结点

printf("无该生信息
");
return 0;

 


}
struct student *del(struct student *head)//链表怎么删除结点并链接 删除序号为多少的学生的成绩 定义一个结构体指针
{
int i,j;
struct student *p1,*p2;//定义两个结构体指针
if(head==NULL)
{
exit(0);
}
p1=head;//

p2=head;//p2指针依然指向head
printf("删除第几个节点的数据
");
scanf("%d",&i);//获得节点数据
for(j=1;j<i;j++)
{
p2=p1;//p2指向p1
p1=p1->next;//p1向后移动一个表
}
//此时指向删除数据的上一个位置
if(p1==head)//如果此时依然指向链表的头 则链表向后移动一位
{

// head=p1->next;//则通过p1向后一移动一位,链表向后移动了一位但是指针没动
head = p1->next;//逻辑完全正确啊
// free(p1);
printf("当前正在删除一个结点数据
");

//return head;
}
else//否则
{
p2->next=p1->next;//把p1指针指向下一个数据给p2指针指向下一个位置 这句话的意思是向后移动一位指针。
//把p1指针指向下一个数据给p2指针指向下一个位置 这句话的意思是向后移动一位指针。

}

while(head!=NULL)
{
printf("

序号 %d 学号 %ld 姓名:%s 性别: %s 语文: %3.1f 数学:%3.1f 外语:%3.1f",head->xuhao,head->num,head->name,head->sex,head->score[0],head->score[1],head->score[2]);//姓名,性别
//	a=p->score[0]+p->score[1]+p->score[2];
//printf(" 总分:%3.1f",a);
printf(" 等级%c
",head->DJ);
head=head->next;
} //删除第二行数据,之后的链条直接中断需要把链条接上
free(p1);//释放
n=n-1;
printf("
**********删除中 稍后*********
");

 

return head;//返回


}
struct student*nsert(struct student *head)
{
struct student *p1,*p,*q;
int i = 1;
int jj;
int mm;
int nn;
if(head==NULL)
{
exit(0);
}

printf("要插入的位置(尾插)1-%d:",n);
scanf("%d",&jj);//所要插入第几位学生信息
if(jj>=1&&jj<=n)
{


p = head->next ;
p1 = (struct student *)malloc(sizeof(struct student));
printf("请先输入学号(输入0退出录入)
");
printf(" ");
scanf("%ld",&p1->num);
if(p1->num!=0)
{
p1->xuhao=jj+1;
printf(" 请输入您的姓名
");
printf(" ");
scanf("%s",&p1->name);
printf(" 你好,%s!",p1->name);
printf("请输入您的性别male or female
");

printf(" ");
scanf("%s",&p1->sex); 
mm=sexJY((char*)p1->sex);//char **类型与char *类型不兼容 需要强制转换为char*类型
if(mm==1)
{
printf(" 请输入三科成绩,(语文成绩,数学成绩,外语成绩)
");
printf(" 第一科的成绩是:");
scanf("%f",&p1->score[0]); 
p1->score[0]=JY(p1->score[0]);//校验第一科的成绩	
printf(" 第二科的成绩是:");
scanf("%f",&p1->score[1]); 
p1->score[1]=JY(p1->score[1]);//校验第二科的成绩
printf(" 第三科的成绩是:");
scanf("%f",&p1->score[2]);
p1->score[2]=JY(p1->score[2]);//校验第三科的成绩
printf(" 录入完毕
");
n=n+1;//系统学生数自增1
printf("-----------------------------------------------------------------------------------------------------------------
");
}
}

if(1 == jj)
{
struct student*q = head->next ;
head->next = p1;
p1 ->next = q; 
}
else
while( p )
{
if(i == (jj-1))
{
struct student*q = p->next ;
p->next = p1;
p1->next = q;
}
p = p->next ;
i++;
}

return p;

}
else
{
printf("
---------录入错误---------
");
printf("请重试
");
return head;
}
}
int sexJY2(char *sex) 
{
int u = 0;
if (strcmp(sex, "male") == 0)
{
u =1;
return u;
}
return 0;
}
int sexJY(char *sex) 
{
int u = 0;
while(1)
{
if (strcmp(sex, "male") == 0 || strcmp(sex, "female") == 0)
{
u =1;
return u;
}
else
{
printf("性别错误请重新输入
");
scanf("%s",sex);

}
}
}
int TJ(struct student *head)
{
int sexJY2(char *sex);
int mm;
int nn;
struct student *p;
if(head==NULL)
{
exit(0);
}
p=head;
do
{ 
nn=sexJY((char*)p->sex);//强制转换

if(nn==1)
{
man++;
}

p=p->next;//一直向下指直到



}while(p!=NULL);

printf("
男生人数为:%d
",man);
return 0;
}//遍历整个链表 计算男生的人数
int in()
{

int i,j;
int m;
int n=0;//如果密码输入错误三次则跳出循环
char user[20]={'0'};
char pas[20]={'0'};
char aa[20]={' ','U','s','e','r',' ','N','a','m','e',':'};//输出账号登陆
char bb[20]={' ','P','a','s','s','w','o','r','d',':'};
system("mode con cols=45 lines=15");
while(1)
{
printf("
");
for(i=0;i<12;i++)
{
printf("%c",aa[i]);
_sleep(50);

}
//printf(" User Name:");
gets(user);//输入账号
for(i=0;i<10;i++)
{
printf("%c",bb[i]);
_sleep(50);

}
gets(pas);//如何隐藏输入的密码 安全性getch(); printf("*");
m=passwd(user,pas);
if(m==1)
{
return m;
}
else
{
n++; 
printf("incorrect please try again
");
if(n==3)
{
system("color 04");
system("cls");
while(1)
{
printf("快滚出老子的魔仙堡!!!!
");
_sleep(1000);
}
return 0;
}
}
}
}
struct student *add(struct student *head)
{
struct student *p,*p1,*p2;
int i = 1;
int jj;
int mm;
int nn;
p=head;
printf("输入要插入的位置1-%d: ",n);
scanf("%d",&i);
jj=i;

p1=(struct student*)malloc(LG);//开辟p1内存空间
p2=(struct student*)malloc(LG);//开辟p2内存空间
printf("请先输入学号(输入0退出录入)
");
printf(" ");
scanf("%ld",&p1->num);
if(p1->num!=0)
{
p1->xuhao=jj+1;
printf(" 请输入您的姓名
");
printf(" ");
scanf("%s",&p1->name);
printf(" 你好,%s!",p1->name);
printf("请输入您的性别male or female
");

printf(" ");
scanf("%s",&p1->sex); 
mm=sexJY((char*)p1->sex);//char **类型与char *类型不兼容 需要强制转换为char*类型
if(mm==1)
{
printf(" 请输入三科成绩,(语文成绩,数学成绩,外语成绩)
");
printf(" 第一科的成绩是:");
scanf("%f",&p1->score[0]); 
p1->score[0]=JY(p1->score[0]);//校验第一科的成绩	
printf(" 第二科的成绩是:");
scanf("%f",&p1->score[1]); 
p1->score[1]=JY(p1->score[1]);//校验第二科的成绩
printf(" 第三科的成绩是:");
scanf("%f",&p1->score[2]);
p1->score[2]=JY(p1->score[2]);//校验第三科的成绩
printf(" 录入完毕
");
printf("-----------------------------------------------------------------------------------------------------------------
");
}
}
if(i==1)//如果插入点为头部head 则
{
p2=head->next;
head->next=p1;
p1->next=p2;
n=n+1;//系统学生数自增1
return head;
}
else
{
p=head;
if(i==n)
{
//如果输入等于n
while(p->next!=NULL)
{
p=p->next;
}
p->next=p1;
p1->next=NULL;
//插入函数写完后一定要把指针指向空
//printf("%d",p1->xuhao);
n=n+1;
return head;

}
else
{
//如果不是头也不是尾巴
//则从中间插
while(i--)
{
p=p->next;

}
//	printf("已找到");
p2=p->next;
p->next=p1;
p1->next=p2;
n=n+1;
return head;

}
}
}
void *dell(struct student *head)
{
struct student *p=head;
free(p);
printf("

链表已摧毁

");


}
int choose(int i)
{
printf("
 ----------------------------------------------- 学生成绩管理系统-----------------------------------------------
"); 
printf("
");
printf("
");
printf(" 请选择信息录入的方式
");
printf(" ===========================
");
printf(" = (1)手动输入 =
");
printf(" = (2)通过外部导入信息 =
");
printf(" ===========================
");
printf(" 请选择:");
while(1)
{
scanf("%d",&i);
if(i==1||i==2)
{
//printf("%d",n);
return i;
}
else
{
printf("
 请输入一个有效的值:");
}

}


}
void load()
{
printf("
该功能还在完善中
 敬请期待
");

}
//实现输出输入文件的功能
void out1(struct student *head)
{
FILE *out;
struct student *p;
char outfile[20];
char ch;
int i;
ch=getchar();
if((out=fopen("stu.txt","wb"))==NULL)
{
printf(" 找不到输出文件");
exit(0);
}
p=head;
while(p!=NULL)
{
if(fwrite(p,LG,1,out)!=1) 
{ 
printf("
写入数据出错
"); 
fclose(out); 
return; 
} 
p=p->next;
} 
fclose(out); 
} 
struct student *input1 () 
{ 
struct student *head = NULL; 
struct student *p1, *p2;//s = p1;p = p2; 

FILE *fp; 
if((fp=fopen("stu.txt","rb+"))==NULL) 
{ 
printf("打开文件出错
"); 
exit(0); 
} 
while(!feof(fp)) { 
if((p1=(struct student*)malloc(LG))==NULL){ 
printf("内存申请出错
"); 
fclose(fp); 
exit(0); 
} 
if(fread(p1,LG,1,fp)!=1){ 
free(p1); 
break; 
} 
if(head==NULL) 
{
head=p2=p1;
n=n+1;
} 
else{ 
p2->next=p1; 
p2=p1;
n=n+1;
} 
} 
fclose(fp); 
return (head); 
}

  

  登陆界面

实现文件的读入功能

主菜单的设计  还有相关的二级菜单

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>
#include<windows.h>
#include"xyf.h"
int main(void)
{
    struct student *p;
    int m=1;//注意要修改回来
	int zz=0;
    //system("cls"); 
    //m=in();
   if(m==1)
   {
	system("color 07");
	zz=choose(zz);
	switch (zz)
	{
case 1:
	body();
    //data(p);
	p=creat();
	showdata(p);
	break;
case 2:
	printf("
   -----------------------------------------------正在导入-----------------------------------------------
"); 
	p=input1();
	showdata(p);
	break;
	}
    }
   
     _sleep(1000);
     return 0;

} 
/*增加一个同学信息
删除一个同学信息
修改一个学生信息
查找一个学生信息(按姓名、按学号)
等级计算
统计男生人数
显示学生信息(局部或全部)
学生成绩管理系统
要求:

定义学生结构体数据类型。在此类型中,应该包括三个成员变量(学号、姓名、成绩)。

定义个学生数组保存学生的信息。用一个变量来记录学生人数。
	添加学生的信息。
	显示学生的信息。
	删除学生的信息。
	查找学生的信息,根据姓名。
	统计学生的信息。


第一步:菜单界面设计
提示:
1、程序功能的展示:输出语句

2、提供用户选择功能的接口:输入语句

3、对用户输入的范围校验:if结构

4、对用户选择的响应:switch结构

5、单个函数头的定义


第二步:
1、结构体构造(函数外面的地方)
2、设计输入函数,实现一个信息的输入;
3、设计输出函数,实现一个信息的输出。

4、提示:变量的定义位置,解决数据共享问题。
方法一:定义在主函数中,通过函数参数传递的方式进行。

方法二:定义为全局变量,实现数据的共享(变量的作用域)


程序结构:
//引入头文件
include

//函数原型声明
void add();

//结构体定义(构造)
struct A{……};

//主函数定义
int main()
{

}

//子函数定义
void add()
{……}


第三步:采用数组解决全班信息的存储、显示问题

1、采用宏定义的方式声明学生人数
2、定义数组,定义数组的数组下标采用宏定义符号
struct stu s[N];
for(int i=0;i<N;i++) 
{
    //单个数据输入代码        
}

3、对数组操作,显示全班信息

第四步:结构体变量定义在主函数中,通过函数参数传递的方式进行数据共享。
1、一个数据的处理
main()
{
   ……
   struct stu s;  //结构体变量的定义
   sr(&s);         //实参传递
   …… 
}

//单个数据输入函数
void sr(struct stu * x)
{  
   //对形参变量x赋值 
   scanf("%d",&(*x).xh);
   scanf("%d",&(x->xh));
}

2、多个数据的处理
main()
{
   ……
   struct stu s[10];  //结构体变量的定义
   for(i=0;i<10;i++)
      sr(&s[i]);         //实参传递
   …… 
}

//单个数据输入函数
void sr(struct stu * x)
{  
   //对形参变量x赋值 
   scanf("%d",&(*x).xh);
   scanf("%d",&(x->xh));
}
*/
/*
/*1、声明一个结构体类型student,包含姓名、性别、年龄、语文成绩、数学成绩、外语成绩等成员。
2、编写程序:输入2个同学的基础信息,分别求出2个同学的语文平均成绩。
3、编写程序:输入10个同学的基础信息,显示同学的基础信息。
4、设计多个显示功能函数:
(1)显示学生的姓名、性别
(2)显示学生的姓名、年龄
(3)显示学生的姓名、总分
编写程序:让用户有选择的查看10位同学的信息。
5、给结构体类型student新增成员:等级
设计等级测试函数:根据3科平均分计算出学生等级(A:100-90;  B:89-60;   C:60-0)
编写程序:让用户有选择的使用系统功能。
6、学生管理系统
7.链表+指针
学生成绩管理系统
               2016级物联网2班
1.代码优化
3.框架
4.增加功能
5.输出定向文件
*/

  

原文地址:https://www.cnblogs.com/a986771570/p/7051129.html