C语言 学生管理系统

Python010

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

}

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

#define MAX 1000

/*定义学生成绩信息结构*/

struct stu

{

char id[8]

char name[8]

double Chinese

double Math

double English

double average

double total

}

/*学生结构数组,用于存储学生成绩信息*/

struct stu students[MAX]

/*当前学生人数*/

int current

void input()

{

int i

printf("请输入学生人数:")

scanf("%d", &current)

for (i = 0i <currenti++)

{

printf("\n请输入学生学号,最多为7位数: ")

scanf("%s", students[i].id)

printf("请输入学生姓名:")

scanf("%s", students[i].name)

printf("请输入语文成绩:")

scanf("%lf", &students[i].Chinese)

printf("请输入数学成绩:")

scanf("%lf", &students[i].Math)

printf("请输入英语成绩:")

scanf("%lf", &students[i].English)

students[i].total = students[i].Chinese + students[i].Math + students[i].English

students[i].average = students[i].total / 3

}

}

/*排名次,即对学生结构数组排序*/

void sort(struct stu array[], int n)

{

int i, j

struct stu temp

for (i = 0i <ni++)

{

for (j = i+1j <nj++)

{

if (array[i].average - array[j].average <1e-16)

{

temp = array[i]

array[i] = array[j]

array[j] = temp

}

}

}

}

/*统计平均成绩,并输出各分数段的人数*/

void print_score(struct stu array[], int n)

{

int i

double ave = 0

int sum1 = 0, sum2 = 0, sum3 = 0, sum4 = 0

for (i = 0i <ni++)

{

ave += array[i].average

switch ((int)(array[i].average / 10))

{

case 10:

case 9: sum1++break

case 8: sum2++break

case 7:

case 6: sum3++break

default: sum4++

}

}

printf("全班的平均分为:%.1f\n", ave/n)

printf("平均分在90分以上的人数为:%d\n", sum1)

printf("平均分在80~89的人数为:%d\n", sum2)

printf("平均分在60~79的人数为:%d\n", sum3)

printf("平均分在60分以下的人数为:%d\n", sum4)

}

/*输出不及格科目及学生名单*/

void print_unreach(struct stu array[], int n)

{

int i

printf("科目\t学号\t名字\n")

for (i = 0i <ni++)

{

if (array[i].Chinese <60)

{

printf("语文\t%s\t%s\n", array[i].id, array[i].name)

}

if (array[i].Math <60)

{

printf("数学\t%s\t%s\n", array[i].id, array[i].name)

}

if (array[i].English <60)

{

printf("英语\t%s\t%s\n", array[i].id, array[i].name)

}

}

}

/*打印优等生名单*/

void print_good(struct stu array[], int n)

{

int i

char mark = 0

if (n >3)

{

n = 3

}

printf("学号\t姓名\t语文\t数学\t英语\t平均分\t名次\n")

for (i = 0i <ni++)

{

if ((array[i].Chinese >60) &&(array[i].Math >60) &&(array[i].English >60))

{

if (array[i].average >90) mark = 1

else if (array[i].average >85)

{

if (array[i].Chinese == 100) mark = 1

if (array[i].Math == 100) mark = 1

if (array[i].English == 100) mark = 1

if (array[i].Chinese >95 &&array[i].English >95) mark = 1

if (array[i].Chinese >95 &&array[i].Math >95) mark = 1

if (array[i].Math >95 &&array[i].English >95) mark = 1

}

if (mark == 1)

{

printf("%s\t%s\t", array[i].id, array[i].name)

printf("%.f\t%.f\t%.f\t%.1f\t", array[i].Chinese, array[i].Math, array[i].English, array[i].average)

printf("%d\n", i+1)

}

}

}

}

/*按学生姓名查询成绩*/

void search_name(struct stu array[], int n, char* name)

{

int i

char mark = 1

for (i = 0i <ni++)

{

if (strcmp(name, array[i].name) == 0)

{

printf("学生姓名:%s\n", name)

printf("学生学号:%s\n", array[i].id)

printf("语文:%.f\n", array[i].Chinese)

printf("数学:%.f\n", array[i].Math)

printf("英语:%.f\n", array[i].English)

printf("平均分:%.1f\n", array[i].average)

mark = 0

}

}

if (mark == 1) puts("不存在该学生记录")

}

/*按学生学号查询成绩*/

void search_id(struct stu array[], int n, char* id)

{

int i

char mark = 1

for (i = 0i <ni++)

{

if (strcmp(id, array[i].id) == 0)

{

printf("学生姓名:%s\n", array[i].name)

printf("学生学号:%s\n", array[i].id)

printf("语文:%.f\n", array[i].Chinese)

printf("数学:%.f\n", array[i].Math)

printf("英语:%.f\n", array[i].English)

printf("平均分:%.1f\n", array[i].average)

mark = 0

break

}

}

if (mark == 1) puts("不存在该学生记录")

}

void print_menu()

