C语言 学生管理系统

Python023

C语言 学生管理系统,第1张

#include

#include

#include

#include

#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

}

参考如下学生信息管理系统的C源代码吧。

#include <stdio.h>

#include <string.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)

}

/*主程序*/

void 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(0)

              break

         }

         IO_WriteInfo()

     }

}