/*
程序功能:
能完成每位学生的某门课程的平时成绩和期末考试成绩的录入,
完成每位学生的总评成绩计算(平时成绩*30%+期末考试成绩*70%)并生成数据文件,
生成分数段统计文件(不及格人数,60-69数,70-79人数,80-89人数,90-100人数,及格率),
通过学生成绩的数据文件查询学生成绩(查询条件自定)。
通过学生成绩的分段统计文件输出学生成绩分段情况和及格率。
程序要求:
(1)能够完成300人以内任何人数的成绩处理。
(2)程序要有主控菜单
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct stud
{
long num
char name[20]
double score
}
typedef struct stucode
{
struct stud student
struct stucode *next
}L
void menu()
void createlist(struct stucode **r)
void out(struct stucode *r)
void search1(struct stucode *r)
void search2(struct stucode *r)
void del(struct stucode **r)
void insert(struct stucode **r)
void sort(struct stucode **r)
void main()
{
char choose
int flag=1
struct stucode *r=NULL
while(flag)
{
system("cls")
menu()
choose=getchar()
switch(choose)
{
case '1':
createlist(&r)
out(r)
printf("Testing function 1\nPress any key to continue\n")
getchar()
getchar()
break
case '2':
search1(r)
printf("Testing function 1\nPress any key to continue\n")
getchar()
getchar()
break
case '3':
search2(r)
printf("Testing function 1\nPress any key to continue\n")
getchar()
getchar()
break
case '4':
del(&r)
out(r)
printf("Testing function 1\nPress any key to continue\n")
getchar()
getchar()
break
case '5':
insert(&r)
out(r)
printf("Testing function 1\nPress any key to continue\n")
getchar()
getchar()
break
case '6':
sort(&r)
out(r)
printf("Testing function 1\nPress any key to continue\n")
getchar()
getchar()
break
case '7':
out(r)
printf("Testing function 7\nPress any key to continue\n")
getchar()
getchar()
break
case '0':
flag=0
printf("The end.\n")
break
default: printf("\nWrong Selection!(选择错误,请重选!)\n")getchar()getchar()
}
}
}
void createlist(struct stucode **r)
{
struct stucode *p,*t
long n
char a[20]
double s
if(*r) *r=NULL
printf(" \n请输入:\n 学号(请按学号升序排列) 姓名 分数 (若要结束请输入三个为零)\n")
scanf("%ld%s%lf",&n,a,&s)
if(n==0) return
p=(L *)malloc(sizeof(L))
p->student.num=n
strcpy(p->student.name,a)
p->student.score=s
p->next=NULL
*r=p
scanf("%ld%s%lf",&n,a,&s)
while(n)
{
t=p
p=(L *)malloc(sizeof(L))
p->student.num=n
strcpy(p->student.name,a)
p->student.score=s
p->next=NULL
t->next=p
scanf("%ld%s%lf",&n,a,&s)
}
}
void search1(struct stucode *r)
{
long x
if(!r)
{
printf("没有学生信息可查询!\n")
return
}
printf(" 请输入要查询的学生信息的学生学号:\n")
scanf("%ld",&x)
while(r&&r->student.num!=x)
r=r->next
if(r==NULL)
printf("Error! No such student !\n")
else
printf("%ld %s %.2lf\n",r->student.num,r->student.name,r->student.score)
}
void search2(struct stucode *r)
{
char m[20]
if(!r)
{
printf("没有学生信息可查询!\n")
return
}
printf(" 请输入要查询的学生信息的学生姓名:\n")
scanf("%s",m)
while(r&&strcmp(r->student.name,m))
r=r->next
if(r==NULL)
printf("Error! No such student !\n")
else
printf("%ld %s %.2lf\n",r->student.num,r->student.name,r->student.score)
}
void del(struct stucode **r)
{
long k
struct stucode *p=*r,*t
if(!(*r))
{
printf("没有学生信息可删除 !\n")
return
}
printf(" 请输入要删除的学生信息的学生学号:\n")
scanf("%ld",&k)
if(p->student.num==k)
*r=(*r)->next,free(p)
else
{
while(p->next&&p->next->student.num!=k)
p=p->next
if(p->next==NULL)
printf("Error! No such student !\n")
else
{
t=p->next
p->next=p->next->next
free(t)
}
}
}
void insert(struct stucode **r)
{
long n
char a[20]
double s
L *p,*t,*k
printf(" 请输入要插入的学生信息的学生学号 姓名 分数:\n")
scanf("%ld%s%lf",&n,a,&s)
p=(L *)malloc(sizeof(L))
p->student.num=n
p->student.score=s
strcpy(p->student.name,a)
if(!(*r))
{
*r=p
(*r)->next=NULL
return
}
if(p->student.num<(*r)->student.num)
p->next=(*r),(*r)=p
else
{
t=*r
k=t
while(t->next&&t->next->student.num<=p->student.num)
t=t->next
p->next=t->next
t->next=p
*r=k
}
}
void sort(struct stucode **r)
{
struct stucode *t,*p,*q,*z
if(!r)
{
printf("没有学生信息可排序!\n")
return
}
if(!(*r)||!(*r)->next)
return
t=*r
p=t->next
t->next=NULL
while(p)
{
q=p->next
if(p->student.score>t->student.score)
{
p->next=t
t=p
}
else
{
z=t
while(z->next&&z->next->student.score>=p->student.score)
z=z->next
p->next=z->next
z->next=p
}
p=q
}
*r=t
}
void out(struct stucode *r)
{
printf("\n\n")
if(!r)
{
printf("没有学生信息可输出!\n")
return
}
while(r)
{
printf("%ld %s %.2lf\n",r->student.num,r->student.name,r->student.score)
r=r->next
}
printf("\n\n")
}
void menu()
{
printf("\n 学生信息管理系统\n")
printf("\n 菜单\n\n")
printf("\n 1建立链表并显示\n")
printf("\n 2查找某学号的学生信息\n")
printf("\n 3查找某姓名的学生信息\n")
printf("\n 4删除某学号的学生信息\n")
printf("\n 5插入新的学生信息\n")
printf("\n 6按分数降序排列输出\n")
printf("\n 7输出\n")
printf("\n 0退出\n")
printf("\n 请选择您要执行的选项:\n")
}
#include<stdio.h>#include<string.h>
#include<stdlib.h>
#include<conio.h>
#define max 20
typedef struct student//学生
{
char sno[max]// 学号
char sname[max] //姓名
char sex[max] //性别
char age[max] //年龄
char depart[max] //系
char classs[max] //班
char grade[max]//年级
struct student* next
} student
student* head
int LogOn() //登录模块,已实现输入密码不回显,如果中途发现输错某几位,可退格键重输
{
char username[max],password[max]
printf("\n请输入用户名:")
scanf("%s",username)
printf("\n请输入密码(最多15位):")
//开始以不回显且支持退格方式获取输入密码
int i=0
while((i>=0)&&(password[i++]=getch())!=13)//条件i>=0是用于限制退格的范围
{
if(password[i-1]=='\b')//对退格键的处理
{
printf("%c%c%c",'\b','\0','\b')
i=i-2
}
else
printf("*")
}
password[--i]='\0'
//已获取密码。验证用户身份
if(!strcmp(username,"zhang")&&!strcmp(password,"8147086"))
{
printf("\n登录成功!")
return 1
}
else
return 0
}
void regist()
{
char ch
student *s,*ptr //s用来建新结点,ptr用来暂存头结点
do
{
s=(student*)malloc(sizeof(student))// 新建一个学生结点
printf("\n开始注册...") //开始注册
printf("\n请输入该学生的学号:")
scanf("%s",s->sno)
printf("\n请输入该学生的姓名:")
scanf("%s",s->sname)
printf("\n请输入该学生的性别:")
scanf("%s",s->sex)
printf("\n请输入该学生的年龄:")
scanf("%s",s->age)
printf("\n请输入该学生的系:")
scanf("%s",s->depart)
printf("\n请输入该学生所在的班:")
scanf("%s",s->classs)
printf("\n请输入该学生所在的年级")
scanf("%s",s->grade)
ptr=head
head=s//将新结点插入队头
s->next=ptr
fflush(stdin)
printf("\n请问是否继续注册?(Y/N)")
scanf("%c",&ch)
}while(ch=='Y'||ch=='y')
return
}
void ElePrint(char str[]) //输出单个元素
{
if(str==NULL) exit(0)
printf("%s",str)
for(unsigned int i=0i<12-strlen(str)i++) printf(" ")//为了对齐输出,需插入一些空格
return
}
int LinePrint(student *ptr) //输出一行
{
if(ptr==NULL) //检查传进来的指针
return 0
printf("\n")
ElePrint(ptr->sno)
ElePrint(ptr->sname)
ElePrint(ptr->age)
ElePrint(ptr->sex)
ElePrint(ptr->depart)
ElePrint(ptr->classs)
ElePrint(ptr->grade)
return 1
}
void print() //输出全部学生信息
{
student *ptr=head
printf("\n学号姓名年龄性别系 班 年级")
while(ptr)
{
LinePrint(ptr)
ptr=ptr->next
}
printf("\n")
return
}
void search()//查询模块
{
int method//查询方式
char no[max],name[max],departm[max],clss[max],grades[max]//用来接收查询关键字
while(1)
{
printf("\n请选择查询方式")
printf("\n1.按学号查询")
printf("\n2.按姓名查询")
printf("\n3.按所在系查询")
printf("\n4.按所在班级查询")
printf("\n5.按所在年级查询")
printf("\n6.打印全部学生信息")
printf("\n7.返回主菜单\n")
scanf("%d",&method)
student *p=head,*temp
switch(method)
{
case 1:
printf("\n请输入要查询的学号:")
scanf("%s",no)
while(p)
{
if(!strcmp(p->sno,no))
break
else
{
temp=p
p=p->next
}
}
printf("\n学号姓名年龄性别系 班 年级")
LinePrint(p)
break
case 2:
printf("\n请输入要查询的姓名:")
scanf("%s",name)
printf("\n学号姓名年龄性别系 班 年级")
while(p)
{
if(!strcmp(p->sname,name))
LinePrint(p)
p=p->next
}
break
case 3:
printf("\n请输入学生所在的系:")
scanf("%s",departm)
printf("\n学号姓名年龄性别系 班 年级")
while(p)
{
if(!strcmp(p->depart,departm))
LinePrint(p)
p=p->next
}
break
case 4:
printf("\n请输入学生所在的班:")
scanf("%s",clss)
printf("\n请输入学生所在的年级:")
scanf("%s",grades)
printf("\n学号姓名年龄性别系 班 年级")
while(p)
{
if(!strcmp(p->classs,clss)&&!strcmp(p->grade,grades))
LinePrint(p)
p=p->next
}
break
case 5:
printf("\n请输入学生所在的年级:")
scanf("%s",grades)
printf("\n学号姓名年龄性别系 班 年级")
while(p)
{
if(!strcmp(p->grade,grades))
LinePrint(p)
p=p->next
}
break
case 6:
print()
break
case 7:
return
default:
printf("很抱歉,暂无此查询方式!")
break
}
}
}
void modify()//修改学生信息
{
char num[max]
student *p=head
printf("\n请输入要修改的学生的学号:")
scanf("%s",num)
while(p)
{
if(!strcmp(p->sno,num))
break
else
p=p->next
}
if(p==NULL)
{
printf("\n错误:没有此学生的信息!\n")
return
}
LinePrint(p)
printf("\n请输入要修改的该学生的信息:")
printf("\n1.姓名")
printf("\n2.性别")
printf("\n3.年龄")
printf("\n4.所在的系")
printf("\n5.所在的班")
printf("\n6.所在的年级")
char name1[max],sex1[max],age1[max],depart1[max],class1[max],grade1[max]
int select
fflush(stdin)
scanf("%d",&select)
printf("\n请输入新的信息:")
switch(select)
{
case 1:
scanf("%s",name1)
strcpy(p->sname,name1)
break
case 2:
scanf("%s",sex1)
strcpy(p->sex,sex1)
break
case 3:
scanf("%s",age1)
strcpy(p->age,age1)
break
case 4:
scanf("%s",depart1)
strcpy(p->depart,depart1)
break
case 5:
scanf("%s",class1)
strcpy(p->classs,class1)
break
case 6:
scanf("%s",grade1)
strcpy(p->grade,grade1)
break
default:
printf("\nError!")
break
}
LinePrint(p)
return
}
void del()// 删除某学生的信息
{
student *p=head,*temp=head,*s
char num1[max]
printf("\n请输入要删除的学生的学号:")
scanf("%s",num1)
while(p)//查找该学生所在的结点
{
if(!strcmp(p->sno,num1))
break
else
{
temp=p
p=p->next
}
}//while
if(!p)
{
printf("\n不存在此学生的信息.")
return
}
LinePrint(p)//输出该学生的信息
printf("\n请问真的要删除该学生的信息吗?(Y/N)")
char ch
fflush(stdin)
scanf("%c",&ch)
if(ch=='Y'||ch=='y')
{
s=p->next
temp->next=s
free(p)
printf("\n已经删除该学生的信息.")
}
return
}
void sort() //排序模块。将学生记录按学号从小到大排列。用起泡排序算法实现
{
student *ptr,*s=head,*p
int count=0,count1
while(s)//统计链表结点个数
{
count++
s=s->next
}
for(int i=1i<counti++)
{
ptr=head
p=NULL
count1=count-i//用来控制每轮起泡排序的终点,即每次把学号最小的结点移到倒数第i个结点
while(ptr&&ptr->next&&(count1--))
{
if(strcmp(ptr->sno,ptr->next->sno)>0)
{
s=ptr->next
ptr->next=s->next
if(p==NULL) //ptr处于队头时
head=s
else
p->next=s
s->next=ptr
p=s
}
else
{
ptr=ptr->next
if(p==NULL) //ptr处于队头时
p=head
else
p=p->next
}
}
}
return
}
void quit()
{
char ch
printf("\n真的要退出?(Y/N)")
fflush(stdin)
scanf("%c",&ch)
if(ch=='Y'||ch=='y')
exit(0)
return
}
int main()
{
int option
printf("\nCopyright@2005 KongXinCai All rights reserved.")
printf("\n欢迎使用学生信息管理系统!\n")
//登录模块
int icheck=0
while(icheck<3)
{
if(LogOn()==0)
icheck++
else
break
}
if(icheck==3)
{
printf("\n连续登录三次不成功,退出!")
exit(0)
}
//系统界面
while(1)
{
printf("\n\n请选择需要的服务:")
printf("\n1.注册")
printf("\n2.查询")
printf("\n3.修改")
printf("\n4.删除")
printf("\n5.排序")
printf("\n7.求平均")
printf("\n6.退出\n")
scanf("%d",&option)
switch(option)
{
case 1:
regist()
break
case 2:
search()
break
case 3:
modify()
break
case 4:
del()
break
case 5:
sort()
break
case 6:
quit()
break
}
}
return 0
}
#include "stdio.h"/*定义学生结构体*/
struct Student
{
char ID[20]
char Name[20]
float Mark1
float Mark2
float Mark3
float Average
}
/*声明学生数组及学生数量*/
struct Student students[1000]
int num=0
/*求平均值*/
float Avg(struct Student stu)
{
return (stu.Mark1+stu.Mark2+stu.Mark3)/3
}
/*通过学号返回数组下标*/
int Student_SearchByIndex(char id[])
{
int i
for (i=0i<numi++)
{
if (strcmp(students[i].ID,id)==0)
{
return i
}
}
return -1
}
/*通过姓名返回数组下标*/
int Student_SearchByName(char name[])
{
int i
for (i=0i<numi++)
{
if (strcmp(students[i].Name,name)==0)
{
return i
}
}
return -1
}
/*显示单条学生记录*/
void Student_DisplaySingle(int index)
{
printf("%10s%10s%8s%8s%8s%10s\n","学号","姓名","成绩","成绩","成绩","平均成绩")
printf("-------------------------------------------------------------\n")
printf("%10s%10s%8.2f%8.2f%8.2f%10.2f\n",students[index].ID,students[index].Name,
students[index].Mark1,students[index].Mark2,students[index].Mark3,students[index].Average)
}
/*插入学生信息*/
void Student_Insert()
{
while(1)
{
printf("请输入学号:")
scanf("%s",&students[num].ID)
getchar()
printf("请输入姓名:")
scanf("%s",&students[num].Name)
getchar()
printf("请输入成绩:")
scanf("%f",&students[num].Mark1)
getchar()
printf("请输入成绩:")
scanf("%f",&students[num].Mark2)
getchar()
printf("请输入成绩:")
scanf("%f",&students[num].Mark3)
getchar()
students[num].Average=Avg(students[num])
num++
printf("是否继续?(y/n)")
if (getchar()=='n')
{
break
}
}
}
/*修改学生信息*/
void Student_Modify()
{
float mark1,mark2,mark3
while(1)
{
char id[20]
int index
printf("请输入要修改的学生的学号:")
scanf("%s",&id)
getchar()
index=Student_SearchByIndex(id)
if (index==-1)
{
printf("学生不存在!\n")
}
else
{
printf("你要修改的学生信息为:\n")
Student_DisplaySingle(index)
printf("-- 请输入新值--\n")
printf("请输入学号:")
scanf("%s",&students[index].ID)
getchar()
printf("请输入姓名:")
scanf("%s",&students[index].Name)
getchar()
printf("请输入成绩:")
scanf("%f",&students[index].Mark1)
getchar()
printf("请输入成绩:")
scanf("%f",&students[index].Mark2)
getchar()
printf("请输入成绩:")
scanf("%f",&students[index].Mark3)
getchar()
students[index].Average=Avg(students[index])
}
printf("是否继续?(y/n)")
if (getchar()=='n')
{
break
}
}
}
/*删除学生信息*/
void Student_Delete()
{
int i
while(1)
{
char id[20]
int index
printf("请输入要删除的学生的学号:")
scanf("%s",&id)
getchar()
index=Student_SearchByIndex(id)
if (index==-1)
{
printf("学生不存在!\n")
}
else
{
printf("你要删除的学生信息为:\n")
Student_DisplaySingle(index)
printf("是否真的要删除?(y/n)")
if (getchar()=='y')
{
for (i=indexi<num-1i++)
{
students[i]=students[i+1]
}
num--
}
getchar()
}
printf("是否继续?(y/n)")
if (getchar()=='n')
{
break
}
}
}
/*按姓名查询*/
void Student_Select()
{
while(1)
{
char name[20]
int index
printf("请输入要查询的学生的姓名:")
scanf("%s",&name)
getchar()
index=Student_SearchByName(name)
if (index==-1)
{
printf("学生不存在!\n")
}
else
{
printf("你要查询的学生信息为:\n")
Student_DisplaySingle(index)
}
printf("是否继续?(y/n)")
if (getchar()=='n')
{
break
}
}
}
/*按平均值排序*/
void Student_SortByAverage()
{
int i,j
struct Student tmp
for (i=0i<numi++)
{
for (j=1j<num-ij++)
{
if (students[j-1].Average<students[j].Average)
{
tmp=students[j-1]
students[j-1]=students[j]
students[j]=tmp
}
}
}
}
/*显示学生信息*/
void Student_Display()
{
int i
printf("%10s%10s%8s%8s%8s%10s\n","学号","姓名","成绩","成绩","成绩","平均成绩")
printf("-------------------------------------------------------------\n")
for (i=0i<numi++)
{
printf("%10s%10s%8.2f%8.2f%8.2f%10.2f\n",students[i].ID,students[i].Name,
students[i].Mark1,students[i].Mark2,students[i].Mark3,students[i].Average)
}
}
/*将学生信息从文件读出*/
void IO_ReadInfo()
{
FILE *fp
int i
if ((fp=fopen("Database.txt","rb"))==NULL)
{
printf("不能打开文件!\n")
return
}
if (fread(&num,sizeof(int),1,fp)!=1)
{
num=-1
}
else
{
for(i=0i<numi++)
{
fread(&students[i],sizeof(struct Student),1,fp)
}
}
fclose(fp)
}
/*将学生信息写入文件*/
void IO_WriteInfo()
{
FILE *fp
int i
if ((fp=fopen("Database.txt","wb"))==NULL)
{
printf("不能打开文件!\n")
return
}
if (fwrite(&num,sizeof(int),1,fp)!=1)
{
printf("写入文件错误!\n")
}
for (i=0i<numi++)
{
if (fwrite(&students[i],sizeof(struct Student),1,fp)!=1)
{
printf("写入文件错误!\n")
}
}
fclose(fp)
}
/*主程序*/
main()
{
int choice
IO_ReadInfo()
while(1)
{
/*主菜单*/
printf("\n------ 学生成绩管理系统------\n")
printf("1. 增加学生记录\n")
printf("2. 修改学生记录\n")
printf("3. 删除学生记录\n")
printf("4. 按姓名查询学生记录\n")
printf("5. 按平均成绩排序\n")
printf("6. 退出\n")
printf("请选择(1-6):")
scanf("%d",&choice)
getchar()
switch(choice)
{
case 1:
Student_Insert()
break
case 2:
Student_Modify()
break
case 3:
Student_Delete()
break
case 4:
Student_Select()
break
case 5:
Student_SortByAverage()
Student_Display()
break
case 6:
exit()
break
}
IO_WriteInfo()
}
}