{

system("cls")

printf("1.输入学生信息\n")

puts("2.统计全班学生成绩")

puts("3.按学号查询学生成绩")

puts("4.按姓名查询学生成绩")

puts("5.输出不及格情况")

puts("6.输出优等生名单")

puts("0.退出本程序")

printf("\n\n 请输入你的选择:")

}

int main(int argc, char **argv)

{

char ch = 0

char id[8], name[8]

while (ch != '0')

{

print_menu()

ch = getchar()

switch (ch)

{

case '1':

{

system("cls")

input()

sort(students, current)

break

}

case '2':

{

system("cls")

print_score(students, current)

break

}

case '3':

{

system("cls")

printf("请输入学号:")

scanf("%s", id)

search_id(students, current, id)

break

}

case '4':

{

system("cls")

printf("请输入姓名:")

scanf("%s", name)

search_name(students, current, name)

break

}

case '5':

{

system("cls")

print_unreach(students, current)

break

}

case '6':

{

system("cls")

print_good(students, current)

break

}

case '0': exit(0)

}

printf("\n\n按任意键返回主菜单……")

getchar()

getchar()

}

return 0

}

代码如下:

#include<stdio.h>

#include<malloc.h>

#include<stdlib.h>

#include<string.h>

#include<conio.h>

typedef struct examinee //考生信息结构

{   char examno[20]//准考证号

char name[10]//姓名

char sex[4]//性别

short age//年龄

char examtype[10]//报考科目

}ElemType

typedef struct Node //定义链表结点

{

ElemType data//数据域

struct Node *next//指针域

}Node,*List,*position

List make_empty( List L )//创建一个带头结点的空表

int is_empty( List L )//测试链表是否是空表

int is_last( position p, List L )//测试当前位置是否是表尾

position make_node( position p,int n )//创建结点并输入考生信息

void put_information( position p )//是否输出该考生信息

void put_name_information( List L )//输出姓名为xx的考生信息

int put_pos_information( position p )//输出该地址考生信息

void link_to_tail( List L, position p )//将结点连接到表尾

int ciculation_make()//循环创建考生信息

int judge_put_all()//是否输出所有考生信息

void put_all(List L)//输出所有考生信息。

position find( List L )//查找第一个姓名为xx的元素并返回位置

position find_previous( List L )//查找第一个姓名为xx的元素并返回该元素直接前驱的位置

//int judge_delete_val()//询问是否删除考生数据

int delete_val( List L )//删除指定考生信息并输出其信息

void menu(List L)//菜单函数

List L

//position p

int

main( void ) 

{

List L = NULL//定义头结点指针

position p = NULL//定义表工作指针

L = make_empty( L )//创建空表

printf("\t\t\t★★考生报名管理程序★★\n\t\t----------------------------------------\n")

menu(L)

return 0

}

//创建一个带头结点的空表

List

make_empty( List L)

{

L = ( List ) malloc (sizeof( Node ))

if(NULL == L)

{

printf("内存分配失败")

exit( 1 )

}

L->next = NULL

//printf("空表创建成功。\n")

return L

}

//创建结点并输入考生信息

position

make_node( position p ,int n)

{

if(n) //n为1是创建结点并输入,n为0是修改

{

p = ( position ) malloc ( sizeof ( Node ))

p->next = NULL

}

printf("请输入考生准考证号:")

gets(p->data.examno)

printf("请输入考生姓名:")

gets(p->data.name)

do

{

printf("请输入考生性别,只能输入“男”或者“女”:")

gets(p->data.sex)

}

while( 0 != strcmp( p->data.sex, "男" ) &&0 != strcmp( p->data.sex, "女" ))//判断性别是否有误

printf("请输入考生年龄:")

scanf("%hd",&p->data.age)

getchar()  //如果把这句删掉,就“无法执行”下面的报考类别

/*下面的do while用来判断报考类别是否输入有误*/

do

{

printf("请输入报考类别,只能输入“数学”或“英语”或者“数据结构”:")

gets(p->data.examtype)

}

while( 0 != strcmp( "英语", p->data.examtype ) &&0 != strcmp( "数学", p->data.examtype ) &&0 != strcmp( "数据结构", p->data.examtype ))

if(n)

{

printf("报名成功\n")

}

else

{

printf("修改成功\n")

}

return p

}

//前插法;

void

link_to_tail( List L, position p)

{

p->next = L->next

L->next = p

}

//查找第一个姓名为xx的元素并返回位置

position

find( List L )

{

position p = L->next

char name[10]

printf("请输入你要查找的考生姓名:")

gets(name)

while( p != NULL &&0 != strcmp( p->data.name , name))

{

p=p->next

}

return p

}

//测试链表是否是空表

int

is_empty( List L )

{

return L->next == NULL

}

//测试当前位置是否是表尾

int

is_last( position p, List L )

{

return p->next == NULL

}

//输出姓名为xx的考生信息

void

put_name_information( List L )

{

position p = find(L)

if(p!=NULL)

{

printf("您要查找的考生信息:\n")

printf("准考证号:%s\t姓名:%s\t性别:%s\t年龄:%hd\t报考科目:%s\n\n",p->data.examno,p->data.name,p->data.sex,p->data.age,p->data.examtype)

}

else

{

printf("没有您要找的学生。\n")

}

}

//循环创建考生信息

int

ciculation_make()

{

int n = 2

do

{

printf("是否继续创建考生信息?是请输入“1”,不是请输入“0”:")

scanf("%d",&n)

getchar()

}

while( n != 0 &&n != 1)

return n

}

//是否输出考生信息

void

put_information( position p )

{

int n=2

do

{

printf("是否输出该考生信息?是请输入“1”,不是请输入“0”:")

scanf("%d",&n)

getchar()

}

while( n != 0 &&n != 1)

if(n)

{

printf("准考证号:%s\t姓名:%s\t性别:%s\t年龄:%hd\t报考科目:%s\n",p->data.examno,p->data.name,p->data.sex,p->data.age,p->data.examtype)

}

}

//是否输出所有考生信息

int

judge_put_all()

{

int n = 2

do

{

printf("是否输出所有考生信息?是请输入“1”,不是请输入“0”:")

scanf("%d",&n)

getchar()

}

while( n != 0 &&n != 1)

return n

}

//输出所有考生信息

void

put_all(List L)

{

if(L->next == NULL)

{

printf("现无考生报名!\n")

}

else

{

position p=L->next

while( p != NULL )

{

printf("准考证号:%s\t姓名:%s\t性别:%s\t年龄:%hd\t报考科目:%s\n",p->data.examno,p->data.name,p->data.sex,p->data.age,p->data.examtype)

p=p->next

}

}

//getchar()

}

//询问是否删除考生数据

int

judge_delete_val()

{

int n = 2

do

{

printf("是否要删除某个考生数据?是请输入“1”,不是输入“0”:")

scanf("%d",&n)

getchar()

}

while( n != 0 &&n != 1)

return n

}

//查找第一个姓名为xx的元素并返回其直接前驱的位置

position

find_previous( List L )

{

position q = L

position p = L->next

char name[10]

printf("请输入你要查找的考生姓名:")

gets(name)

while( p != NULL &&0 != strcmp( p->data.name , name))

{

q=p

p=p->next

}

if( p != NULL )

{

return q

}

else

return p

}

//删除指定考生信息并输出其信息

int

delete_val(List L)

{

int n=2

position q=NULL

position p=find_previous( L )//返回考生信息地址

if( NULL == p )

{

printf("你要删除的考生不存在\n")

return 0

}

else

{

q = p->next

p->next = q->next

printf("删除成功。\n删除的考生信息为:\n")

printf("准考证号:%s\t姓名:%s\t性别:%s\t年龄:%hd\t报考科目:%s\n",q->data.examno,q->data.name,q->data.sex,q->data.age,q->data.examtype)

free(q)

return 1

}

}

//输出该地址考试信息

int

put_pos_information( position p )

{

if(p != NULL )

{

printf("准考证号:%s\t姓名:%s\t性别:%s\t年龄:%hd\t报考科目:%s\n\n",p->data.examno,p->data.name,p->data.sex,p->data.age,p->data.examtype)

return 1

}

else

{

printf("没有您要查找的学生。")

return 0

}

}

//菜单函数

void

menu(List L)

{

printf("\t\t\t   a. 考生报名入口\n")

printf("\t\t\t   b. 查询考生信息\n")

printf("\t\t\t   c. 修改考生信息\n")

printf("\t\t\t   d. 删除考生信息\n")

printf("\t\t\t   e. 全部考生信息\n")

printf("\t\t\t   f. 程序作者信息\n")

printf("\t\t\t   g.   退出程序\n")

char n='h'

while(n != 'g')

{

do  //确定正确输入

{

printf("请通过字母序号选择功能:")

n = getchar()

getchar()

putchar('\n')

if( n <'a' || n >'g')

{

printf("错误的字母序号。\n")

}

}

while( n <'a' || n >'g' )

switch (n)

{

case 'a':

{

printf("请输入报名考生信息:\n")

position p = make_node( p, 1 )//创建新结点

link_to_tail( L, p )//将新结点连接到表上

put_information( p )   //是否输出该考生信息

putchar('\n')

}

break

case 'b':

{

put_name_information( L )

putchar('\n')

}

break

case 'c':

{

int n=0

position p = NULL

printf("您正在进行修改操作。\n")

p = find(L)

n = put_pos_information( p )

if(n)

{

make_node( p , 0 )

put_information( p )   //是否输出该考生信息

}

putchar('\n')

}

break

case 'd':

{

printf("您正在进行删除操作。\n")

delete_val( L )

putchar('\n')

}

break

case 'e':

{

put_all( L )

putchar('\n')

}

break

case 'f':

{

printf("              修改日期    版本号      修改人      修改内容    \n")

printf("        --------------------------------------------------------\n")

printf("              2018.6.19    v2.0       陈百川     增加主菜单\n")

printf("              2018.6.23    v3.0       陈百川   增加生成文件功能\n\n")

printf("            该版本号为v2.0\n")

putchar('\n')

}

break

default:

break

}

}

printf("                     感谢本次使用,祝您生活愉快。")

getch()

}

回答于 2022-12-11